]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
Ensure popup menus can display sub-menus.
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index f0c765b9cbb72af82f76b9782c84cc7f55c7fbf4..6aac442420314221f6fdb3b41583e0a4e894de5e 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"
@@ -170,6 +171,51 @@ private:
     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
 
 class wxMacMLTEControl : public wxMacTextControl
@@ -412,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 ) ;
     }
 
@@ -440,7 +486,7 @@ void wxTextCtrl::MacSuperChangedPosition()
 
 void wxTextCtrl::MacVisibilityChanged()
 {
-    GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
+    GetPeer()->VisibilityChanged( GetPeer()->IsVisible() );
 }
 
 void wxTextCtrl::MacCheckSpelling(bool check)
@@ -518,7 +564,7 @@ void wxTextCtrl::Cut()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
       }
 }
 
@@ -532,7 +578,7 @@ void wxTextCtrl::Paste()
 
         wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
     }
 }
 
@@ -782,6 +828,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
     bool eat_key = false ;
+    long from, to;
 
     if ( key == 'a' && event.MetaDown() )
     {
@@ -809,10 +856,11 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
 
     // Check if we have reached the max # of chars (if it is set), but still
     // allow navigation and deletion
+    GetSelection( &from, &to );
     if ( !IsMultiLine() && m_maxLength && GetValue().length() >= m_maxLength &&
         key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB &&
-        key != WXK_BACK && !( key == WXK_RETURN && (m_windowStyle & wxTE_PROCESS_ENTER) )
-       )
+        key != WXK_BACK && key != WXK_DELETE && !( key == WXK_RETURN && (m_windowStyle & wxTE_PROCESS_ENTER) ) &&
+        from == to )
     {
         // eat it, we don't want to add more than allowed # of characters
 
@@ -847,7 +895,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;
             }
 
@@ -1293,7 +1341,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 ;
@@ -1337,7 +1385,7 @@ wxString wxMacUnicodeTextControl::GetStringValue() const
     CFStringRef value = GetData<CFStringRef>(0, m_valueTag) ;
     if ( value )
     {
-        wxMacCFStringHolder cf(value) ;
+        wxCFStringRef cf(value) ;
         result = cf.AsString() ;
     }
 
@@ -1354,7 +1402,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 ) ) ;
 }
 
@@ -1420,7 +1468,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() ;
     }
 
@@ -1453,7 +1501,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 );
     }
@@ -1625,7 +1673,8 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle )
 
     if ( wxStyle & wxTE_MULTILINE )
     {
-        frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+        if ( ! (wxStyle & wxTE_DONTWRAP ) )
+            frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
 
         if ( !(wxStyle & wxTE_NO_VSCROLL) )
         {
@@ -1716,11 +1765,11 @@ void wxMacMLTEControl::AdjustCreationAttributes(const wxColour &background,
             | kTXNSupportFontCommandProcessing
             | kTXNSupportFontCommandUpdating;
 
-        // only spell check when not read-only 
+        // only spell check when not read-only
         // use system options for the default
-        bool checkSpelling = false ; 
+        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) )
             {
@@ -1728,11 +1777,11 @@ void wxMacMLTEControl::AdjustCreationAttributes(const wxColour &background,
             }
 #endif
         }
-        
+
         if ( checkSpelling )
             options |=
                 kTXNSupportSpellCheckCommandProcessing
-                | kTXNSupportSpellCheckCommandUpdating;              
+                | kTXNSupportSpellCheckCommandUpdating;
 
         TXNSetCommandEventSupport( m_txn , options ) ;
     }
@@ -1765,11 +1814,12 @@ void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , lo
     TXNTab* tabs = NULL;
 
     bool relayout = false;
+    wxFont font ;
 
     if ( style.HasFont() )
     {
         wxASSERT( typeAttrCount < WXSIZEOF(typeAttr) );
-        const wxFont &font = style.GetFont() ;
+        font = style.GetFont() ;
         typeAttr[typeAttrCount].tag = kTXNATSUIStyle ;
         typeAttr[typeAttrCount].size = kTXNATSUIStyleSize ;
         typeAttr[typeAttrCount].data.dataPtr = font.MacGetATSUStyle() ;
@@ -2257,40 +2307,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 ....
 
-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 ;
 
@@ -2549,7 +2565,7 @@ void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 WXUNUSED(thePar
     if ( textctrl == NULL )
         return ;
 
-    if ( textctrl->MacIsReallyShown() )
+    if ( textctrl->IsShownOnScreen() )
     {
         wxMacWindowClipper clipper( textctrl ) ;
         TXNDraw( m_txn , NULL ) ;
@@ -2562,7 +2578,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt1
     ControlPartCode result = kControlNoPart;
 
     wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference( m_controlRef );
-    if ( (textctrl != NULL) && textctrl->MacIsReallyShown() )
+    if ( (textctrl != NULL) && textctrl->IsShownOnScreen() )
     {
         if (PtInRect( where, &m_txnControlBounds ))
         {
@@ -2589,7 +2605,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxIn
     ControlPartCode result = kControlNoPart;
 
     wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference( m_controlRef );
-    if ( (textctrl != NULL) && textctrl->MacIsReallyShown() )
+    if ( (textctrl != NULL) && textctrl->IsShownOnScreen() )
     {
         Point startPt = { y , x } ;
 
@@ -2625,7 +2641,7 @@ void wxMacMLTEClassicControl::MacControlUserPaneIdleProc()
     if ( textctrl == NULL )
         return ;
 
-    if (textctrl->MacIsReallyShown())
+    if (textctrl->IsShownOnScreen())
     {
         if (IsControlActive(m_controlRef))
         {
@@ -2731,7 +2747,7 @@ wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
 
     AdjustCreationAttributes( *wxWHITE , true ) ;
 
-    MacSetObjectVisibility( wxPeer->MacIsReallyShown() ) ;
+    MacSetObjectVisibility( wxPeer->IsShownOnScreen() ) ;
 
     {
         wxString st = str ;
@@ -3019,7 +3035,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) )
         {