X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/005ac806ead92411ad4810d407df311e4a608302..5e382463783f520fbbc4272dd777c9da0ce4f08a:/src/osx/textentry_osx.cpp diff --git a/src/osx/textentry_osx.cpp b/src/osx/textentry_osx.cpp index 3e2ca4f22d..c5f53512b2 100644 --- a/src/osx/textentry_osx.cpp +++ b/src/osx/textentry_osx.cpp @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: Kevin Ollivier // Created: 1998-01-01 -// RCS-ID: $Id: textctrl.cpp 54820 2008-07-29 20:04:11Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -45,21 +45,40 @@ #include "wx/filefn.h" #include "wx/sysopt.h" #include "wx/thread.h" +#include "wx/textcompleter.h" #include "wx/osx/private.h" +wxTextEntry::wxTextEntry() +{ + m_completer = NULL; + m_editable = true; + m_maxLength = 0; +} + +wxTextEntry::~wxTextEntry() +{ + delete m_completer; +} + wxString wxTextEntry::DoGetValue() const { + wxCHECK_MSG( GetTextPeer(), wxString(), "Must create the control first" ); + return GetTextPeer()->GetStringValue() ; } void wxTextEntry::GetSelection(long* from, long* to) const { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + GetTextPeer()->GetSelection( from , to ) ; } void wxTextEntry::SetMaxLength(unsigned long len) { + if ( GetTextPeer()->CanClipMaxLength() ) + GetTextPeer()->SetMaxLength(len); m_maxLength = len ; } @@ -67,18 +86,24 @@ void wxTextEntry::SetMaxLength(unsigned long len) void wxTextEntry::Copy() { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + if (CanCopy()) GetTextPeer()->Copy() ; } void wxTextEntry::Cut() { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + if (CanCut()) GetTextPeer()->Cut() ; } void wxTextEntry::Paste() { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + if (CanPaste()) GetTextPeer()->Paste() ; } @@ -109,16 +134,20 @@ bool wxTextEntry::CanPaste() const if (!IsEditable()) return false; + wxCHECK_MSG( GetTextPeer(), false, "Must create the control first" ); + return GetTextPeer()->CanPaste() ; } void wxTextEntry::SetEditable(bool editable) { - if ( editable != m_editable ) - { - m_editable = editable ; - GetTextPeer()->SetEditable( editable ) ; - } + if ( editable == m_editable ) + return; + + m_editable = editable ; + + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + GetTextPeer()->SetEditable( editable ) ; } void wxTextEntry::SetInsertionPoint(long pos) @@ -142,27 +171,52 @@ long wxTextEntry::GetInsertionPoint() const wxTextPos wxTextEntry::GetLastPosition() const { + wxCHECK_MSG( GetTextPeer(), -1, "Must create the control first" ); + return GetTextPeer()->GetLastPosition() ; } void wxTextEntry::Remove(long from, long to) { - GetTextPeer()->Remove( from , to ) ; + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + + { + EventsSuppressor noevents(this); + GetTextPeer()->Remove( from , to ); + } + + SendTextUpdatedEventIfAllowed(); } void wxTextEntry::SetSelection(long from, long to) { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + GetTextPeer()->SetSelection( from , to ) ; } void wxTextEntry::WriteText(const wxString& str) { - GetTextPeer()->WriteText( str ) ; + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + + { + EventsSuppressor noevents(this); + GetTextPeer()->WriteText( str ); + } + + SendTextUpdatedEventIfAllowed(); } void wxTextEntry::Clear() { - GetTextPeer()->Clear() ; + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + + { + EventsSuppressor noevents(this); + GetTextPeer()->Clear(); + } + + SendTextUpdatedEventIfAllowed(); } bool wxTextEntry::IsEditable() const @@ -170,18 +224,39 @@ bool wxTextEntry::IsEditable() const return m_editable ; } +bool wxTextEntry::SendMaxLenEvent() +{ + wxWindow *win = GetEditableWindow(); + wxCHECK_MSG( win, false, "can't send an event without a window" ); + + wxCommandEvent event(wxEVT_TEXT_MAXLEN, win->GetId()); + + // do not do this as it could be very inefficient if the text control + // contains a lot of text and we're not using ref-counted wxString + // implementation -- instead, event.GetString() will query the control for + // its current text if needed + //event.SetString(win->GetValue()); + + event.SetEventObject(win); + return win->HandleWindowEvent(event); +} + // ---------------------------------------------------------------------------- // Undo/redo // ---------------------------------------------------------------------------- void wxTextEntry::Undo() { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + if (CanUndo()) GetTextPeer()->Undo() ; } void wxTextEntry::Redo() { + wxCHECK_RET( GetTextPeer(), "Must create the control first" ); + if (CanRedo()) GetTextPeer()->Redo() ; } @@ -191,6 +266,8 @@ bool wxTextEntry::CanUndo() const if ( !IsEditable() ) return false ; + wxCHECK_MSG( GetTextPeer(), false, "Must create the control first" ); + return GetTextPeer()->CanUndo() ; } @@ -199,6 +276,8 @@ bool wxTextEntry::CanRedo() const if ( !IsEditable() ) return false ; + wxCHECK_MSG( GetTextPeer(), false, "Must create the control first" ); + return GetTextPeer()->CanRedo() ; } @@ -209,4 +288,23 @@ wxTextWidgetImpl * wxTextEntry::GetTextPeer() const return win ? dynamic_cast(win->GetPeer()) : NULL; } +// ---------------------------------------------------------------------------- +// Auto-completion +// ---------------------------------------------------------------------------- + +bool wxTextEntry::DoAutoCompleteStrings(const wxArrayString& choices) +{ + wxTextCompleterFixed * const completer = new wxTextCompleterFixed; + completer->SetCompletions(choices); + + return DoAutoCompleteCustom(completer); +} + +bool wxTextEntry::DoAutoCompleteCustom(wxTextCompleter *completer) +{ + m_completer = completer; + + return true; +} + #endif // wxUSE_TEXTCTRL