X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f74e0d132e73250ef422c06175dcf7e4146ec57..1bd568fa44a864a4110b13e8e0d08f923e5fb4ff:/src/mac/carbon/textctrl.cpp diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index 1e50c81412..7a3e1acb96 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -45,32 +45,8 @@ #include "wx/filefn.h" #include "wx/sysopt.h" -#if defined(__BORLANDC__) && !defined(__WIN32__) - #include -#elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__) - #include -#endif - -#ifndef __DARWIN__ -#include -#endif - -#ifndef __DARWIN__ -#include -#include -#include -#include -#endif - #include "wx/mac/uma.h" - -#ifndef __WXMAC_OSX__ -enum -{ - kTXNVisibilityTag = 'visb' // set the visibility state of the object -}; -#endif - +#include "wx/mac/carbon/private/mactext.h" class wxMacFunctor { @@ -165,59 +141,6 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( con return result ; } -// common interface for all implementations -class wxMacTextControl : public wxMacControl -{ -public : - wxMacTextControl( wxTextCtrl *peer ) ; - virtual ~wxMacTextControl() ; - - virtual wxString GetStringValue() const = 0 ; - virtual void SetStringValue( const wxString &val ) = 0 ; - virtual void SetSelection( long from, long to ) = 0 ; - virtual void GetSelection( long* from, long* to ) const = 0 ; - virtual void WriteText( const wxString& str ) = 0 ; - - virtual void SetStyle( long start, long end, const wxTextAttr& style ) ; - virtual void Copy() ; - virtual void Cut() ; - virtual void Paste() ; - virtual bool CanPaste() const ; - virtual void SetEditable( bool editable ) ; - virtual wxTextPos GetLastPosition() const ; - virtual void Replace( long from, long to, const wxString &str ) ; - virtual void Remove( long from, long to ) ; - - - virtual bool HasOwnContextMenu() const - { return false ; } - - virtual bool SetupCursor( const wxPoint& pt ) - { return false ; } - - virtual void Clear() ; - virtual bool CanUndo() const; - virtual void Undo() ; - virtual bool CanRedo() const; - virtual void Redo() ; - virtual int GetNumberOfLines() const ; - virtual long XYToPosition(long x, long y) const; - virtual bool PositionToXY(long pos, long *x, long *y) const ; - virtual void ShowPosition(long WXUNUSED(pos)) ; - virtual int GetLineLength(long lineNo) const ; - virtual wxString GetLineText(long lineNo) const ; - -#ifndef __WXMAC_OSX__ - virtual void MacControlUserPaneDrawProc(wxInt16 part) = 0 ; - virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) = 0 ; - virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) = 0 ; - virtual void MacControlUserPaneIdleProc() = 0 ; - virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) = 0 ; - virtual void MacControlUserPaneActivateProc(bool activating) = 0 ; - virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) = 0 ; - virtual void MacControlUserPaneBackgroundProc(void* info) = 0 ; -#endif -} ; // common parts for implementations based on MLTE @@ -251,18 +174,15 @@ public : virtual bool HasOwnContextMenu() const { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if ( UMAGetSystemVersion() >= 0x1040 ) - { - TXNCommandEventSupportOptions options ; - TXNGetCommandEventSupport( m_txn , & options ) ; - return options & kTXNSupportEditCommandProcessing ; - } -#endif - - return false ; + TXNCommandEventSupportOptions options ; + TXNGetCommandEventSupport( m_txn , & options ) ; + return options & kTXNSupportEditCommandProcessing ; } + virtual void CheckSpelling(bool check) + { + TXNSetSpellCheckAsYouType( m_txn, (Boolean) check ); + } virtual void Clear() ; virtual bool CanUndo() const ; @@ -285,12 +205,8 @@ protected : TXNObject m_txn ; } ; -#if TARGET_API_MAC_OSX - // implementation available under OSX -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 - class wxMacMLTEHIViewControl : public wxMacMLTEControl { public : @@ -307,45 +223,8 @@ public : protected : HIViewRef m_scrollView ; HIViewRef m_textView ; - EventHandlerRef m_textEventHandlerRef ; -}; - -#endif - -class wxMacUnicodeTextControl : public wxMacTextControl -{ -public : - wxMacUnicodeTextControl( wxTextCtrl *wxPeer, - const wxString& str, - const wxPoint& pos, - const wxSize& size, long style ) ; - virtual ~wxMacUnicodeTextControl(); - - virtual void VisibilityChanged(bool shown); - virtual wxString GetStringValue() const ; - virtual void SetStringValue( const wxString &str) ; - virtual void Copy(); - virtual void Cut(); - virtual void Paste(); - virtual bool CanPaste() const; - virtual void SetEditable(bool editable) ; - virtual void GetSelection( long* from, long* to) const ; - virtual void SetSelection( long from , long to ) ; - virtual void WriteText(const wxString& str) ; - -protected : - // contains the tag for the content (is different for password and non-password controls) - OSType m_valueTag ; - - // as the selection tag only works correctly when the control has the focus we have to mirror the - // intended value - EventHandlerRef m_focusHandlerRef ; -public : - ControlEditTextSelectionRec m_selection ; }; -#endif - // 'classic' MLTE implementation class wxMacMLTEClassicControl : public wxMacMLTEControl @@ -393,7 +272,6 @@ private : Rect m_txnControlBounds ; Rect m_txnVisBounds ; -#ifdef __WXMAC_OSX__ static pascal void TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ) ; static pascal void TXNScrollInfoProc( SInt32 iValue, SInt32 iMaximumValue, @@ -403,7 +281,6 @@ private : SInt32 m_lastHorizontalValue ; ControlRef m_sbVertical ; SInt32 m_lastVerticalValue ; -#endif }; @@ -473,6 +350,27 @@ bool wxTextCtrl::Create( wxWindow *parent, style |= wxTE_PROCESS_ENTER ; } + CreatePeer( str, pos, size, style ); + + MacPostControlCreate(pos, size) ; + + // only now the embedding is correct and we can do a positioning update + + MacSuperChangedPosition() ; + + if ( m_windowStyle & wxTE_READONLY) + SetEditable( false ) ; + + SetCursor( wxCursor( wxCURSOR_IBEAM ) ) ; + + return true; +} + +void wxTextCtrl::CreatePeer( + const wxString& str, + const wxPoint& pos, + const wxSize& size, long style ) +{ bool forceMLTE = false ; #if wxUSE_SYSTEM_OPTIONS @@ -481,48 +379,30 @@ 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 - if ( UMAGetSystemVersion() >= 0x1030 && !forceMLTE ) + if ( UMAGetSystemVersion() >= 0x1050 ) + forceMLTE = false; + + if ( !forceMLTE ) { if ( m_windowStyle & wxTE_MULTILINE ) m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ; } -#endif 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 + // the horizontal single line scrolling bug that made us keep the classic implementation + // is fixed in 10.5 +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 if ( !m_peer ) m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ; #endif - - MacPostControlCreate(pos, size) ; - - // only now the embedding is correct and we can do a positioning update - - MacSuperChangedPosition() ; - - if ( m_windowStyle & wxTE_READONLY) - SetEditable( false ) ; - - SetCursor( wxCursor( wxCURSOR_IBEAM ) ) ; - - return true; } void wxTextCtrl::MacSuperChangedPosition() @@ -540,6 +420,11 @@ void wxTextCtrl::MacEnabledStateChanged() { } +void wxTextCtrl::MacCheckSpelling(bool check) +{ + GetPeer()->CheckSpelling(check); +} + wxString wxTextCtrl::GetValue() const { return GetPeer()->GetStringValue() ; @@ -1134,52 +1019,6 @@ bool wxTextCtrl::MacSetupCursor( const wxPoint& pt ) return true ; } -#if !TARGET_API_MAC_OSX - -// user pane implementation - -void wxTextCtrl::MacControlUserPaneDrawProc(wxInt16 part) -{ - GetPeer()->MacControlUserPaneDrawProc( part ) ; -} - -wxInt16 wxTextCtrl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) -{ - return GetPeer()->MacControlUserPaneHitTestProc( x , y ) ; -} - -wxInt16 wxTextCtrl::MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) -{ - return GetPeer()->MacControlUserPaneTrackingProc( x , y , actionProc ) ; -} - -void wxTextCtrl::MacControlUserPaneIdleProc() -{ - GetPeer()->MacControlUserPaneIdleProc( ) ; -} - -wxInt16 wxTextCtrl::MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) -{ - return GetPeer()->MacControlUserPaneKeyDownProc( keyCode , charCode , modifiers ) ; -} - -void wxTextCtrl::MacControlUserPaneActivateProc(bool activating) -{ - GetPeer()->MacControlUserPaneActivateProc( activating ) ; -} - -wxInt16 wxTextCtrl::MacControlUserPaneFocusProc(wxInt16 action) -{ - return GetPeer()->MacControlUserPaneFocusProc( action ) ; -} - -void wxTextCtrl::MacControlUserPaneBackgroundProc(void* info) -{ - GetPeer()->MacControlUserPaneBackgroundProc( info ) ; -} - -#endif - // ---------------------------------------------------------------------------- // implementation base class // ---------------------------------------------------------------------------- @@ -1193,7 +1032,9 @@ wxMacTextControl::~wxMacTextControl() { } -void wxMacTextControl::SetStyle(long start, long end, const wxTextAttr& style) +void wxMacTextControl::SetStyle(long WXUNUSED(start), + long WXUNUSED(end), + const wxTextAttr& WXUNUSED(style)) { } @@ -1214,7 +1055,7 @@ bool wxMacTextControl::CanPaste() const return false ; } -void wxMacTextControl::SetEditable(bool editable) +void wxMacTextControl::SetEditable(bool WXUNUSED(editable)) { } @@ -1258,12 +1099,14 @@ void wxMacTextControl::Redo() { } -long wxMacTextControl::XYToPosition(long x, long y) const +long wxMacTextControl::XYToPosition(long WXUNUSED(x), long WXUNUSED(y)) const { return 0 ; } -bool wxMacTextControl::PositionToXY(long pos, long *x, long *y) const +bool wxMacTextControl::PositionToXY(long WXUNUSED(pos), + long *WXUNUSED(x), + long *WXUNUSED(y)) const { return false ; } @@ -1353,8 +1196,6 @@ int wxMacTextControl::GetLineLength(long lineNo) const // standard unicode control implementation // ---------------------------------------------------------------------------- -#if TARGET_API_MAC_OSX - // the current unicode textcontrol implementation has a bug : only if the control // is currently having the focus, the selection can be retrieved by the corresponding // data tag. So we have a mirroring using a member variable @@ -1414,38 +1255,48 @@ static pascal OSStatus wxMacUnicodeTextControlEventHandler( EventHandlerCallRef DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacUnicodeTextControlEventHandler ) +wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer ) : wxMacTextControl( wxPeer ) +{ +} + wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer, const wxString& str, const wxPoint& pos, const wxSize& size, long style ) : wxMacTextControl( wxPeer ) +{ + Create( wxPeer, str, pos, size, style ); +} + +bool wxMacUnicodeTextControl::Create( wxTextCtrl *wxPeer, + const wxString& str, + const wxPoint& pos, + const wxSize& size, long style ) { m_font = wxPeer->GetFont() ; m_windowStyle = style ; + m_selection.selStart = m_selection.selEnd = 0; Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ; wxString st = str ; wxMacConvertNewlines10To13( &st ) ; wxMacCFStringHolder cf(st , m_font.GetEncoding()) ; CFStringRef cfr = cf ; - Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ; - m_valueTag = isPassword ? kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag ; - OSStatus err = CreateEditUnicodeTextControl( - MAC_WXHWND(wxPeer->MacGetTopLevelWindowRef()), &bounds , cfr , - isPassword , NULL , &m_controlRef ) ; - verify_noerr( err ); + m_valueTag = kControlEditTextCFStringTag ; + CreateControl( wxPeer, &bounds, cfr ); if ( !(m_windowStyle & wxTE_MULTILINE) ) SetData( kControlEditTextPart , kControlEditTextSingleLineTag , true ) ; InstallControlEventHandler( m_controlRef , GetwxMacUnicodeTextControlEventHandlerUPP(), GetEventTypeCount(unicodeTextControlEventList), unicodeTextControlEventList, this, - &m_focusHandlerRef); + NULL); + + return true; } wxMacUnicodeTextControl::~wxMacUnicodeTextControl() { - ::RemoveEventHandler( m_focusHandlerRef ); } void wxMacUnicodeTextControl::VisibilityChanged(bool shown) @@ -1493,6 +1344,19 @@ void wxMacUnicodeTextControl::SetStringValue( const wxString &str ) verify_noerr( SetData( 0, m_valueTag , cf ) ) ; } +void wxMacUnicodeTextControl::CreateControl( wxTextCtrl* peer, const Rect* bounds, CFStringRef cfr ) +{ + Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ; + if ( isPassword ) + { + m_valueTag = kControlEditTextPasswordCFStringTag ; + } + OSStatus err = CreateEditUnicodeTextControl( + MAC_WXHWND(peer->MacGetTopLevelWindowRef()), bounds , cfr , + isPassword , NULL , &m_controlRef ) ; + verify_noerr( err ); +} + void wxMacUnicodeTextControl::Copy() { SendHICommand( kHICommandCopy ) ; @@ -1513,7 +1377,7 @@ bool wxMacUnicodeTextControl::CanPaste() const return true ; } -void wxMacUnicodeTextControl::SetEditable(bool editable) +void wxMacUnicodeTextControl::SetEditable(bool WXUNUSED(editable)) { #if 0 // leads to problem because text cannot be selected anymore SetData( kControlEditTextPart , kControlEditTextLockedTag , (Boolean) !editable ) ; @@ -1554,7 +1418,10 @@ void wxMacUnicodeTextControl::SetSelection( long from , long to ) else { from = wxMin(textLength,wxMax(from,0)) ; - to = wxMax(0,wxMin(textLength,to)) ; + if ( to == -1 ) + to = textLength; + else + to = wxMax(0,wxMin(textLength,to)) ; } sel.selStart = from ; @@ -1570,7 +1437,6 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str ) wxString st = str ; wxMacConvertNewlines10To13( &st ) ; -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 if ( HasFocus() ) { wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ; @@ -1578,7 +1444,6 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str ) SetData( 0, kControlEditTextInsertCFStringRefTag, &value ); } else -#endif { wxString val = GetStringValue() ; long start , end ; @@ -1590,8 +1455,6 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str ) } } -#endif - // ---------------------------------------------------------------------------- // MLTE control implementation (common part) // ---------------------------------------------------------------------------- @@ -1738,9 +1601,7 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle ) { TXNFrameOptions frameOptions = kTXNDontDrawCaretWhenInactiveMask; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 frameOptions |= kTXNDoFontSubstitutionMask; -#endif if ( ! (wxStyle & wxTE_NOHIDESEL) ) frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ; @@ -1771,7 +1632,8 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle ) return frameOptions ; } -void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, bool visible ) +void wxMacMLTEControl::AdjustCreationAttributes(const wxColour &background, + bool WXUNUSED(visible)) { TXNControlTag iControlTags[] = { @@ -1800,26 +1662,23 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo // setting the default font: // under 10.2 this causes a visible caret, therefore we avoid it - if ( UMAGetSystemVersion() >= 0x1030 ) - { - Str255 fontName ; - SInt16 fontSize ; - Style fontStyle ; + Str255 fontName ; + SInt16 fontSize ; + Style fontStyle ; - GetThemeFont( kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; + GetThemeFont( kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; - TXNTypeAttributes typeAttr[] = - { - { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } , - { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } , - { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } , - } ; - - err = TXNSetTypeAttributes( - m_txn, sizeof(typeAttr) / sizeof(TXNTypeAttributes), - typeAttr, kTXNStartOffset, kTXNEndOffset ); - verify_noerr( err ); - } + TXNTypeAttributes typeAttr[] = + { + { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } , + { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } , + { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } , + } ; + + err = TXNSetTypeAttributes( + m_txn, sizeof(typeAttr) / sizeof(TXNTypeAttributes), + typeAttr, kTXNStartOffset, kTXNEndOffset ); + verify_noerr( err ); if ( m_windowStyle & wxTE_PASSWORD ) { @@ -1830,27 +1689,39 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo TXNBackground tback; tback.bgType = kTXNBackgroundTypeRGB; - tback.bg.color = MAC_WXCOLORREF( background.GetPixel() ); + background.GetRGBColor( &tback.bg.color ); TXNSetBackground( m_txn , &tback ); -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if ( UMAGetSystemVersion() >= 0x1040 ) + + TXNCommandEventSupportOptions options ; + if ( TXNGetCommandEventSupport( m_txn, &options ) == noErr ) { - TXNCommandEventSupportOptions options ; - if ( TXNGetCommandEventSupport( m_txn, &options ) == noErr ) - { - options |= - kTXNSupportEditCommandProcessing - | kTXNSupportEditCommandUpdating - | kTXNSupportSpellCheckCommandProcessing - | kTXNSupportSpellCheckCommandUpdating - | kTXNSupportFontCommandProcessing - | kTXNSupportFontCommandUpdating; - - TXNSetCommandEventSupport( m_txn , options ) ; + options |= + kTXNSupportEditCommandProcessing + | kTXNSupportEditCommandUpdating + | kTXNSupportFontCommandProcessing + | kTXNSupportFontCommandUpdating; + + // only spell check when not read-only + // use system options for the default + bool checkSpelling = false ; + if ( !(m_windowStyle & wxTE_READONLY) ) + { +#if wxUSE_SYSTEM_OPTIONS + if ( wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) == 1) ) + { + checkSpelling = true ; + } +#endif } + + if ( checkSpelling ) + options |= + kTXNSupportSpellCheckCommandProcessing + | kTXNSupportSpellCheckCommandUpdating; + + TXNSetCommandEventSupport( m_txn , options ) ; } -#endif } void wxMacMLTEControl::SetBackground( const wxBrush &brush ) @@ -1859,74 +1730,140 @@ void wxMacMLTEControl::SetBackground( const wxBrush &brush ) TXNBackground tback; tback.bgType = kTXNBackgroundTypeRGB; - tback.bg.color = MAC_WXCOLORREF( brush.GetColour().GetPixel() ); + brush.GetColour().GetRGBColor(&tback.bg.color); TXNSetBackground( m_txn , &tback ); } +static inline int wxConvertToTXN(int x) +{ + return wx_static_cast(int, x / 254.0 * 72 + 0.5); +} + void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to ) { TXNTypeAttributes typeAttr[4] ; RGBColor color ; - int attrCount = 0 ; + size_t typeAttrCount = 0 ; + + TXNMargins margins; + TXNControlTag controlTags[4]; + TXNControlData controlData[4]; + size_t controlAttrCount = 0; + + TXNTab* tabs = NULL; + + bool relayout = false; if ( style.HasFont() ) { + wxASSERT( typeAttrCount < WXSIZEOF(typeAttr) ); const wxFont &font = style.GetFont() ; - -#if 0 // old version - Str255 fontName = "\pMonaco" ; - SInt16 fontSize = 12 ; - Style fontStyle = normal ; - wxMacStringToPascal( font.GetFaceName() , fontName ) ; - fontSize = font.GetPointSize() ; - if ( font.GetUnderlined() ) - fontStyle |= underline ; - if ( font.GetWeight() == wxBOLD ) - fontStyle |= bold ; - if ( font.GetStyle() == wxITALIC ) - fontStyle |= italic ; - - typeAttr[attrCount].tag = kTXNQDFontNameAttribute ; - typeAttr[attrCount].size = kTXNQDFontNameAttributeSize ; - typeAttr[attrCount].data.dataPtr = (void*)fontName ; - attrCount++ ; - - typeAttr[attrCount].tag = kTXNQDFontSizeAttribute ; - typeAttr[attrCount].size = kTXNFontSizeAttributeSize ; - typeAttr[attrCount].data.dataValue = (fontSize << 16) ; - attrCount++ ; - - typeAttr[attrCount].tag = kTXNQDFontStyleAttribute ; - typeAttr[attrCount].size = kTXNQDFontStyleAttributeSize ; - typeAttr[attrCount].data.dataValue = fontStyle ; - attrCount++ ; -#else - typeAttr[attrCount].tag = kTXNATSUIStyle ; - typeAttr[attrCount].size = kTXNATSUIStyleSize ; - typeAttr[attrCount].data.dataPtr = font.MacGetATSUStyle() ; - attrCount++ ; -#endif + typeAttr[typeAttrCount].tag = kTXNATSUIStyle ; + typeAttr[typeAttrCount].size = kTXNATSUIStyleSize ; + typeAttr[typeAttrCount].data.dataPtr = font.MacGetATSUStyle() ; + typeAttrCount++ ; } if ( style.HasTextColour() ) { - color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ; + wxASSERT( typeAttrCount < WXSIZEOF(typeAttr) ); + style.GetTextColour().GetRGBColor( &color ); + typeAttr[typeAttrCount].tag = kTXNQDFontColorAttribute ; + typeAttr[typeAttrCount].size = kTXNQDFontColorAttributeSize ; + typeAttr[typeAttrCount].data.dataPtr = (void*) &color ; + typeAttrCount++ ; + } + + if ( style.HasAlignment() ) + { + wxASSERT( controlAttrCount < WXSIZEOF(controlTags) ); + SInt32 align; + + switch ( style.GetAlignment() ) + { + case wxTEXT_ALIGNMENT_LEFT: + align = kTXNFlushLeft; + break; + case wxTEXT_ALIGNMENT_CENTRE: + align = kTXNCenter; + break; + case wxTEXT_ALIGNMENT_RIGHT: + align = kTXNFlushRight; + break; + case wxTEXT_ALIGNMENT_JUSTIFIED: + align = kTXNFullJust; + break; + default : + case wxTEXT_ALIGNMENT_DEFAULT: + align = kTXNFlushDefault; + break; + } + + controlTags[controlAttrCount] = kTXNJustificationTag ; + controlData[controlAttrCount].sValue = align ; + controlAttrCount++ ; + } + + if ( style.HasLeftIndent() || style.HasRightIndent() ) + { + wxASSERT( controlAttrCount < WXSIZEOF(controlTags) ); + controlTags[controlAttrCount] = kTXNMarginsTag; + controlData[controlAttrCount].marginsPtr = &margins; + verify_noerr( TXNGetTXNObjectControls (m_txn, 1 , + &controlTags[controlAttrCount], &controlData[controlAttrCount]) ); + if ( style.HasLeftIndent() ) + { + margins.leftMargin = wxConvertToTXN(style.GetLeftIndent()); + } + if ( style.HasRightIndent() ) + { + margins.rightMargin = wxConvertToTXN(style.GetRightIndent()); + } + controlAttrCount++ ; + } + + if ( style.HasTabs() ) + { + const wxArrayInt& tabarray = style.GetTabs(); + // unfortunately Mac only applies a tab distance, not individually different tabs + controlTags[controlAttrCount] = kTXNTabSettingsTag; + if ( tabarray.size() > 0 ) + controlData[controlAttrCount].tabValue.value = wxConvertToTXN(tabarray[0]); + else + controlData[controlAttrCount].tabValue.value = 72 ; + + controlData[controlAttrCount].tabValue.tabType = kTXNLeftTab; + controlAttrCount++ ; + } + + // unfortunately the relayout is not automatic + if ( controlAttrCount > 0 ) + { + verify_noerr( TXNSetTXNObjectControls (m_txn, false /* don't clear all */, controlAttrCount, + controlTags, controlData) ); + relayout = true; + } - typeAttr[attrCount].tag = kTXNQDFontColorAttribute ; - typeAttr[attrCount].size = kTXNQDFontColorAttributeSize ; - typeAttr[attrCount].data.dataPtr = (void*) &color ; - attrCount++ ; + if ( typeAttrCount > 0 ) + { + verify_noerr( TXNSetTypeAttributes( m_txn , typeAttrCount, typeAttr, from , to ) ); + relayout = true; } - if ( attrCount > 0 ) + if ( tabs != NULL ) + { + delete[] tabs; + } + + if ( relayout ) { - verify_noerr( TXNSetTypeAttributes( m_txn , attrCount , typeAttr, from , to ) ); - // unfortunately the relayout is not automatic TXNRecalcTextLayout( m_txn ); } } -void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) +void wxMacMLTEControl::SetFont(const wxFont & font, + const wxColour& foreground, + long WXUNUSED(windowStyle)) { wxMacEditHelper help( m_txn ) ; TXNSetAttribute( wxTextAttr( foreground, wxNullColour, font ), kTXNStartOffset, kTXNEndOffset ) ; @@ -1940,21 +1877,16 @@ void wxMacMLTEControl::SetStyle( long start, long end, const wxTextAttr& style ) void wxMacMLTEControl::Copy() { - ClearCurrentScrap(); TXNCopy( m_txn ); - TXNConvertToPublicScrap(); } void wxMacMLTEControl::Cut() { - ClearCurrentScrap(); TXNCut( m_txn ); - TXNConvertToPublicScrap(); } void wxMacMLTEControl::Paste() { - TXNConvertFromPublicScrap(); TXNPaste( m_txn ); } @@ -2001,7 +1933,7 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString &str ) wxMacWindowClipper c( m_peer ) ; #endif - TXNSetSelection( m_txn, from, to ) ; + TXNSetSelection( m_txn, from, to == -1 ? kTXNEndOffset : to ) ; TXNClear( m_txn ) ; SetTXNData( value, kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ; } @@ -2018,7 +1950,10 @@ void wxMacMLTEControl::Remove( long from , long to ) void wxMacMLTEControl::GetSelection( long* from, long* to) const { - TXNGetSelection( m_txn , (TXNOffset*) from , (TXNOffset*) to ) ; + TXNOffset f,t ; + TXNGetSelection( m_txn , &f , &t ) ; + *from = f; + *to = t; } void wxMacMLTEControl::SetSelection( long from , long to ) @@ -2031,7 +1966,7 @@ void wxMacMLTEControl::SetSelection( long from , long to ) if ((from == -1) && (to == -1)) TXNSelectAll( m_txn ); else - TXNSetSelection( m_txn, from, to ); + TXNSetSelection( m_txn, from, to == -1 ? kTXNEndOffset : to ); TXNShowSelection( m_txn, kTXNShowStart ); } @@ -2298,7 +2233,7 @@ int wxMacMLTEControl::GetLineLength(long lineNo) const return theLength ; } -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 // ---------------------------------------------------------------------------- // MLTE control implementation (classic part) @@ -2310,8 +2245,6 @@ int wxMacMLTEControl::GetLineLength(long lineNo) const // while this can be solved on 10.3 by reassigning them the correct place, on 10.2 there is // no way out, therefore we are using our own implementation and our own scrollbars .... -#ifdef __WXMAC_OSX__ - TXNScrollInfoUPP gTXNScrollInfoProc = NULL ; ControlActionUPP gTXNScrollActionProc = NULL ; @@ -2415,7 +2348,6 @@ pascal void wxMacMLTEClassicControl::TXNScrollActionProc( ControlRef controlRef mlte->m_lastVerticalValue = newValue ; } } -#endif // make correct activations void wxMacMLTEClassicControl::MacActivatePaneText(bool setActive) @@ -2485,7 +2417,6 @@ void wxMacMLTEClassicControl::MacUpdatePosition() m_txnVisBounds = visBounds ; wxMacWindowClipper cl( textctrl ) ; -#ifdef __WXMAC_OSX__ if ( m_sbHorizontal || m_sbVertical ) { int w = bounds.right - bounds.left ; @@ -2547,13 +2478,6 @@ void wxMacMLTEClassicControl::MacUpdatePosition() m_txnControlBounds.right - (m_sbVertical ? 14 : 0), m_txnFrameID ); #endif -#else - - TXNSetFrameBounds( - m_txn, m_txnControlBounds.top, m_txnControlBounds.left, - wxMax( m_txnControlBounds.bottom, m_txnControlBounds.top ), - wxMax( m_txnControlBounds.right, m_txnControlBounds.left ), m_txnFrameID ); -#endif // the SetFrameBounds method under Classic sometimes does not correctly scroll a selection into sight after a // movement, therefore we have to force it @@ -2573,7 +2497,7 @@ void wxMacMLTEClassicControl::SetRect( Rect *r ) MacUpdatePosition() ; } -void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 thePart) +void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 WXUNUSED(thePart)) { wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); if ( textctrl == NULL ) @@ -2614,7 +2538,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt1 return result; } -wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxInt16 y, void* actionProc ) +wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxInt16 y, void* WXUNUSED(actionProc) ) { ControlPartCode result = kControlNoPart; @@ -2732,7 +2656,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action) return focusResult; } -void wxMacMLTEClassicControl::MacControlUserPaneBackgroundProc( void *info ) +void wxMacMLTEClassicControl::MacControlUserPaneBackgroundProc( void *WXUNUSED(info) ) { } @@ -2790,8 +2714,6 @@ void wxMacMLTEClassicControl::SuperChangedPosition() wxMacControl::SuperChangedPosition() ; } -#ifdef __WXMAC_OSX__ - ControlUserPaneDrawUPP gTPDrawProc = NULL; ControlUserPaneHitTestUPP gTPHitProc = NULL; ControlUserPaneTrackingUPP gTPTrackProc = NULL; @@ -2874,8 +2796,6 @@ static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, Contro } #endif -#endif // __WXMAC_OSX__ - // TXNRegisterScrollInfoProc OSStatus wxMacMLTEClassicControl::DoCreate() @@ -2884,7 +2804,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() OSStatus err = noErr ; // set up our globals -#ifdef __WXMAC_OSX__ if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(wxMacControlUserPaneDrawProc); if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(wxMacControlUserPaneHitTestProc); if (gTPTrackProc == NULL) gTPTrackProc = NewControlUserPaneTrackingUPP(wxMacControlUserPaneTrackingProc); @@ -2895,14 +2814,12 @@ OSStatus wxMacMLTEClassicControl::DoCreate() if (gTXNScrollInfoProc == NULL ) gTXNScrollInfoProc = NewTXNScrollInfoUPP(TXNScrollInfoProc) ; if (gTXNScrollActionProc == NULL ) gTXNScrollActionProc = NewControlActionUPP(TXNScrollActionProc) ; -#endif // set the initial settings for our private data m_txnWindow = GetControlOwner(m_controlRef); m_txnPort = (GrafPtr) GetWindowPort(m_txnWindow); -#ifdef __WXMAC_OSX__ // set up the user pane procedures SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneDrawProcTag, sizeof(gTPDrawProc), &gTPDrawProc); SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneHitTestProcTag, sizeof(gTPHitProc), &gTPHitProc); @@ -2911,7 +2828,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneKeyDownProcTag, sizeof(gTPKeyProc), &gTPKeyProc); SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneActivateProcTag, sizeof(gTPActivateProc), &gTPActivateProc); SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc); -#endif // calculate the rectangles used by the control UMAGetControlBoundsInWindowCoords( m_controlRef, &bounds ); @@ -2928,7 +2844,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() // create the new edit field TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( m_windowStyle ); -#ifdef __WXMAC_OSX__ // the scrollbars are not correctly embedded but are inserted at the root: // this gives us problems as we have erratic redraws even over the structure area @@ -2958,8 +2873,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() frameOptions &= ~(kTXNWantHScrollBarMask | kTXNDrawGrowIconMask); } -#endif - err = TXNNewObject( NULL, m_txnWindow, &bounds, frameOptions, kTXNTextEditStyleFrameType, kTXNTextensionFile, kTXNSystemDefaultEncoding, @@ -2979,9 +2892,7 @@ OSStatus wxMacMLTEClassicControl::DoCreate() verify_noerr( TXNSetTXNObjectControls( m_txn, false, toptag, iControlTags, iControlData ) ); #endif -#ifdef __WXMAC_OSX__ TXNRegisterScrollInfoProc( m_txn, gTXNScrollInfoProc, (SInt32)this ); -#endif SetGWorld( origPort , origDev ) ; @@ -2993,10 +2904,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() // MLTE control implementation (OSX part) // ---------------------------------------------------------------------------- -#if TARGET_API_MAC_OSX - -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 - // tiger multi-line textcontrols with no CR in the entire content // don't scroll automatically, so we need a hack. // This attempt only works 'before' the key (ie before CallNextEventHandler) @@ -3017,13 +2924,10 @@ static pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler { case kEventTextInputUnicodeForKeyEvent : { - if ( UMAGetSystemVersion() >= 0x1040 ) - { - TXNOffset from , to ; - TXNGetSelection( focus->GetTXNObject() , &from , &to ) ; - if ( from == to ) - TXNShowSelection( focus->GetTXNObject() , kTXNShowStart ); - } + TXNOffset from , to ; + TXNGetSelection( focus->GetTXNObject() , &from , &to ) ; + if ( from == to ) + TXNShowSelection( focus->GetTXNObject() , kTXNShowStart ); result = CallNextEventHandler(handler,event); break; } @@ -3069,12 +2973,20 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer, m_scrollView = NULL ; TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( style ) ; - if ( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask) ) + if (( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask)) || !(frameOptions &kTXNSingleLineOnlyMask)) { - HIScrollViewCreate( - (frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) - | (frameOptions & kTXNWantVScrollBarMask ? kHIScrollViewOptionsVertScroll : 0) , - &m_scrollView ) ; + if ( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask) ) + { + HIScrollViewCreate( + (frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) + | (frameOptions & kTXNWantVScrollBarMask ? kHIScrollViewOptionsVertScroll : 0) , + &m_scrollView ) ; + } + else + { + HIScrollViewCreate(kHIScrollViewOptionsVertScroll,&m_scrollView); + HIScrollViewSetScrollBarAutoHide(m_scrollView,true); + } HIViewSetFrame( m_scrollView, &hr ); HIViewSetVisible( m_scrollView, true ); @@ -3107,12 +3019,11 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer, InstallControlEventHandler( m_textView , GetwxMacTextControlEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, - &m_textEventHandlerRef); + NULL); } wxMacMLTEHIViewControl::~wxMacMLTEHIViewControl() { - ::RemoveEventHandler( m_textEventHandlerRef ) ; } OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart ) @@ -3123,6 +3034,9 @@ OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart ) bool wxMacMLTEHIViewControl::HasFocus() const { ControlRef control ; + if ( GetUserFocusWindow() == NULL ) + return false; + GetKeyboardFocus( GetUserFocusWindow() , &control ) ; return control == m_textView ; } @@ -3133,7 +3047,8 @@ void wxMacMLTEHIViewControl::SetBackground( const wxBrush &brush ) #if 0 CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceRGB(); - RGBColor col = MAC_WXCOLORREF(brush.GetColour().GetPixel()) ; + RGBColor col; + brush.GetColour().GetRGBColor(&col) ; float component[4] ; component[0] = col.red / 65536.0 ; @@ -3147,9 +3062,4 @@ void wxMacMLTEHIViewControl::SetBackground( const wxBrush &brush ) #endif } -#endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 - - -#endif - #endif // wxUSE_TEXTCTRL