]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/textctrl.cpp
VTK wrapper of vtkRenderWindow for wxPython. Tested on MSW so far.
[wxWidgets.git] / src / mac / textctrl.cpp
index 4171b868b644f2cc2e326c897dd8ad3f0f8335d2..21648fc476ed1444f6a18f2602857e2fd3d84089 100644 (file)
 #endif
 #endif
 
+#include "wx/mac/uma.h"
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
        EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+       EVT_CHAR(wxTextCtrl::OnChar)
 END_EVENT_TABLE()
 #endif
 
@@ -54,67 +57,114 @@ wxTextCtrl::wxTextCtrl()
 }
 
 bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
-                  const wxString& value,
+                  const wxString& st,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    m_fileName = "";
-    SetName(name);
-    SetValidator(validator);
-    if (parent) parent->AddChild(this);
+       m_macHorizontalBorder = 2 ; // additional pixels around the real control
+       m_macVerticalBorder = 2 ;
 
-    m_windowStyle = style;
+       wxSize mySize = size ;
 
-    if ( id == -1 )
-           m_windowId = (int)NewControlId();
-    else
-           m_windowId = id;
+       Rect bounds ;
+       Str255 title ;
+       
+       if ( mySize.y == -1 )
+       {
+               if ( UMAHasAppearance() )
+                       mySize.y = 16 ;
+               else
+                       mySize.y = 24 ;
+       }
+       MacPreControlCreate( parent , id ,  "" , pos , mySize ,style, validator , name , &bounds , title ) ;
 
-    return TRUE;
+       m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+               kControlEditTextProc , (long) this ) ;
+       MacPostControlCreate() ;
+
+       wxString value ;
+       
+       if( wxApp::s_macDefaultEncodingIsPC )
+               value = wxMacMakeMacStringFromPC( st ) ;
+       else
+               value = st ;
+       UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+
+  return TRUE;
 }
 
 wxString wxTextCtrl::GetValue() const
 {
-    // TODO
-    return wxString("");
+       Size actualsize;
+       UMAGetControlData( m_macControl, 0, kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ;
+       wxBuffer[actualsize] = 0 ;
+       if( wxApp::s_macDefaultEncodingIsPC )
+               return wxMacMakePCStringFromMac( wxBuffer ) ;
+       else
+       return wxString(wxBuffer);
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::SetValue(const wxString& st)
 {
-    // TODO
+       wxString value ;
+       
+       if( wxApp::s_macDefaultEncodingIsPC )
+               value = wxMacMakeMacStringFromPC( st ) ;
+       else
+               value = st ;
+       UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+       Refresh() ;
+//     MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 // Clipboard operations
 void wxTextCtrl::Copy()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+       TECopy( teH ) ;
 }
 
 void wxTextCtrl::Cut()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+       TECut( teH ) ;
+//     MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Paste()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+       TEPaste( teH ) ;
+//     MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetEditable(bool editable)
 {
-    // TODO
+    if ( editable )
+       UMAActivateControl( m_macControl ) ;
+    else
+       UMADeactivateControl( m_macControl ) ;
 }
 
 void wxTextCtrl::SetInsertionPoint(long pos)
 {
-    // TODO
+       SetSelection( pos , pos ) ;
 }
 
 void wxTextCtrl::SetInsertionPointEnd()
@@ -125,29 +175,72 @@ void wxTextCtrl::SetInsertionPointEnd()
 
 long wxTextCtrl::GetInsertionPoint() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).selStart ;
 }
 
 long wxTextCtrl::GetLastPosition() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).teLength ;
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& value)
 {
-    // TODO
+       TEHandle teH ;
+       long size ;
+   
+       ControlEditTextSelectionRec selection ;
+   
+       selection.selStart = from ;
+       selection.selEnd = to ;
+       UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+               UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+       TESetSelect( from , to  , teH ) ;
+       TEDelete( teH ) ;
+               TEInsert( value , value.Length() , teH ) ;
+//     MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Remove(long from, long to)
 {
-    // TODO
+       TEHandle teH ;
+       long size ;
+   
+       ControlEditTextSelectionRec selection ;
+   
+       selection.selStart = from ;
+       selection.selEnd = to ;
+       UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+       UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+       TEDelete( teH ) ;
+//     MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
-    // TODO
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+   selection.selStart = from ;
+   selection.selEnd = to ;
+   
+   UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   TESetSelect( selection.selStart , selection.selEnd , teH ) ;
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
@@ -217,18 +310,44 @@ bool wxTextCtrl::SaveFile(const wxString& file)
 
 void wxTextCtrl::WriteText(const wxString& text)
 {
-    // TODO write text to control
+    TEHandle teH ;
+    long size ;
+   
+       memcpy( wxBuffer, text , text.Length() ) ;
+       wxBuffer[text.Length() ] = 0 ;
+//    wxMacConvertNewlines( wxBuffer , wxBuffer ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+               TEInsert( wxBuffer , strlen( wxBuffer) , teH ) ;
+               Refresh() ;
+}
+
+void wxTextCtrl::AppendText(const wxString& text)
+{
+    SetInsertionPointEnd();
+    WriteText(text);
 }
 
 void wxTextCtrl::Clear()
 {
-    // TODO
+    TEHandle teH ;
+    long size ;
+       ControlEditTextSelectionRec selection ;
+   
+       selection.selStart = 0 ;
+       selection.selEnd = 32767 ;
+   
+    UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+               TECut( teH ) ;
+//     MacInvalidateControl() ;
 }
 
 bool wxTextCtrl::IsModified() const
 {
-    // TODO
-    return FALSE;
+    return TRUE;
 }
 
 // Makes 'unmodified'
@@ -261,14 +380,12 @@ void wxTextCtrl::ShowPosition(long pos)
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
-    // TODO
-    return 0;
+    return GetValue().Length();
 }
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-    // TODO
-    return wxString("");
+    return GetValue();
 }
 
 /*
@@ -290,6 +407,54 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
+void wxTextCtrl::OnChar(wxKeyEvent& event)
+{
+    switch( event.KeyCode() )
+    {
+        case WXK_RETURN:
+        {
+            if ( !(m_windowStyle & wxTE_MULTILINE) )
+            {
+                wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
+                event.SetEventObject( this );
+                if ( GetEventHandler()->ProcessEvent(event) )
+                    return;
+            }
+            //else: multiline controls need Enter for themselves
+
+            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.
+            //
+            // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is
+            //     handled by Windows
+            {
+                wxNavigationKeyEvent eventNav;
+                eventNav.SetDirection(!event.ShiftDown());
+                eventNav.SetWindowChange(FALSE);
+                eventNav.SetEventObject(this);
+
+                if ( GetEventHandler()->ProcessEvent(eventNav) )
+                    return;
+            }
+            break;
+
+        default:
+            event.Skip();
+            return;
+    }
+
+    // don't just call event.Skip() because this will cause TABs and ENTERs
+    // be passed upwards and we don't always want this - instead process it
+    // right here
+
+    // FIXME
+    event.Skip();
+}
 // The streambuf code was partly taken from chapter 3 by Jerry Schwarz of
 // AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers
 
@@ -345,7 +510,7 @@ int wxTextCtrl::overflow(int c)
   txt[plen] = (char)c;     // append c
   txt[plen+xtra] = '\0';   // append '\0' or overwrite c
     // If the put area already contained \0, output will be truncated there
-  WriteText(txt);
+  AppendText(txt);
     delete[] txt;
   }
 
@@ -399,7 +564,7 @@ int wxTextCtrl::underflow()
 
 wxTextCtrl& wxTextCtrl::operator<<(const wxString& s)
 {
-    WriteText(s);
+    AppendText(s);
     return *this;
 }
 
@@ -407,7 +572,7 @@ wxTextCtrl& wxTextCtrl::operator<<(float f)
 {
     wxString str;
     str.Printf("%.2f", f);
-    WriteText(str);
+    AppendText(str);
     return *this;
 }
 
@@ -415,7 +580,7 @@ wxTextCtrl& wxTextCtrl::operator<<(double d)
 {
     wxString str;
     str.Printf("%.2f", d);
-    WriteText(str);
+    AppendText(str);
     return *this;
 }
 
@@ -423,7 +588,7 @@ wxTextCtrl& wxTextCtrl::operator<<(int i)
 {
     wxString str;
     str.Printf("%d", i);
-    WriteText(str);
+    AppendText(str);
     return *this;
 }
 
@@ -431,7 +596,7 @@ wxTextCtrl& wxTextCtrl::operator<<(long i)
 {
     wxString str;
     str.Printf("%ld", i);
-    WriteText(str);
+    AppendText(str);
     return *this;
 }
 
@@ -441,7 +606,7 @@ wxTextCtrl& wxTextCtrl::operator<<(const char c)
 
     buf[0] = c;
     buf[1] = 0;
-    WriteText(buf);
+    AppendText(buf);
     return *this;
 }