]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/textctrl.cpp
removed checks for compilers supporting wxUSE_ON_FATAL_EXCEPTION, it's in wx/chkconf...
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
index 599dc75b6b228923e7a46841fb5468cedc73c4d1..7273cf7bb875dffaa25f40603422954e6e30783a 100644 (file)
@@ -2,18 +2,18 @@
 // Name:        textctrl.cpp
 // Purpose:     wxTextCtrl
 // Author:      Stefan Csomor
-// Modified by:
+// Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)
 // Created:     1998-01-01
 // RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "textctrl.h"
 #endif
 
-#include "wx/defs.h"
+#include "wx/wxprec.h"
 
 #if wxUSE_TEXTCTRL
 
 #define wxMAC_AWAYS_USE_MLTE 1
 #endif
 
+#ifndef __WXMAC_OSX__
+enum 
+{
+    kTXNVisibilityTag             = 'visb' /*set the visibility state of the object  */
+};
+#endif
+
 #include <MacTextEditor.h>
 #include <ATSUnicode.h>
 #include <TextCommon.h>
 
 class wxMacFunctor
 {
-public :  
+public :
     wxMacFunctor(){}
     virtual ~wxMacFunctor() {}
     virtual void* operator()() = 0 ;
-    static void* CallBackProc(void *param) 
+    static void* CallBackProc(void *param)
     {
         wxMacFunctor* f = (wxMacFunctor*) param ;
         void *result = (*f)() ;
@@ -87,7 +94,7 @@ class wxMacObjectFunctor1 : public wxMacFunctor
 {
     typedef void (classtype::*function)( param1type p1 ) ;
     typedef void (classtype::*ref_function)( const param1type& p1 ) ;
-public :   
+public :
     wxMacObjectFunctor1( classtype *obj , function f , param1type p1 ) :
         wxMacFunctor(  )
     {
@@ -105,8 +112,8 @@ public :
     }
 
     ~wxMacObjectFunctor1() {}
-    
-    virtual void* operator()() 
+
+    virtual void* operator()()
     {
         (m_object->*m_function)(m_param1) ;
         return NULL ;
@@ -121,25 +128,25 @@ private :
     } ;
 } ;
 
-template<typename classtype, typename param1type> 
+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 = 
+    wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;
+    void *result =
         MPRemoteCall( wxMacFunctor::CallBackProc , &params  , kMPOwningProcessRemoteContext ) ;
     return result ;
 }
 
-template<typename classtype, typename param1type> 
+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 = 
+    wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;
+    void *result =
         MPRemoteCall( wxMacFunctor::CallBackProc , &params  , kMPOwningProcessRemoteContext ) ;
     return result ;
 }
 
-template<typename classtype, typename param1type> 
+template<typename classtype, typename param1type>
 void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 )
 {
     wxMutexGuiLeave() ;
@@ -148,7 +155,7 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( par
     return result ;
 }
 
-template<typename classtype, typename param1type> 
+template<typename classtype, typename param1type>
 void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 )
 {
     wxMutexGuiLeave() ;
@@ -160,9 +167,9 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( con
 class wxMacTextControl : public wxMacControl
 {
 public :
-    wxMacTextControl() ;
+    wxMacTextControl( wxTextCtrl *peer ) ;
     ~wxMacTextControl() ;
-    
+
     virtual wxString GetStringValue() const = 0 ;
     virtual void SetStringValue( const wxString &val ) = 0 ;
     virtual void SetStyle(long start, long end, const wxTextAttr& style) ;
@@ -171,7 +178,7 @@ public :
     virtual void Paste() ;
     virtual bool CanPaste() const ;
     virtual void SetEditable(bool editable) ;
-    virtual long GetLastPosition() const ;
+    virtual wxTextPos GetLastPosition() const ;
     virtual void Replace( long from , long to , const wxString str ) ;
     virtual void Remove( long from , long to ) = 0 ;
     virtual void SetSelection( long from , long to ) = 0 ;
@@ -180,7 +187,7 @@ public :
 
     virtual void Clear() ;
     virtual bool CanUndo() const;
-    virtual void Undo() ; 
+    virtual void Undo() ;
     virtual bool CanRedo() const;
     virtual void Redo() ;
     virtual int GetNumberOfLines() const ;
@@ -189,6 +196,17 @@ public :
     virtual void ShowPosition( long WXUNUSED(pos) ) ;
     virtual int GetLineLength(long lineNo) const ;
     virtual wxString GetLineText(long lineNo) const ;
+
+#ifndef __WXMAC_OSX__
+    virtual void            MacControlUserPaneDrawProc(wxInt16 part) = 0 ;
+    virtual wxInt16         MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) = 0 ;
+    virtual wxInt16         MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) = 0 ;
+    virtual void            MacControlUserPaneIdleProc() = 0 ;
+    virtual wxInt16         MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) = 0 ;
+    virtual void            MacControlUserPaneActivateProc(bool activating) = 0 ;
+    virtual wxInt16         MacControlUserPaneFocusProc(wxInt16 action) = 0 ;
+    virtual void            MacControlUserPaneBackgroundProc(void* info) = 0 ;
+#endif
 } ;
 
 // common parts for implementations based on MLTE
@@ -196,26 +214,27 @@ public :
 class wxMacMLTEControl : public wxMacTextControl
 {
 public :
+    wxMacMLTEControl( wxTextCtrl *peer ) : wxMacTextControl( peer ) {}
     virtual wxString GetStringValue() const ;
     virtual void SetStringValue( const wxString &str) ;
-    
-    static int ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes attr[] ) ;
+
     static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ;
     void    AdjustCreationAttributes( const wxColour& background , bool visible ) ;
 
     virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) ;
+    virtual void SetBackground( const wxBrush &brush) ;
     virtual void SetStyle(long start, long end, const wxTextAttr& style) ;
     virtual void Copy() ;
     virtual void Cut() ;
     virtual void Paste() ;
     virtual bool CanPaste() const ;
     virtual void SetEditable(bool editable) ;
-    virtual long GetLastPosition() const ;
+    virtual wxTextPos GetLastPosition() const ;
     virtual void Replace( long from , long to , const wxString str ) ;
     virtual void Remove( long from , long to )  ;
     virtual void GetSelection( long* from, long* to) const ;
     virtual void SetSelection( long from , long to ) ;
-    
+
     virtual void WriteText(const wxString& str) ;
     virtual void Clear() ;
 
@@ -233,6 +252,7 @@ public :
     void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ;
 
 protected :
+    void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ;
     TXNObject m_txn ;
 } ;
 
@@ -242,16 +262,16 @@ protected :
 
 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
 
-class wxMacMLTEHIViewControl : public wxMacMLTEControl 
+class wxMacMLTEHIViewControl : public wxMacMLTEControl
 {
 public :
-    wxMacMLTEHIViewControl( wxWindow *wxPeer,
+    wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
                              const wxString& str,
                              const wxPoint& pos,
                              const wxSize& size, long style ) ;
     virtual OSStatus SetFocus( ControlFocusPart focusPart ) ;
     virtual bool HasFocus() const ;
-    virtual bool NeedsFocusRect() const ;
+    virtual bool NeedsFocusRect() const;
 protected :
     HIViewRef m_scrollView ;
     HIViewRef m_textView ;
@@ -262,7 +282,7 @@ protected :
 class wxMacUnicodeTextControl : public wxMacTextControl
 {
 public :
-    wxMacUnicodeTextControl( wxWindow *wxPeer,
+    wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
                              const wxString& str,
                              const wxPoint& pos,
                              const wxSize& size, long style ) ;
@@ -286,24 +306,48 @@ protected :
 
 #endif
 
-// implementation available under classic
-
-class STPTextPaneVars ;
+// 'classic' MLTE implementation
 
 class wxMacMLTEClassicControl : public wxMacMLTEControl
 {
 public :
-    wxMacMLTEClassicControl( wxWindow *wxPeer,
+    wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
                              const wxString& str,
                              const wxPoint& pos,
                              const wxSize& size, long style ) ;
     ~wxMacMLTEClassicControl() ;
     virtual void VisibilityChanged(bool shown) ;
+    virtual bool NeedsFocusRect() const;
+
+    virtual void            MacControlUserPaneDrawProc(wxInt16 part) ;
+    virtual wxInt16         MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) ;
+    virtual wxInt16         MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) ;
+    virtual void            MacControlUserPaneIdleProc() ;
+    virtual wxInt16         MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) ;
+    virtual void            MacControlUserPaneActivateProc(bool activating) ;
+    virtual wxInt16         MacControlUserPaneFocusProc(wxInt16 action) ;
+    virtual void            MacControlUserPaneBackgroundProc(void* info) ;
+
+    virtual void            SetRect( Rect *r ) ;
+
 protected :
     OSStatus                 DoCreate();
-public :
-    // hack to make public until we have migrated all procs
-    STPTextPaneVars*    m_macTXNvars ;
+    
+    void                    MacUpdatePosition() ;
+    void                    MacActivatePaneText(Boolean setActive) ;
+    void                    MacFocusPaneText(Boolean setFocus) ;
+
+    void                    MacSetObjectVisibility(Boolean vis) ;
+private :
+    TXNFrameID              m_txnFrameID ;
+    GrafPtr                 m_txnPort ;
+    // bounds of the control as we last did set the txn frames
+    Rect                    m_txnControlBounds ;
+
+    bool                    m_txnIsFocused ;
+    bool                    m_txnIsActive ;
+    bool                    m_txnIsVisible ;
+    bool                    m_controlIsActive ;
 } ;
 
 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
@@ -312,6 +356,7 @@ public :
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
+    EVT_ERASE_BACKGROUND( wxTextCtrl::OnEraseBackground )
     EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
     EVT_CHAR(wxTextCtrl::OnChar)
     EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
@@ -349,18 +394,16 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    m_macIsUserPane = FALSE ;
+    m_macIsUserPane = false ;
     m_editable = true ;
 
-    if ( !HasFlag(wxNO_BORDER) )
-        style |= wxSUNKEN_BORDER ;
-    
-    if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) )
-        return FALSE;
+    if ( ! ( style & wxNO_BORDER) )
+        style = ( style & ~wxBORDER_MASK) | wxSUNKEN_BORDER ;
 
-    wxSize mySize = size ;
+    if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) )
+        return false;
 
-    Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ;    
+    Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ;
 
     if ( m_windowStyle & wxTE_MULTILINE )
     {
@@ -371,7 +414,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         style |= wxTE_PROCESS_ENTER ;
     }
 
-#if TARGET_API_MAC_OSX
+#ifdef __WXMAC_OSX__
 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
     if ( UMAGetSystemVersion() >= 0x1030 )
     {
@@ -380,16 +423,13 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
 #endif
 #if !wxMAC_AWAYS_USE_MLTE
     if ( !m_peer )
-    {     
+    {
         m_peer = new wxMacUnicodeTextControl( this , str , pos , size , style ) ;
     }
 #endif
 #endif
     if ( !m_peer )
     {
-        // this control draws the border itself
-        if ( !HasFlag(wxNO_BORDER) )
-            m_windowStyle &= ~wxSUNKEN_BORDER ;
         m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ;
     }
 
@@ -399,17 +439,16 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     {
         SetEditable( false ) ;
     }
-        
 
-    return TRUE;
+    return true;
 }
 
-void wxTextCtrl::MacVisibilityChanged() 
+void wxTextCtrl::MacVisibilityChanged()
 {
     GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
 }
 
-void wxTextCtrl::MacEnabledStateChanged() 
+void wxTextCtrl::MacEnabledStateChanged()
 {
 }
 
@@ -419,7 +458,7 @@ wxString wxTextCtrl::GetValue() const
 }
 
 void wxTextCtrl::GetSelection(long* from, long* to) const
-{    
+{
     GetPeer()->GetSelection( from , to ) ;
 }
 
@@ -430,6 +469,11 @@ void wxTextCtrl::SetValue(const wxString& str)
         return ;
 
     GetPeer()->SetStringValue(str) ;
+
+    wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
+    event.SetString( GetValue() ) ;
+    event.SetEventObject( this );
+    GetEventHandler()->ProcessEvent(event);
 }
 
 void wxTextCtrl::SetMaxLength(unsigned long len)
@@ -440,8 +484,8 @@ void wxTextCtrl::SetMaxLength(unsigned long len)
 bool wxTextCtrl::SetFont( const wxFont& font )
 {
     if ( !wxTextCtrlBase::SetFont( font ) )
-        return FALSE ;
-        
+        return false ;
+
     GetPeer()->SetFont( font , GetForegroundColour() , GetWindowStyle() ) ;
     return true ;
 }
@@ -456,7 +500,7 @@ bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
 {
     wxTextCtrlBase::SetDefaultStyle( style ) ;
     SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
-    return TRUE ;
+    return true ;
 }
 
 // Clipboard operations
@@ -464,7 +508,7 @@ void wxTextCtrl::Copy()
 {
     if (CanCopy())
     {
-        GetPeer()->Copy() ;    
+        GetPeer()->Copy() ;
     }
 }
 
@@ -472,10 +516,9 @@ void wxTextCtrl::Cut()
 {
     if (CanCut())
     {
-        GetPeer()->Cut() ;    
+        GetPeer()->Cut() ;
 
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
-        event.SetString( GetValue() ) ;
         event.SetEventObject( this );
         GetEventHandler()->ProcessEvent(event);
       }
@@ -485,11 +528,10 @@ void wxTextCtrl::Paste()
 {
     if (CanPaste())
     {
-        GetPeer()->Paste() ;    
+        GetPeer()->Paste() ;
         // eventually we should add setting the default style again
 
         wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
-        event.SetString( GetValue() ) ;
         event.SetEventObject( this );
         GetEventHandler()->ProcessEvent(event);
     }
@@ -518,7 +560,7 @@ bool wxTextCtrl::CanCut() const
 bool wxTextCtrl::CanPaste() const
 {
     if (!IsEditable())
-        return FALSE;
+        return false;
 
     return GetPeer()->CanPaste() ;
 }
@@ -539,7 +581,7 @@ void wxTextCtrl::SetInsertionPoint(long pos)
 
 void wxTextCtrl::SetInsertionPointEnd()
 {
-    long pos = GetLastPosition();
+    wxTextPos pos = GetLastPosition();
     SetInsertionPoint(pos);
 }
 
@@ -550,7 +592,7 @@ long wxTextCtrl::GetInsertionPoint() const
     return begin ;
 }
 
-long wxTextCtrl::GetLastPosition() const
+wxTextPos wxTextCtrl::GetLastPosition() const
 {
     return GetPeer()->GetLastPosition( ) ;
 }
@@ -574,10 +616,10 @@ bool wxTextCtrl::LoadFile(const wxString& file)
 {
     if ( wxTextCtrlBase::LoadFile(file) )
     {
-        return TRUE;
+        return true;
     }
 
-    return FALSE;
+    return false;
 }
 
 void wxTextCtrl::WriteText(const wxString& str)
@@ -585,7 +627,7 @@ void wxTextCtrl::WriteText(const wxString& str)
     // TODO this MPRemoting will be moved into a remoting peer proxy for any command
     if ( !wxIsMainThread() )
     {
-        // unfortunately CW 8 is not able to correctly deduce the template types, so we have 
+        // 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 ;
@@ -629,30 +671,35 @@ wxSize wxTextCtrl::DoGetBestSize() const
 
     int hText;
 
+    // these are the numbers from the HIG, we reduce them by the borders
+    // first
+
     switch( m_windowVariant )
     {
         case wxWINDOW_VARIANT_NORMAL :
-            hText = 22 ;
+            hText = 22 - 6 ;
             break ;
         case wxWINDOW_VARIANT_SMALL :
-            hText = 19 ;
+            hText = 19 - 6 ;
             break ;
         case wxWINDOW_VARIANT_MINI :
-            hText= 15 ;
+            hText= 15 - 6 ;
             break ;
         default :
-            hText = 22 ;
-            break ; 
+            hText = 22 - 6;
+            break ;
     }
 
-    if ( HasFlag(wxNO_BORDER) )
-        hText -= 6 ;
-
+    // as the above numbers have some free space around the text
+    // we get 5 lines like this anyway
     if ( m_windowStyle & wxTE_MULTILINE )
     {
          hText *= 5 ;
     }
 
+    if ( !HasFlag(wxNO_BORDER) )
+        hText += 6 ;
+
     return wxSize(wText, hText);
 }
 
@@ -678,18 +725,18 @@ void wxTextCtrl::Redo()
 
 bool wxTextCtrl::CanUndo() const
 {
-    if ( !IsEditable() ) 
+    if ( !IsEditable() )
     {
-        return false ; 
+        return false ;
     }
     return GetPeer()->CanUndo() ;
 }
 
 bool wxTextCtrl::CanRedo() const
 {
-    if ( !IsEditable() ) 
+    if ( !IsEditable() )
     {
-        return false ; 
+        return false ;
     }
     return GetPeer()->CanRedo() ;
 }
@@ -753,6 +800,15 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
+void wxTextCtrl::OnEraseBackground(wxEraseEvent& event)
+{
+    // all erasing should be done by the real mac control implementation
+    // while this is true for MLTE under classic, the HITextView is somehow
+    // transparent but background erase is not working correctly, so intercept
+    // things while we can...
+    event.Skip() ;
+}
+
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     int key = event.GetKeyCode() ;
@@ -774,6 +830,16 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
         return ;
     }
 
+    // Check if we have reached the max # of chars, but still allow navigation and deletion
+    if ( !IsMultiLine() && GetValue().Length() >= m_maxLength &&
+        key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB &&
+        key != WXK_BACK && !( key == WXK_RETURN && (m_windowStyle & wxPROCESS_ENTER) )
+       )
+    {
+        // eat it, we don't want to add more than allowed # of characters
+        return;
+    }
+
     // assume that any key not processed yet is going to modify the control
     m_dirty = true;
 
@@ -822,7 +888,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                 // this will make wxWidgets eat the ENTER key so that
                 // we actually prevent line wrapping in a single line
                 // text control
-                eat_key = TRUE;
+                eat_key = true;
             }
 
             break;
@@ -844,7 +910,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
                 // be inserted.
                 WriteText(wxT("\t"));
             }
-            
+
             break;
     }
 
@@ -853,7 +919,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
         // perform keystroke handling
         if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL )
             CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ;
-        else 
+        else
         {
             EventRecord rec ;
             if ( wxMacConvertEventToRecord(  (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) )
@@ -874,7 +940,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
          key == WXK_BACK)
     {
         wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
-        event1.SetString( GetValue() ) ;
         event1.SetEventObject( this );
         wxPostEvent(GetEventHandler(),event1);
     }
@@ -938,109 +1003,116 @@ bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
 {
     return true ;
 }
+#if !TARGET_API_MAC_OSX
 
 // user pane implementation
 
-void wxTextCtrl::MacControlUserPaneDrawProc(wxInt16 part) 
+void wxTextCtrl::MacControlUserPaneDrawProc(wxInt16 part)
 {
+    GetPeer()->MacControlUserPaneDrawProc( part ) ;
 }
 
-wxInt16 wxTextCtrl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) 
+wxInt16 wxTextCtrl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y)
 {
-    return kControlNoPart ;
+    return GetPeer()->MacControlUserPaneHitTestProc( x , y ) ;
 }
 
-wxInt16 wxTextCtrl::MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) 
+wxInt16 wxTextCtrl::MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc)
 {
-    return kControlNoPart ;
+    return GetPeer()->MacControlUserPaneTrackingProc( x , y , actionProc ) ;
 }
 
-void wxTextCtrl::MacControlUserPaneIdleProc() 
+void wxTextCtrl::MacControlUserPaneIdleProc()
 {
+    GetPeer()->MacControlUserPaneIdleProc( ) ;
 }
 
-wxInt16 wxTextCtrl::MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) 
+wxInt16 wxTextCtrl::MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers)
 {
-    return kControlNoPart ;
+    return GetPeer()->MacControlUserPaneKeyDownProc( keyCode , charCode , modifiers ) ;
 }
 
-void wxTextCtrl::MacControlUserPaneActivateProc(bool activating) 
+void wxTextCtrl::MacControlUserPaneActivateProc(bool activating)
 {
+    GetPeer()->MacControlUserPaneActivateProc( activating ) ;
 }
 
-wxInt16 wxTextCtrl::MacControlUserPaneFocusProc(wxInt16 action) 
+wxInt16 wxTextCtrl::MacControlUserPaneFocusProc(wxInt16 action)
 {
-    return kControlNoPart ;
+    return GetPeer()->MacControlUserPaneFocusProc( action ) ;
 }
 
-void wxTextCtrl::MacControlUserPaneBackgroundProc(void* info) 
+void wxTextCtrl::MacControlUserPaneBackgroundProc(void* info)
 {
+    GetPeer()->MacControlUserPaneBackgroundProc( info ) ;
 }
 
+#endif
 // ----------------------------------------------------------------------------
 // implementation base class
 // ----------------------------------------------------------------------------
 
-wxMacTextControl::wxMacTextControl() 
+wxMacTextControl::wxMacTextControl(wxTextCtrl* peer) :
+    wxMacControl( peer )
 {
 }
 
-wxMacTextControl::~wxMacTextControl() 
+wxMacTextControl::~wxMacTextControl()
 {
 }
 
-void wxMacTextControl::SetStyle(long start, long end, const wxTextAttr& style) 
+void wxMacTextControl::SetStyle(long start, long end, const wxTextAttr& style)
 {
 }
 
-void wxMacTextControl::Copy() 
+void wxMacTextControl::Copy()
 {
 }
 
-void wxMacTextControl::Cut() 
+void wxMacTextControl::Cut()
 {
 }
 
-void wxMacTextControl::Paste() 
+void wxMacTextControl::Paste()
 {
 }
 
-bool wxMacTextControl::CanPaste() const 
-{  
+bool wxMacTextControl::CanPaste() const
+{
     return false ;
 }
 
-void wxMacTextControl::SetEditable(bool editable) 
+void wxMacTextControl::SetEditable(bool editable)
 {
-} 
+}
 
-long wxMacTextControl::GetLastPosition() const
+wxTextPos wxMacTextControl::GetLastPosition() const
 {
     return GetStringValue().Length() ;
 }
 
-void wxMacTextControl::Replace( long from , long to , const wxString str ) 
+void wxMacTextControl::Replace( long from , long to , const wxString str )
 {
 }
 
-void wxMacTextControl::Clear() 
+void wxMacTextControl::Clear()
 {
     SetStringValue( wxEmptyString ) ;
 }
 
-bool wxMacTextControl::CanUndo() const 
+bool wxMacTextControl::CanUndo() const
 {
     return false ;
 }
 
-void wxMacTextControl::Undo() { } 
+void wxMacTextControl::Undo() { }
 
 bool wxMacTextControl::CanRedo()  const
 {
     return false ;
-} 
+}
 
-void wxMacTextControl::Redo() 
+void wxMacTextControl::Redo()
 {
 }
 
@@ -1049,16 +1121,16 @@ long wxMacTextControl::XYToPosition(long x, long y) const
     return 0 ;
 }
 
-bool wxMacTextControl::PositionToXY(long pos, long *x, long *y) const 
+bool wxMacTextControl::PositionToXY(long pos, long *x, long *y) const
 {
     return false ;
 }
 
-void wxMacTextControl::ShowPosition( long WXUNUSED(pos) ) 
-{ 
-} 
+void wxMacTextControl::ShowPosition( long WXUNUSED(pos) )
+{
+}
 
-int wxMacTextControl::GetNumberOfLines() const 
+int wxMacTextControl::GetNumberOfLines() const
 {
     ItemCount lines = 0 ;
     wxString content = GetStringValue() ;
@@ -1074,7 +1146,7 @@ wxString wxMacTextControl::GetLineText(long lineNo) const
 {
     // TODO change this if possible to reflect real lines
     wxString content = GetStringValue() ;
-    
+
     // Find line first
     int count = 0;
     for (size_t i = 0; i < content.Length() ; i++)
@@ -1083,15 +1155,15 @@ wxString wxMacTextControl::GetLineText(long lineNo) const
         {
             // 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++;
@@ -1103,7 +1175,7 @@ int  wxMacTextControl::GetLineLength(long lineNo) const
 {
     // TODO change this if possible to reflect real lines
     wxString content = GetStringValue() ;
-    
+
     // Find line first
     int count = 0;
     for (size_t i = 0; i < content.Length() ; i++)
@@ -1117,7 +1189,7 @@ int  wxMacTextControl::GetLineLength(long lineNo) const
                 count++;
                 if (content[j] == '\n') return count;
             }
-            
+
             return count;
         }
         if (content[i] == '\n') count++;
@@ -1131,22 +1203,22 @@ int  wxMacTextControl::GetLineLength(long lineNo) const
 
 #if TARGET_API_MAC_OSX
 
-wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxWindow *wxPeer,
+wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
                          const wxString& str,
                          const wxPoint& pos,
-                         const wxSize& size, long style )
+                         const wxSize& size, long style ) : wxMacTextControl( wxPeer )
 {
     m_font = wxPeer->GetFont() ;
     m_windowStyle = style ;
-    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;    
+    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+    wxMacConvertNewlines10To13( &st ) ;
     wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
     CFStringRef cfr = cf ;
     Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
     m_valueTag = isPassword ? kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag ;
     CreateEditUnicodeTextControl( MAC_WXHWND(wxPeer->MacGetTopLevelWindowRef()), &bounds , cfr , isPassword , NULL , &m_controlRef ) ;
-    
+
     if ( !(m_windowStyle & wxTE_MULTILINE) )
     {
         SetData<Boolean>( kControlEditTextPart , kControlEditTextSingleLineTag , true ) ;
@@ -1157,7 +1229,7 @@ wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
 {
 }
 
-void wxMacUnicodeTextControl::VisibilityChanged(bool shown) 
+void wxMacUnicodeTextControl::VisibilityChanged(bool shown)
 {
     if ( !(m_windowStyle & wxTE_MULTILINE) && shown )
     {
@@ -1169,11 +1241,11 @@ void wxMacUnicodeTextControl::VisibilityChanged(bool shown)
         verify_noerr( GetData<CFStringRef>( 0, m_valueTag , &value ) );
         verify_noerr( SetData<CFStringRef>( 0, m_valueTag, &value ) );
         verify_noerr( SetData<ControlEditTextSelectionRec>( 0, kControlEditTextSelectionTag, &sel ) );
-        
+
         CFRelease( value ) ;
     }
 }
-wxString wxMacUnicodeTextControl::GetStringValue() const 
+wxString wxMacUnicodeTextControl::GetStringValue() const
 {
     wxString result ;
     CFStringRef value = GetData<CFStringRef>(0,m_valueTag) ;
@@ -1182,13 +1254,17 @@ wxString wxMacUnicodeTextControl::GetStringValue() const
         wxMacCFStringHolder cf(value) ;
         result = cf.AsString() ;
     }
+#if '\n' == 10
+    wxMacConvertNewlines13To10( &result ) ;
+#else
     wxMacConvertNewlines10To13( &result ) ;
+#endif
     return result ;
 }
-void wxMacUnicodeTextControl::SetStringValue( const wxString &str) 
+void wxMacUnicodeTextControl::SetStringValue( const wxString &str)
 {
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+    wxMacConvertNewlines10To13( &st ) ;
     wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
     verify_noerr( SetData<CFStringRef>(  0, m_valueTag , cf ) ) ;
 }
@@ -1208,11 +1284,11 @@ bool wxMacUnicodeTextControl::CanPaste() const
 {
     return true ;
 }
-void wxMacUnicodeTextControl::SetEditable(bool editable) 
+void wxMacUnicodeTextControl::SetEditable(bool editable)
 {
     SetData<Boolean>( 0 , kControlEditTextLockedTag , (Boolean) !editable ) ;
 }
-void wxMacUnicodeTextControl::Remove( long from , long to ) 
+void wxMacUnicodeTextControl::Remove( long from , long to )
 {
 }
 
@@ -1224,7 +1300,7 @@ void wxMacUnicodeTextControl::GetSelection( long* from, long* to) const
     if ( to ) *to = sel.selEnd ;
 }
 
-void wxMacUnicodeTextControl::SetSelection( long from , long to ) 
+void wxMacUnicodeTextControl::SetSelection( long from , long to )
 {
     ControlEditTextSelectionRec sel ;
     sel.selStart = from ;
@@ -1235,7 +1311,7 @@ void wxMacUnicodeTextControl::SetSelection( long from , long to )
 void wxMacUnicodeTextControl::WriteText(const wxString& str)
 {
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+    wxMacConvertNewlines10To13( &st ) ;
     #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
         wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
         CFStringRef value = cf ;
@@ -1247,7 +1323,7 @@ void wxMacUnicodeTextControl::WriteText(const wxString& str)
         val.Remove( start , end - start ) ;
         val.insert( start , str ) ;
         SetStringValue( val ) ;
-        SetInsertionPoint( start + str.Length() ) ;
+        SetSelection( start + str.Length() , start + str.Length() ) ;
     #endif
 }
 
@@ -1257,12 +1333,7 @@ void wxMacUnicodeTextControl::WriteText(const wxString& str)
 // MLTE control implementation (common part)
 // ----------------------------------------------------------------------------
 
-#if TARGET_API_MAC_OSX == 0 
-// declaration needed because of one line in the code...
-static void TPUpdateVisibility(ControlRef theControl) ;
-#endif
-
-// if mlte is on read only , no changes at all are allowed, not even from 
+// if mlte is on read only , no changes at all are allowed, not even from
 // procedural API, in order to allow changes via API all the same we must undo
 // the readonly status while we are executing, this class helps to do so
 
@@ -1280,7 +1351,7 @@ public :
             TXNSetTXNObjectControls( m_txn , false , 1 , tag , data ) ;
         }
     }
-    ~EditHelper() 
+    ~EditHelper()
     {
         TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
         if ( m_data[0].uValue == kTXNReadOnly )
@@ -1293,7 +1364,7 @@ public :
         TXNControlData m_data[1] ;
 } ;
 
-wxString wxMacMLTEControl::GetStringValue() const 
+wxString wxMacMLTEControl::GetStringValue() const
 {
     wxString result ;
     OSStatus err ;
@@ -1313,10 +1384,9 @@ wxString wxMacMLTEControl::GetStringValue() const
             if ( actualSize > 0 )
             {
                 wxChar *ptr = NULL ;
-#if SIZEOF_WCHAR_T == 2                
-                ptr = new wxChar[actualSize + 1 ] ;            
+#if SIZEOF_WCHAR_T == 2
+                ptr = new wxChar[actualSize + 1 ] ;
                 wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
-                
 #else
                 SetHandleSize( theText , ( actualSize + 1 ) * sizeof( UniChar ) ) ;
                 HLock( theText ) ;
@@ -1324,7 +1394,7 @@ wxString wxMacMLTEControl::GetStringValue() const
                 wxMBConvUTF16BE converter ;
                 size_t noChars = converter.MB2WC( NULL , (const char*)*theText , 0 ) ;
                 ptr = new wxChar[noChars + 1] ;
-                
+
                 noChars = converter.MB2WC( ptr , (const char*)*theText , noChars ) ;
                 ptr[noChars] = 0 ;
                 HUnlock( theText ) ;
@@ -1356,21 +1426,26 @@ wxString wxMacMLTEControl::GetStringValue() const
         }
 #endif
     }
+#if '\n' == 10
+    wxMacConvertNewlines13To10( &result ) ;
+#else
     wxMacConvertNewlines10To13( &result ) ;
+#endif
     return result ;
 }
 
-void wxMacMLTEControl::SetStringValue( const wxString &str) 
+void wxMacMLTEControl::SetStringValue( const wxString &str)
 {
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+
+    wxMacConvertNewlines10To13( &st ) ;
     EditHelper help(m_txn) ;
 
-    // wxMacWindowClipper c( this ) ;
 #if !TARGET_API_MAC_OSX
     // otherwise scrolling might have problems ?
-    TPUpdateVisibility( m_controlRef ) ;
+//    MacUpdatePosition( m_controlRef ) ;
 #endif
+    wxMacWindowClipper c( m_peer ) ;
     SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
     TXNSetSelection( m_txn, 0, 0);
     TXNShowSelection( m_txn, kTXNShowStart);
@@ -1398,10 +1473,10 @@ TXNFrameOptions wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle )
     }
     else
         frameOptions |= kTXNSingleLineOnlyMask ;
-        
+
     if ( wxStyle & wxHSCROLL )
         frameOptions |= kTXNWantHScrollBarMask ;
-    
+
     return frameOptions ;
 }
 
@@ -1414,17 +1489,16 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo
     iControlTags[2] = kTXNVisibilityTag ;
     iControlData[2].uValue = visible ;
     toptag++ ;
-#endif        
-    
+#endif
+
     if ( m_windowStyle & wxTE_MULTILINE )
     {
         if (m_windowStyle & wxTE_DONTWRAP)
             iControlData[1].uValue = kTXNNoAutoWrap ;
         else
             iControlData[1].uValue = kTXNAutoWrap ;
-        
     }
-    verify_noerr( TXNSetTXNObjectControls( m_txn, false, toptag,
+    verify_noerr( TXNSetTXNObjectControls( m_txn, true, toptag,
                                         iControlTags, iControlData )) ;
 
     // setting the default font
@@ -1458,8 +1532,18 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo
     TXNSetBackground( m_txn , &tback);
 }
 
-int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes typeAttr[] )
+void wxMacMLTEControl::SetBackground( const wxBrush &brush )
+{
+    // currently only solid background are supported
+    TXNBackground tback;
+    tback.bgType = kTXNBackgroundTypeRGB;
+    tback.bg.color = MAC_WXCOLORREF( brush.GetColour().GetPixel() );
+    TXNSetBackground( m_txn , &tback);
+}
+
+void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to)
 {
+    TXNTypeAttributes typeAttr[4] ;
     Str255 fontName = "\pMonaco" ;
     SInt16 fontSize = 12 ;
     Style fontStyle = normal ;
@@ -1476,7 +1560,7 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu
             fontStyle |= bold ;
         if ( font.GetStyle() == wxITALIC )
             fontStyle |= italic ;
-        
+
         typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
         typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
         typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
@@ -1487,7 +1571,6 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu
         typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
         typeAttr[attrCounter+2].data.dataValue = fontStyle ;
         attrCounter += 3 ;
-        
     }
     if ( style.HasTextColour() )
     {
@@ -1497,46 +1580,38 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu
         color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
         attrCounter += 1 ;
     }
-    return attrCounter ;
+    if ( attrCounter > 0 )
+    {
+        verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, from , to) );
+    }
 }
 
-void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) 
+void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
 {
     EditHelper help(m_txn) ;
-    wxTextAttr style(wxNullColour,wxNullColour,font) ;
-    TXNTypeAttributes typeAttr[4] ;
-    int attrCounter = ConvertAttribute( style , typeAttr ) ;
-    if ( attrCounter > 0 )
-    {
-        verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, kTXNStartOffset,kTXNEndOffset) );
-    }
+    TXNSetAttribute( wxTextAttr(foreground,wxNullColour,font) , kTXNStartOffset,kTXNEndOffset ) ;
 }
-void wxMacMLTEControl::SetStyle(long start, long end, const wxTextAttr& style) 
-{ 
+void wxMacMLTEControl::SetStyle(long start, long end, const wxTextAttr& style)
+{
     EditHelper help(m_txn) ;
-    TXNTypeAttributes typeAttr[4] ;
-    int attrCounter = ConvertAttribute( style , typeAttr ) ;
-    if ( attrCounter > 0 )
-    {
-        verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, start,end) );
-    }
-}   
-void wxMacMLTEControl::Copy() 
+    TXNSetAttribute( style , start,end ) ;
+}
+
+void wxMacMLTEControl::Copy()
 {
     ClearCurrentScrap();
     TXNCopy(m_txn);
     TXNConvertToPublicScrap();
 }
 
-void wxMacMLTEControl::Cut() 
+void wxMacMLTEControl::Cut()
 {
     ClearCurrentScrap();
     TXNCut(m_txn);
     TXNConvertToPublicScrap();
 }
 
-void wxMacMLTEControl::Paste() 
+void wxMacMLTEControl::Paste()
 {
     TXNConvertFromPublicScrap();
     TXNPaste(m_txn);
@@ -1547,16 +1622,16 @@ bool wxMacMLTEControl::CanPaste() const
     return TXNIsScrapPastable() ;
 }
 
-void wxMacMLTEControl::SetEditable(bool editable) 
+void wxMacMLTEControl::SetEditable(bool editable)
 {
     TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
     TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
     TXNSetTXNObjectControls( m_txn , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
 }
 
-long wxMacMLTEControl::GetLastPosition() const
+wxTextPos wxMacMLTEControl::GetLastPosition() const
 {
-    long actualsize = 0 ;
+    wxTextPos actualsize = 0 ;
 
     Handle theText ;
     OSErr err = TXNGetDataEncoded( m_txn, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
@@ -1574,22 +1649,23 @@ long wxMacMLTEControl::GetLastPosition() const
     return actualsize ;
 }
 
-void wxMacMLTEControl::Replace( long from , long to , const wxString str ) 
+void wxMacMLTEControl::Replace( long from , long to , const wxString str )
 {
     wxString value = str ;
-    wxMacConvertNewlines13To10( &value ) ;
+    wxMacConvertNewlines10To13( &value ) ;
 
     EditHelper help( m_txn ) ;
+    wxMacWindowClipper c( m_peer ) ;
 
     TXNSetSelection(m_txn , from , to ) ;
     TXNClear( m_txn ) ;
-    SetTXNData( str , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
+    SetTXNData( value , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
 }
 
 void wxMacMLTEControl::Remove( long from , long to )
 {
+    wxMacWindowClipper c( m_peer ) ;
     EditHelper help( m_txn ) ;
-
     TXNSetSelection(m_txn , from , to ) ;
     TXNClear( m_txn ) ;
 }
@@ -1599,22 +1675,24 @@ void wxMacMLTEControl::GetSelection( long* from, long* to) const
     TXNGetSelection( m_txn , (TXNOffset*) from , (TXNOffset*) to ) ;
 }
 
-void wxMacMLTEControl::SetSelection( long from , long to ) 
+void wxMacMLTEControl::SetSelection( long from , long to )
 {
+    wxMacWindowClipper c( m_peer ) ;
     /* change the selection */
     if ((from == -1) && (to == -1))
-       TXNSelectAll(m_txn);
+        TXNSelectAll(m_txn);
     else
-       TXNSetSelection( m_txn, from, to);
+        TXNSetSelection( m_txn, from, to);
     TXNShowSelection( m_txn, kTXNShowStart);
 }
 
-void wxMacMLTEControl::WriteText(const wxString& str) 
+void wxMacMLTEControl::WriteText(const wxString& str)
 {
     EditHelper helper( m_txn ) ;
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
+    wxMacConvertNewlines10To13( &st ) ;
 
+    wxMacWindowClipper c( m_peer ) ;
     long start , end , dummy ;
     GetSelection( &start , &dummy ) ;
     SetTXNData( st , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
@@ -1622,34 +1700,35 @@ void wxMacMLTEControl::WriteText(const wxString& str)
     // TODO SetStyle( start , end , GetDefaultStyle() ) ;
 }
 
-void wxMacMLTEControl::Clear() 
+void wxMacMLTEControl::Clear()
 {
     EditHelper st(m_txn) ;
+    wxMacWindowClipper c( m_peer ) ;
     TXNSetSelection( m_txn , kTXNStartOffset , kTXNEndOffset ) ;
     TXNClear(m_txn);
 }
 
-bool wxMacMLTEControl::CanUndo() const 
+bool wxMacMLTEControl::CanUndo() const
 {
     return TXNCanUndo( m_txn , NULL ) ;
 }
 
-void wxMacMLTEControl::Undo() 
+void wxMacMLTEControl::Undo()
 {
-    TXNUndo( m_txn ) ; 
-} 
+    TXNUndo( m_txn ) ;
+}
 
 bool wxMacMLTEControl::CanRedo()  const
 {
     return TXNCanRedo( m_txn , NULL ) ;
-} 
+}
 
-void wxMacMLTEControl::Redo() 
-{ 
+void wxMacMLTEControl::Redo()
+{
     TXNRedo( m_txn ) ;
 }
 
-int wxMacMLTEControl::GetNumberOfLines() const 
+int wxMacMLTEControl::GetNumberOfLines() const
 {
     ItemCount lines = 0 ;
     TXNGetLineCount(m_txn, &lines ) ;
@@ -1659,14 +1738,14 @@ int wxMacMLTEControl::GetNumberOfLines() const
 long wxMacMLTEControl::XYToPosition(long x, long y) const
 {
     Point curpt ;
-    
-    long lastpos = GetLastPosition() ;
-    
-    // TODO find a better implementation : while we can get the 
+
+    wxTextPos lastpos = GetLastPosition() ;
+
+    // TODO find a better implementation : while we can get the
     // line metrics of a certain line, we don't get its starting
     // position, so it would probably be rather a binary search
     // for the start position
-    long xpos = 0 ; 
+    long xpos = 0 ;
     long ypos = 0 ;
     int lastHeight = 0 ;
 
@@ -1675,7 +1754,7 @@ long wxMacMLTEControl::XYToPosition(long x, long y) const
     {
         if ( y == ypos && x == xpos )
             return n ;
-        
+
         TXNOffsetToPoint( m_txn ,  n , &curpt);
 
         if ( curpt.v > lastHeight )
@@ -1694,19 +1773,19 @@ long wxMacMLTEControl::XYToPosition(long x, long y) const
 bool wxMacMLTEControl::PositionToXY(long pos, long *x, long *y) const
 {
     Point curpt ;
-    
-    long lastpos = GetLastPosition() ;
-    
+
+    wxTextPos lastpos = GetLastPosition() ;
+
     if ( y ) *y = 0 ;
     if ( x ) *x = 0 ;
-    
+
     if ( pos <= lastpos )
     {
-        // TODO find a better implementation : while we can get the 
+        // TODO find a better implementation : while we can get the
         // line metrics of a certain line, we don't get its starting
         // position, so it would probably be rather a binary search
         // for the start position
-        long xpos = 0 ; 
+        long xpos = 0 ;
         long ypos = 0 ;
         int lastHeight = 0 ;
 
@@ -1729,10 +1808,10 @@ bool wxMacMLTEControl::PositionToXY(long pos, long *x, long *y) const
         if ( x ) *x = xpos ;
     }
 
-    return FALSE ;
+    return false ;
 }
 
-void wxMacMLTEControl::ShowPosition( long pos ) 
+void wxMacMLTEControl::ShowPosition( long pos )
 {
 #if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER)
     {
@@ -1749,7 +1828,7 @@ void wxMacMLTEControl::ShowPosition( long pos )
             SInt32 dv = desired.v - current.v ;
             SInt32 dh = desired.h - current.h ;
             TXNShowSelection( m_txn , true ) ;
-            theErr = TXNScroll( m_txn, kTXNScrollUnitsInPixels , kTXNScrollUnitsInPixels , &dv , &dh );          
+            theErr = TXNScroll( m_txn, kTXNScrollUnitsInPixels , kTXNScrollUnitsInPixels , &dv , &dh );
             wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") );
         }
     }
@@ -1760,64 +1839,60 @@ void wxMacMLTEControl::SetTXNData( const wxString& st , TXNOffset start , TXNOff
 {
 #if wxUSE_UNICODE
 #if SIZEOF_WCHAR_T == 2
-       size_t len = st.Len() ;
+    size_t len = st.Len() ;
     TXNSetData( m_txn , kTXNUnicodeTextData,  (void*)st.wc_str(), len * 2,
       start, end);
 #else
-       wxMBConvUTF16BE converter ;
-       ByteCount byteBufferLen = converter.WC2MB( NULL , st.wc_str() , 0 ) ;
-       UniChar *unibuf = (UniChar*) malloc(byteBufferLen) ;
-       converter.WC2MB( (char*) unibuf , st.wc_str() , byteBufferLen ) ;
+    wxMBConvUTF16BE converter ;
+    ByteCount byteBufferLen = converter.WC2MB( NULL , st.wc_str() , 0 ) ;
+    UniChar *unibuf = (UniChar*) malloc(byteBufferLen) ;
+    converter.WC2MB( (char*) unibuf , st.wc_str() , byteBufferLen ) ;
     TXNSetData( m_txn , kTXNUnicodeTextData,  (void*)unibuf, byteBufferLen ,
       start, end);
-       free( unibuf ) ;
+    free( unibuf ) ;
 #endif
 #else
-       wxCharBuffer text =  st.mb_str(wxConvLocal)  ;
+    wxCharBuffer text =  st.mb_str(wxConvLocal)  ;
     TXNSetData( m_txn , kTXNTextData,  (void*)text.data(), strlen( text ) ,
       start, end);
-#endif  
+#endif
 }
 
 
 wxString wxMacMLTEControl::GetLineText(long lineNo) const
 {
     wxString line ;
-    Point curpt ;
-    wxString content = GetStringValue() ;
 
     if ( lineNo < GetNumberOfLines() )
     {
-        // TODO find a better implementation : while we can get the 
-        // line metrics of a certain line, we don't get its starting
-        // position, so it would probably be rather a binary search
-        // for the start position
-        long xpos = 0 ; 
         long ypos = 0 ;
-        int lastHeight = 0 ;
-        long lastpos = GetLastPosition() ;
 
-        ItemCount n ;
-        for ( n = 0 ; n <= (ItemCount)lastpos ; ++n )
+        Fixed   lineWidth,
+                lineHeight,
+                currentHeight = 0;
+
+        // get the first possible position in the control
+        Point firstPoint;
+        TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+        // Iterate through the lines until we reach the one we want,
+        // adding to our current y pixel point position
+        while (ypos < lineNo)
         {
-            TXNOffsetToPoint( m_txn,  n , &curpt);
+            TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+            currentHeight += lineHeight;
+        }
 
-            if ( curpt.v > lastHeight )
-            {
-                if ( ypos == lineNo )
-                    return line ;
-                    
-                xpos = 0 ;
-                if ( n > 0 )
-                    ++ypos ;
-                lastHeight = curpt.v ;
-            }
-            else
-            {
-                if ( ypos == lineNo )
-                    line += content[n] ;
-                ++xpos ;
-            }
+        Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+        TXNOffset theOffset;
+        TXNPointToOffset(m_txn, thePoint, &theOffset);
+
+        wxString content = GetStringValue() ;
+        Point currentPoint = thePoint;
+        while(thePoint.v == currentPoint.v && theOffset < content.length())
+        {
+            line += content[theOffset];
+            TXNOffsetToPoint(m_txn, ++theOffset, &currentPoint);
         }
     }
     return line ;
@@ -1825,38 +1900,41 @@ wxString wxMacMLTEControl::GetLineText(long lineNo) const
 
 int  wxMacMLTEControl::GetLineLength(long lineNo) const
 {
-    Point curpt ;
+    int theLength = 0;
+
     if ( lineNo < GetNumberOfLines() )
     {
-        // TODO find a better implementation : while we can get the 
-        // line metrics of a certain line, we don't get its starting
-        // position, so it would probably be rather a binary search
-        // for the start position
-        long xpos = 0 ; 
         long ypos = 0 ;
-        int lastHeight = 0 ;
-        long lastpos = GetLastPosition() ;
 
-        ItemCount n ;
-        for ( n = 0 ; n <= (ItemCount) lastpos ; ++n )
+        Fixed   lineWidth,
+                lineHeight,
+                currentHeight = 0;
+
+        // get the first possible position in the control
+        Point firstPoint;
+        TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+        // Iterate through the lines until we reach the one we want,
+        // adding to our current y pixel point position
+        while (ypos < lineNo)
         {
-            TXNOffsetToPoint( m_txn ,  n , &curpt);
+            TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+            currentHeight += lineHeight;
+        }
 
-            if ( curpt.v > lastHeight )
-            {
-                if ( ypos == lineNo )
-                    return xpos ;
-                    
-                xpos = 0 ;
-                if ( n > 0 )
-                    ++ypos ;
-                lastHeight = curpt.v ;
-            }
-            else
-                ++xpos ;
+        Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+        TXNOffset theOffset;
+        TXNPointToOffset(m_txn, thePoint, &theOffset);
+
+        wxString content = GetStringValue() ;
+        Point currentPoint = thePoint;
+        while(thePoint.v == currentPoint.v && theOffset < content.length())
+        {
+            ++theLength;
+            TXNOffsetToPoint(m_txn, ++theOffset, &currentPoint);
         }
     }
-    return 0 ;
+    return theLength ;
 }
 
 
@@ -1894,33 +1972,6 @@ internal variables and state information.  A handle to this record is
 stored in the pane control's reference value field using the
 SetControlReference routine. */
 
-class STPTextPaneVars {
-public :
-    /* OS records referenced */
-    TXNObject fTXNRec; /* the txn record */
-    TXNFrameID fTXNFrame; /* the txn frame ID */
-    ControlRef fUserPaneRec;  /* handle to the user pane control */
-    WindowPtr fOwner; /* window containing control */
-    GrafPtr fDrawingEnvironment; /* grafport where control is drawn */
-    /* flags */
-    Boolean fInFocus; /* true while the focus rect is drawn around the control */
-    Boolean fIsActive; /* true while the control is drawn in the active state */
-    Boolean fTXNObjectActive; /* reflects the activation state of the text edit record */
-       Boolean fFocusDrawState; /* true if focus is drawn (default: true) */ 
-    /* calculated locations */
-    Rect fRBounds; /* control bounds */
-    Rect fRTextArea; /* area where the text is drawn */
-    Rect fRFocusOutline;  /* rectangle used to draw the focus box */
-    Rect fRTextOutline; /* rectangle used to draw the border */
-    RgnHandle fRTextOutlineRegion; /* background region for the text, erased before calling TEUpdate */
-    /* our focus advance override routine */
-    EventHandlerUPP handlerUPP;
-    EventHandlerRef handlerRef;
-    bool fNoBorders ;
-    bool fMultiline ;
-    bool fVisible ;
-} ;
-
 /* Univerals Procedure Pointer variables used by the
 mUP Control.  These variables are set up
 the first time that mUPOpenControl is called. */
@@ -1932,133 +1983,135 @@ ControlUserPaneKeyDownUPP gTPKeyProc = NULL;
 ControlUserPaneActivateUPP gTPActivateProc = NULL;
 ControlUserPaneFocusUPP gTPFocusProc = NULL;
 
-// one place for calculating all
-static void TPCalculateBounds(STPTextPaneVars *varsp, const Rect& bounds) 
+
+class wxMacMLTENoDraw
 {
-    SetRect(&varsp->fRBounds, bounds.left, bounds.top, bounds.right, bounds.bottom);
-    SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
-    // eventually make TextOutline inset 1,1
-    SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
-    if ( !varsp->fNoBorders )
-    {
-       SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
-                bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2));
-    }
-    else
-    {
-        SetRect(&varsp->fRTextArea, bounds.left , bounds.top ,
-                bounds.right, bounds.bottom);
-    }
-}
+public :
+    wxMacMLTENoDraw( TXNObject txn ) ;
+    ~wxMacMLTENoDraw() ;
+    
+private :
+    bool m_formerDraw ;
+    TXNObject m_txn ;
+} ;
 
-OSStatus MLTESetObjectVisibility( STPTextPaneVars *varsp, Boolean vis , long wxStyle)
+wxMacMLTENoDraw::wxMacMLTENoDraw( TXNObject txn ) 
 {
-    OSStatus err = noErr ;
-#if TARGET_API_MAC_OSX
+    m_txn = txn ;
+#ifdef __WXMAC_OSX__
     TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
-    TXNControlData iControlData[1] = {{ vis }};
-    err = ::TXNSetTXNObjectControls( varsp->fTXNRec, false, 1, iControlTags, iControlData );
-#endif
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec);
-    if ( vis && textctrl )
+    TXNControlData iControlData[1] ;
+    
+    TXNGetTXNObjectControls( m_txn , 1 , iControlTags , iControlData ) ;
+    m_formerDraw = iControlData[0].uValue ;
+    if ( m_formerDraw )
     {
-        Rect bounds ;
-        UMAGetControlBoundsInWindowCoords( varsp->fUserPaneRec, &bounds);
-        TPCalculateBounds( varsp , bounds ) ;
-        wxMacWindowClipper cl(textctrl) ;
-        TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
-                           varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
-        TXNShowSelection( varsp->fTXNRec, kTXNShowStart);
+        iControlData[0].uValue = 0 ;
+        TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
     }
-    return err ;
+#endif
 }
 
-// make sure we don't miss changes as carbon events are not available for these under classic
-static void TPUpdateVisibility(ControlRef theControl) {
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
-    if ( textctrl == NULL )
-        return ;
-    
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    
-    Rect bounds ;
-    UMAGetControlBoundsInWindowCoords(theControl, &bounds);
-    if ( textctrl->MacIsReallyShown() != varsp->fVisible )
-    {
-        // invalidate old position
-        // InvalWindowRect( GetControlOwner( theControl ) , &varsp->fRBounds ) ;
-        varsp->fVisible = textctrl->MacIsReallyShown() ;
-    }
-    if ( !EqualRect( &bounds , &varsp->fRBounds ) )
+wxMacMLTENoDraw::~wxMacMLTENoDraw() 
+{
+#ifdef __WXMAC_OSX__
+    if ( m_formerDraw )
     {
-        // old position
-        Rect oldBounds = varsp->fRBounds ;
-        TPCalculateBounds( varsp , bounds ) ;
-        // we only recalculate when visible, otherwise scrollbars get drawn at incorrect places
-        if ( varsp->fVisible )
-        {
-            wxMacWindowClipper cl(textctrl) ;
-            TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
-                               varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
-        }
-        InvalWindowRect( GetControlOwner( theControl ) , &oldBounds ) ;
-        InvalWindowRect( GetControlOwner( theControl ) , &varsp->fRBounds ) ;
+        TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
+        TXNControlData iControlData[1] ;
+    
+        iControlData[0].uValue = m_formerDraw ;
+        TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
     }
+#endif
 }
 
+
 // make correct activations
-static void TPActivatePaneText(STPTextPaneVars *varsp, Boolean setActive) {
-    
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec);
-    if (varsp->fTXNObjectActive != setActive && textctrl->MacIsReallyShown() ) 
+void wxMacMLTEClassicControl::MacActivatePaneText(Boolean setActive) 
+{
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
+    if (m_txnIsActive != setActive && textctrl->MacIsReallyShown() )
     {
-        varsp->fTXNObjectActive = setActive;
-        TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTXNObjectActive);
-        if (varsp->fInFocus)
-            TXNFocus( varsp->fTXNRec, varsp->fTXNObjectActive);
+        m_txnIsActive = setActive;
+        // TXNSetScrollBarState
+        
+        TXNActivate(m_txn, m_txnFrameID, m_txnIsActive);
+        if (m_txnIsFocused)
+            TXNFocus( m_txn, m_txnIsActive);
+    }
+}
+
+// update TXN focus state
+void wxMacMLTEClassicControl::MacFocusPaneText(Boolean setFocus) {
+/*    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef); */
+
+    if (m_txnIsFocused != setFocus /*&& textctrl->MacIsReallyShown() */ ) {
+        m_txnIsFocused = setFocus;
+        TXNFocus( m_txn, m_txnIsFocused);
     }
 }
 
-// update focus outlines
-static void TPRedrawFocusOutline(STPTextPaneVars *varsp) {
+// makes sure that the TXNObject is either offscreen or on screen 
+
+void wxMacMLTEClassicControl::MacSetObjectVisibility(Boolean vis)
+{
+#ifdef __WXMAC_OSX__
+    OSStatus err = noErr ;
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
+    if ( textctrl )
+    {
+        UMAGetControlBoundsInWindowCoords( m_controlRef, &m_txnControlBounds);
+        TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
+        TXNControlData iControlData[1] = { { vis } };
     
-    /* state changed */
-       if (varsp->fFocusDrawState != (varsp->fIsActive && varsp->fInFocus)) 
-       { 
-               varsp->fFocusDrawState = (varsp->fIsActive && varsp->fInFocus);
-               DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fFocusDrawState);
-       }
+        TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
+    }
+#endif
 }
 
-// update TXN focus state
-static void TPFocusPaneText(STPTextPaneVars *varsp, Boolean setFocus) {
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec);
+// make sure that the TXNObject is at the right position
+void wxMacMLTEClassicControl::MacUpdatePosition() 
+{
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
+    if ( textctrl == NULL )
+        return ;
+
+    Rect bounds ;
+    UMAGetControlBoundsInWindowCoords(m_controlRef, &bounds);
     
-    if (varsp->fInFocus != setFocus && textctrl->MacIsReallyShown()) {
-        varsp->fInFocus = setFocus;
-        TXNFocus( varsp->fTXNRec, varsp->fInFocus);
+    if ( !EqualRect( &bounds , &m_txnControlBounds ) )
+    {
+        // old position
+        Rect oldBounds = m_txnControlBounds ;
+        m_txnControlBounds = bounds ;
+        wxMacWindowClipper cl(textctrl) ;
+        TXNSetFrameBounds( m_txn, m_txnControlBounds.top, m_txnControlBounds.left,
+            m_txnControlBounds.bottom, m_txnControlBounds.right, m_txnFrameID);
     }
 }
 
+void wxMacMLTEClassicControl::SetRect( Rect *r ) 
+{
+    wxMacControl::SetRect( r ) ;
+    MacUpdatePosition() ;
+}
+
 // draw the control
-static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart) {
+void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 thePart) 
+{
     /* set up our globals */
-    
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return ;
-    TPUpdateVisibility( theControl ) ;
-    
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
+
     if ( textctrl->MacIsReallyShown() )
     {
         wxMacWindowClipper clipper( textctrl ) ;
-        TXNDraw(varsp->fTXNRec, NULL);
-        if ( !varsp->fNoBorders )
-               DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive);
-        TPRedrawFocusOutline( varsp ) ;
+        TXNDraw( m_txn , NULL ) ;
     }
-    
 }
 
 
@@ -2066,20 +2119,21 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
 like to determine what part of the control the mouse resides over.
 We also call this routine from our tracking proc to determine how
 to handle mouse clicks. */
-static pascal ControlPartCode TPPaneHitTestProc(ControlRef theControl, Point where) {
+wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) 
+{
+    Point where = { y , x } ;
     ControlPartCode result;
     /* set up our locals and lock down our globals*/
     result = 0;
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return 0 ;
-    TPUpdateVisibility( theControl ) ;
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    if (textctrl->MacIsReallyShown() ) 
+        
+    if (textctrl->MacIsReallyShown() )
     {
-        if (PtInRect(where, &varsp->fRBounds))
+        if (PtInRect(where, &m_txnControlBounds))
             result = kmUPTextPart;
-        else 
+        else
         {
             // sometimes we get the coords also in control local coordinates, therefore test again
             if ( textctrl->MacGetTopLevelWindow()->MacUsesCompositing() )
@@ -2089,42 +2143,39 @@ static pascal ControlPartCode TPPaneHitTestProc(ControlRef theControl, Point whe
                 where.h += x ;
                 where.v += y ;
             }
-            if (PtInRect(where, &varsp->fRBounds))
+            if (PtInRect(where, &m_txnControlBounds))
                 result = kmUPTextPart;
-            else 
+            else
                 result = 0;
         }
     }
     return result;
 }
 
-
-
-
-
 /* TPPaneTrackingProc is called when the mouse is being held down
 over our control.  This routine handles clicks in the text area
 and in the scroll bar. */
-static pascal ControlPartCode TPPaneTrackingProc(ControlRef theControl, Point startPt, ControlActionUPP actionProc) {
-       
+
+wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxInt16 y, void* actionProc ) 
+{
+    Point startPt = { y ,x } ;
     ControlPartCode partCodeResult;
-       /* make sure we have some variables... */
+    /* make sure we have some variables... */
     partCodeResult = 0;
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return 0;
-    TPUpdateVisibility( theControl ) ;
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    if (textctrl->MacIsReallyShown() ) 
-       {
-               /* we don't do any of these functions unless we're in focus */
-        if ( ! varsp->fInFocus) {
+
+    if (textctrl->MacIsReallyShown() )
+    {
+        /* we don't do any of these functions unless we're in focus */
+        if ( ! m_txnIsFocused) {
             WindowPtr owner;
-            owner = GetControlOwner(theControl);
+            owner = GetControlOwner(m_controlRef);
             ClearKeyboardFocus(owner);
-            SetKeyboardFocus(owner, theControl, kUserClickedToFocusPart);
+            SetKeyboardFocus(owner, m_controlRef, kUserClickedToFocusPart);
         }
-               /* find the location for the click */
+        /* find the location for the click */
         // for compositing, we must convert these into toplevel window coordinates, because hittesting expects them
         if ( textctrl->MacGetTopLevelWindow()->MacUsesCompositing() )
         {
@@ -2133,22 +2184,21 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlRef theControl, Point st
             startPt.h += x ;
             startPt.v += y ;
         }
-        
-        switch (TPPaneHitTestProc(theControl, startPt)) 
+
+        switch (MacControlUserPaneHitTestProc( startPt.h , startPt.v ))
         {
-                       
-                       /* handle clicks in the text part */
+            /* handle clicks in the text part */
             case kmUPTextPart:
-                       { 
-                               wxMacWindowClipper clipper( textctrl ) ;
-                               
-                               EventRecord rec ;
-                               ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
-                               TXNClick( varsp->fTXNRec, &rec );
-                               
-                       }
+            {
+                wxMacWindowClipper clipper( textctrl ) ;
+
+                EventRecord rec ;
+                ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
+                TXNClick( m_txn, &rec );
+
+            }
                 break;
-                               
+
         }
     }
     return partCodeResult;
@@ -2157,40 +2207,46 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlRef theControl, Point st
 
 /* TPPaneIdleProc is our user pane idle routine.  When our text field
 is active and in focus, we use this routine to set the cursor. */
-static pascal void TPPaneIdleProc(ControlRef theControl) {
+void wxMacMLTEClassicControl::MacControlUserPaneIdleProc() 
+{
     /* set up locals */
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return ;
-    TPUpdateVisibility( theControl ) ;
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    if (textctrl->MacIsReallyShown()) {
+
+    if (textctrl->MacIsReallyShown()) 
+    {
         /* if we're not active, then we have nothing to say about the cursor */
-        if (varsp->fIsActive) {
+        if (m_controlIsActive) 
+        {
             Rect bounds;
             Point mousep;
-            
+
             wxMacWindowClipper clipper( textctrl ) ;
             GetMouse(&mousep);
             /* there's a 'focus thing' and an 'unfocused thing' */
-            if (varsp->fInFocus) {
+            if (m_txnIsFocused) 
+            {
                 /* flash the cursor */
-                SetPort(varsp->fDrawingEnvironment);
-                TXNIdle(varsp->fTXNRec);
+                SetPort(m_txnPort);
+                TXNIdle(m_txn);
                 /* set the cursor */
-                if (PtInRect(mousep, &varsp->fRTextArea)) {
+                if (PtInRect(mousep, &m_txnControlBounds)) 
+                {
                     RgnHandle theRgn;
-                    RectRgn((theRgn = NewRgn()), &varsp->fRTextArea);
-                    TXNAdjustCursor(varsp->fTXNRec, theRgn);
+                    RectRgn((theRgn = NewRgn()), &m_txnControlBounds);
+                    TXNAdjustCursor(m_txn, theRgn);
                     DisposeRgn(theRgn);
                 }
                 else
                 {
                     // SetThemeCursor(kThemeArrowCursor);
                 }
-            } else {
+            } 
+            else 
+            {
                 /* if it's in our bounds, set the cursor */
-                UMAGetControlBoundsInWindowCoords(theControl, &bounds);
+                UMAGetControlBoundsInWindowCoords(m_controlRef, &bounds);
                 if (PtInRect(mousep, &bounds))
                 {
                     //    SetThemeCursor(kThemeArrowCursor);
@@ -2204,16 +2260,14 @@ static pascal void TPPaneIdleProc(ControlRef theControl) {
 /* TPPaneKeyDownProc is called whenever a keydown event is directed
 at our control.  Here, we direct the keydown event to the text
 edit record and redraw the scroll bar and text field as appropriate. */
-static pascal ControlPartCode TPPaneKeyDownProc(ControlRef theControl,
-                                                SInt16 keyCode, SInt16 charCode, SInt16 modifiers) {
-    
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+wxInt16 wxMacMLTEClassicControl::MacControlUserPaneKeyDownProc (wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) 
+{
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return 0;
-    TPUpdateVisibility( theControl ) ;
-    
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    if (varsp->fInFocus) 
+    // MacUpdatePosition() ;
+
+    if (m_txnIsFocused)
     {
         /* turn autoscrolling on and send the key event to text edit */
         wxMacWindowClipper clipper( textctrl ) ;
@@ -2222,7 +2276,7 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlRef theControl,
         ev.what = keyDown ;
         ev.modifiers = modifiers ;
         ev.message = (( keyCode << 8 ) & keyCodeMask ) + ( charCode & charCodeMask ) ;
-        TXNKeyDown( varsp->fTXNRec, &ev);
+        TXNKeyDown( m_txn , &ev);
     }
     return kControlEntireControl;
 }
@@ -2231,26 +2285,25 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlRef theControl,
 /* TPPaneActivateProc is called when the window containing
 the user pane control receives activate events. Here, we redraw
 the control and it's text as necessary for the activation state. */
-static pascal void TPPaneActivateProc(ControlRef theControl, Boolean activating) {
+
+void wxMacMLTEClassicControl::MacControlUserPaneActivateProc( bool activating) 
+{
     /* set up locals */
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
-    
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
+
     if ( textctrl == NULL )
         return ;
-    TPUpdateVisibility( theControl ) ;
-    
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
-    
-    varsp->fIsActive = activating;
-    wxMacWindowClipper clipper( textctrl ) ;
-    TPActivatePaneText(varsp, varsp->fIsActive && varsp->fInFocus);
-    /* redraw the frame */
-    if ( textctrl->MacIsReallyShown() )
+        
+    if ( m_controlIsActive != activating )
     {
-        if ( !varsp->fNoBorders )
-               DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive);
-        TPRedrawFocusOutline( varsp ) ;
+        wxLogDebug(wxString::Format( wxT("id %xd activating with %d") , (long) this , activating ) ) ;
+        // MacUpdatePosition() ;
+        m_controlIsActive = activating;
+        wxMacWindowClipper clipper( textctrl ) ;
+        MacActivatePaneText( activating );
     }
+
+
 }
 
 
@@ -2258,15 +2311,20 @@ static pascal void TPPaneActivateProc(ControlRef theControl, Boolean activating)
 from our control.  Herein, switch the focus appropriately
 according to the parameters and redraw the control as
 necessary.  */
-static pascal ControlPartCode TPPaneFocusProc(ControlRef theControl, ControlFocusPart action) {
+wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action) 
+{
+    wxLogDebug(wxString::Format( wxT("id %xd Focus Proc with action %d") , (long) this , action ) ) ;
     ControlPartCode focusResult;
-    
+
     focusResult = kControlFocusNoPart;
-    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
+    wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
     if ( textctrl == NULL )
         return 0;
-    TPUpdateVisibility( theControl ) ;
-    STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
+
+    wxMacWindowClipper clipper( textctrl ) ;
+    
+    // MacUpdatePosition() ;
+
     /* if kControlFocusPrevPart and kControlFocusNextPart are received when the user is
         tabbing forwards (or shift tabbing backwards) through the items in the dialog,
         and kControlFocusNextPart will be received.  When the user clicks in our field
@@ -2274,10 +2332,10 @@ static pascal ControlPartCode TPPaneFocusProc(ControlRef theControl, ControlFocu
         be received.  The constant kControlFocusNoPart will be received when our control
         is the current focus and the user clicks in another control.  In your focus routine,
         you should respond to these codes as follows:
-        
+
         kControlFocusNoPart - turn off focus and return kControlFocusNoPart.  redraw
         the control and the focus rectangle as necessary.
-        
+
         kControlFocusPrevPart or kControlFocusNextPart - toggle focus on or off
         depending on its current state.  redraw the control and the focus rectangle
         as appropriate for the new focus state.  If the focus state is 'off', return the constant
@@ -2285,126 +2343,185 @@ static pascal ControlPartCode TPPaneFocusProc(ControlRef theControl, ControlFocu
         kUserClickedToFocusPart - is a constant defined for this example.  You should
         define your own value for handling click-to-focus type events. */
     /* calculate the next highlight state */
-    switch (action) {
+    switch (action) 
+    {
         default:
         case kControlFocusNoPart:
-            TPFocusPaneText(varsp, false);
+            MacFocusPaneText( false);
             focusResult = kControlFocusNoPart;
             break;
         case kUserClickedToFocusPart:
-            TPFocusPaneText(varsp, true);
+            MacFocusPaneText(true);
             focusResult = 1;
             break;
         case kControlFocusPrevPart:
         case kControlFocusNextPart:
-            TPFocusPaneText(varsp, ( ! varsp->fInFocus));
-            focusResult = varsp->fInFocus ? 1 : kControlFocusNoPart;
+            MacFocusPaneText( ( ! m_txnIsFocused));
+            focusResult = m_txnIsFocused ? 1 : kControlFocusNoPart;
             break;
     }
-    TPActivatePaneText(varsp, varsp->fIsActive && varsp->fInFocus);
-    /* redraw the text fram and focus rectangle to indicate the
-        new focus state */
-    if ( textctrl->MacIsReallyShown() )
-    {
-        wxMacWindowClipper c( textctrl ) ;
-        if ( !varsp->fNoBorders )
-               DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive);
-        TPRedrawFocusOutline( varsp ) ;
-    }
+
     return focusResult;
 }
 
-wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxWindow *wxPeer,
+void wxMacMLTEClassicControl::MacControlUserPaneBackgroundProc( void *info )
+{
+}
+
+wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
                          const wxString& str,
                          const wxPoint& pos,
-                         const wxSize& size, long style ) 
+                         const wxSize& size, long style ) : wxMacMLTEControl( wxPeer )
 {
     m_font = wxPeer->GetFont() ;
     m_windowStyle = style ;
-    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;    
+    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
-
-    wxMacConvertNewlines13To10( &st ) ;
+    wxMacConvertNewlines10To13( &st ) ;
 
     short featurSet;
 
     featurSet = kControlSupportsEmbedding | kControlSupportsFocus  | kControlWantsIdle
-            | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
+            | kControlWantsActivate  | kControlHandlesTracking | kControlHasSpecialBackground
             | kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
         /* create the control */
 
     verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(wxPeer->GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, &m_controlRef ) );
-    
-    {
-//        wxMacWindowClipper c(wxPeer) ;
-        DoCreate();
-    }
-    
-    if ( wxPeer->MacIsReallyShown() )
-        MLTESetObjectVisibility( (STPTextPaneVars*) m_macTXNvars, true , style ) ;
 
-    {
- //            wxMacWindowClipper clipper( wxPeer ) ;
+    DoCreate();
 
-        TPUpdateVisibility( m_controlRef ) ;
+    if ( wxPeer->MacIsReallyShown() )
+        MacSetObjectVisibility( true ) ;
 
-        SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
+    AdjustCreationAttributes( *wxWHITE , true ) ;
 
+    {
+        wxMacWindowClipper clipper( m_peer ) ;
+        SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
         TXNSetSelection( m_txn, 0, 0);
         TXNShowSelection( m_txn, kTXNShowStart);
-    }    
-    
-    AdjustCreationAttributes( *wxWHITE , true ) ;
+    }
 }
 
 wxMacMLTEClassicControl::~wxMacMLTEClassicControl()
 {
 //    SetControlReference(m_controlRef , 0) ;
     TXNDeleteObject(m_txn);
-    free(m_macTXNvars);
 }
 
-void wxMacMLTEClassicControl::VisibilityChanged(bool shown) 
+void wxMacMLTEClassicControl::VisibilityChanged(bool shown)
 {
-    MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , shown , m_windowStyle ) ;
-    if ( !shown )
-        InvalWindowRect( GetControlOwner( m_controlRef ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ;
+    MacSetObjectVisibility( shown ) ;
+}
+
+bool wxMacMLTEClassicControl::NeedsFocusRect() const
+{
+    return true;
+}
+
+#ifdef __WXMAC_OSX__
+
+static pascal void wxMacControlUserPaneDrawProc(ControlRef control, SInt16 part)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        win->MacControlUserPaneDrawProc(part) ;
+}
+
+static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control, Point where)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        return win->MacControlUserPaneHitTestProc(where.h , where.v) ;
+    else
+        return kControlNoPart ;
 }
 
+static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef control, Point startPt, ControlActionUPP actionProc)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        return win->MacControlUserPaneTrackingProc( startPt.h , startPt.v , (void*) actionProc) ;
+    else
+        return kControlNoPart ;
+}
+
+static pascal void wxMacControlUserPaneIdleProc(ControlRef control)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        win->MacControlUserPaneIdleProc() ;
+}
+
+static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        return win->MacControlUserPaneKeyDownProc(keyCode,charCode,modifiers) ;
+    else
+        return kControlNoPart ;
+}
+
+static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean activating)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        win->MacControlUserPaneActivateProc(activating) ;
+}
+
+static pascal ControlPartCode wxMacControlUserPaneFocusProc(ControlRef control, ControlFocusPart action)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        return win->MacControlUserPaneFocusProc(action) ;
+    else
+        return kControlNoPart ;
+}
+
+static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, ControlBackgroundPtr info)
+{
+    wxTextCtrl *textCtrl =  wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ;
+    wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast<wxMacMLTEClassicControl*>(textCtrl->GetPeer()) : NULL ;
+    if ( win )
+        win->MacControlUserPaneBackgroundProc(info) ;
+}
+#endif
+
 OSStatus wxMacMLTEClassicControl::DoCreate()
 {
     Rect bounds;
-    WindowRef theWindow;
 
     OSStatus err = noErr ;
-    
+
     /* set up our globals */
-    if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(TPPaneDrawProc);
-    if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(TPPaneHitTestProc);
-    if (gTPTrackProc == NULL) gTPTrackProc = NewControlUserPaneTrackingUPP(TPPaneTrackingProc);
-    if (gTPIdleProc == NULL) gTPIdleProc = NewControlUserPaneIdleUPP(TPPaneIdleProc);
-    if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc);
-    if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(TPPaneActivateProc);
-    if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(TPPaneFocusProc);
-    
-    /* allocate our private storage */
-    m_macTXNvars = (STPTextPaneVars *) malloc(sizeof(STPTextPaneVars));
-    
+#ifdef __WXMAC_OSX__
+    if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(wxMacControlUserPaneDrawProc);
+    if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(wxMacControlUserPaneHitTestProc);
+    if (gTPTrackProc == NULL) gTPTrackProc = NewControlUserPaneTrackingUPP(wxMacControlUserPaneTrackingProc);
+    if (gTPIdleProc == NULL) gTPIdleProc = NewControlUserPaneIdleUPP(wxMacControlUserPaneIdleProc);
+    if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(wxMacControlUserPaneKeyDownProc);
+    if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(wxMacControlUserPaneActivateProc);
+    if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(wxMacControlUserPaneFocusProc);
+#endif
+
     /* set the initial settings for our private data */
-    m_macTXNvars->fMultiline = m_windowStyle & wxTE_MULTILINE ;
-    m_macTXNvars->fNoBorders = m_windowStyle & wxNO_BORDER ;
-    m_macTXNvars->fInFocus = false;
-    m_macTXNvars->fIsActive = true;
-    m_macTXNvars->fTXNObjectActive = false; 
-    m_macTXNvars->fFocusDrawState = false ;
-    m_macTXNvars->fUserPaneRec = m_controlRef ;
-    m_macTXNvars->fVisible = true ;
-    
-    theWindow = m_macTXNvars->fOwner = GetControlOwner(m_controlRef);
-    
-    m_macTXNvars->fDrawingEnvironment = (GrafPtr)  GetWindowPort(theWindow);
-    
+
+    m_txnIsFocused = false;
+    m_controlIsActive = true;
+    m_txnIsActive = false;
+    m_txnIsVisible = true ;
+
+    WindowRef owningWindow = GetControlOwner(m_controlRef);
+    m_txnPort = (GrafPtr) GetWindowPort(owningWindow);
+
+#ifdef __WXMAC_OSX__
     /* set up the user pane procedures */
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneDrawProcTag, sizeof(gTPDrawProc), &gTPDrawProc);
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneHitTestProcTag, sizeof(gTPHitProc), &gTPHitProc);
@@ -2413,31 +2530,33 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneKeyDownProcTag, sizeof(gTPKeyProc), &gTPKeyProc);
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneActivateProcTag, sizeof(gTPActivateProc), &gTPActivateProc);
     SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc);
-    
+#endif
     /* calculate the rectangles used by the control */
     UMAGetControlBoundsInWindowCoords(m_controlRef, &bounds);
-    m_macTXNvars->fRTextOutlineRegion = NewRgn() ;
-    TPCalculateBounds( m_macTXNvars , bounds ) ;
-    
-    /* set up the drawing environment */
-    SetPort(m_macTXNvars->fDrawingEnvironment);
+    m_txnControlBounds = bounds ;
     
+    CGrafPtr        origPort = NULL ;
+    GDHandle        origDev = NULL ;
+    GetGWorld( &origPort , &origDev ) ;
+    SetPort(m_txnPort);
+
     /* create the new edit field */
-    
+
     TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( m_windowStyle ) ;
-    
-    verify_noerr(TXNNewObject(NULL, m_macTXNvars->fOwner, &m_macTXNvars->fRTextArea,
+
+    verify_noerr(TXNNewObject(NULL, owningWindow , &bounds,
                               frameOptions ,
                               kTXNTextEditStyleFrameType,
                               kTXNTextensionFile,
                               kTXNSystemDefaultEncoding,
-                              &m_macTXNvars->fTXNRec, &m_macTXNvars->fTXNFrame, (TXNObjectRefcon) m_macTXNvars));
-    m_txn = m_macTXNvars->fTXNRec ;
-    
+                              &m_txn, &m_txnFrameID, NULL ) );
+
     /* perform final activations and setup for our text field.  Here,
-        we assume that the window is going to be the 'active' window. */
-    TPActivatePaneText(m_macTXNvars, m_macTXNvars->fIsActive && m_macTXNvars->fInFocus);
+    we assume that the window is going to be the 'active' window. */
+    // MacActivatePaneText(m_controlIsActive && m_txnIsFocused);
     /* all done */
+    SetGWorld( origPort , origDev ) ;
     return err;
 }
 
@@ -2447,30 +2566,32 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
 
 #if TARGET_API_MAC_OSX
 
-wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
+wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
                          const wxString& str,
                          const wxPoint& pos,
-                         const wxSize& size, long style ) 
+                         const wxSize& size, long style ) : wxMacMLTEControl( wxPeer )
 {
     m_font = wxPeer->GetFont() ;
     m_windowStyle = style ;
-    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;    
+    Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
     wxString st = str ;
-    wxMacConvertNewlines13To10( &st ) ;
-    
+    wxMacConvertNewlines10To13( &st ) ;
+
     HIRect hr = { bounds.left , bounds.top , bounds.right - bounds.left , bounds.bottom- bounds.top } ;
 
     m_scrollView = NULL ;
     TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( style ) ;
     if ( frameOptions & (kTXNWantVScrollBarMask|kTXNWantHScrollBarMask) )
     {
-        HIScrollViewCreate(( frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) | 
+        HIScrollViewCreate(( frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) |
             ( frameOptions & kTXNWantVScrollBarMask ? kHIScrollViewOptionsVertScroll: 0 ) , &m_scrollView ) ;
-       
-       HIViewSetFrame( m_scrollView, &hr );
-       HIViewSetVisible( m_scrollView, true );
+
+        HIViewSetFrame( m_scrollView, &hr );
+        HIViewSetVisible( m_scrollView, true );
     }
-    
+
     m_textView = NULL ;
     HITextViewCreate( NULL , 0, frameOptions , &m_textView ) ;
     m_txn = HITextViewGetTXNObject( m_textView) ;
@@ -2483,37 +2604,41 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
     }
     else
     {
-       HIViewSetFrame( m_textView, &hr );
+        HIViewSetFrame( m_textView, &hr );
         m_controlRef = m_textView ;
     }
-    
-    
+
+    AdjustCreationAttributes( *wxWHITE , true ) ;
+
+    wxMacWindowClipper c( m_peer ) ;
     SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
 
     TXNSetSelection( m_txn, 0, 0);
     TXNShowSelection( m_txn, kTXNShowStart);
 
-    AdjustCreationAttributes( *wxWHITE , true ) ;
 }
 
-OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart ) 
+OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart )
 {
-    return SetKeyboardFocus(  GetControlOwner( m_textView )  , 
+    return SetKeyboardFocus(  GetControlOwner( m_textView )  ,
         m_textView , focusPart ) ;
 }
 
-bool wxMacMLTEHIViewControl::HasFocus() const 
+bool wxMacMLTEHIViewControl::HasFocus() const
 {
     ControlRef control ;
     GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
     return control == m_textView ;
 }
 
-bool wxMacMLTEHIViewControl::NeedsFocusRect() const 
+bool wxMacMLTEHIViewControl::NeedsFocusRect() const
 {
-    return true ;
+    return m_windowStyle & wxNO_BORDER ? false : true;
 }
 
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
+
 #endif
 
 #endif // wxUSE_TEXTCTRL