X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e9576ca53db96b462ed4c0b4bdf47d64c40203e4..1dd521517c6a7047dce77302cd35a7f07ee2f595:/src/mac/carbon/textctrl.cpp?ds=sidebyside diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index 4171b868b6..21648fc476 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -36,11 +36,14 @@ #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; }