]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
1. added wxEvtHandler::SafelyProcessEvent() and wxWindow::HandleWindowEvent() to...
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index 341d97c5e9700d98ea4efc46b4a5095e9c45a4f6..89ab18889a1b5d2ee60d856b40a9cdf0343f8a48 100644 (file)
@@ -141,6 +141,34 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( con
     return result ;
 }
 
     return result ;
 }
 
+class WXDLLEXPORT wxMacPortSaver
+{
+    DECLARE_NO_COPY_CLASS(wxMacPortSaver)
+
+public:
+    wxMacPortSaver( GrafPtr port );
+    ~wxMacPortSaver();
+private :
+    GrafPtr m_port;
+};
+
+
+/*
+ Clips to the visible region of a control within the current port
+ */
+
+class WXDLLEXPORT wxMacWindowClipper : public wxMacPortSaver
+{
+    DECLARE_NO_COPY_CLASS(wxMacWindowClipper)
+
+public:
+    wxMacWindowClipper( const wxWindow* win );
+    ~wxMacWindowClipper();
+private:
+    GrafPtr   m_newPort;
+    RgnHandle m_formerClip;
+    RgnHandle m_newClip;
+};
 
 // common parts for implementations based on MLTE
 
 
 // common parts for implementations based on MLTE
 
@@ -157,7 +185,7 @@ public :
     void AdjustCreationAttributes( const wxColour& background, bool visible ) ;
 
     virtual void SetFont( const wxFont & font, const wxColour& foreground, long windowStyle ) ;
     void AdjustCreationAttributes( const wxColour& background, bool visible ) ;
 
     virtual void SetFont( const wxFont & font, const wxColour& foreground, long windowStyle ) ;
-    virtual void SetBackground( const wxBrush &brush ) ;
+    virtual void SetBackgroundColour(const wxColour& col );
     virtual void SetStyle( long start, long end, const wxTextAttr& style ) ;
     virtual void Copy() ;
     virtual void Cut() ;
     virtual void SetStyle( long start, long end, const wxTextAttr& style ) ;
     virtual void Copy() ;
     virtual void Cut() ;
@@ -174,23 +202,14 @@ public :
 
     virtual bool HasOwnContextMenu() const
     {
 
     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)
     {
     }
 
     virtual void CheckSpelling(bool check)
     {
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-    TXNSetSpellCheckAsYouType( m_txn, (Boolean) check );
-#endif
+        TXNSetSpellCheckAsYouType( m_txn, (Boolean) check );
     }
     virtual void Clear() ;
 
     }
     virtual void Clear() ;
 
@@ -227,7 +246,7 @@ public :
 
     virtual OSStatus SetFocus( ControlFocusPart focusPart ) ;
     virtual bool HasFocus() const ;
 
     virtual OSStatus SetFocus( ControlFocusPart focusPart ) ;
     virtual bool HasFocus() const ;
-    virtual void SetBackground( const wxBrush &brush) ;
+    virtual void SetBackgroundColour(const wxColour& col ) ;
 
 protected :
     HIViewRef m_scrollView ;
 
 protected :
     HIViewRef m_scrollView ;
@@ -296,7 +315,6 @@ private :
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase)
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase)
-    EVT_ERASE_BACKGROUND( wxTextCtrl::OnEraseBackground )
     EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
     EVT_CHAR(wxTextCtrl::OnChar)
     EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
     EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
     EVT_CHAR(wxTextCtrl::OnChar)
     EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
@@ -394,7 +412,7 @@ void wxTextCtrl::CreatePeer(
 
     if ( !forceMLTE )
     {
 
     if ( !forceMLTE )
     {
-        if ( m_windowStyle & wxTE_MULTILINE )
+        if ( m_windowStyle & wxTE_MULTILINE || ( UMAGetSystemVersion() >= 0x1050 ) )
             m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
     }
 
             m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
     }
 
@@ -425,10 +443,6 @@ void wxTextCtrl::MacVisibilityChanged()
     GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
 }
 
     GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
 }
 
-void wxTextCtrl::MacEnabledStateChanged()
-{
-}
-
 void wxTextCtrl::MacCheckSpelling(bool check)
 {
     GetPeer()->CheckSpelling(check);
 void wxTextCtrl::MacCheckSpelling(bool check)
 {
     GetPeer()->CheckSpelling(check);
@@ -504,7 +518,7 @@ void wxTextCtrl::Cut()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
       }
 }
 
       }
 }
 
@@ -518,7 +532,7 @@ void wxTextCtrl::Paste()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
     }
 }
 
     }
 }
 
@@ -764,15 +778,6 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
         LoadFile( event.GetFiles()[0] );
 }
 
         LoadFile( event.GetFiles()[0] );
 }
 
-void wxTextCtrl::OnEraseBackground(wxEraseEvent& event)
-{
-    // all erasing should be done by the real mac control implementation
-    // while this is true for MLTE under classic, the HITextView is somehow
-    // transparent but background erase is not working correctly, so intercept
-    // things while we can...
-    event.Skip() ;
-}
-
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
@@ -842,7 +847,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
                 event.SetEventObject( this );
                 event.SetString( GetValue() );
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
                 event.SetEventObject( this );
                 event.SetString( GetValue() );
-                if ( GetEventHandler()->ProcessEvent(event) )
+                if ( HandleWindowEvent(event) )
                     return;
             }
 
                     return;
             }
 
@@ -1028,52 +1033,6 @@ bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
         return true ;
 }
 
         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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // implementation base class
 // ----------------------------------------------------------------------------
@@ -1251,8 +1210,6 @@ int wxMacTextControl::GetLineLength(long lineNo) const
 // standard unicode control implementation
 // ----------------------------------------------------------------------------
 
 // 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
 // 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
@@ -1475,7 +1432,10 @@ void wxMacUnicodeTextControl::SetSelection( long from , long to )
     else
     {
         from = wxMin(textLength,wxMax(from,0)) ;
     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 ;
     }
 
     sel.selStart = from ;
@@ -1509,8 +1469,6 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str )
     }
 }
 
     }
 }
 
-#endif
-
 // ----------------------------------------------------------------------------
 // MLTE control implementation (common part)
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // MLTE control implementation (common part)
 // ----------------------------------------------------------------------------
@@ -1667,7 +1625,8 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle )
 
     if ( wxStyle & wxTE_MULTILINE )
     {
 
     if ( wxStyle & wxTE_MULTILINE )
     {
-        frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+        if ( ! (wxStyle & wxTE_DONTWRAP ) )
+            frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
 
         if ( !(wxStyle & wxTE_NO_VSCROLL) )
         {
 
         if ( !(wxStyle & wxTE_NO_VSCROLL) )
         {
@@ -1745,55 +1704,54 @@ void wxMacMLTEControl::AdjustCreationAttributes(const wxColour &background,
 
     TXNBackground tback;
     tback.bgType = kTXNBackgroundTypeRGB;
 
     TXNBackground tback;
     tback.bgType = kTXNBackgroundTypeRGB;
-    tback.bg.color = MAC_WXCOLORREF( background.GetPixel() );
+    background.GetRGBColor( &tback.bg.color );
     TXNSetBackground( m_txn , &tback );
 
     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
-                | kTXNSupportFontCommandProcessing
-                | kTXNSupportFontCommandUpdating;
-
-            // only spell check when not read-only 
-            // use system options for the default
-            bool checkSpelling = false ; 
-            if ( !(m_windowStyle & wxTE_READONLY) )
-            {   
+        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 wxUSE_SYSTEM_OPTIONS
-                if ( wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) == 1) )
-                {
-                    checkSpelling = true ;
-                }
-#endif
+            if ( wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_SPELL_CHECKER ) == 1) )
+            {
+                checkSpelling = true ;
             }
             }
-            
-            if ( checkSpelling )
-                options |=
-                    kTXNSupportSpellCheckCommandProcessing
-                    | kTXNSupportSpellCheckCommandUpdating;              
-
-            TXNSetCommandEventSupport( m_txn , options ) ;
+#endif
         }
         }
+        
+        if ( checkSpelling )
+            options |=
+                kTXNSupportSpellCheckCommandProcessing
+                | kTXNSupportSpellCheckCommandUpdating;              
+
+        TXNSetCommandEventSupport( m_txn , options ) ;
     }
     }
-#endif
 }
 
 }
 
-void wxMacMLTEControl::SetBackground( const wxBrush &brush )
+void wxMacMLTEControl::SetBackgroundColour(const wxColour& col )
 {
 {
-    // currently only solid background are supported
     TXNBackground tback;
     TXNBackground tback;
-
     tback.bgType = kTXNBackgroundTypeRGB;
     tback.bgType = kTXNBackgroundTypeRGB;
-    tback.bg.color = MAC_WXCOLORREF( brush.GetColour().GetPixel() );
+    col.GetRGBColor(&tback.bg.color);
     TXNSetBackground( m_txn , &tback );
 }
 
     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] ;
 void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to )
 {
     TXNTypeAttributes typeAttr[4] ;
@@ -1804,9 +1762,9 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
     TXNControlTag    controlTags[4];
     TXNControlData   controlData[4];
     size_t controlAttrCount = 0;
     TXNControlTag    controlTags[4];
     TXNControlData   controlData[4];
     size_t controlAttrCount = 0;
-    
+
     TXNTab* tabs = NULL;
     TXNTab* tabs = NULL;
-    
+
     bool relayout = false;
 
     if ( style.HasFont() )
     bool relayout = false;
 
     if ( style.HasFont() )
@@ -1822,19 +1780,18 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
     if ( style.HasTextColour() )
     {
         wxASSERT( typeAttrCount < WXSIZEOF(typeAttr) );
     if ( style.HasTextColour() )
     {
         wxASSERT( typeAttrCount < WXSIZEOF(typeAttr) );
-        color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
-
+        style.GetTextColour().GetRGBColor( &color );
         typeAttr[typeAttrCount].tag = kTXNQDFontColorAttribute ;
         typeAttr[typeAttrCount].size = kTXNQDFontColorAttributeSize ;
         typeAttr[typeAttrCount].data.dataPtr = (void*) &color ;
         typeAttrCount++ ;
     }
         typeAttr[typeAttrCount].tag = kTXNQDFontColorAttribute ;
         typeAttr[typeAttrCount].size = kTXNQDFontColorAttributeSize ;
         typeAttr[typeAttrCount].data.dataPtr = (void*) &color ;
         typeAttrCount++ ;
     }
-    
+
     if ( style.HasAlignment() )
     {
         wxASSERT( controlAttrCount < WXSIZEOF(controlTags) );
         SInt32 align;
     if ( style.HasAlignment() )
     {
         wxASSERT( controlAttrCount < WXSIZEOF(controlTags) );
         SInt32 align;
-        
+
         switch ( style.GetAlignment() )
         {
             case wxTEXT_ALIGNMENT_LEFT:
         switch ( style.GetAlignment() )
         {
             case wxTEXT_ALIGNMENT_LEFT:
@@ -1848,13 +1805,13 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
                 break;
             case wxTEXT_ALIGNMENT_JUSTIFIED:
                 align = kTXNFullJust;
                 break;
             case wxTEXT_ALIGNMENT_JUSTIFIED:
                 align = kTXNFullJust;
-                break;  
+                break;
             default :
             case wxTEXT_ALIGNMENT_DEFAULT:
                 align = kTXNFlushDefault;
                 break;
         }
             default :
             case wxTEXT_ALIGNMENT_DEFAULT:
                 align = kTXNFlushDefault;
                 break;
         }
-        
+
         controlTags[controlAttrCount] = kTXNJustificationTag ;
         controlData[controlAttrCount].sValue = align ;
         controlAttrCount++ ;
         controlTags[controlAttrCount] = kTXNJustificationTag ;
         controlData[controlAttrCount].sValue = align ;
         controlAttrCount++ ;
@@ -1869,29 +1826,29 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
                                 &controlTags[controlAttrCount], &controlData[controlAttrCount]) );
         if ( style.HasLeftIndent() )
         {
                                 &controlTags[controlAttrCount], &controlData[controlAttrCount]) );
         if ( style.HasLeftIndent() )
         {
-            margins.leftMargin = style.GetLeftIndent() / 254.0 * 72 + 0.5;
+            margins.leftMargin = wxConvertToTXN(style.GetLeftIndent());
         }
         if ( style.HasRightIndent() )
         {
         }
         if ( style.HasRightIndent() )
         {
-            margins.rightMargin = style.GetRightIndent() / 254.0 * 72 + 0.5;
+            margins.rightMargin = wxConvertToTXN(style.GetRightIndent());
         }
         controlAttrCount++ ;
     }
         }
         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 )
     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 = tabarray[0] / 254.0 * 72 + 0.5;
+            controlData[controlAttrCount].tabValue.value = wxConvertToTXN(tabarray[0]);
         else
         else
-            controlData[controlAttrCount].tabValue.value = 72 ; 
+            controlData[controlAttrCount].tabValue.value = 72 ;
 
         controlData[controlAttrCount].tabValue.tabType = kTXNLeftTab;
         controlAttrCount++ ;
     }
 
         controlData[controlAttrCount].tabValue.tabType = kTXNLeftTab;
         controlAttrCount++ ;
     }
-    
+
     // unfortunately the relayout is not automatic
     if ( controlAttrCount > 0 )
     {
     // unfortunately the relayout is not automatic
     if ( controlAttrCount > 0 )
     {
@@ -1899,18 +1856,18 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
                                 controlTags, controlData) );
         relayout = true;
     }
                                 controlTags, controlData) );
         relayout = true;
     }
-    
+
     if ( typeAttrCount > 0 )
     {
         verify_noerr( TXNSetTypeAttributes( m_txn , typeAttrCount, typeAttr, from , to ) );
         relayout = true;
     }
     if ( typeAttrCount > 0 )
     {
         verify_noerr( TXNSetTypeAttributes( m_txn , typeAttrCount, typeAttr, from , to ) );
         relayout = true;
     }
-    
+
     if ( tabs != NULL )
     {
         delete[] tabs;
     }
     if ( tabs != NULL )
     {
         delete[] tabs;
     }
-    
+
     if ( relayout )
     {
         TXNRecalcTextLayout( m_txn );
     if ( relayout )
     {
         TXNRecalcTextLayout( m_txn );
@@ -1989,7 +1946,7 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString &str )
     wxMacWindowClipper c( m_peer ) ;
 #endif
 
     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 ) ;
 }
     TXNClear( m_txn ) ;
     SetTXNData( value, kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
 }
@@ -2022,7 +1979,7 @@ void wxMacMLTEControl::SetSelection( long from , long to )
     if ((from == -1) && (to == -1))
         TXNSelectAll( m_txn );
     else
     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 );
 }
 
     TXNShowSelection( m_txn, kTXNShowStart );
 }
@@ -2301,6 +2258,51 @@ 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 ....
 
 // 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 ....
 
+wxMacPortSaver::wxMacPortSaver( GrafPtr port )
+{
+    ::GetPort( &m_port );
+    ::SetPort( port );
+}
+
+wxMacPortSaver::~wxMacPortSaver()
+{
+    ::SetPort( m_port );
+}
+
+wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) :
+    wxMacPortSaver( (GrafPtr) GetWindowPort( (WindowRef) win->MacGetTopLevelWindowRef() ) )
+{
+    m_newPort = (GrafPtr) GetWindowPort( (WindowRef) win->MacGetTopLevelWindowRef() ) ;
+    m_formerClip = NewRgn() ;
+    m_newClip = NewRgn() ;
+    GetClip( m_formerClip ) ;
+
+    if ( win )
+    {
+        // guard against half constructed objects, this just leads to a empty clip
+        if ( win->GetPeer() )
+        {
+            int x = 0 , y = 0;
+            win->MacWindowToRootWindow( &x, &y ) ;
+
+            // get area including focus rect
+            HIShapeGetAsQDRgn( ((wxWindow*)win)->MacGetVisibleRegion(true).GetWXHRGN() , m_newClip );
+            if ( !EmptyRgn( m_newClip ) )
+                OffsetRgn( m_newClip , x , y ) ;
+        }
+
+        SetClip( m_newClip ) ;
+    }
+}
+
+wxMacWindowClipper::~wxMacWindowClipper()
+{
+    SetPort( m_newPort ) ;
+    SetClip( m_formerClip ) ;
+    DisposeRgn( m_newClip ) ;
+    DisposeRgn( m_formerClip ) ;
+}
+
 TXNScrollInfoUPP gTXNScrollInfoProc = NULL ;
 ControlActionUPP gTXNScrollActionProc = NULL ;
 
 TXNScrollInfoUPP gTXNScrollInfoProc = NULL ;
 ControlActionUPP gTXNScrollActionProc = NULL ;
 
@@ -2458,7 +2460,7 @@ void wxMacMLTEClassicControl::MacUpdatePosition()
         return ;
 
     Rect bounds ;
         return ;
 
     Rect bounds ;
-    UMAGetControlBoundsInWindowCoords( m_controlRef, &bounds );
+    GetRectInWindowCoords( &bounds );
 
     wxRect visRect = textctrl->MacGetClippedClientRect() ;
     Rect visBounds = { visRect.y , visRect.x , visRect.y + visRect.height , visRect.x + visRect.width } ;
 
     wxRect visRect = textctrl->MacGetClippedClientRect() ;
     Rect visBounds = { visRect.y , visRect.x , visRect.y + visRect.height , visRect.x + visRect.width } ;
@@ -2886,7 +2888,7 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc);
 
     // calculate the rectangles used by the control
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc);
 
     // calculate the rectangles used by the control
-    UMAGetControlBoundsInWindowCoords( m_controlRef, &bounds );
+    GetRectInWindowCoords( &bounds );
 
     m_txnControlBounds = bounds ;
     m_txnVisBounds = bounds ;
 
     m_txnControlBounds = bounds ;
     m_txnVisBounds = bounds ;
@@ -2980,13 +2982,10 @@ static pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler
     {
         case kEventTextInputUnicodeForKeyEvent :
         {
     {
         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;
         }
             result = CallNextEventHandler(handler,event);
             break;
         }
@@ -3095,29 +3094,14 @@ bool wxMacMLTEHIViewControl::HasFocus() const
     ControlRef control ;
     if ( GetUserFocusWindow() == NULL )
         return false;
     ControlRef control ;
     if ( GetUserFocusWindow() == NULL )
         return false;
-        
+
     GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
     return control == m_textView ;
 }
 
     GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
     return control == m_textView ;
 }
 
-void wxMacMLTEHIViewControl::SetBackground( const wxBrush &brush )
+void wxMacMLTEHIViewControl::SetBackgroundColour(const wxColour& col )
 {
 {
-    wxMacMLTEControl::SetBackground( brush ) ;
-
-#if 0
-    CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceRGB();
-    RGBColor col = MAC_WXCOLORREF(brush.GetColour().GetPixel()) ;
-
-    float component[4] ;
-    component[0] = col.red / 65536.0 ;
-    component[1] = col.green / 65536.0 ;
-    component[2] = col.blue / 65536.0 ;
-    component[3] = 1.0 ; // alpha
-
-    CGColorRef color = CGColorCreate( rgbSpace , component );
-    HITextViewSetBackgroundColor( m_textView , color );
-    CGColorSpaceRelease( rgbSpace );
-#endif
+    HITextViewSetBackgroundColor( m_textView, col.GetPixel() );
 }
 
 #endif // wxUSE_TEXTCTRL
 }
 
 #endif // wxUSE_TEXTCTRL