X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..3baaf31317b1380ba9f33f8a23ff04bd20356d63:/src/mac/carbon/textctrl.cpp?ds=sidebyside diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index d553477f93..c6a6d86e09 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -13,27 +13,33 @@ #pragma implementation "textctrl.h" #endif -#ifndef __WXMAC__ -#include -#include +#include "wx/defs.h" + +#if wxUSE_TEXTCTRL + +#ifdef __DARWIN__ + #include + #include #else -#include + #include #endif #include +#include "wx/app.h" +#include "wx/dc.h" +#include "wx/button.h" +#include "wx/panel.h" #include "wx/textctrl.h" +#include "wx/notebook.h" +#include "wx/tabctrl.h" #include "wx/settings.h" #include "wx/filefn.h" #include "wx/utils.h" #if defined(__BORLANDC__) && !defined(__WIN32__) -#include -#else -#ifndef __MWERKS__ -#ifndef __GNUWIN32__ -#include -#endif -#endif + #include +#elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__) + #include #endif #include "wx/mac/uma.h" @@ -44,18 +50,28 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) EVT_CHAR(wxTextCtrl::OnChar) + EVT_MENU(wxID_CUT, wxTextCtrl::OnCut) + EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy) + EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste) + EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo) + EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo) + + EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut) + EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy) + EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste) + EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo) + EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() #endif // Text item wxTextCtrl::wxTextCtrl() -#ifndef NO_TEXT_WINDOW_STREAM - :streambuf() -#endif { - m_fileName = ""; } +const short kVerticalMargin = 2 ; +const short kHorizontalMargin = 2 ; + bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxString& st, const wxPoint& pos, @@ -63,34 +79,66 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - m_macHorizontalBorder = 2 ; // additional pixels around the real control - m_macVerticalBorder = 2 ; + // base initialization + if ( !CreateBase(parent, id, pos, size, style, validator, name) ) + return FALSE; wxSize mySize = size ; + if ( UMAHasAppearance() ) + { + m_macHorizontalBorder = 5 ; // additional pixels around the real control + m_macVerticalBorder = 5 ; + } + else + { + m_macHorizontalBorder = 0 ; // additional pixels around the real control + m_macVerticalBorder = 0 ; + } + Rect bounds ; Str255 title ; - + if ( mySize.y == -1 ) { if ( UMAHasAppearance() ) - mySize.y = 16 ; + mySize.y = 13 ; else mySize.y = 24 ; + + mySize.y += 2 * m_macVerticalBorder ; } + MacPreControlCreate( parent , id , "" , pos , mySize ,style, validator , name , &bounds , title ) ; + if ( m_windowStyle & wxTE_MULTILINE ) + { + wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER), + wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") ); + + m_windowStyle |= wxTE_PROCESS_ENTER; + } + + m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, - kControlEditTextProc , (long) this ) ; + ( style & wxTE_PASSWORD ) ? kControlEditTextPasswordProc : kControlEditTextProc , (long) this ) ; MacPostControlCreate() ; wxString value ; + { + TEHandle teH ; + long size ; + + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + (*teH)->lineHeight = -1 ; + } + if( wxApp::s_macDefaultEncodingIsPC ) value = wxMacMakeMacStringFromPC( st ) ; else value = st ; - UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; + UMASetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; return TRUE; } @@ -98,7 +146,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, wxString wxTextCtrl::GetValue() const { Size actualsize; - UMAGetControlData( m_macControl, 0, kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ; + UMAGetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ; wxBuffer[actualsize] = 0 ; if( wxApp::s_macDefaultEncodingIsPC ) return wxMacMakePCStringFromMac( wxBuffer ) ; @@ -106,6 +154,18 @@ wxString wxTextCtrl::GetValue() const return wxString(wxBuffer); } +void wxTextCtrl::GetSelection(long* from, long* to) const +{ + ControlEditTextSelectionRec selection ; + TEHandle teH ; + long size ; + + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + + *from = (**teH).selStart; + *to = (**teH).selEnd; +} + void wxTextCtrl::SetValue(const wxString& st) { wxString value ; @@ -114,44 +174,181 @@ void wxTextCtrl::SetValue(const wxString& st) 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) -{ - wxControl::SetSize( x , y , width , height , sizeFlags ) ; + UMASetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; + WindowRef window = GetMacRootWindow() ; + if ( window ) + { + wxWindow* win = wxFindWinFromMacWindow( window ) ; + if ( win ) + { + wxMacDrawingHelper help( win ) ; + // the mac control manager always assumes to have the origin at 0,0 + SetOrigin( 0 , 0 ) ; + + bool hasTabBehind = false ; + wxWindow* parent = GetParent() ; + while ( parent ) + { + if( parent->MacGetWindowData() ) + { + UMASetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ; + break ; + } + + if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) )) + { + if ( ((wxControl*)parent)->GetMacControl() ) + SetUpControlBackground( ((wxControl*)parent)->GetMacControl() , -1 , true ) ; + break ; + } + + parent = parent->GetParent() ; + } + + UMADrawControl( m_macControl ) ; + UMASetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , win->MacGetWindowData()->m_macWindowBackgroundTheme , false ) ; + } + } } // Clipboard operations void wxTextCtrl::Copy() { - TEHandle teH ; - long size ; + if (CanCopy()) + { + TEHandle teH ; + long size ; - UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; - TECopy( teH ) ; + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + TECopy( teH ) ; +#if TARGET_CARBON + OSStatus err ; + err = ClearCurrentScrap( ); +#else + OSErr err ; + err = ZeroScrap( ); +#endif + TEToScrap() ; + } } void wxTextCtrl::Cut() { - TEHandle teH ; - long size ; + if (CanCut()) + { + TEHandle teH ; + long size ; - UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; - TECut( teH ) ; -// MacInvalidateControl() ; + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + TECut( teH ) ; +#if TARGET_CARBON + OSStatus err ; + err = ClearCurrentScrap( ); +#else + OSErr err ; + err = ZeroScrap( ); +#endif + TEToScrap() ; + // MacInvalidateControl() ; + } } void wxTextCtrl::Paste() { - TEHandle teH ; - long size ; + if (CanPaste()) + { + TEHandle teH ; + long size ; - UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; - TEPaste( teH ) ; -// MacInvalidateControl() ; + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + TEFromScrap() ; + TEPaste( teH ) ; + WindowRef window = GetMacRootWindow() ; + if ( window ) + { + wxWindow* win = wxFindWinFromMacWindow( window ) ; + if ( win ) + { + wxMacDrawingHelper help( win ) ; + // the mac control manager always assumes to have the origin at 0,0 + SetOrigin( 0 , 0 ) ; + + bool hasTabBehind = false ; + wxWindow* parent = GetParent() ; + while ( parent ) + { + if( parent->MacGetWindowData() ) + { + UMASetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ; + break ; + } + + if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) )) + { + if ( ((wxControl*)parent)->GetMacControl() ) + SetUpControlBackground( ((wxControl*)parent)->GetMacControl() , -1 , true ) ; + break ; + } + + parent = parent->GetParent() ; + } + + UMADrawControl( m_macControl ) ; + UMASetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , win->MacGetWindowData()->m_macWindowBackgroundTheme , false ) ; + } + } + } +} + +bool wxTextCtrl::CanCopy() const +{ + // Can copy if there's a selection + long from, to; + GetSelection(& from, & to); + return (from != to); +} + +bool wxTextCtrl::CanCut() const +{ + // Can cut if there's a selection + long from, to; + GetSelection(& from, & to); + return (from != to); +} + +bool wxTextCtrl::CanPaste() const +{ + if (!IsEditable()) + return FALSE; + + long offset ; +#if TARGET_CARBON + OSStatus err = noErr; + ScrapRef scrapRef; + + err = GetCurrentScrap( &scrapRef ); + if ( err != noTypeErr && err != memFullErr ) + { + ScrapFlavorFlags flavorFlags; + Size byteCount; + + if (( err = GetScrapFlavorFlags( scrapRef, 'TEXT', &flavorFlags )) == noErr) + { + if (( err = GetScrapFlavorSize( scrapRef, 'TEXT', &byteCount )) == noErr) + { + return TRUE ; + } + } + } + return FALSE; + +#else + if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 ) + { + return TRUE ; + } +#endif + return FALSE ; } void wxTextCtrl::SetEditable(bool editable) @@ -210,7 +407,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) TESetSelect( from , to , teH ) ; TEDelete( teH ) ; TEInsert( value , value.Length() , teH ) ; -// MacInvalidateControl() ; + Refresh() ; } void wxTextCtrl::Remove(long from, long to) @@ -225,7 +422,7 @@ void wxTextCtrl::Remove(long from, long to) UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; TEDelete( teH ) ; -// MacInvalidateControl() ; + Refresh() ; } void wxTextCtrl::SetSelection(long from, long to) @@ -245,65 +442,10 @@ void wxTextCtrl::SetSelection(long from, long to) bool wxTextCtrl::LoadFile(const wxString& file) { - if (!wxFileExists(file)) - return FALSE; - - m_fileName = file; - - Clear(); - -#ifndef __WXMAC__ - ifstream input((char*) (const char*) file, ios::nocreate | ios::in); -#else - ifstream input((char*) (const char*) file, ios::in); -#endif - if (!input.bad()) + if ( wxTextCtrlBase::LoadFile(file) ) { - struct stat stat_buf; - if (stat(file, &stat_buf) < 0) - return FALSE; - // This may need to be a bigger buffer than the file size suggests, - // if it's a UNIX file. Give it an extra 1000 just in case. - char *tmp_buffer = (char*)malloc((size_t)(stat_buf.st_size+1+1000)); - long no_lines = 0; - long pos = 0; - while (!input.eof() && input.peek() != EOF) - { - input.getline(wxBuffer, 500); - int len = strlen(wxBuffer); - wxBuffer[len] = 13; - wxBuffer[len+1] = 10; - wxBuffer[len+2] = 0; - strcpy(tmp_buffer+pos, wxBuffer); - pos += strlen(wxBuffer); - no_lines++; - } - - // TODO add line - - free(tmp_buffer); - - return TRUE; + return TRUE; } - return FALSE; -} - -// If file is null, try saved file name first -// Returns TRUE if succeeds. -bool wxTextCtrl::SaveFile(const wxString& file) -{ - wxString theFile(file); - if (theFile == "") - theFile = m_fileName; - if (theFile == "") - return FALSE; - m_fileName = theFile; - - ofstream output((char*) (const char*) theFile); - if (output.bad()) - return FALSE; - - // TODO get and save text return FALSE; } @@ -331,18 +473,8 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - 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() ; + UMASetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ; + Refresh() ; } bool wxTextCtrl::IsModified() const @@ -350,6 +482,73 @@ bool wxTextCtrl::IsModified() const return TRUE; } +bool wxTextCtrl::IsEditable() const +{ + return IsEnabled(); +} + +bool wxTextCtrl::AcceptsFocus() const +{ + // we don't want focus if we can't be edited + return IsEditable() && wxControl::AcceptsFocus(); +} + +wxSize wxTextCtrl::DoGetBestSize() const +{ + int wText = 100 ; + + int hText ; + if ( UMAHasAppearance() ) + hText = 13 ; + else + hText = 24 ; + hText += 2 * m_macHorizontalBorder ; +/* + int cx, cy; + wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); + + int wText = DEFAULT_ITEM_WIDTH; + + int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); + + return wxSize(wText, hText); +*/ + if ( m_windowStyle & wxTE_MULTILINE ) + { + hText *= wxMin(GetNumberOfLines(), 5); + } + //else: for single line control everything is ok + return wxSize(wText, hText); +} + +// ---------------------------------------------------------------------------- +// Undo/redo +// ---------------------------------------------------------------------------- + +void wxTextCtrl::Undo() +{ + if (CanUndo()) + { + } +} + +void wxTextCtrl::Redo() +{ + if (CanRedo()) + { + } +} + +bool wxTextCtrl::CanUndo() const +{ + return FALSE ; +} + +bool wxTextCtrl::CanRedo() const +{ + return FALSE ; +} + // Makes 'unmodified' void wxTextCtrl::DiscardEdits() { @@ -358,8 +557,16 @@ void wxTextCtrl::DiscardEdits() int wxTextCtrl::GetNumberOfLines() const { - // TODO - return 0; + Size actualsize; + UMAGetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ; + + int count = 1; + for (int i = 0; i < actualsize; i++) + { + if (wxBuffer[i] == '\r') count++; + } + + return count; } long wxTextCtrl::XYToPosition(long x, long y) const @@ -368,9 +575,9 @@ long wxTextCtrl::XYToPosition(long x, long y) const return 0; } -void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const +bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const { - // TODO + return FALSE ; } void wxTextCtrl::ShowPosition(long pos) @@ -380,12 +587,59 @@ void wxTextCtrl::ShowPosition(long pos) int wxTextCtrl::GetLineLength(long lineNo) const { - return GetValue().Length(); + Size actualsize; + UMAGetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ; + + // Find line first + int count = 0; + for (int i = 0; i < actualsize; i++) + { + if (count == lineNo) + { + // Count chars in line then + count = 0; + for (int j = i; j < actualsize; j++) + { + count++; + if (wxBuffer[j] == '\r') return count; + } + + return count; + } + if (wxBuffer[i] == '\r') count++; + } + + return 0; } wxString wxTextCtrl::GetLineText(long lineNo) const { - return GetValue(); + Size actualsize; + UMAGetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ; + + // Find line first + int count = 0; + for (int i = 0; i < actualsize; i++) + { + if (count == lineNo) + { + // Add chars in line then + wxString tmp(""); + + for (int j = i; j < actualsize; j++) + { + if (wxBuffer[j] == '\r') + return tmp; + + tmp += wxBuffer[j]; + } + + return tmp; + } + if (wxBuffer[i] == '\r') count++; + } + + return wxString(""); } /* @@ -409,226 +663,130 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event) void wxTextCtrl::OnChar(wxKeyEvent& event) { - bool handleIt = true ; - switch( event.KeyCode() ) + switch ( event.KeyCode() ) { case WXK_RETURN: - { -/* Oh yes it will, because we also specify DLGC_WANTCHARS - wxASSERT_MSG( m_windowStyle & wxTE_PROCESS_ENTER, - "this text ctrl should never receive return" ); -*/ - - if ( (m_windowStyle & wxTE_MULTILINE) == 0 ) + if (m_windowStyle & wxPROCESS_ENTER) + { + wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); + event.SetEventObject( this ); + if ( GetEventHandler()->ProcessEvent(event) ) + return; + } + if ( !(m_windowStyle & wxTE_MULTILINE) ) { - wxWindow* parent = GetParent() ; - while( parent ) - { - if ( parent->GetDefaultItem() ) - { - wxButton *defaultBtn = parent->GetDefaultItem() ; - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, defaultBtn->GetId() ); - event.SetEventObject(defaultBtn); - defaultBtn->Command(event); - return ; - } - parent = parent->GetParent() ; - } ; + wxWindow *parent = GetParent(); + wxPanel *panel = wxDynamicCast(parent, wxPanel); + while ( parent != NULL && panel == NULL ) + { + parent = parent->GetParent() ; + panel = wxDynamicCast(parent, wxPanel); + } + if ( panel && panel->GetDefaultItem() ) + { + wxButton *def = wxDynamicCast(panel->GetDefaultItem(), + wxButton); + if ( def && def->IsEnabled() ) + { + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); + event.SetEventObject(def); + def->Command(event); + return ; + } + } } + //else: multiline controls need Enter for themselves + break; - } + case WXK_TAB: - // only produce navigation event if we don't process TAB ourself or - // if it's a Shift-Tab keypress (we assume nobody will ever need - // this key combo for himself) - // - // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is - // handled by Windows - if ( event.ShiftDown() || !(m_windowStyle & wxTE_PROCESS_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. { wxNavigationKeyEvent eventNav; eventNav.SetDirection(!event.ShiftDown()); - eventNav.SetWindowChange(FALSE); + eventNav.SetWindowChange(event.ControlDown()); eventNav.SetEventObject(this); - - if ( GetEventHandler()->ProcessEvent(eventNav) ) + + if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) ) return; + event.Skip() ; + return ; } break; } - if ( handleIt ) - { - EventRecord *ev = wxTheApp->MacGetCurrentEvent() ; - short keycode ; - short keychar ; - keychar = short(ev->message & charCodeMask); - keycode = short(ev->message & keyCodeMask) >> 8 ; - UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ; - if ( keychar >= 0x20 ) - { - { + + EventRecord *ev = wxTheApp->MacGetCurrentEvent() ; + short keycode ; + short keychar ; + keychar = short(ev->message & charCodeMask); + keycode = short(ev->message & keyCodeMask) >> 8 ; + UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ; + if ( keychar >= 0x20 || event.KeyCode() == WXK_RETURN || event.KeyCode() == WXK_DELETE || event.KeyCode() == WXK_BACK) + { wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - wxString val(GetValue()); - if ( !val.IsNull() ) - event.m_commandString = WXSTRINGCAST val; + event.SetString( GetValue() ) ; event.SetEventObject( this ); - ProcessCommand(event); - } - } - } + GetEventHandler()->ProcessEvent(event); + } + } -// 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 - -//========================================================================= -// Called then the buffer is full (gcc 2.6.3) -// or when "endl" is output (Borland 4.5) -//========================================================================= -// Class declaration using multiple inheritance doesn't work properly for -// Borland. See note in wb_text.h. -#ifndef NO_TEXT_WINDOW_STREAM -int wxTextCtrl::overflow(int c) -{ - // Make sure there is a holding area - if ( allocate()==EOF ) - { - wxError("Streambuf allocation failed","Internal error"); - return EOF; - } - - // Verify that there are no characters in get area - if ( gptr() && gptr() < egptr() ) - { - wxError("Who's trespassing my get area?","Internal error"); - return EOF; - } - - // Reset get area - setg(0,0,0); - - // Make sure there is a put area - if ( ! pptr() ) - { -/* This doesn't seem to be fatal so comment out error message */ -// wxError("Put area not opened","Internal error"); - setp( base(), base() ); - } - - // Determine how many characters have been inserted but no consumed - int plen = pptr() - pbase(); - - // Now Jerry relies on the fact that the buffer is at least 2 chars - // long, but the holding area "may be as small as 1" ??? - // And we need an additional \0, so let's keep this inefficient but - // safe copy. - - // If c!=EOF, it is a character that must also be comsumed - int xtra = c==EOF? 0 : 1; - - // Write temporary C-string to wxTextWindow - { - char *txt = new char[plen+xtra+1]; - memcpy(txt, pbase(), plen); - 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 - AppendText(txt); - delete[] txt; - } - - // Reset put area - setp(pbase(), epptr()); - -#if defined(__WATCOMC__) - return __NOT_EOF; -#elif defined(zapeof) // HP-UX (all cfront based?) - return zapeof(c); -#else - return c!=EOF ? c : 0; // this should make everybody happy -#endif + +// ---------------------------------------------------------------------------- +// standard handlers for standard edit menu events +// ---------------------------------------------------------------------------- + +void wxTextCtrl::OnCut(wxCommandEvent& event) +{ + Cut(); } -//========================================================================= -// called then "endl" is output (gcc) or then explicit sync is done (Borland) -//========================================================================= -int wxTextCtrl::sync() -{ - // Verify that there are no characters in get area - if ( gptr() && gptr() < egptr() ) - { - wxError("Who's trespassing my get area?","Internal error"); - return EOF; - } - - if ( pptr() && pptr() > pbase() ) return overflow(EOF); - - return 0; -/* OLD CODE - int len = pptr() - pbase(); - char *txt = new char[len+1]; - strncpy(txt, pbase(), len); - txt[len] = '\0'; - (*this) << txt; - setp(pbase(), epptr()); - delete[] txt; - return 0; -*/ +void wxTextCtrl::OnCopy(wxCommandEvent& event) +{ + Copy(); } -//========================================================================= -// Should not be called by a "ostream". Used by a "istream" -//========================================================================= -int wxTextCtrl::underflow() +void wxTextCtrl::OnPaste(wxCommandEvent& event) { - return EOF; + Paste(); } -#endif -wxTextCtrl& wxTextCtrl::operator<<(const wxString& s) +void wxTextCtrl::OnUndo(wxCommandEvent& event) { - AppendText(s); - return *this; + Undo(); } -wxTextCtrl& wxTextCtrl::operator<<(float f) +void wxTextCtrl::OnRedo(wxCommandEvent& event) { - wxString str; - str.Printf("%.2f", f); - AppendText(str); - return *this; + Redo(); } -wxTextCtrl& wxTextCtrl::operator<<(double d) +void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event) { - wxString str; - str.Printf("%.2f", d); - AppendText(str); - return *this; + event.Enable( CanCut() ); } -wxTextCtrl& wxTextCtrl::operator<<(int i) +void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event) { - wxString str; - str.Printf("%d", i); - AppendText(str); - return *this; + event.Enable( CanCopy() ); } -wxTextCtrl& wxTextCtrl::operator<<(long i) +void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event) { - wxString str; - str.Printf("%ld", i); - AppendText(str); - return *this; + event.Enable( CanPaste() ); } -wxTextCtrl& wxTextCtrl::operator<<(const char c) +void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event) { - char buf[2]; + event.Enable( CanUndo() ); +} - buf[0] = c; - buf[1] = 0; - AppendText(buf); - return *this; +void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) +{ + event.Enable( CanRedo() ); } +#endif + // wxUSE_TEXTCTRL