]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/textctrl.cpp
Added GetBordersForSizer(int *bordertop, int *borderOther)
[wxWidgets.git] / src / mac / textctrl.cpp
index 65bb0f8176db48abcd0224e53908a6656861b092..0f6f9e9ab7c5e6398ab6bf3f9084e5bbcbf9d936 100644 (file)
@@ -1,11 +1,11 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        textctrl.cpp
 // Purpose:     wxTextCtrl
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
+// Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -296,7 +296,13 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point
             case kmUPTextPart:
                 {   SetPort((**tpvars).fDrawingEnvironment);
                     wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
+#if !TARGET_CARBON 
                     TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
+#else
+                    EventRecord rec ;
+                    ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
+                    TXNClick( varsp->fTXNRec, &rec );
+#endif
                 }
                 break;
             
@@ -587,6 +593,7 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle )
           kTXNStartOffset,
           kTXNEndOffset);
         /* set the field's background */
+
     tback.bgType = kTXNBackgroundTypeRGB;
     tback.bg.color = rgbWhite;
     TXNSetBackground( varsp->fTXNRec, &tback);
@@ -656,15 +663,15 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-  m_macTE = NULL ;
-  m_macTXN = NULL ;
-  m_macTXNvars = NULL ;
-  m_macUsesTXN = false ;
-  m_editable = true ;
-
-  m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; 
-
-  m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
+    m_macTE = NULL ;
+    m_macTXN = NULL ;
+    m_macTXNvars = NULL ;
+    m_macUsesTXN = false ;
+    m_editable = true ;
+    
+    m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; 
+    
+    m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
     
     // base initialization
     if ( !CreateBase(parent, id, pos, size, style, validator, name) )
@@ -695,7 +702,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         mySize.y += 2 * m_macVerticalBorder ;
     }
     */
-    MacPreControlCreate( parent , id ,  "" , pos , mySize ,style, validator , name , &bounds , title ) ;
+    MacPreControlCreate( parent , id ,  wxEmptyString , pos , mySize ,style, validator , name , &bounds , title ) ;
 
     if ( m_windowStyle & wxTE_MULTILINE )
     {
@@ -729,25 +736,13 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0);
             /* set up the mUP specific features and data */
         mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
-        /*
-        if ( parent )
-        {
-            parent->MacGetTopLevelWindow()->MacInstallEventHandler() ;
-        }
-        */
     }
     MacPostControlCreate() ;
 
-    wxString value ;
-    
-    if( wxApp::s_macDefaultEncodingIsPC )
-        value = wxMacMakeMacStringFromPC( st ) ;
-    else
-        value = st ;
-        
     if ( !m_macUsesTXN )
     {
-        ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
     }
     else
     {
@@ -755,60 +750,91 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
             /* set up locals */
         tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
             /* set the text in the record */
-        TXNSetData( (**tpvars).fTXNRec, kTXNTextData,  (void*)value.c_str(), value.Length(),
-          kTXNStartOffset, kTXNEndOffset);
         m_macTXN =  (**tpvars).fTXNRec ;
+#if wxUSE_UNICODE
+        TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData,  (void*)st.wc_str(), st.Length() * 2,
+          kTXNStartOffset, kTXNEndOffset);
+#else
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData,  (void*)text.data(), strlen( text ) ,
+          kTXNStartOffset, kTXNEndOffset);
+#endif
         m_macTXNvars = tpvars ;
         m_macUsesTXN = true ;
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
     }
   
-  return TRUE;
+    return TRUE;
 }
 
 wxString wxTextCtrl::GetValue() const
 {
-    Size actualsize;
-    
+    Size actualSize = 0;
+    wxString result ;
+    OSStatus err ;
     if ( !m_macUsesTXN )
     {
-        ::GetControlData( (ControlHandle) m_macControl, 0,
-            ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, 
-            32767 , wxBuffer , &actualsize ) ;
+        err = ::GetControlDataSize((ControlHandle) m_macControl, 0,
+            ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, &actualSize ) ;
+       
+       if ( err )
+           return wxEmptyString ;
+       
+       if ( actualSize > 0 )
+       {
+                       wxCharBuffer buf(actualSize) ;            
+            ::GetControlData( (ControlHandle) m_macControl, 0,
+                ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, 
+                actualSize , buf.data() , &actualSize ) ;
+            result = wxMacMakeStringFromCString( buf ) ;
+        }
     }
     else
     {
+#if wxUSE_UNICODE
         Handle theText ;
-        OSStatus err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+        err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData );
         // all done
         if ( err )
         {
-            actualsize = 0 ;
+            actualSize = 0 ;
         }
         else
         {
-            actualsize = GetHandleSize( theText ) ;
-            if (actualsize != 0)
-              strncpy( wxBuffer , *theText , actualsize ) ;
+            actualSize = GetHandleSize( theText ) ;
+            if ( actualSize > 0 )
+            {
+                wxChar *ptr = result.GetWriteBuf(actualSize*sizeof(wxChar)) ;
+                wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
+                ptr[actualSize] = 0 ;
+                result.UngetWriteBuf( actualSize ) ;
+            }
             DisposeHandle( theText ) ;
         }
+#else
+        Handle theText ;
+        err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+        // all done
+        if ( err )
+        {
+            actualSize = 0 ;
+        }
+        else
+        {
+            actualSize = GetHandleSize( theText ) ;
+            if ( actualSize > 0 )
+            {
+                HLock( theText ) ;
+                result = wxMacMakeStringFromCString( *theText , actualSize ) ;
+                HUnlock( theText ) ;
+            }
+            DisposeHandle( theText ) ;
+        }
+#endif
     }
     
-    wxBuffer[actualsize] = 0 ;
-    
-    wxString value;
-
-    if( wxApp::s_macDefaultEncodingIsPC )
-    {
-        value = wxMacMakePCStringFromMac( wxBuffer ) ;
-        value.Replace( "\r", "\n" );
-    }
-    else
-        value = wxBuffer;
-        
-    
-    return value;
+    return result ;
 }
 
 void wxTextCtrl::GetSelection(long* from, long* to) const
@@ -826,28 +852,24 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
 
 void wxTextCtrl::SetValue(const wxString& st)
 {
-    wxString value;
-    
-    if( wxApp::s_macDefaultEncodingIsPC )
-    {
-        value = wxMacMakeMacStringFromPC( st ) ;
-        value.Replace( "\n", "\r" );
-    }
-    else
-        value = st;
-        
-        
     if ( !m_macUsesTXN )
     {
-        ::SetControlData((ControlHandle)  m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
     }
     else
     {
         bool formerEditable = IsEditable() ;
         if ( !formerEditable )
             SetEditable(true) ;
-        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
+#if wxUSE_UNICODE
+        TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData,  (void*)st.wc_str(), st.Length() * 2 ,
+          kTXNStartOffset, kTXNEndOffset);
+#else
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)text.data(), strlen( text ) ,
           kTXNStartOffset, kTXNEndOffset);
+#endif
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
         if ( !formerEditable )
@@ -877,7 +899,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
         if ( style.HasFont() )
         {
             const wxFont &font = style.GetFont() ;
-            CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ;
+            wxMacStringToPascal( font.GetFaceName() , fontName ) ;
             fontSize = font.GetPointSize() ;
             if ( font.GetUnderlined() )
                 fontStyle |= underline ;
@@ -911,7 +933,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
         {
             OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr,
                 start,end);
-            wxASSERT_MSG( status == noErr , "Couldn't set text attributes" ) ;
+            wxASSERT_MSG( status == noErr , wxT("Couldn't set text attributes") ) ;
         }
         if ( !formerEditable )
             SetEditable(formerEditable) ;
@@ -1083,42 +1105,42 @@ void wxTextCtrl::SetInsertionPointEnd()
 
 long wxTextCtrl::GetInsertionPoint() const
 {
-  long begin,end ;
-  GetSelection( &begin , &end ) ;
-  return begin ;
+    long begin,end ;
+    GetSelection( &begin , &end ) ;
+    return begin ;
 }
 
 long wxTextCtrl::GetLastPosition() const
 {
     if ( !m_macUsesTXN )
-  {
-    return (**((TEHandle) m_macTE)).teLength ;
-  }
-  else
-  {
-    Handle theText ;
-    long actualsize ;
-    OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
-        /* all done */
-    if ( err )
     {
-      actualsize = 0 ;
+        return (**((TEHandle) m_macTE)).teLength ;
     }
     else
     {
-      actualsize = GetHandleSize( theText ) ;
-      DisposeHandle( theText ) ;
+        Handle theText ;
+        long actualsize ;
+        OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+        /* all done */
+        if ( err )
+        {
+            actualsize = 0 ;
+        }
+        else
+        {
+            actualsize = GetHandleSize( theText ) ;
+            DisposeHandle( theText ) ;
+        }
+        return actualsize ;
     }
-    return actualsize ;
-  }
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& value)
 {
-  if ( !m_macUsesTXN )
-  {
+    if ( !m_macUsesTXN )
+    {
         ControlEditTextSelectionRec selection ;
-   
+        
         selection.selStart = from ;
         selection.selEnd = to ;
         ::SetControlData((ControlHandle)  m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
@@ -1133,8 +1155,13 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
             SetEditable(true) ;
         TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
         TXNClear( ((TXNObject) m_macTXN) ) ;
+#if wxUSE_UNICODE
+        TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData,  (void*)value.wc_str(), value.Length() * 2 ,
+          kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#else
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
-        kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+            kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#endif
         if ( !formerEditable )
             SetEditable( formerEditable ) ;
     }
@@ -1143,52 +1170,52 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
 
 void wxTextCtrl::Remove(long from, long to)
 {
-  if ( !m_macUsesTXN )
-  {
-    ControlEditTextSelectionRec selection ;
-   
-    selection.selStart = from ;
-    selection.selEnd = to ;
-    ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
-    TEDelete( ((TEHandle) m_macTE) ) ;
-  }
-  else
-  {
-    bool formerEditable = IsEditable() ;
-    if ( !formerEditable )
-        SetEditable(true) ;
-    TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; 
-    TXNClear( ((TXNObject) m_macTXN) ) ; 
-    if ( !formerEditable )
-        SetEditable( formerEditable ) ;
-  }
+    if ( !m_macUsesTXN )
+    {
+        ControlEditTextSelectionRec selection ;
+        
+        selection.selStart = from ;
+        selection.selEnd = to ;
+        ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+        TEDelete( ((TEHandle) m_macTE) ) ;
+    }
+    else
+    {
+        bool formerEditable = IsEditable() ;
+        if ( !formerEditable )
+            SetEditable(true) ;
+        TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; 
+        TXNClear( ((TXNObject) m_macTXN) ) ; 
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
+    }
     Refresh() ;
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
-
-  if ( !m_macUsesTXN )
-  {
-   ControlEditTextSelectionRec selection ;
-   selection.selStart = from ;
-   selection.selEnd = to ;
-   
-   TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ;
-   ::SetControlData((ControlHandle)  m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
-  }
-  else
-  {
-    STPTextPaneVars **tpvars;
+    
+    if ( !m_macUsesTXN )
+    {
+        ControlEditTextSelectionRec selection ;
+        selection.selStart = from ;
+        selection.selEnd = to ;
+        
+        TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ;
+        ::SetControlData((ControlHandle)  m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+    }
+    else
+    {
+        STPTextPaneVars **tpvars;
         /* set up our locals */
-    tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
+        tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
         /* and our drawing environment as the operation
         may force a redraw in the text area. */
-    SetPort((**tpvars).fDrawingEnvironment);
+        SetPort((**tpvars).fDrawingEnvironment);
         /* change the selection */
-    TXNSetSelection( (**tpvars).fTXNRec, from, to);
-    TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
-  }
+        TXNSetSelection( (**tpvars).fTXNRec, from, to);
+        TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+    }
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
@@ -1201,20 +1228,12 @@ bool wxTextCtrl::LoadFile(const wxString& file)
     return FALSE;
 }
 
-void wxTextCtrl::WriteText(const wxString& text)
-{
-    wxString value ;
-    if( wxApp::s_macDefaultEncodingIsPC )
-    {
-        value = wxMacMakeMacStringFromPC( text ) ;
-        value.Replace( "\n", "\r" );
-    }
-    else
-        value = text ;
-        
+void wxTextCtrl::WriteText(const wxString& st)
+{        
     if ( !m_macUsesTXN )
     {
-        TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ;
     }
     else
     {
@@ -1223,8 +1242,14 @@ void wxTextCtrl::WriteText(const wxString& text)
             SetEditable(true) ;
         long start , end , dummy ;
         GetSelection( &start , &dummy ) ;
-        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
+#if wxUSE_UNICODE
+        TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData,  (void*)st.wc_str(), st.Length() * 2 ,
           kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#else
+       wxCharBuffer text = wxMacStringToCString( st ) ;
+        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)text.data(), strlen( text ) ,
+          kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#endif
         GetSelection( &dummy , &end ) ;
         SetStyle( start , end , GetDefaultStyle() ) ;
         if ( !formerEditable )
@@ -1245,15 +1270,15 @@ void wxTextCtrl::Clear()
     {
         return ;
     }
-  if ( !m_macUsesTXN )
-  {
-    ::SetControlData((ControlHandle)  m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ;
-  }
-  else
-  {
+    if ( !m_macUsesTXN )
+    {
+        ::SetControlData((ControlHandle)  m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ;
+    }
+    else
+    {
         TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ;
         TXNClear((TXNObject)m_macTXN); 
-  }
+    }
     Refresh() ;
 }
 
@@ -1342,8 +1367,8 @@ void wxTextCtrl::DiscardEdits()
 
 int wxTextCtrl::GetNumberOfLines() const
 {
-  // TODO change this if possible to reflect real lines
-  wxString content = GetValue() ;
+    // TODO change this if possible to reflect real lines
+    wxString content = GetValue() ;
     
     int count = 1;
     for (size_t i = 0; i < content.Length() ; i++)
@@ -1372,8 +1397,8 @@ void wxTextCtrl::ShowPosition(long pos)
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
-  // TODO change this if possible to reflect real lines
-  wxString content = GetValue() ;
+    // TODO change this if possible to reflect real lines
+    wxString content = GetValue() ;
     
     // Find line first
     int count = 0;
@@ -1398,8 +1423,8 @@ int wxTextCtrl::GetLineLength(long lineNo) const
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-  // TODO change this if possible to reflect real lines
-  wxString content = GetValue() ;
+    // TODO change this if possible to reflect real lines
+    wxString content = GetValue() ;
 
     // Find line first
     int count = 0;
@@ -1408,7 +1433,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
         if (count == lineNo)
         {
             // Add chars in line then
-            wxString tmp("");
+            wxString tmp;
             
             for (size_t j = i; j < content.Length(); j++)
             {
@@ -1422,7 +1447,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
         }
         if (content[i] == '\r') count++;
     }
-    return "" ;
+    return wxEmptyString ;
 }
 
 /*
@@ -1572,7 +1597,7 @@ bool  wxTextCtrl::Show(bool show)
     
     bool retval = wxControl::Show( show ) ;
     
-    if ( former != m_macControlIsShown && show )
+    if ( former != m_macControlIsShown && m_macUsesTXN )
     {
         if ( m_macControlIsShown )
             TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,