X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c20e8f816b21b911e3a8ed8197c21df6ce726d6..83f787ba2137594f12c7bd0659dc3c2fb973598f:/src/mac/carbon/textctrl.cpp diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index c84b8fa714..66d4b0eec0 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -64,13 +64,6 @@ #include "wx/mac/uma.h" - -// if this is set to 1 then under OSX 10.2 the 'classic' MLTE implementation will be used -// if set to 0 then the unicode textctrl will be used -#ifndef wxMAC_AWAYS_USE_MLTE -#define wxMAC_AWAYS_USE_MLTE 1 -#endif - #ifndef __WXMAC_OSX__ enum { @@ -118,7 +111,7 @@ public : m_param1 = p1 ; } - ~wxMacObjectFunctor1() {} + virtual ~wxMacObjectFunctor1() {} virtual void* operator()() { @@ -177,7 +170,7 @@ class wxMacTextControl : public wxMacControl { public : wxMacTextControl( wxTextCtrl *peer ) ; - ~wxMacTextControl() ; + virtual ~wxMacTextControl() ; virtual wxString GetStringValue() const = 0 ; virtual void SetStringValue( const wxString &val ) = 0 ; @@ -213,6 +206,7 @@ public : virtual void ShowPosition(long WXUNUSED(pos)) ; virtual int GetLineLength(long lineNo) const ; virtual wxString GetLineText(long lineNo) const ; + virtual void CheckSpelling(bool check) { } #ifndef __WXMAC_OSX__ virtual void MacControlUserPaneDrawProc(wxInt16 part) = 0 ; @@ -270,6 +264,12 @@ public : return false ; } + virtual void CheckSpelling(bool check) + { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + TXNSetSpellCheckAsYouType( m_txn, (Boolean) check ); +#endif + } virtual void Clear() ; virtual bool CanUndo() const ; @@ -305,7 +305,7 @@ public : const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; - ~wxMacMLTEHIViewControl() ; + virtual ~wxMacMLTEHIViewControl() ; virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; virtual bool HasFocus() const ; @@ -326,7 +326,7 @@ public : const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; - ~wxMacUnicodeTextControl(); + virtual ~wxMacUnicodeTextControl(); virtual void VisibilityChanged(bool shown); virtual wxString GetStringValue() const ; @@ -362,7 +362,7 @@ public : const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; - ~wxMacMLTEClassicControl() ; + virtual ~wxMacMLTEClassicControl() ; virtual void VisibilityChanged(bool shown) ; virtual void SuperChangedPosition() ; @@ -475,10 +475,7 @@ bool wxTextCtrl::Create( wxWindow *parent, if ( m_windowStyle & wxTE_MULTILINE ) { - wxASSERT_MSG( - !(m_windowStyle & wxTE_PROCESS_ENTER), - wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") ); - + // always turn on this style for multi-line controls m_windowStyle |= wxTE_PROCESS_ENTER; style |= wxTE_PROCESS_ENTER ; } @@ -491,6 +488,9 @@ bool wxTextCtrl::Create( wxWindow *parent, forceMLTE = true ; } #endif +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + forceMLTE = false; +#endif #ifdef __WXMAC_OSX__ #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 @@ -503,13 +503,20 @@ bool wxTextCtrl::Create( wxWindow *parent, if ( !m_peer ) { +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 if ( !(m_windowStyle & wxTE_MULTILINE) && !forceMLTE ) +#endif + { m_peer = new wxMacUnicodeTextControl( this , str , pos , size , style ) ; + } } #endif + // the horizontal single line scrolling bug that made us keep +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 if ( !m_peer ) m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ; +#endif MacPostControlCreate(pos, size) ; @@ -540,6 +547,11 @@ void wxTextCtrl::MacEnabledStateChanged() { } +void wxTextCtrl::MacCheckSpelling(bool check) +{ + GetPeer()->CheckSpelling(check); +} + wxString wxTextCtrl::GetValue() const { return GetPeer()->GetStringValue() ; @@ -550,20 +562,17 @@ void wxTextCtrl::GetSelection(long* from, long* to) const GetPeer()->GetSelection( from , to ) ; } -void wxTextCtrl::SetValue(const wxString& str) +void wxTextCtrl::DoSetValue(const wxString& str, int flags) { // optimize redraws if ( GetValue() == str ) - return ; + return; GetPeer()->SetStringValue( str ) ; - if ( m_triggerOnSetValue ) + if ( (flags & SetValue_SendEvent) && m_triggerOnSetValue ) { - wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId ); - event.SetString( GetValue() ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); + SendTextUpdatedEvent(); } } @@ -708,11 +717,6 @@ void wxTextCtrl::SetSelection(long from, long to) GetPeer()->SetSelection( from , to ) ; } -bool wxTextCtrl::LoadFile(const wxString& file) -{ - return wxTextCtrlBase::LoadFile( file ); -} - void wxTextCtrl::WriteText(const wxString& str) { // TODO: this MPRemoting will be moved into a remoting peer proxy for any command @@ -999,6 +1003,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) // This is necessary (don't know why); // otherwise the tab will not be inserted. WriteText(wxT("\t")); + eat_key = true; } break; @@ -1727,7 +1732,9 @@ void wxMacMLTEControl::SetStringValue( const wxString &str ) wxMacConvertNewlines10To13( &st ); { - wxMacWindowClipper c( m_peer ); +#ifndef __LP64__ + wxMacWindowClipper c( m_peer ) ; +#endif { wxMacEditHelper help( m_txn ); @@ -1908,7 +1915,7 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo #else typeAttr[attrCount].tag = kTXNATSUIStyle ; typeAttr[attrCount].size = kTXNATSUIStyleSize ; - typeAttr[attrCount].data.dataValue = (UInt32)font.MacGetATSUStyle() ; + typeAttr[attrCount].data.dataPtr = font.MacGetATSUStyle() ; attrCount++ ; #endif } @@ -2002,7 +2009,9 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString &str ) wxMacConvertNewlines10To13( &value ) ; wxMacEditHelper help( m_txn ) ; +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif TXNSetSelection( m_txn, from, to ) ; TXNClear( m_txn ) ; @@ -2011,7 +2020,9 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString &str ) void wxMacMLTEControl::Remove( long from , long to ) { +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif wxMacEditHelper help( m_txn ) ; TXNSetSelection( m_txn , from , to ) ; TXNClear( m_txn ) ; @@ -2024,7 +2035,9 @@ void wxMacMLTEControl::GetSelection( long* from, long* to) const void wxMacMLTEControl::SetSelection( long from , long to ) { +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif // change the selection if ((from == -1) && (to == -1)) @@ -2043,7 +2056,9 @@ void wxMacMLTEControl::WriteText( const wxString& str ) long start , end , dummy ; GetSelection( &start , &dummy ) ; +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif { wxMacEditHelper helper( m_txn ) ; @@ -2057,7 +2072,9 @@ void wxMacMLTEControl::WriteText( const wxString& str ) void wxMacMLTEControl::Clear() { +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif wxMacEditHelper st( m_txn ) ; TXNSetSelection( m_txn , kTXNStartOffset , kTXNEndOffset ) ; TXNClear( m_txn ) ; @@ -2175,30 +2192,24 @@ bool wxMacMLTEControl::PositionToXY( long pos, long *x, long *y ) const void wxMacMLTEControl::ShowPosition( long pos ) { -#if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER) - { - Point current, desired ; - TXNOffset selstart, selend; + Point current, desired ; + TXNOffset selstart, selend; - TXNGetSelection( m_txn, &selstart, &selend ); - TXNOffsetToPoint( m_txn, selstart, ¤t ); - TXNOffsetToPoint( m_txn, pos, &desired ); + TXNGetSelection( m_txn, &selstart, &selend ); + TXNOffsetToPoint( m_txn, selstart, ¤t ); + TXNOffsetToPoint( m_txn, pos, &desired ); - // TODO: use HIPoints for 10.3 and above - if ( (UInt32)TXNScroll != (UInt32)kUnresolvedCFragSymbolAddress ) - { - OSErr theErr = noErr; - SInt32 dv = desired.v - current.v; - SInt32 dh = desired.h - current.h; - TXNShowSelection( m_txn, kTXNShowStart ) ; // NB: should this be kTXNShowStart or kTXNShowEnd ?? - theErr = TXNScroll( m_txn, kTXNScrollUnitsInPixels, kTXNScrollUnitsInPixels, &dv, &dh ); - - // there will be an error returned for classic MLTE implementation when the control is - // invisible, but HITextView works correctly, so we don't assert that one - // wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") ); - } - } -#endif + // TODO: use HIPoints for 10.3 and above + + OSErr theErr = noErr; + long dv = desired.v - current.v; + long dh = desired.h - current.h; + TXNShowSelection( m_txn, kTXNShowStart ) ; // NB: should this be kTXNShowStart or kTXNShowEnd ?? + theErr = TXNScroll( m_txn, kTXNScrollUnitsInPixels, kTXNScrollUnitsInPixels, &dv, &dh ); + + // there will be an error returned for classic MLTE implementation when the control is + // invisible, but HITextView works correctly, so we don't assert that one + // wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") ); } void wxMacMLTEControl::SetTXNData( const wxString& st, TXNOffset start, TXNOffset end ) @@ -2299,6 +2310,8 @@ int wxMacMLTEControl::GetLineLength(long lineNo) const return theLength ; } +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 + // ---------------------------------------------------------------------------- // MLTE control implementation (classic part) // ---------------------------------------------------------------------------- @@ -2485,7 +2498,6 @@ void wxMacMLTEClassicControl::MacUpdatePosition() wxMacWindowClipper cl( textctrl ) ; #ifdef __WXMAC_OSX__ - bool isCompositing = textctrl->MacGetTopLevelWindow()->MacUsesCompositing() ; if ( m_sbHorizontal || m_sbVertical ) { int w = bounds.right - bounds.left ; @@ -2500,9 +2512,6 @@ void wxMacMLTEClassicControl::MacUpdatePosition() sbBounds.right = w + 1 ; sbBounds.bottom = h + 1 ; - if ( !isCompositing ) - OffsetRect( &sbBounds , m_txnControlBounds.left , m_txnControlBounds.top ) ; - SetControlBounds( m_sbHorizontal , &sbBounds ) ; SetControlViewSize( m_sbHorizontal , w ) ; } @@ -2516,9 +2525,6 @@ void wxMacMLTEClassicControl::MacUpdatePosition() sbBounds.right = w + 1 ; sbBounds.bottom = m_sbHorizontal ? h - 14 : h + 1 ; - if ( !isCompositing ) - OffsetRect( &sbBounds , m_txnControlBounds.left , m_txnControlBounds.top ) ; - SetControlBounds( m_sbVertical , &sbBounds ) ; SetControlViewSize( m_sbVertical , h ) ; } @@ -2607,13 +2613,10 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt1 else { // sometimes we get the coords also in control local coordinates, therefore test again - if ( textctrl->MacGetTopLevelWindow()->MacUsesCompositing() ) - { - int x = 0 , y = 0 ; - textctrl->MacClientToRootWindow( &x , &y ) ; - where.h += x ; - where.v += y ; - } + int x = 0 , y = 0 ; + textctrl->MacClientToRootWindow( &x , &y ) ; + where.h += x ; + where.v += y ; if (PtInRect( where, &m_txnControlBounds )) result = kControlEditTextPart ; @@ -2631,14 +2634,12 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxIn if ( (textctrl != NULL) && textctrl->MacIsReallyShown() ) { Point startPt = { y , x } ; + // for compositing, we must convert these into toplevel window coordinates, because hittesting expects them - if ( textctrl->MacGetTopLevelWindow()->MacUsesCompositing() ) - { - int x = 0 , y = 0 ; - textctrl->MacClientToRootWindow( &x , &y ) ; - startPt.h += x ; - startPt.v += y ; - } + int x = 0 , y = 0 ; + textctrl->MacClientToRootWindow( &x , &y ) ; + startPt.h += x ; + startPt.v += y ; switch (MacControlUserPaneHitTestProc( startPt.h , startPt.v )) { @@ -2998,6 +2999,7 @@ OSStatus wxMacMLTEClassicControl::DoCreate() return err; } +#endif // ---------------------------------------------------------------------------- // MLTE control implementation (OSX part) @@ -3107,8 +3109,9 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer, } AdjustCreationAttributes( *wxWHITE , true ) ; - +#ifndef __LP64__ wxMacWindowClipper c( m_peer ) ; +#endif SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ; TXNSetSelection( m_txn, 0, 0 );