]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/textctrl.cpp
MSVC 5 does not have BIF_EDITBOX.
[wxWidgets.git] / src / mac / textctrl.cpp
index 141042b1aea070a11374ca6a806c073f631beea3..e825d8b3d44b3cb34082352b88b50b6ec2efadc0 100644 (file)
 #else
   #include <stat.h>
 #endif
-#include <fstream.h>
+
+#if wxUSE_STD_IOSTREAM
+    #if wxUSE_IOSTREAMH
+        #include <fstream.h>
+    #else
+        #include <fstream>
+    #endif
+#endif
 
 #include "wx/app.h"
 #include "wx/dc.h"
@@ -289,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;
             
@@ -332,12 +345,18 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) {
                     RectRgn((theRgn = NewRgn()), &varsp->fRTextArea);
                     TXNAdjustCursor(varsp->fTXNRec, theRgn);
                     DisposeRgn(theRgn);
-                 } else SetThemeCursor(kThemeArrowCursor);
+                 } 
+                 else 
+                 {
+                 // SetThemeCursor(kThemeArrowCursor);
+                 }
             } else {
                 /* if it's in our bounds, set the cursor */
                 GetControlBounds(theControl, &bounds);
                 if (PtInRect(mousep, &bounds))
-                    SetThemeCursor(kThemeArrowCursor);
+                {
+                //    SetThemeCursor(kThemeArrowCursor);
+                }
             }
             
             HSetState((Handle) tpvars, state);
@@ -529,29 +548,29 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle )
     TXNFrameOptions frameOptions = 
         kTXNDontDrawCaretWhenInactiveMask ;
     if ( ! ( wxStyle & wxTE_NOHIDESEL ) )
-           frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ;
-       
-       if ( wxStyle & wxTE_MULTILINE )
-       {
-           if ( ! ( wxStyle & wxTE_DONTWRAP ) )
-               frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
-           else
-           {
-               frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
-               frameOptions |= kTXNWantHScrollBarMask ;
-           }
-               
-           if ( !(wxStyle & wxTE_NO_VSCROLL ) )
-               frameOptions |= kTXNWantVScrollBarMask ;
-       }
-       else
-           frameOptions |= kTXNSingleLineOnlyMask ;
-           
-       if ( wxStyle & wxTE_READONLY )
-           frameOptions |= kTXNReadOnlyMask ;
+        frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ;
+    
+    if ( wxStyle & wxTE_MULTILINE )
+    {
+        if ( ! ( wxStyle & wxTE_DONTWRAP ) )
+            frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+        else
+        {
+            frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+            frameOptions |= kTXNWantHScrollBarMask ;
+        }
+            
+        if ( !(wxStyle & wxTE_NO_VSCROLL ) )
+            frameOptions |= kTXNWantVScrollBarMask ;
+    }
+    else
+        frameOptions |= kTXNSingleLineOnlyMask ;
+        
+    if ( wxStyle & wxTE_READONLY )
+        frameOptions |= kTXNReadOnlyMask ;
   
     TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
-           frameOptions ,
+        frameOptions ,
         kTXNTextEditStyleFrameType,
         kTXNTextensionFile,
         kTXNSystemDefaultEncoding, 
@@ -715,11 +734,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
             /* create the control */
         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() ;
-        }
+        mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
     }
     MacPostControlCreate() ;
 
@@ -745,7 +760,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         m_macTXN =  (**tpvars).fTXNRec ;
         m_macTXNvars = tpvars ;
         m_macUsesTXN = true ;
-       TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+        TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
     }
   
@@ -754,44 +769,53 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
 
 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 )
+               {
+               wxChar *ptr = result.GetWriteBuf(actualSize) ;
+               
+               ::GetControlData( (ControlHandle) m_macControl, 0,
+                   ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, 
+                   actualSize , ptr , &actualSize ) ;
+               ptr[actualSize] = 0 ;
+               result.UngetWriteBuf(actualSize) ;
+        }
+        
     }
     else
     {
         Handle theText ;
-        OSStatus err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+        err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
         // all done
         if ( err )
         {
-            actualsize = 0 ;
+            actualSize = 0 ;
         }
         else
         {
-            actualsize = GetHandleSize( theText ) ;
-            if (actualsize != 0)
-              strncpy( wxBuffer , *theText , actualsize ) ;
-            DisposeHandle( theText ) ;
+            actualSize = GetHandleSize( theText ) ;
+               if ( actualSize > 0 )
+               {
+                       wxChar *ptr = result.GetWriteBuf(actualSize) ;
+                   strncpy( ptr , *theText , actualSize ) ;
+                   ptr[actualSize] = 0 ;
+                   result.UngetWriteBuf( actualSize ) ;
+               }
+               DisposeHandle( theText ) ;
         }
     }
     
-    wxBuffer[actualsize] = 0 ;
-    
-    wxString value;
-
-    if( wxApp::s_macDefaultEncodingIsPC )
-        value = wxMacMakePCStringFromMac( wxBuffer ) ;
-    else
-        value = wxBuffer;
-        
-    value.Replace( "\r", "\n" );
-    
-    return value;
+    return wxMacMakeStringFromMacString( result ) ;
 }
 
 void wxTextCtrl::GetSelection(long* from, long* to) const
@@ -812,11 +836,13 @@ void wxTextCtrl::SetValue(const wxString& st)
     wxString value;
     
     if( wxApp::s_macDefaultEncodingIsPC )
+    {
         value = wxMacMakeMacStringFromPC( st ) ;
+        // value.Replace( "\n", "\r" ); TODO this should be handled by the conversion
+    }
     else
         value = st;
         
-    value.Replace( "\n", "\r" );
         
     if ( !m_macUsesTXN )
     {
@@ -825,12 +851,14 @@ void wxTextCtrl::SetValue(const wxString& st)
     else
     {
         bool formerEditable = IsEditable() ;
-        SetEditable(true) ;
-       TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
-         kTXNStartOffset, kTXNEndOffset);
-       TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+        if ( !formerEditable )
+            SetEditable(true) ;
+        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
+          kTXNStartOffset, kTXNEndOffset);
+        TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
-        SetEditable(formerEditable) ;
+        if ( !formerEditable )
+            SetEditable(formerEditable) ;
     }
     MacRedrawControl() ;
 }
@@ -845,52 +873,55 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
     if ( m_macUsesTXN )
     {
         bool formerEditable = IsEditable() ;
-        SetEditable(true) ;
-               TXNTypeAttributes typeAttr[4] ;
-               Str255 fontName = "\pMonaco" ;
-               SInt16 fontSize = 12 ;
-               Style fontStyle = normal ;
-               RGBColor color ;
-               int attrCounter = 0 ;
-               if ( style.HasFont() )
-               {
-                   const wxFont &font = style.GetFont() ;
-                   CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ;
-                   fontSize = font.GetPointSize() ;
-                   if ( font.GetUnderlined() )
-                       fontStyle |= underline ;
-                   if ( font.GetWeight() == wxBOLD )
-                       fontStyle |= bold ;
-                   if ( font.GetStyle() == wxITALIC )
-                       fontStyle |= italic ;
-                       
-                   typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
-                   typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
-                   typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
-                   typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
-                   typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
-                   typeAttr[attrCounter+1].data.dataValue =  (fontSize << 16) ;
-                   typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
-                   typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
-                   typeAttr[attrCounter+2].data.dataValue = fontStyle ;
-                   attrCounter += 3 ;
-                   
-               }
-               if ( style.HasTextColour() )
-               {
-                   typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ;
-                   typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ;
-                   typeAttr[attrCounter].data.dataPtr = (void*) &color ;
-                   color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
-                   attrCounter += 1 ;
-               }
+        if ( !formerEditable )
+            SetEditable(true) ;
+        TXNTypeAttributes typeAttr[4] ;
+        Str255 fontName = "\pMonaco" ;
+        SInt16 fontSize = 12 ;
+        Style fontStyle = normal ;
+        RGBColor color ;
+        int attrCounter = 0 ;
+        if ( style.HasFont() )
+        {
+            const wxFont &font = style.GetFont() ;
+            CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ;
+            fontSize = font.GetPointSize() ;
+            if ( font.GetUnderlined() )
+                fontStyle |= underline ;
+            if ( font.GetWeight() == wxBOLD )
+                fontStyle |= bold ;
+            if ( font.GetStyle() == wxITALIC )
+                fontStyle |= italic ;
+                
+            typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
+            typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
+            typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
+            typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
+            typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
+            typeAttr[attrCounter+1].data.dataValue =  (fontSize << 16) ;
+            typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
+            typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
+            typeAttr[attrCounter+2].data.dataValue = fontStyle ;
+            attrCounter += 3 ;
+            
+        }
+        if ( style.HasTextColour() )
+        {
+            typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ;
+            typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ;
+            typeAttr[attrCounter].data.dataPtr = (void*) &color ;
+            color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
+            attrCounter += 1 ;
+        }
            
         if ( attrCounter > 0 )
         {
             OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr,
                 start,end);
+            wxASSERT_MSG( status == noErr , "Couldn't set text attributes" ) ;
         }
-        SetEditable(formerEditable) ;
+        if ( !formerEditable )
+            SetEditable(formerEditable) ;
     }
     return TRUE ;
 }
@@ -995,7 +1026,6 @@ bool wxTextCtrl::CanPaste() const
     if (!IsEditable())
         return FALSE;
 
-    long offset ;
 #if TARGET_CARBON
     OSStatus err = noErr;
     ScrapRef scrapRef;
@@ -1017,6 +1047,7 @@ bool wxTextCtrl::CanPaste() const
     return FALSE;
     
 #else
+    long offset ;
     if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
     {
         return TRUE ;
@@ -1033,14 +1064,14 @@ void wxTextCtrl::SetEditable(bool editable)
         if ( !m_macUsesTXN )
         {
             if ( editable )
-               UMAActivateControl( (ControlHandle) m_macControl ) ;
+                UMAActivateControl( (ControlHandle) m_macControl ) ;
             else
-               UMADeactivateControl((ControlHandle)  m_macControl ) ;
+                UMADeactivateControl((ControlHandle)  m_macControl ) ;
         }
         else
         {
             TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
-            TXNControlData data[] = { editable ? kTXNReadWrite : kTXNReadOnly } ;
+            TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
             TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
         }
     }
@@ -1105,12 +1136,14 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
     else
     {
         bool formerEditable = IsEditable() ;
-        SetEditable(true) ;
-           TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
-           TXNClear( ((TXNObject) m_macTXN) ) ;
-           TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
-           kTXNUseCurrentSelection, kTXNUseCurrentSelection);
-           SetEditable( formerEditable ) ;
+        if ( !formerEditable )
+            SetEditable(true) ;
+        TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
+        TXNClear( ((TXNObject) m_macTXN) ) ;
+        TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
+        kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
     }
     Refresh() ;
 }
@@ -1129,10 +1162,12 @@ void wxTextCtrl::Remove(long from, long to)
   else
   {
     bool formerEditable = IsEditable() ;
-    SetEditable(true) ;
+    if ( !formerEditable )
+        SetEditable(true) ;
     TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; 
     TXNClear( ((TXNObject) m_macTXN) ) ; 
-    SetEditable( formerEditable ) ;
+    if ( !formerEditable )
+        SetEditable( formerEditable ) ;
   }
     Refresh() ;
 }
@@ -1177,9 +1212,13 @@ void wxTextCtrl::WriteText(const wxString& text)
 {
     wxString value ;
     if( wxApp::s_macDefaultEncodingIsPC )
+    {
         value = wxMacMakeMacStringFromPC( text ) ;
+        // value.Replace( "\n", "\r" ); // TODO this should be handled by the conversion
+    }
     else
         value = text ;
+        
     if ( !m_macUsesTXN )
     {
         TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
@@ -1187,14 +1226,16 @@ void wxTextCtrl::WriteText(const wxString& text)
     else
     {
         bool formerEditable = IsEditable() ;
-        SetEditable(true) ;
-           long start , end , dummy ;
-           GetSelection( &start , &dummy ) ;
+        if ( !formerEditable )
+            SetEditable(true) ;
+        long start , end , dummy ;
+        GetSelection( &start , &dummy ) ;
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
           kTXNUseCurrentSelection, kTXNUseCurrentSelection);
-       GetSelection( &dummy , &end ) ;
+        GetSelection( &dummy , &end ) ;
         SetStyle( start , end , GetDefaultStyle() ) ;
-       SetEditable( formerEditable ) ;
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
     }
     MacRedrawControl() ;
 }
@@ -1217,8 +1258,8 @@ void wxTextCtrl::Clear()
   }
   else
   {
-            ClearCurrentScrap();
-            TXNClear((TXNObject)m_macTXN); 
+        TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ;
+        TXNClear((TXNObject)m_macTXN); 
   }
     Refresh() ;
 }
@@ -1312,7 +1353,7 @@ int wxTextCtrl::GetNumberOfLines() const
   wxString content = GetValue() ;
     
     int count = 1;
-    for (int i = 0; i < content.Length() ; i++)
+    for (size_t i = 0; i < content.Length() ; i++)
     {
         if (content[i] == '\r') count++;
     }
@@ -1343,13 +1384,13 @@ int wxTextCtrl::GetLineLength(long lineNo) const
     
     // Find line first
     int count = 0;
-    for (int i = 0; i < content.Length() ; i++)
+    for (size_t i = 0; i < content.Length() ; i++)
     {
         if (count == lineNo)
         {
             // Count chars in line then
             count = 0;
-            for (int j = i; j < content.Length(); j++)
+            for (size_t j = i; j < content.Length(); j++)
             {
                 count++;
                 if (content[j] == '\r') return count;
@@ -1369,14 +1410,14 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
 
     // Find line first
     int count = 0;
-    for (int i = 0; i < content.Length() ; i++)
+    for (size_t i = 0; i < content.Length() ; i++)
     {
         if (count == lineNo)
         {
             // Add chars in line then
             wxString tmp("");
             
-            for (int j = i; j < content.Length(); j++)
+            for (size_t j = i; j < content.Length(); j++)
             {
                 if (content[j] == '\r')
                     return tmp;
@@ -1538,7 +1579,7 @@ bool  wxTextCtrl::Show(bool show)
     
     bool retval = wxControl::Show( show ) ;
     
-    if ( former != m_macControlIsShown )
+    if ( former != m_macControlIsShown && show )
     {
         if ( m_macControlIsShown )
             TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, 
@@ -1555,27 +1596,27 @@ bool  wxTextCtrl::Show(bool show)
 // standard handlers for standard edit menu events
 // ----------------------------------------------------------------------------
 
-void wxTextCtrl::OnCut(wxCommandEvent& event)
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
 {
     Cut();
 }
 
-void wxTextCtrl::OnCopy(wxCommandEvent& event)
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
 {
     Copy();
 }
 
-void wxTextCtrl::OnPaste(wxCommandEvent& event)
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
 {
     Paste();
 }
 
-void wxTextCtrl::OnUndo(wxCommandEvent& event)
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
 {
     Undo();
 }
 
-void wxTextCtrl::OnRedo(wxCommandEvent& event)
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
 {
     Redo();
 }
@@ -1605,7 +1646,13 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
     event.Enable( CanRedo() );
 }
 
-
+bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
+{
+    if ( m_macUsesTXN )
+        return true ;
+    else
+        return wxWindow::MacSetupCursor( pt ) ;
+}
 
 #endif
     // wxUSE_TEXTCTRL