]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
moved win_gtk.h header to wx/gtk/private, it's for internal use only
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index b447b8ee3651cb546fc8896baa5df214afb31402..a8bcfbdef9078a56f6e45956ded57c8763b2e115 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "wx/filefn.h"
 #include "wx/sysopt.h"
+#include "wx/thread.h"
 
 #include "wx/mac/uma.h"
 #include "wx/mac/carbon/private/mactext.h"
@@ -141,6 +142,79 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( con
     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;
+};
+
+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 ) ;
+}
 
 // common parts for implementations based on MLTE
 
@@ -157,7 +231,7 @@ public :
     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() ;
@@ -174,23 +248,14 @@ 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)
     {
-#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() ;
 
@@ -227,7 +292,7 @@ public :
 
     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 ;
@@ -296,7 +361,6 @@ private :
 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)
@@ -394,7 +458,7 @@ void wxTextCtrl::CreatePeer(
 
     if ( !forceMLTE )
     {
-        if ( m_windowStyle & wxTE_MULTILINE )
+        if ( m_windowStyle & wxTE_MULTILINE || ( UMAGetSystemVersion() >= 0x1050 ) )
             m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
     }
 
@@ -425,10 +489,6 @@ void wxTextCtrl::MacVisibilityChanged()
     GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
 }
 
-void wxTextCtrl::MacEnabledStateChanged()
-{
-}
-
 void wxTextCtrl::MacCheckSpelling(bool check)
 {
     GetPeer()->CheckSpelling(check);
@@ -504,7 +564,7 @@ void wxTextCtrl::Cut()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
       }
 }
 
@@ -518,7 +578,7 @@ void wxTextCtrl::Paste()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
     }
 }
 
@@ -764,15 +824,6 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
         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() ;
@@ -842,7 +893,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
                 event.SetEventObject( this );
                 event.SetString( GetValue() );
-                if ( GetEventHandler()->ProcessEvent(event) )
+                if ( HandleWindowEvent(event) )
                     return;
             }
 
@@ -1028,52 +1079,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
 // ----------------------------------------------------------------------------
@@ -1251,8 +1256,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
@@ -1336,7 +1339,7 @@ bool wxMacUnicodeTextControl::Create( wxTextCtrl *wxPeer,
     Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
     wxString st = str ;
     wxMacConvertNewlines10To13( &st ) ;
-    wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
+    wxCFStringRef cf(st , m_font.GetEncoding()) ;
     CFStringRef cfr = cf ;
 
     m_valueTag = kControlEditTextCFStringTag ;
@@ -1380,7 +1383,7 @@ wxString wxMacUnicodeTextControl::GetStringValue() const
     CFStringRef value = GetData<CFStringRef>(0, m_valueTag) ;
     if ( value )
     {
-        wxMacCFStringHolder cf(value) ;
+        wxCFStringRef cf(value) ;
         result = cf.AsString() ;
     }
 
@@ -1397,7 +1400,7 @@ void wxMacUnicodeTextControl::SetStringValue( const wxString &str )
 {
     wxString st = str ;
     wxMacConvertNewlines10To13( &st ) ;
-    wxMacCFStringHolder cf( st , m_font.GetEncoding() ) ;
+    wxCFStringRef cf( st , m_font.GetEncoding() ) ;
     verify_noerr( SetData<CFStringRef>( 0, m_valueTag , cf ) ) ;
 }
 
@@ -1463,7 +1466,7 @@ void wxMacUnicodeTextControl::SetSelection( long from , long to )
     CFStringRef value = GetData<CFStringRef>(0, m_valueTag) ;
     if ( value )
     {
-        wxMacCFStringHolder cf(value) ;
+        wxCFStringRef cf(value) ;
         textLength = cf.AsString().length() ;
     }
 
@@ -1475,7 +1478,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 ;
@@ -1493,7 +1499,7 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str )
 
     if ( HasFocus() )
     {
-        wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
+        wxCFStringRef cf(st , m_font.GetEncoding() ) ;
         CFStringRef value = cf ;
         SetData<CFStringRef>( 0, kControlEditTextInsertCFStringRefTag, &value );
     }
@@ -1509,8 +1515,6 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str )
     }
 }
 
-#endif
-
 // ----------------------------------------------------------------------------
 // MLTE control implementation (common part)
 // ----------------------------------------------------------------------------
@@ -1667,7 +1671,8 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle )
 
     if ( wxStyle & wxTE_MULTILINE )
     {
-        frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+        if ( ! (wxStyle & wxTE_DONTWRAP ) )
+            frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
 
         if ( !(wxStyle & wxTE_NO_VSCROLL) )
         {
@@ -1745,52 +1750,46 @@ void wxMacMLTEControl::AdjustCreationAttributes(const wxColour &background,
 
     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
-                | 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 ( 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;
-
     tback.bgType = kTXNBackgroundTypeRGB;
-    tback.bg.color = MAC_WXCOLORREF( brush.GetColour().GetPixel() );
+    col.GetRGBColor(&tback.bg.color);
     TXNSetBackground( m_txn , &tback );
 }
 
@@ -1827,8 +1826,7 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
     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 ;
@@ -1994,7 +1992,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 ) ;
 }
@@ -2027,7 +2025,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 );
 }
@@ -2463,7 +2461,7 @@ void wxMacMLTEClassicControl::MacUpdatePosition()
         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 } ;
@@ -2891,7 +2889,7 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
     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 ;
@@ -2985,13 +2983,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;
         }
@@ -3037,7 +3032,7 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
 
     m_scrollView = NULL ;
     TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( style ) ;
-    if (( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask)) || !(frameOptions &kTXNSingleLineOnlyMask))
+    if (( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask)) || (frameOptions &kTXNSingleLineOnlyMask))
     {
         if ( frameOptions & (kTXNWantVScrollBarMask | kTXNWantHScrollBarMask) )
         {
@@ -3105,24 +3100,9 @@ bool wxMacMLTEHIViewControl::HasFocus() const
     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