]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/textctrl.cpp
Under Cygwin, in platform.h default to wxMSW unless otherwise specified.
[wxWidgets.git] / src / mac / textctrl.cpp
index 7f26d486852f5de4d4cde1e0298359274caeec4f..c678b88edcdf81badb06b84d6d53d3b1a86c5dcc 100644 (file)
 #else
   #include <stat.h>
 #endif
 #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"
 
 #include "wx/app.h"
 #include "wx/dc.h"
@@ -54,6 +61,7 @@
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
 
 extern wxApp *wxTheApp ;
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
 
 extern wxApp *wxTheApp ;
+extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
 
 // 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
 
 // 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
@@ -196,8 +204,10 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
             
             /* save the drawing state */
         SetPort((**tpvars).fDrawingEnvironment);
             
             /* save the drawing state */
         SetPort((**tpvars).fDrawingEnvironment);
-            /* verify our boundary */
+           /* verify our boundary */
         GetControlBounds(theControl, &bounds);
         GetControlBounds(theControl, &bounds);
+
+        wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
         if ( ! EqualRect(&bounds, &varsp->fRFocusOutline) ) {
             // scrollbar is on the border, we add one
             Rect oldbounds = varsp->fRFocusOutline ;
         if ( ! EqualRect(&bounds, &varsp->fRFocusOutline) ) {
             // scrollbar is on the border, we add one
             Rect oldbounds = varsp->fRFocusOutline ;
@@ -224,6 +234,7 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
         if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true);
             /* release our globals */
         HSetState((Handle) tpvars, state);
         if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true);
             /* release our globals */
         HSetState((Handle) tpvars, state);
+
     }
 }
 
     }
 }
 
@@ -284,6 +295,7 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point
                 /* handle clicks in the text part */
             case kmUPTextPart:
                 {   SetPort((**tpvars).fDrawingEnvironment);
                 /* handle clicks in the text part */
             case kmUPTextPart:
                 {   SetPort((**tpvars).fDrawingEnvironment);
+                    wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
                     TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
                 }
                 break;
                     TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
                 }
                 break;
@@ -314,6 +326,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) {
             varsp = *tpvars;
                 /* get the current mouse coordinates (in our window) */
             SetPortWindowPort(GetControlOwner(theControl));
             varsp = *tpvars;
                 /* get the current mouse coordinates (in our window) */
             SetPortWindowPort(GetControlOwner(theControl));
+            wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
             GetMouse(&mousep);
                 /* there's a 'focus thing' and an 'unfocused thing' */
             if (varsp->fInFocus) {
             GetMouse(&mousep);
                 /* there's a 'focus thing' and an 'unfocused thing' */
             if (varsp->fInFocus) {
@@ -326,12 +339,18 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) {
                     RectRgn((theRgn = NewRgn()), &varsp->fRTextArea);
                     TXNAdjustCursor(varsp->fTXNRec, theRgn);
                     DisposeRgn(theRgn);
                     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))
             } 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);
             }
             
             HSetState((Handle) tpvars, state);
@@ -351,6 +370,7 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlHandle theControl,
         if ((**tpvars).fInFocus) {
                 /* turn autoscrolling on and send the key event to text edit */
             SetPort((**tpvars).fDrawingEnvironment);
         if ((**tpvars).fInFocus) {
                 /* turn autoscrolling on and send the key event to text edit */
             SetPort((**tpvars).fDrawingEnvironment);
+            wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
             EventRecord ev ;
             memset( &ev , 0 , sizeof( ev ) ) ;
             ev.what = keyDown ;
             EventRecord ev ;
             memset( &ev , 0 , sizeof( ev ) ) ;
             ev.what = keyDown ;
@@ -378,6 +398,7 @@ static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activati
         varsp = *tpvars;
             /* de/activate the text edit record */
         SetPort((**tpvars).fDrawingEnvironment);
         varsp = *tpvars;
             /* de/activate the text edit record */
         SetPort((**tpvars).fDrawingEnvironment);
+        wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
             GetControlBounds(theControl, &bounds);
             varsp->fIsActive = activating;
             TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
             GetControlBounds(theControl, &bounds);
             varsp->fIsActive = activating;
             TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
@@ -423,6 +444,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF
                 define your own value for handling click-to-focus type events. */
             /* save the drawing state */
         SetPort((**tpvars).fDrawingEnvironment);
                 define your own value for handling click-to-focus type events. */
             /* save the drawing state */
         SetPort((**tpvars).fDrawingEnvironment);
+        wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
             /* calculate the next highlight state */
         switch (action) {
             default:
             /* calculate the next highlight state */
         switch (action) {
             default:
@@ -520,29 +542,29 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle )
     TXNFrameOptions frameOptions = 
         kTXNDontDrawCaretWhenInactiveMask ;
     if ( ! ( wxStyle & wxTE_NOHIDESEL ) )
     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,
   
     TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
-           frameOptions ,
+        frameOptions ,
         kTXNTextEditStyleFrameType,
         kTXNTextensionFile,
         kTXNSystemDefaultEncoding, 
         kTXNTextEditStyleFrameType,
         kTXNTextensionFile,
         kTXNSystemDefaultEncoding, 
@@ -706,7 +728,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 */
             /* 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 );
+        mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
         if ( parent )
         {
             parent->MacGetTopLevelWindow()->MacInstallEventHandler() ;
         if ( parent )
         {
             parent->MacGetTopLevelWindow()->MacInstallEventHandler() ;
@@ -736,6 +758,8 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         m_macTXN =  (**tpvars).fTXNRec ;
         m_macTXNvars = tpvars ;
         m_macUsesTXN = true ;
         m_macTXN =  (**tpvars).fTXNRec ;
         m_macTXNvars = tpvars ;
         m_macUsesTXN = true ;
+        TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+        TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
     }
   
   return TRUE;
     }
   
   return TRUE;
@@ -774,11 +798,13 @@ wxString wxTextCtrl::GetValue() const
     wxString value;
 
     if( wxApp::s_macDefaultEncodingIsPC )
     wxString value;
 
     if( wxApp::s_macDefaultEncodingIsPC )
+    {
         value = wxMacMakePCStringFromMac( wxBuffer ) ;
         value = wxMacMakePCStringFromMac( wxBuffer ) ;
+        value.Replace( "\r", "\n" );
+    }
     else
         value = wxBuffer;
         
     else
         value = wxBuffer;
         
-    value.Replace( "\r", "\n" );
     
     return value;
 }
     
     return value;
 }
@@ -801,11 +827,13 @@ void wxTextCtrl::SetValue(const wxString& st)
     wxString value;
     
     if( wxApp::s_macDefaultEncodingIsPC )
     wxString value;
     
     if( wxApp::s_macDefaultEncodingIsPC )
+    {
         value = wxMacMakeMacStringFromPC( st ) ;
         value = wxMacMakeMacStringFromPC( st ) ;
+        value.Replace( "\n", "\r" );
+    }
     else
         value = st;
         
     else
         value = st;
         
-    value.Replace( "\n", "\r" );
         
     if ( !m_macUsesTXN )
     {
         
     if ( !m_macUsesTXN )
     {
@@ -813,8 +841,15 @@ void wxTextCtrl::SetValue(const wxString& st)
     }
     else
     {
     }
     else
     {
+        bool formerEditable = IsEditable() ;
+        if ( !formerEditable )
+            SetEditable(true) ;
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
-                    kTXNStartOffset, kTXNEndOffset);
+          kTXNStartOffset, kTXNEndOffset);
+        TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+        TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+        if ( !formerEditable )
+            SetEditable(formerEditable) ;
     }
     MacRedrawControl() ;
 }
     }
     MacRedrawControl() ;
 }
@@ -828,50 +863,56 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
 {
     if ( m_macUsesTXN )
     {
 {
     if ( m_macUsesTXN )
     {
-               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 ;
-               }
+        bool formerEditable = IsEditable() ;
+        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);
            
         if ( attrCounter > 0 )
         {
             OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr,
                 start,end);
+            wxASSERT_MSG( status == noErr , "Couldn't set text attributes" ) ;
         }
         }
+        if ( !formerEditable )
+            SetEditable(formerEditable) ;
     }
     return TRUE ;
 }
     }
     return TRUE ;
 }
@@ -942,6 +983,7 @@ void wxTextCtrl::Paste()
         {
             TXNConvertFromPublicScrap();
             TXNPaste((TXNObject)m_macTXN); 
         {
             TXNConvertFromPublicScrap();
             TXNPaste((TXNObject)m_macTXN); 
+            SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
         }
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
         }
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
@@ -975,7 +1017,6 @@ bool wxTextCtrl::CanPaste() const
     if (!IsEditable())
         return FALSE;
 
     if (!IsEditable())
         return FALSE;
 
-    long offset ;
 #if TARGET_CARBON
     OSStatus err = noErr;
     ScrapRef scrapRef;
 #if TARGET_CARBON
     OSStatus err = noErr;
     ScrapRef scrapRef;
@@ -997,6 +1038,7 @@ bool wxTextCtrl::CanPaste() const
     return FALSE;
     
 #else
     return FALSE;
     
 #else
+    long offset ;
     if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
     {
         return TRUE ;
     if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
     {
         return TRUE ;
@@ -1010,10 +1052,19 @@ void wxTextCtrl::SetEditable(bool editable)
     if ( editable != m_editable )
     {
         m_editable = editable ;
     if ( editable != m_editable )
     {
         m_editable = editable ;
-    if ( editable )
-            UMAActivateControl( (ControlHandle) m_macControl ) ;
+        if ( !m_macUsesTXN )
+        {
+            if ( editable )
+                UMAActivateControl( (ControlHandle) m_macControl ) ;
+            else
+                UMADeactivateControl((ControlHandle)  m_macControl ) ;
+        }
         else
         else
-            UMADeactivateControl((ControlHandle)  m_macControl ) ;
+        {
+            TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
+            TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
+            TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
+        }
     }
 }
 
     }
 }
 
@@ -1075,10 +1126,15 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
     }
     else
     {
     }
     else
     {
-      TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
-      TXNClear( ((TXNObject) m_macTXN) ) ;
-      TXNSetData( ((TXNObject) m_macTXN), kTXNTextData,  (void*)value.c_str(), value.Length(),
+        bool formerEditable = IsEditable() ;
+        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);
         kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
     }
     Refresh() ;
 }
     }
     Refresh() ;
 }
@@ -1096,8 +1152,13 @@ void wxTextCtrl::Remove(long from, long to)
   }
   else
   {
   }
   else
   {
+    bool formerEditable = IsEditable() ;
+    if ( !formerEditable )
+        SetEditable(true) ;
     TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; 
     TXNClear( ((TXNObject) m_macTXN) ) ; 
     TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; 
     TXNClear( ((TXNObject) m_macTXN) ) ; 
+    if ( !formerEditable )
+        SetEditable( formerEditable ) ;
   }
     Refresh() ;
 }
   }
     Refresh() ;
 }
@@ -1124,6 +1185,7 @@ void wxTextCtrl::SetSelection(long from, long to)
     SetPort((**tpvars).fDrawingEnvironment);
         /* change the selection */
     TXNSetSelection( (**tpvars).fTXNRec, from, to);
     SetPort((**tpvars).fDrawingEnvironment);
         /* change the selection */
     TXNSetSelection( (**tpvars).fTXNRec, from, to);
+    TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
   }
 }
 
   }
 }
 
@@ -1141,21 +1203,30 @@ void wxTextCtrl::WriteText(const wxString& text)
 {
     wxString value ;
     if( wxApp::s_macDefaultEncodingIsPC )
 {
     wxString value ;
     if( wxApp::s_macDefaultEncodingIsPC )
+    {
         value = wxMacMakeMacStringFromPC( text ) ;
         value = wxMacMakeMacStringFromPC( text ) ;
+        value.Replace( "\n", "\r" );
+    }
     else
         value = text ;
     else
         value = text ;
+        
     if ( !m_macUsesTXN )
     {
         TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
     }
     else
     {
     if ( !m_macUsesTXN )
     {
         TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
     }
     else
     {
-           long start , end , dummy ;
-           GetSelection( &start , &dummy ) ;
+        bool formerEditable = IsEditable() ;
+        if ( !formerEditable )
+            SetEditable(true) ;
+        long start , end , dummy ;
+        GetSelection( &start , &dummy ) ;
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
           kTXNUseCurrentSelection, kTXNUseCurrentSelection);
         TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
           kTXNUseCurrentSelection, kTXNUseCurrentSelection);
-       GetSelection( &dummy , &end ) ;
+        GetSelection( &dummy , &end ) ;
         SetStyle( start , end , GetDefaultStyle() ) ;
         SetStyle( start , end , GetDefaultStyle() ) ;
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
     }
     MacRedrawControl() ;
 }
     }
     MacRedrawControl() ;
 }
@@ -1178,8 +1249,8 @@ void wxTextCtrl::Clear()
   }
   else
   {
   }
   else
   {
-            ClearCurrentScrap();
-            TXNClear((TXNObject)m_macTXN); 
+        TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ;
+        TXNClear((TXNObject)m_macTXN); 
   }
     Refresh() ;
 }
   }
     Refresh() ;
 }
@@ -1273,7 +1344,7 @@ int wxTextCtrl::GetNumberOfLines() const
   wxString content = GetValue() ;
     
     int count = 1;
   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++;
     }
     {
         if (content[i] == '\r') count++;
     }
@@ -1304,13 +1375,13 @@ int wxTextCtrl::GetLineLength(long lineNo) const
     
     // Find line first
     int count = 0;
     
     // 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;
     {
         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;
             {
                 count++;
                 if (content[j] == '\r') return count;
@@ -1330,14 +1401,14 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
 
     // Find line first
     int count = 0;
 
     // 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("");
             
     {
         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;
             {
                 if (content[j] == '\r')
                     return tmp;
@@ -1376,6 +1447,13 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
     int key = event.GetKeyCode() ;
     bool eat_key = false ;
     
     int key = event.GetKeyCode() ;
     bool eat_key = false ;
     
+    if ( key == 'c' && event.MetaDown() )
+    {
+        if ( CanCopy() )
+            Copy() ;
+        return ;
+    }
+    
     if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB && 
         !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) ) 
 /*        && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
     if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB && 
         !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) ) 
 /*        && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
@@ -1384,6 +1462,18 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
         // eat it
         return ;
     }
         // eat it
         return ;
     }
+    if ( key == 'v' && event.MetaDown() )
+    {
+        if ( CanPaste() )
+            Paste() ;
+        return ;
+    }
+    if ( key == 'x' && event.MetaDown() )
+    {
+        if ( CanCut() )
+            Cut() ;
+        return ;
+    }
     switch ( key )
     {
         case WXK_RETURN:
     switch ( key )
     {
         case WXK_RETURN:
@@ -1447,7 +1537,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
         // default handling
         event.Skip() ;
     }
         // default handling
         event.Skip() ;
     }
-    if ( key >= 0x20 ||
+    if ( ( key >= 0x20 && key < WXK_START ) ||
          key == WXK_RETURN ||
          key == WXK_DELETE || 
          key == WXK_BACK)
          key == WXK_RETURN ||
          key == WXK_DELETE || 
          key == WXK_BACK)
@@ -1480,7 +1570,7 @@ bool  wxTextCtrl::Show(bool show)
     
     bool retval = wxControl::Show( 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, 
     {
         if ( m_macControlIsShown )
             TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, 
@@ -1497,27 +1587,27 @@ bool  wxTextCtrl::Show(bool show)
 // standard handlers for standard edit menu events
 // ----------------------------------------------------------------------------
 
 // standard handlers for standard edit menu events
 // ----------------------------------------------------------------------------
 
-void wxTextCtrl::OnCut(wxCommandEvent& event)
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
 {
     Cut();
 }
 
 {
     Cut();
 }
 
-void wxTextCtrl::OnCopy(wxCommandEvent& event)
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
 {
     Copy();
 }
 
 {
     Copy();
 }
 
-void wxTextCtrl::OnPaste(wxCommandEvent& event)
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
 {
     Paste();
 }
 
 {
     Paste();
 }
 
-void wxTextCtrl::OnUndo(wxCommandEvent& event)
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
 {
     Undo();
 }
 
 {
     Undo();
 }
 
-void wxTextCtrl::OnRedo(wxCommandEvent& event)
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
 {
     Redo();
 }
 {
     Redo();
 }
@@ -1547,7 +1637,13 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
     event.Enable( CanRedo() );
 }
 
     event.Enable( CanRedo() );
 }
 
-
+bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
+{
+    if ( m_macUsesTXN )
+        return true ;
+    else
+        return wxWindow::MacSetupCursor( pt ) ;
+}
 
 #endif
     // wxUSE_TEXTCTRL
 
 #endif
     // wxUSE_TEXTCTRL