]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
fixed include dependency
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index 3e4445ebd2a9263f327cb6314211076ecb454c14..b1ae31ebe5eae8db343d3d6f4873eea58b71591c 100644 (file)
 #include "wx/mac/uma.h"
 
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
 #include "wx/mac/uma.h"
 
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
+#if TARGET_API_MAC_OSX
+ #define wxMAC_USE_MLTE 0
+ #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 wxMAC_USE_MLTE
+
+TXNFrameOptions FrameOptionsFromWXStyle( 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 ;
+    return frameOptions ;
+}
+
+void AdjustAttributesFromWXStyle( TXNObject txn , long wxStyle , bool visible )
+{
+    TXNControlTag iControlTags[3] = { kTXNDoFontSubstitution, kTXNWordWrapStateTag };
+    TXNControlData iControlData[3] = { {false}, {kTXNNoAutoWrap} };
+    int toptag = 2 ;
+#if TARGET_API_MAC_OSX
+    iControlTags[2] = kTXNVisibilityTag ;
+    iControlData[2].uValue = visible ;
+    toptag++ ;
+#endif        
+    
+    if ( wxStyle & wxTE_MULTILINE )
+    {
+        if (wxStyle & wxTE_DONTWRAP)
+            iControlData[1].uValue = kTXNNoAutoWrap ;
+        else
+            iControlData[1].uValue = kTXNAutoWrap ;
+        
+    }
+    verify_noerr( TXNSetTXNObjectControls( txn, false, toptag,
+                                        iControlTags, iControlData )) ;
+
+    Str255 fontName ;
+    SInt16 fontSize ;
+    Style fontStyle ;
+
+    GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+
+    TXNTypeAttributes typeAttr[] =
+    {
+        {   kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } ,
+        {   kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } ,
+        {   kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , {  (void*) normal } } ,
+    } ;
+
+    verify_noerr( TXNSetTypeAttributes (txn, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr,
+          kTXNStartOffset,
+          kTXNEndOffset) );
+
+}
+
+#if !wxMAC_USE_MLTE_HIVIEW
 
 // 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
@@ -571,26 +653,7 @@ OSStatus mUPOpenControl(STPTextPaneVars* &handle, ControlRef theControl, long wx
 
         /* create the new edit field */
 
 
         /* create the new edit field */
 
-    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 ;
+    TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( wxStyle ) ;
 
     verify_noerr(TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
         frameOptions ,
 
     verify_noerr(TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
         frameOptions ,
@@ -599,44 +662,7 @@ OSStatus mUPOpenControl(STPTextPaneVars* &handle, ControlRef theControl, long wx
         kTXNSystemDefaultEncoding,
         &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) varsp));
 
         kTXNSystemDefaultEncoding,
         &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) varsp));
 
-    TXNControlTag iControlTags[3] = { kTXNDoFontSubstitution, kTXNWordWrapStateTag };
-    TXNControlData iControlData[3] = { {false}, {kTXNNoAutoWrap} };
-    int toptag = 2 ;
-#if TARGET_API_MAC_OSX
-    iControlTags[2] = kTXNVisibilityTag ;
-    iControlData[2].uValue = varsp->fVisible ;
-    toptag++ ;
-#endif        
-    
-    if ( wxStyle & wxTE_MULTILINE )
-    {
-        if (wxStyle & wxTE_DONTWRAP)
-            iControlData[1].uValue = kTXNNoAutoWrap ;
-        else
-            iControlData[1].uValue = kTXNAutoWrap ;
-        
-    }
-    verify_noerr( TXNSetTXNObjectControls( varsp->fTXNRec, false, toptag,
-                                        iControlTags, iControlData )) ;
-
-    Str255 fontName ;
-    SInt16 fontSize ;
-    Style fontStyle ;
-
-    GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
-
-    TXNTypeAttributes typeAttr[] =
-    {
-        {   kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } ,
-        {   kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } ,
-        {   kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , {  (void*) normal } } ,
-    } ;
-
-    err = TXNSetTypeAttributes (varsp->fTXNRec, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr,
-          kTXNStartOffset,
-          kTXNEndOffset);
-
-
+    AdjustAttributesFromWXStyle( varsp->fTXNRec , wxStyle , varsp->fVisible ) ;
         /* perform final activations and setup for our text field.  Here,
         we assume that the window is going to be the 'active' window. */
     TPActivatePaneText(varsp, varsp->fIsActive && varsp->fInFocus);
         /* perform final activations and setup for our text field.  Here,
         we assume that the window is going to be the 'active' window. */
     TPActivatePaneText(varsp, varsp->fIsActive && varsp->fInFocus);
@@ -644,27 +670,11 @@ OSStatus mUPOpenControl(STPTextPaneVars* &handle, ControlRef theControl, long wx
     return err;
 }
 
     return err;
 }
 
+#else
+struct STPTextPaneVars
+{
+} ;
 
 
-
-
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
-
-BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
-    EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
-    EVT_CHAR(wxTextCtrl::OnChar)
-    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
-    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
-    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
-    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
-    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
-
-    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
-    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
-    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
-    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
-    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
-END_EVENT_TABLE()
 #endif
 
 static void SetTXNData( STPTextPaneVars *varsp, TXNObject txn , const wxString& st , TXNOffset start , TXNOffset end )
 #endif
 
 static void SetTXNData( STPTextPaneVars *varsp, TXNObject txn , const wxString& st , TXNOffset start , TXNOffset end )
@@ -690,6 +700,29 @@ static void SetTXNData( STPTextPaneVars *varsp, TXNObject txn , const wxString&
 #endif  
 }
 
 #endif  
 }
 
+
+#endif
+
+#if !USE_SHARED_LIBRARY
+IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
+
+BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
+    EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+    EVT_CHAR(wxTextCtrl::OnChar)
+    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
+END_EVENT_TABLE()
+#endif
+
 // Text item
 void wxTextCtrl::Init()
 {
 // Text item
 void wxTextCtrl::Init()
 {
@@ -704,11 +737,15 @@ void wxTextCtrl::Init()
 
 wxTextCtrl::~wxTextCtrl()
 {
 
 wxTextCtrl::~wxTextCtrl()
 {
-    SetControlReference((ControlRef)m_macControl, 0) ;
+#if wxMAC_USE_MLTE
+    SetControlReference(*m_peer, 0) ;
+#if !wxMAC_USE_MLTE_HIVIEW
     TXNDeleteObject((TXNObject)m_macTXN);
     TXNDeleteObject((TXNObject)m_macTXN);
+#endif
     /* delete our private storage */
     free(m_macTXNvars);
     /* zero the control reference */
     /* delete our private storage */
     free(m_macTXNvars);
     /* zero the control reference */
+#endif
 }
 
 
 }
 
 
@@ -743,21 +780,52 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
 
     wxString st = str ;
     wxMacConvertNewlines13To10( &st ) ;
 
     wxString st = str ;
     wxMacConvertNewlines13To10( &st ) ;
-#if 1
+#if wxMAC_USE_MLTE
     {
     {
+#if wxMAC_USE_MLTE_HIVIEW
+        HIRect hr = { bounds.left , bounds.top , bounds.right - bounds.left , bounds.bottom- bounds.top } ;
+        HIViewRef scrollView = NULL ;
+        TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( style ) ;
+
+        if ( frameOptions & (kTXNWantVScrollBarMask|kTXNWantHScrollBarMask) )
+        {
+            HIScrollViewCreate(( frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) | 
+                ( frameOptions & kTXNWantVScrollBarMask ? kHIScrollViewOptionsVertScroll: 0 ) , &scrollView ) ;
+           
+               HIViewSetFrame( scrollView, &hr );
+               HIViewSetVisible( scrollView, true );
+        }
+        HIViewRef textView ;
+        HITextViewCreate( NULL , 0, frameOptions , (ControlRef*) &textView ) ;
+        m_macTXN = HITextViewGetTXNObject( textView) ;
+        AdjustAttributesFromWXStyle( (TXNObject) m_macTXN , style , true ) ;
+        HIViewSetVisible( (ControlRef) textView , true ) ;
+        if ( scrollView )
+        {
+            HIViewAddSubview( scrollView , textView ) ;
+            m_peer = scrollView ;
+        }
+        else
+        {
+            m_peer = textView ;
+        }
+#else
         short featurSet;
 
         featurSet = kControlSupportsEmbedding | kControlSupportsFocus  | kControlWantsIdle
                 | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
                 | kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
             /* create the control */
         short featurSet;
 
         featurSet = kControlSupportsEmbedding | kControlSupportsFocus  | kControlWantsIdle
                 | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
                 | kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
             /* create the control */
-        m_macControl = (WXWidget) ::NewControl(MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, "\p", true , featurSet, 0, featurSet, kControlUserPaneProc,  (long) this );
-            /* set up the mUP specific features and data */
+        m_peer = new wxMacControl() ;
+        verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, *m_peer ) );
+        
         wxMacWindowClipper c(this) ;
         STPTextPaneVars *varsp ;
         wxMacWindowClipper c(this) ;
         STPTextPaneVars *varsp ;
-        mUPOpenControl( varsp, (ControlRef) m_macControl, m_windowStyle );
+        mUPOpenControl( varsp, *m_peer, m_windowStyle );
         m_macTXNvars = varsp ;
         m_macTXN =  varsp->fTXNRec ;
         m_macTXNvars = varsp ;
         m_macTXN =  varsp->fTXNRec ;
+#endif
+
         if ( style & wxTE_PASSWORD )
         {
             UniChar c = 0xA5 ;
         if ( style & wxTE_PASSWORD )
         {
             UniChar c = 0xA5 ;
@@ -766,12 +834,16 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     }
     MacPostControlCreate(pos,size) ;
         
     }
     MacPostControlCreate(pos,size) ;
         
+#if !wxMAC_USE_MLTE_HIVIEW
     if ( MacIsReallyShown() )
         MLTESetObjectVisibility( (STPTextPaneVars*) m_macTXNvars, true , GetWindowStyle() ) ;
     if ( MacIsReallyShown() )
         MLTESetObjectVisibility( (STPTextPaneVars*) m_macTXNvars, true , GetWindowStyle() ) ;
+#endif
 
     {
        wxMacWindowClipper clipper( this ) ;
 
     {
        wxMacWindowClipper clipper( this ) ;
-        TPUpdateVisibility( (ControlRef) m_macControl ) ;
+#if !wxMAC_USE_MLTE_HIVIEW
+        TPUpdateVisibility( *m_peer ) ;
+#endif
         SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
 
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
 
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
@@ -788,14 +860,25 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     tback.bg.color = MAC_WXCOLORREF( GetBackgroundColour().GetPixel() );
     TXNSetBackground( (TXNObject) m_macTXN , &tback);
 
     tback.bg.color = MAC_WXCOLORREF( GetBackgroundColour().GetPixel() );
     TXNSetBackground( (TXNObject) m_macTXN , &tback);
 
+#else
+    wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
+    CFStringRef cfr = cf ;
+    Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
+    m_peer = new wxMacControl() ;
+    CreateEditUnicodeTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds , cfr , isPassword , NULL , *m_peer ) ;
+    
+    if ( !(m_windowStyle & wxTE_MULTILINE) )
+    {
+        Boolean singleline = true ;
+        ::SetControlData( *m_peer, kControlEditTextPart , kControlEditTextSingleLineTag , sizeof( singleline ) , &singleline ) ;
+    }
+    MacPostControlCreate(pos,size) ;
+    
+#endif
     if ( m_windowStyle & wxTE_READONLY)
     {
         SetEditable( false ) ;
     }
     if ( m_windowStyle & wxTE_READONLY)
     {
         SetEditable( false ) ;
     }
-#else
-    wxMacCFStringHolder cf ;
-    CreateEditUnicodeTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds , cf , style & wxTE_PASSWORD , NULL , (ControlRef*) &m_macControl ) ;
-#endif
         
 
     return TRUE;
         
 
     return TRUE;
@@ -803,10 +886,32 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
 
 void wxTextCtrl::MacVisibilityChanged() 
 {
 
 void wxTextCtrl::MacVisibilityChanged() 
 {
+#if wxMAC_USE_MLTE 
+#if !wxMAC_USE_MLTE_HIVIEW
     MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , MacIsReallyShown() , GetWindowStyle() ) ;
     if ( !MacIsReallyShown() )
     MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , MacIsReallyShown() , GetWindowStyle() ) ;
     if ( !MacIsReallyShown() )
-        InvalWindowRect( GetControlOwner( (ControlHandle) m_macControl ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ;
-
+        InvalWindowRect( GetControlOwner( *m_peer ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ;
+#endif
+#else
+    if ( !(m_windowStyle & wxTE_MULTILINE) && MacIsReallyShown() )
+    {
+        // work around a refresh issue insofar as not always the entire content is shown even if this would be possible
+        ControlEditTextSelectionRec sel ;
+        CFStringRef value = NULL ;
+        Size    actualSize = 0 ;
+        ResType datatag = GetWindowStyle() & wxTE_PASSWORD ? 
+            kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag ;
+
+        verify_noerr( GetControlData( *m_peer , 0, kControlEditTextSelectionTag, 
+                    sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) );
+        verify_noerr( GetControlData( *m_peer , 0, datatag , sizeof(CFStringRef), &value, &actualSize ) );
+        
+        verify_noerr( SetControlData(  *m_peer , 0, datatag, sizeof(CFStringRef), &value ) );
+        verify_noerr( SetControlData(  *m_peer , 0, kControlEditTextSelectionTag, sizeof(ControlEditTextSelectionRec), &sel ) );
+                        
+        CFRelease( value ) ;
+    }
+#endif
 }
 
 void wxTextCtrl::MacEnabledStateChanged() 
 }
 
 void wxTextCtrl::MacEnabledStateChanged() 
@@ -816,10 +921,10 @@ void wxTextCtrl::MacEnabledStateChanged()
 
 wxString wxTextCtrl::GetValue() const
 {
 
 wxString wxTextCtrl::GetValue() const
 {
-    Size actualSize = 0;
     wxString result ;
     wxString result ;
+#if wxMAC_USE_MLTE
     OSStatus err ;
     OSStatus err ;
-
+    Size actualSize = 0;
     {
 #if wxUSE_UNICODE
         Handle theText ;
     {
 #if wxUSE_UNICODE
         Handle theText ;
@@ -878,13 +983,35 @@ wxString wxTextCtrl::GetValue() const
         }
 #endif
     }
         }
 #endif
     }
+#else
+    CFStringRef value = NULL ;
+    Size    actualSize = 0 ;
+
+    verify_noerr( GetControlData( *m_peer , 0, GetWindowStyle() & wxTE_PASSWORD ? 
+        kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag, 
+                    sizeof(CFStringRef), &value, &actualSize ) );
+    if ( value )
+    {
+        wxMacCFStringHolder cf(value) ;
+        result = cf.AsString() ;
+    }
+#endif
     wxMacConvertNewlines10To13( &result ) ;
     return result ;
 }
 
 void wxTextCtrl::GetSelection(long* from, long* to) const
     wxMacConvertNewlines10To13( &result ) ;
     return result ;
 }
 
 void wxTextCtrl::GetSelection(long* from, long* to) const
-{
+{    
+#if wxMAC_USE_MLTE
    TXNGetSelection( (TXNObject) m_macTXN , (TXNOffset*) from , (TXNOffset*) to ) ;
    TXNGetSelection( (TXNObject) m_macTXN , (TXNOffset*) from , (TXNOffset*) to ) ;
+#else
+    ControlEditTextSelectionRec sel ;
+    Size actualSize ;
+    verify_noerr( GetControlData( *m_peer , 0, kControlEditTextSelectionTag, 
+                    sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) );
+    if ( from ) *from = sel.selStart ;
+    if ( to ) *to = sel.selEnd ;
+#endif
 }
 
 void wxTextCtrl::SetValue(const wxString& str)
 }
 
 void wxTextCtrl::SetValue(const wxString& str)
@@ -895,21 +1022,30 @@ void wxTextCtrl::SetValue(const wxString& str)
 
     wxString st = str ;
     wxMacConvertNewlines13To10( &st ) ;
 
     wxString st = str ;
     wxMacConvertNewlines13To10( &st ) ;
-
+#if wxMAC_USE_MLTE
     {
         wxMacWindowClipper c( this ) ;
         bool formerEditable = m_editable ;
         if ( !formerEditable )
             SetEditable(true) ;
 
     {
         wxMacWindowClipper c( this ) ;
         bool formerEditable = m_editable ;
         if ( !formerEditable )
             SetEditable(true) ;
 
+#if !wxMAC_USE_MLTE_HIVIEW
         // otherwise scrolling might have problems ?
         TPUpdateVisibility( ( (STPTextPaneVars *)m_macTXNvars)->fUserPaneRec ) ;
         // otherwise scrolling might have problems ?
         TPUpdateVisibility( ( (STPTextPaneVars *)m_macTXNvars)->fUserPaneRec ) ;
+#endif
         SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
         if ( !formerEditable )
             SetEditable(formerEditable) ;
     }
         SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
         TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
         TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
         if ( !formerEditable )
             SetEditable(formerEditable) ;
     }
+#else
+    wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
+    CFStringRef value = cf ;
+    verify_noerr( SetControlData(  *m_peer , 0, GetWindowStyle() & wxTE_PASSWORD ? 
+        kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag, 
+        sizeof(CFStringRef), &value ) );
+#endif
 }
 
 void wxTextCtrl::SetMaxLength(unsigned long len)
 }
 
 void wxTextCtrl::SetMaxLength(unsigned long len)
@@ -922,6 +1058,7 @@ bool wxTextCtrl::SetFont( const wxFont& font )
     if ( !wxTextCtrlBase::SetFont( font ) )
         return FALSE ;
         
     if ( !wxTextCtrlBase::SetFont( font ) )
         return FALSE ;
         
+#if wxMAC_USE_MLTE        
     wxMacWindowClipper c( this ) ;
     bool formerEditable = m_editable ;
     if ( !formerEditable )
     wxMacWindowClipper c( this ) ;
     bool formerEditable = m_editable ;
     if ( !formerEditable )
@@ -958,11 +1095,13 @@ bool wxTextCtrl::SetFont( const wxFont& font )
 
     if ( !formerEditable )
         SetEditable(formerEditable) ;
 
     if ( !formerEditable )
         SetEditable(formerEditable) ;
+#endif
     return true ;
 }
 
 bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
 {
     return true ;
 }
 
 bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
 {
+#if wxMAC_USE_MLTE
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
@@ -1011,7 +1150,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
     }
     if ( !formerEditable )
         SetEditable(formerEditable) ;
     }
     if ( !formerEditable )
         SetEditable(formerEditable) ;
-
+#endif
     return TRUE ;
 }
 
     return TRUE ;
 }
 
@@ -1027,9 +1166,13 @@ void wxTextCtrl::Copy()
 {
     if (CanCopy())
     {
 {
     if (CanCopy())
     {
+#if wxMAC_USE_MLTE
         ClearCurrentScrap();
         TXNCopy((TXNObject)m_macTXN);
         TXNConvertToPublicScrap();
         ClearCurrentScrap();
         TXNCopy((TXNObject)m_macTXN);
         TXNConvertToPublicScrap();
+#else
+        m_peer->SendHICommand( kHICommandCopy ) ;
+#endif
     }
 }
 
     }
 }
 
@@ -1037,10 +1180,13 @@ void wxTextCtrl::Cut()
 {
     if (CanCut())
     {
 {
     if (CanCut())
     {
+#if wxMAC_USE_MLTE
         ClearCurrentScrap();
         TXNCut((TXNObject)m_macTXN);
         TXNConvertToPublicScrap();
         ClearCurrentScrap();
         TXNCut((TXNObject)m_macTXN);
         TXNConvertToPublicScrap();
-
+#else
+        m_peer->SendHICommand( kHICommandCut ) ;
+#endif
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
         event.SetEventObject( this );
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
         event.SetEventObject( this );
@@ -1052,11 +1198,13 @@ void wxTextCtrl::Paste()
 {
     if (CanPaste())
     {
 {
     if (CanPaste())
     {
-
+#if wxMAC_USE_MLTE
         TXNConvertFromPublicScrap();
         TXNPaste((TXNObject)m_macTXN);
         SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
         TXNConvertFromPublicScrap();
         TXNPaste((TXNObject)m_macTXN);
         SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
-
+#else
+        m_peer->SendHICommand( kHICommandPaste ) ;
+#endif
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
         event.SetEventObject( this );
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
         event.SetString( GetValue() ) ;
         event.SetEventObject( this );
@@ -1089,7 +1237,11 @@ bool wxTextCtrl::CanPaste() const
     if (!IsEditable())
         return FALSE;
 
     if (!IsEditable())
         return FALSE;
 
+#if wxMAC_USE_MLTE
     return TXNIsScrapPastable() ;
     return TXNIsScrapPastable() ;
+#else
+    return true ;
+#endif
 }
 
 void wxTextCtrl::SetEditable(bool editable)
 }
 
 void wxTextCtrl::SetEditable(bool editable)
@@ -1097,11 +1249,14 @@ void wxTextCtrl::SetEditable(bool editable)
     if ( editable != m_editable )
     {
         m_editable = editable ;
     if ( editable != m_editable )
     {
         m_editable = editable ;
-
+#if wxMAC_USE_MLTE
         TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
         TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
         TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
         TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
         TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
         TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
-
+#else
+        Boolean value = !editable ;
+        ::SetControlData( *m_peer, 0, kControlEditTextLockedTag , sizeof( value ) , &value ) ;
+#endif
     }
 }
 
     }
 }
 
@@ -1125,8 +1280,9 @@ long wxTextCtrl::GetInsertionPoint() const
 
 long wxTextCtrl::GetLastPosition() const
 {
 
 long wxTextCtrl::GetLastPosition() const
 {
+    long actualsize = 0 ;
+#if wxMAC_USE_MLTE
     Handle theText ;
     Handle theText ;
-    long actualsize ;
     OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
     /* all done */
     if ( err )
     OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
     /* all done */
     if ( err )
@@ -1138,11 +1294,13 @@ long wxTextCtrl::GetLastPosition() const
         actualsize = GetHandleSize( theText ) ;
         DisposeHandle( theText ) ;
     }
         actualsize = GetHandleSize( theText ) ;
         DisposeHandle( theText ) ;
     }
+#endif
     return actualsize ;
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& str)
 {
     return actualsize ;
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& str)
 {
+#if wxMAC_USE_MLTE
     wxString value = str ;
     wxMacConvertNewlines13To10( &value ) ;
 
     wxString value = str ;
     wxMacConvertNewlines13To10( &value ) ;
 
@@ -1156,10 +1314,12 @@ void wxTextCtrl::Replace(long from, long to, const wxString& str)
         SetEditable( formerEditable ) ;
 
     Refresh() ;
         SetEditable( formerEditable ) ;
 
     Refresh() ;
+#endif
 }
 
 void wxTextCtrl::Remove(long from, long to)
 {
 }
 
 void wxTextCtrl::Remove(long from, long to)
 {
+#if wxMAC_USE_MLTE
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
@@ -1169,20 +1329,26 @@ void wxTextCtrl::Remove(long from, long to)
         SetEditable( formerEditable ) ;
 
     Refresh() ;
         SetEditable( formerEditable ) ;
 
     Refresh() ;
+#endif
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
-    STPTextPaneVars *varsp = (STPTextPaneVars *) m_macTXNvars;
-    /* and our drawing environment as the operation
-    may force a redraw in the text area. */
-    SetPort(varsp->fDrawingEnvironment);
+#if wxMAC_USE_MLTE
     /* change the selection */
     if ((from == -1) && (to == -1))
        TXNSelectAll((TXNObject) m_macTXN);
     else
     /* change the selection */
     if ((from == -1) && (to == -1))
        TXNSelectAll((TXNObject) m_macTXN);
     else
-       TXNSetSelection( varsp->fTXNRec, from, to);
+       TXNSetSelection( (TXNObject) m_macTXN, from, to);
     TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
     TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+#else
+    ControlEditTextSelectionRec sel ;
+    sel.selStart = from ;
+    sel.selEnd = to ;
+    verify_noerr( SetControlData( *m_peer , 0, kControlEditTextSelectionTag, 
+                    sizeof(ControlEditTextSelectionRec), &sel ) );
+
+#endif
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
@@ -1195,23 +1361,141 @@ bool wxTextCtrl::LoadFile(const wxString& file)
     return FALSE;
 }
 
     return FALSE;
 }
 
-void wxTextCtrl::WriteText(const wxString& str)
+class wxMacFunctor
 {
 {
-    wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+public :  
+    wxMacFunctor(){}
+    virtual ~wxMacFunctor() {}
+    virtual void* operator()() = 0 ;
+    static void* CallBackProc(void *param) 
+    {
+        wxMacFunctor* f = (wxMacFunctor*) param ;
+        void *result = (*f)() ;
+        return result ;
+    }
+} ;
 
 
-    bool formerEditable = m_editable ;
-    if ( !formerEditable )
-        SetEditable(true) ;
-    long start , end , dummy ;
-    GetSelection( &start , &dummy ) ;
-    SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
-    GetSelection( &dummy , &end ) ;
-    SetStyle( start , end , GetDefaultStyle() ) ;
-    if ( !formerEditable )
-        SetEditable( formerEditable ) ;
+template<typename classtype,typename param1type>
+class wxMacObjectFunctor1 : public wxMacFunctor
+{
+    typedef void (classtype::*function)( param1type p1 ) ;
+    typedef void (classtype::*ref_function)( const param1type& p1 ) ;
+public :   
+    wxMacObjectFunctor1( classtype *obj , function f , param1type p1 ) :
+        wxMacFunctor(  )
+    {
+        m_object = obj ;
+        m_function = f ;
+        m_param1 = p1 ;
+    }
 
 
-    MacRedrawControl() ;
+    wxMacObjectFunctor1( classtype *obj , ref_function f , param1type p1 ) :
+        wxMacFunctor(  )
+    {
+        m_object = obj ;
+        m_refFunction = f ;
+        m_param1 = p1 ;
+    }
+
+    ~wxMacObjectFunctor1() {}
+    
+    virtual void* operator()() 
+    {
+        (m_object->*m_function)(m_param1) ;
+        return NULL ;
+    }
+private :
+    classtype* m_object ;
+    param1type m_param1 ;
+    union
+    {
+    function m_function ;
+    ref_function m_refFunction ;
+    } ;
+} ;
+
+template<typename classtype, typename param1type> 
+void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 )
+{
+    wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;   
+    void *result = 
+        MPRemoteCall( wxMacFunctor::CallBackProc , &params  , kMPOwningProcessRemoteContext ) ;
+    return result ;
+}
+
+template<typename classtype, typename param1type> 
+void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 )
+{
+    wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;   
+    void *result = 
+        MPRemoteCall( wxMacFunctor::CallBackProc , &params  , kMPOwningProcessRemoteContext ) ;
+    return result ;
+}
+
+template<typename classtype, typename param1type> 
+void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 )
+{
+    wxMutexGuiLeave() ;
+    void *result = wxMacMPRemoteCall( object , function , p1 ) ;
+    wxMutexGuiEnter() ;
+    return result ;
+}
+
+template<typename classtype, typename param1type> 
+void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 )
+{
+    wxMutexGuiLeave() ;
+    void *result = wxMacMPRemoteCall( object , function , p1 ) ;
+    wxMutexGuiEnter() ;
+    return result ;
+}
+
+void wxTextCtrl::WriteText(const wxString& str)
+{
+    if ( !wxIsMainThread() )
+    {
+        // unfortunately CW 8 is not able to correctly deduce the template types, so we have 
+        // to instantiate explicitely
+        wxMacMPRemoteGUICall<wxTextCtrl,wxString>( this , &wxTextCtrl::WriteText , str ) ;
+        return ;
+    }
+    else
+    {
+        wxString st = str ;
+        wxMacConvertNewlines13To10( &st ) ;
+    #if wxMAC_USE_MLTE
+        bool formerEditable = m_editable ;
+        if ( !formerEditable )
+            SetEditable(true) ;
+        {
+            wxMacWindowStateSaver s( this ) ;
+            long start , end , dummy ;
+            GetSelection( &start , &dummy ) ;
+            SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
+            GetSelection( &dummy , &end ) ;
+            SetStyle( start , end , GetDefaultStyle() ) ;
+        }
+        if ( !formerEditable )
+            SetEditable( formerEditable ) ;
+
+        MacRedrawControl() ;
+    #else
+    #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+        wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
+        CFStringRef value = cf ;
+        SetControlData(  *m_peer , 0, kControlEditTextInsertCFStringRefTag, 
+            sizeof(CFStringRef), &value );
+    #else
+        wxString val = GetValue() ;
+        long start , end ;
+        GetSelection( &start , &end ) ;
+        val.Remove( start , end - start ) ;
+        val.insert( start , str ) ;
+        SetValue( val ) ;
+        SetInsertionPoint( start + str.Length() ) ;
+    #endif
+    #endif
+    }
 }
 
 void wxTextCtrl::AppendText(const wxString& text)
 }
 
 void wxTextCtrl::AppendText(const wxString& text)
@@ -1222,6 +1506,7 @@ void wxTextCtrl::AppendText(const wxString& text)
 
 void wxTextCtrl::Clear()
 {
 
 void wxTextCtrl::Clear()
 {
+#if wxMAC_USE_MLTE
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
     bool formerEditable = m_editable ;
     if ( !formerEditable )
         SetEditable(true) ;
@@ -1232,6 +1517,9 @@ void wxTextCtrl::Clear()
         SetEditable( formerEditable ) ;
 
     Refresh() ;
         SetEditable( formerEditable ) ;
 
     Refresh() ;
+#else
+    SetValue(wxEmptyString) ;
+#endif
 }
 
 bool wxTextCtrl::IsModified() const
 }
 
 bool wxTextCtrl::IsModified() const
@@ -1272,6 +1560,13 @@ wxSize wxTextCtrl::DoGetBestSize() const
             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
+
     if ( m_windowStyle & wxTE_MULTILINE )
     {
          hText *= 5 ;
     if ( m_windowStyle & wxTE_MULTILINE )
     {
          hText *= 5 ;
@@ -1288,7 +1583,9 @@ void wxTextCtrl::Undo()
 {
     if (CanUndo())
     {
 {
     if (CanUndo())
     {
+#if wxMAC_USE_MLTE
         TXNUndo((TXNObject)m_macTXN); 
         TXNUndo((TXNObject)m_macTXN); 
+#endif
     }
 }
 
     }
 }
 
@@ -1296,7 +1593,9 @@ void wxTextCtrl::Redo()
 {
     if (CanRedo())
     {
 {
     if (CanRedo())
     {
+#if wxMAC_USE_MLTE
         TXNRedo((TXNObject)m_macTXN); 
         TXNRedo((TXNObject)m_macTXN); 
+#endif
     }
 }
 
     }
 }
 
@@ -1306,7 +1605,11 @@ bool wxTextCtrl::CanUndo() const
     {
         return false ; 
     }
     {
         return false ; 
     }
+#if wxMAC_USE_MLTE
     return TXNCanUndo((TXNObject)m_macTXN,NULL); 
     return TXNCanUndo((TXNObject)m_macTXN,NULL); 
+#else
+    return false ;
+#endif
 }
 
 bool wxTextCtrl::CanRedo() const
 }
 
 bool wxTextCtrl::CanRedo() const
@@ -1315,7 +1618,11 @@ bool wxTextCtrl::CanRedo() const
     {
         return false ; 
     }
     {
         return false ; 
     }
+#if wxMAC_USE_MLTE
     return TXNCanRedo((TXNObject)m_macTXN,NULL); 
     return TXNCanRedo((TXNObject)m_macTXN,NULL); 
+#else
+    return false ;
+#endif
 }
 
 // Makes modifie or unmodified
 }
 
 // Makes modifie or unmodified
@@ -1331,13 +1638,23 @@ void wxTextCtrl::DiscardEdits()
 
 int wxTextCtrl::GetNumberOfLines() const
 {
 
 int wxTextCtrl::GetNumberOfLines() const
 {
-    ItemCount lines ;
+    ItemCount lines = 0 ;
+#if wxMAC_USE_MLTE
     TXNGetLineCount((TXNObject)m_macTXN, &lines ) ;
     TXNGetLineCount((TXNObject)m_macTXN, &lines ) ;
+#else
+    wxString content = GetValue() ;
+    lines = 1;
+    for (size_t i = 0; i < content.Length() ; i++)
+    {
+        if (content[i] == '\r') lines++;
+    }
+#endif
     return lines ;
 }
 
 long wxTextCtrl::XYToPosition(long x, long y) const
 {
     return lines ;
 }
 
 long wxTextCtrl::XYToPosition(long x, long y) const
 {
+#if wxMAC_USE_MLTE
     Point curpt ;
     
     long lastpos = GetLastPosition() ;
     Point curpt ;
     
     long lastpos = GetLastPosition() ;
@@ -1351,7 +1668,7 @@ long wxTextCtrl::XYToPosition(long x, long y) const
     int lastHeight = 0 ;
 
     ItemCount n ;
     int lastHeight = 0 ;
 
     ItemCount n ;
-    for ( n = 0 ; n <= lastpos ; ++n )
+    for ( n = 0 ; n <= (ItemCount) lastpos ; ++n )
     {
         if ( y == ypos && x == xpos )
             return n ;
     {
         if ( y == ypos && x == xpos )
             return n ;
@@ -1368,12 +1685,13 @@ long wxTextCtrl::XYToPosition(long x, long y) const
         else
             ++xpos ;
     }
         else
             ++xpos ;
     }
-    
+#endif    
     return 0;
 }
 
 bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
 {
     return 0;
 }
 
 bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
 {
+#if wxMAC_USE_MLTE
     Point curpt ;
     
     long lastpos = GetLastPosition() ;
     Point curpt ;
     
     long lastpos = GetLastPosition() ;
@@ -1392,7 +1710,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
         int lastHeight = 0 ;
 
         ItemCount n ;
         int lastHeight = 0 ;
 
         ItemCount n ;
-        for ( n = 0 ; n <= pos ; ++n )
+        for ( n = 0 ; n <= (ItemCount) pos ; ++n )
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
@@ -1409,12 +1727,16 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
         if ( y ) *y = ypos ;
         if ( x ) *x = xpos ;
     }
         if ( y ) *y = ypos ;
         if ( x ) *x = xpos ;
     }
-    
+#else
+    if ( y ) *y = 0 ;
+    if ( x ) *x = 0 ;
+#endif    
     return FALSE ;
 }
 
 void wxTextCtrl::ShowPosition(long pos)
 {
     return FALSE ;
 }
 
 void wxTextCtrl::ShowPosition(long pos)
 {
+#if wxMAC_USE_MLTE
 #if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER)
     {
         Point current ;
 #if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER)
     {
         Point current ;
@@ -1435,10 +1757,12 @@ void wxTextCtrl::ShowPosition(long pos)
         }
     }
 #endif
         }
     }
 #endif
+#endif
 }
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
 }
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
+#if wxMAC_USE_MLTE
     Point curpt ;
     if ( lineNo < GetNumberOfLines() )
     {
     Point curpt ;
     if ( lineNo < GetNumberOfLines() )
     {
@@ -1452,7 +1776,7 @@ int wxTextCtrl::GetLineLength(long lineNo) const
         long lastpos = GetLastPosition() ;
 
         ItemCount n ;
         long lastpos = GetLastPosition() ;
 
         ItemCount n ;
-        for ( n = 0 ; n <= lastpos ; ++n )
+        for ( n = 0 ; n <= (ItemCount) lastpos ; ++n )
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
@@ -1470,14 +1794,37 @@ int wxTextCtrl::GetLineLength(long lineNo) const
                 ++xpos ;
         }
     }
                 ++xpos ;
         }
     }
+#else
+    // TODO change this if possible to reflect real lines
+    wxString content = GetValue() ;
 
 
+    // Find line first
+    int count = 0;
+    for (size_t i = 0; i < content.Length() ; i++)
+    {
+        if (count == lineNo)
+        {
+            // Count chars in line then
+            count = 0;
+            for (size_t j = i; j < content.Length(); j++)
+            {
+                count++;
+                if (content[j] == '\n') return count;
+            }
+
+            return count;
+        }
+        if (content[i] == '\n') count++;
+    }
+#endif
     return 0;
 }
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
     return 0;
 }
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-    Point curpt ;
+#if wxMAC_USE_MLTE
     wxString line ;
     wxString line ;
+    Point curpt ;
     wxString content = GetValue() ;
 
     if ( lineNo < GetNumberOfLines() )
     wxString content = GetValue() ;
 
     if ( lineNo < GetNumberOfLines() )
@@ -1492,7 +1839,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
         long lastpos = GetLastPosition() ;
 
         ItemCount n ;
         long lastpos = GetLastPosition() ;
 
         ItemCount n ;
-        for ( n = 0 ; n <= lastpos ; ++n )
+        for ( n = 0 ; n <= (ItemCount)lastpos ; ++n )
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
         {
             TXNOffsetToPoint( (TXNObject) m_macTXN,  n , &curpt);
 
@@ -1514,8 +1861,34 @@ wxString wxTextCtrl::GetLineText(long lineNo) const
             }
         }
     }
             }
         }
     }
-
     return line ;
     return line ;
+#else
+    // TODO change this if possible to reflect real lines
+    wxString content = GetValue() ;
+
+    // Find line first
+    int count = 0;
+    for (size_t i = 0; i < content.Length() ; i++)
+    {
+        if (count == lineNo)
+        {
+            // Add chars in line then
+            wxString tmp;
+
+            for (size_t j = i; j < content.Length(); j++)
+            {
+                if (content[j] == '\n')
+                    return tmp;
+
+                tmp += content[j];
+            }
+
+            return tmp;
+        }
+        if (content[i] == '\n') count++;
+    }
+    return wxEmptyString ;
+#endif
 }
 
 /*
 }
 
 /*
@@ -1603,7 +1976,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                    }
                 }
 
                    }
                 }
 
-                // this will make wxWindows eat the ENTER key so that
+                // this will make wxWidgets eat the ENTER key so that
                 // we actually prevent line wrapping in a single line
                 // text control
                 eat_key = TRUE;
                 // we actually prevent line wrapping in a single line
                 // text control
                 eat_key = TRUE;
@@ -1612,22 +1985,23 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
             break;
 
         case WXK_TAB:
             break;
 
         case WXK_TAB:
-            // always produce navigation event - even if we process TAB
-            // ourselves the fact that we got here means that the user code
-            // decided to skip processing of this TAB - probably to let it
-            // do its default job.
+            if ( !(m_windowStyle & wxTE_PROCESS_TAB))
             {
             {
-                wxNavigationKeyEvent eventNav;
-                eventNav.SetDirection(!event.ShiftDown());
-                eventNav.SetWindowChange(event.ControlDown());
-                eventNav.SetEventObject(this);
-
-                if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
-                    return;
-
-                event.Skip() ;
+                int flags = 0;
+                if (!event.ShiftDown())
+                    flags |= wxNavigationKeyEvent::IsForward ;
+                if (event.ControlDown())
+                    flags |= wxNavigationKeyEvent::WinChange ;
+                Navigate(flags);
                 return;
             }
                 return;
             }
+            else
+            {
+                // This is necessary (don't know why) or the tab will not
+                // be inserted.
+                WriteText(wxT("\t"));
+            }
+            
             break;
     }
 
             break;
     }
 
@@ -1647,7 +2021,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                 keychar = short(ev->message & charCodeMask);
                 keycode = short(ev->message & keyCodeMask) >> 8 ;
 
                 keychar = short(ev->message & charCodeMask);
                 keycode = short(ev->message & keyCodeMask) >> 8 ;
 
-                ::HandleControlKey( (ControlRef) m_macControl , keycode , keychar , ev->modifiers ) ;
+                ::HandleControlKey( *m_peer , keycode , keychar , ev->modifiers ) ;
             }
         }
     }
             }
         }
     }