]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
metal appearance supported under 10.3
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index 0f5950f8e807dbc2af47b4c2af87f2cd2eb6fe88..8f28ec3dcc189088fb41081716f3055bf9553fe9 100644 (file)
 #ifndef __DARWIN__
 #include <Scrap.h>
 #endif
 #ifndef __DARWIN__
 #include <Scrap.h>
 #endif
+
+// 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
+
 #include <MacTextEditor.h>
 #include <ATSUnicode.h>
 #include <TextCommon.h>
 #include <MacTextEditor.h>
 #include <ATSUnicode.h>
 #include <TextCommon.h>
@@ -197,6 +204,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 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() ;
@@ -233,6 +241,8 @@ protected :
 
 // implementation available under OSX
 
 
 // implementation available under OSX
 
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
 class wxMacMLTEHIViewControl : public wxMacMLTEControl 
 {
 public :
 class wxMacMLTEHIViewControl : public wxMacMLTEControl 
 {
 public :
@@ -248,6 +258,8 @@ protected :
     HIViewRef m_textView ;
 } ;
 
     HIViewRef m_textView ;
 } ;
 
+#endif
+
 class wxMacUnicodeTextControl : public wxMacTextControl
 {
 public :
 class wxMacUnicodeTextControl : public wxMacTextControl
 {
 public :
@@ -273,7 +285,7 @@ protected :
     OSType m_valueTag ;
 } ;
 
     OSType m_valueTag ;
 } ;
 
-#else
+#endif
 
 // implementation available under classic
 
 
 // implementation available under classic
 
@@ -295,28 +307,13 @@ public :
     STPTextPaneVars*    m_macTXNvars ;
 } ;
 
     STPTextPaneVars*    m_macTXNvars ;
 } ;
 
-#endif
-// built-in TextCtrl
-
-
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
-#if TARGET_API_MAC_OSX
-    #define wxMAC_USE_MLTE 1
-    #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
-        #define wxMAC_USE_MLTE_HIVIEW 1
-    #else
-        #define wxMAC_USE_MLTE_HIVIEW 0
-    #endif
-#else
- // there is no unicodetextctrl on classic, and hopefully MLTE works better there
-    #define wxMAC_USE_MLTE 1
-    #define wxMAC_USE_MLTE_HIVIEW 0
-#endif
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
+    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)
@@ -357,19 +354,8 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     m_macIsUserPane = FALSE ;
     m_editable = true ;
 
     m_macIsUserPane = FALSE ;
     m_editable = true ;
 
-    // base initialization
-    
-    if ( !HasFlag(wxNO_BORDER) )
-    {
-#if wxMAC_USE_MLTE
-#if wxMAC_USE_MLTE_HIVIEW
-        style |= wxSUNKEN_BORDER ;
-#endif
-#endif
-    }
-    else
-    {
-    }
+    if ( ! ( style & wxNO_BORDER) )
+        style = ( style & ~wxBORDER_MASK) | wxSUNKEN_BORDER ;
     
     if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) )
         return FALSE;
     
     if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) )
         return FALSE;
@@ -386,15 +372,29 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         m_windowStyle |= wxTE_PROCESS_ENTER;
         style |= wxTE_PROCESS_ENTER ;
     }
         m_windowStyle |= wxTE_PROCESS_ENTER;
         style |= wxTE_PROCESS_ENTER ;
     }
-#if wxMAC_USE_MLTE
-#if wxMAC_USE_MLTE_HIVIEW
-    m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
-#else
-    m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ;
-#endif        
-#else // wxMAC_USE_MLTE
-    m_peer = new wxMacUnicodeTextControl( this , str , pos , size , style ) ;
+
+#if TARGET_API_MAC_OSX
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+    if ( UMAGetSystemVersion() >= 0x1030 )
+    {
+        m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
+    }
+#endif
+#if !wxMAC_AWAYS_USE_MLTE
+    if ( !m_peer )
+    {     
+        m_peer = new wxMacUnicodeTextControl( this , str , pos , size , style ) ;
+    }
+#endif
 #endif
 #endif
+    if ( !m_peer )
+    {
+        // this control draws the border itself
+        if ( !HasFlag(wxNO_BORDER) )
+            m_windowStyle &= ~wxSUNKEN_BORDER ;
+        m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ;
+    }
+
     MacPostControlCreate(pos,size) ;
 
     if ( m_windowStyle & wxTE_READONLY)
     MacPostControlCreate(pos,size) ;
 
     if ( m_windowStyle & wxTE_READONLY)
@@ -631,34 +631,35 @@ wxSize wxTextCtrl::DoGetBestSize() const
 
     int hText;
 
 
     int hText;
 
+    // these are the numbers from the HIG, we reduce them by the borders
+    // first
+
     switch( m_windowVariant )
     {
         case wxWINDOW_VARIANT_NORMAL :
     switch( m_windowVariant )
     {
         case wxWINDOW_VARIANT_NORMAL :
-            hText = 22 ;
+            hText = 22 - 6 ;
             break ;
         case wxWINDOW_VARIANT_SMALL :
             break ;
         case wxWINDOW_VARIANT_SMALL :
-            hText = 19 ;
+            hText = 19 - 6 ;
             break ;
         case wxWINDOW_VARIANT_MINI :
             break ;
         case wxWINDOW_VARIANT_MINI :
-            hText= 15 ;
+            hText= 15 - 6 ;
             break ;
         default :
             break ;
         default :
-            hText = 22 ;
+            hText = 22 - 6;
             break ; 
     }
 
             break ; 
     }
 
-#if !wxMAC_USE_MLTE
-    // unicode text control is using client size, ie 3 pixels on every side
-    // TODO make this fit into normal window size concept, probably having 
-    // to reintroduce the margin vars
-    hText -= 6 ;
-#endif
-
+    // as the above numbers have some free space around the text
+    // we get 5 lines like this anyway
     if ( m_windowStyle & wxTE_MULTILINE )
     {
          hText *= 5 ;
     }
 
     if ( m_windowStyle & wxTE_MULTILINE )
     {
          hText *= 5 ;
     }
 
+    if ( !HasFlag(wxNO_BORDER) )
+        hText += 6 ;
+
     return wxSize(wText, hText);
 }
 
     return wxSize(wText, hText);
 }
 
@@ -759,6 +760,14 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
     }
 }
 
+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...
+}
+
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
@@ -1253,7 +1262,7 @@ void wxMacUnicodeTextControl::WriteText(const wxString& str)
         val.Remove( start , end - start ) ;
         val.insert( start , str ) ;
         SetStringValue( val ) ;
         val.Remove( start , end - start ) ;
         val.insert( start , str ) ;
         SetStringValue( val ) ;
-        SetInsertionPoint( start + str.Length() ) ;
+        SetSelection( start + str.Length() , start + str.Length() ) ;
     #endif
 }
 
     #endif
 }
 
@@ -1343,7 +1352,7 @@ wxString wxMacMLTEControl::GetStringValue() const
         }
 #else
         Handle theText ;
         }
 #else
         Handle theText ;
-        err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+        err = TXNGetDataEncoded( m_txn , kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
         // all done
         if ( err )
         {
         // all done
         if ( err )
         {
@@ -1464,6 +1473,15 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo
     TXNSetBackground( m_txn , &tback);
 }
 
     TXNSetBackground( m_txn , &tback);
 }
 
+void wxMacMLTEControl::SetBackground( const wxBrush &brush ) 
+{
+    // currently only solid background are supported
+    TXNBackground tback;
+    tback.bgType = kTXNBackgroundTypeRGB;
+    tback.bg.color = MAC_WXCOLORREF( brush.GetColour().GetPixel() );
+    TXNSetBackground( m_txn , &tback);
+}
+
 int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes typeAttr[] )
 {
     Str255 fontName = "\pMonaco" ;
 int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes typeAttr[] )
 {
     Str255 fontName = "\pMonaco" ;
@@ -1493,7 +1511,6 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu
         typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
         typeAttr[attrCounter+2].data.dataValue = fontStyle ;
         attrCounter += 3 ;
         typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
         typeAttr[attrCounter+2].data.dataValue = fontStyle ;
         attrCounter += 3 ;
-        
     }
     if ( style.HasTextColour() )
     {
     }
     if ( style.HasTextColour() )
     {
@@ -1509,7 +1526,7 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu
 void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) 
 {
     EditHelper help(m_txn) ;
 void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) 
 {
     EditHelper help(m_txn) ;
-    wxTextAttr style(wxNullColour,wxNullColour,font) ;
+    wxTextAttr style(foreground,wxNullColour,font) ;
     TXNTypeAttributes typeAttr[4] ;
     int attrCounter = ConvertAttribute( style , typeAttr ) ;
     if ( attrCounter > 0 )
     TXNTypeAttributes typeAttr[4] ;
     int attrCounter = ConvertAttribute( style , typeAttr ) ;
     if ( attrCounter > 0 )
@@ -1870,8 +1887,6 @@ int  wxMacMLTEControl::GetLineLength(long lineNo) const
 // MLTE control implementation (classic part)
 // ----------------------------------------------------------------------------
 
 // MLTE control implementation (classic part)
 // ----------------------------------------------------------------------------
 
-#if !TARGET_API_MAC_OSX
-
 // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
 // the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
 // moment is to avoid setting the true focus on the control, the proper solution at the end would be to have
 // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
 // the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
 // moment is to avoid setting the true focus on the control, the proper solution at the end would be to have
@@ -2088,7 +2103,20 @@ static pascal ControlPartCode TPPaneHitTestProc(ControlRef theControl, Point whe
         if (PtInRect(where, &varsp->fRBounds))
             result = kmUPTextPart;
         else 
         if (PtInRect(where, &varsp->fRBounds))
             result = kmUPTextPart;
         else 
-            result = 0;
+        {
+            // 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 ;
+            }
+            if (PtInRect(where, &varsp->fRBounds))
+                result = kmUPTextPart;
+            else 
+                result = 0;
+        }
     }
     return result;
 }
     }
     return result;
 }
@@ -2436,15 +2464,14 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
     return err;
 }
 
     return err;
 }
 
-
-#endif
-
 // ----------------------------------------------------------------------------
 // MLTE control implementation (OSX part)
 // ----------------------------------------------------------------------------
 
 #if TARGET_API_MAC_OSX
 
 // ----------------------------------------------------------------------------
 // MLTE control implementation (OSX part)
 // ----------------------------------------------------------------------------
 
 #if TARGET_API_MAC_OSX
 
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
 wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
                          const wxString& str,
                          const wxPoint& pos,
 wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
                          const wxString& str,
                          const wxPoint& pos,
@@ -2509,9 +2536,12 @@ bool wxMacMLTEHIViewControl::HasFocus() const
 
 bool wxMacMLTEHIViewControl::NeedsFocusRect() const 
 {
 
 bool wxMacMLTEHIViewControl::NeedsFocusRect() const 
 {
-    return true ;
+    return m_windowStyle & wxNO_BORDER ? false : true;
 }
 
 }
 
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
+
 #endif
 
 #endif // wxUSE_TEXTCTRL
 #endif
 
 #endif // wxUSE_TEXTCTRL