From 0306e73e630bce45a3f56a0616559250fcb8c05e Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Fri, 17 Dec 2010 11:20:50 +0000 Subject: [PATCH] Make the wxComboCtrl's wxTextEntry interface more complete and consistent. All text is no longer selected on SetValue(), but only when user selects an item from the drop-down list. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66394 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/combo.h | 39 +++++++++++++++++++--- src/common/combocmn.cpp | 71 ++++++++++++++++++++++++++++++----------- src/generic/odcombo.cpp | 2 +- 3 files changed, 87 insertions(+), 25 deletions(-) diff --git a/include/wx/combo.h b/include/wx/combo.h index f0c06eb484..6dd69ab8e0 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -199,14 +199,32 @@ public: virtual bool Show(bool show = true); virtual bool SetFont(const wxFont& font); - // wxTextCtrl methods - for readonly combo they should return - // without errors. - virtual void SetValue(const wxString& value); + // + // wxTextEntry methods + // + // NB: We basically need to override all of them because there is + // no guarantee how platform-specific wxTextEntry is implemented. + // + virtual void SetValue(const wxString& value) + { wxTextEntryBase::SetValue(value); } + virtual void ChangeValue(const wxString& value) + { wxTextEntryBase::ChangeValue(value); } - // wxTextEntry methods - we basically need to override all of them virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text) + { wxTextEntryBase::AppendText(text); } + + virtual wxString GetValue() const + { return wxTextEntryBase::GetValue(); } + virtual wxString GetRange(long from, long to) const + { return wxTextEntryBase::GetRange(from, to); } + + // Replace() and DoSetValue() need to be fully re-implemented since + // EventSuppressor utility class does not work with the way + // wxComboCtrl is implemented. virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); virtual void Copy(); @@ -237,7 +255,13 @@ public: // This method sets value and also optionally sends EVT_TEXT // (needed by combo popups) - void SetValueWithEvent(const wxString& value, bool withEvent = true); + wxDEPRECATED( void SetValueWithEvent(const wxString& value, + bool withEvent = true) ); + + // Changes value of the control as if user had done it by selecting an + // item from a combo box drop-down list. Needs to be public so that + // derived popup classes can call it. + void SetValueByUser(const wxString& value); // // Popup customization methods @@ -464,6 +488,10 @@ protected: // extraStyle: Extra style parameters void CreateTextCtrl( int extraStyle ); + // Called when text was changed programmatically + // (e.g. from WriteText()) + void OnSetValue(const wxString& value); + // Installs standard input handler to combo (and optionally to the textctrl) void InstallInputHandlers(); @@ -558,6 +586,7 @@ protected: #endif // protected wxTextEntry methods + virtual void DoSetValue(const wxString& value, int flags); virtual wxString DoGetValue() const; virtual wxWindow *GetEditableWindow() { return this; } diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 0de8dd9d36..2f99796830 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -2388,7 +2388,7 @@ void wxComboCtrlBase::HidePopup(bool generateEvent) // transfer value and show it in textctrl, if any if ( !IsPopupWindowState(Animating) ) - SetValue( m_popupInterface->GetStringValue() ); + SetValueByUser( m_popupInterface->GetStringValue() ); m_winPopup->Hide(); @@ -2555,18 +2555,16 @@ wxString wxComboCtrlBase::DoGetValue() const return m_valueString; } -void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) +void wxComboCtrlBase::SetValueWithEvent(const wxString& value, + bool withEvent) { - if ( m_text ) - { - if ( !withEvent ) - m_ignoreEvtText++; - - m_text->SetValue(value); + DoSetValue(value, withEvent ? SetValue_SendEvent : 0); +} - if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) - m_text->SelectAll(); - } +void wxComboCtrlBase::OnSetValue(const wxString& value) +{ + // Note: before wxComboCtrl inherited from wxTextEntry, + // this code used to be in SetValueWithEvent(). // Since wxComboPopup may want to paint the combo as well, we need // to set the string value here (as well as sometimes in ShowPopup). @@ -2583,9 +2581,20 @@ void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) Refresh(); } -void wxComboCtrlBase::SetValue(const wxString& value) +void wxComboCtrlBase::SetValueByUser(const wxString& value) { - SetValueWithEvent(value, false); + // NB: Order of function calls is important here. Otherwise + // the SelectAll() may not work. + + if ( m_text ) + { + m_text->SetValue(value); + + if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) + m_text->SelectAll(); + } + + OnSetValue(value); } // In this SetValue variant wxComboPopup::SetStringValue is not called @@ -2646,24 +2655,48 @@ long wxComboCtrlBase::GetLastPosition() const return 0; } -void wxComboCtrlBase::Replace(long from, long to, const wxString& value) +void wxComboCtrlBase::WriteText(const wxString& text) { if ( m_text ) - m_text->Replace(from, to, value); + { + m_text->WriteText(text); + OnSetValue(m_text->GetValue()); + } + else + { + OnSetValue(text); + } } -void wxComboCtrlBase::WriteText(const wxString& text) +void wxComboCtrlBase::DoSetValue(const wxString& value, int flags) { if ( m_text ) - m_text->WriteText(text); - else - SetText(m_valueString + text); + { + if ( flags & SetValue_SendEvent ) + m_text->SetValue(value); + else + m_text->ChangeValue(value); + } + + OnSetValue(value); +} + +void wxComboCtrlBase::Replace(long from, long to, const wxString& value) +{ + if ( m_text ) + { + m_text->Replace(from, to, value); + OnSetValue(m_text->GetValue()); + } } void wxComboCtrlBase::Remove(long from, long to) { if ( m_text ) + { m_text->Remove(from, to); + OnSetValue(m_text->GetValue()); + } } void wxComboCtrlBase::SetSelection(long from, long to) diff --git a/src/generic/odcombo.cpp b/src/generic/odcombo.cpp index 160c1f47d4..557a533268 100644 --- a/src/generic/odcombo.cpp +++ b/src/generic/odcombo.cpp @@ -228,7 +228,7 @@ void wxVListBoxComboPopup::DismissWithEvent() m_stringValue = wxEmptyString; if ( m_stringValue != m_combo->GetValue() ) - m_combo->SetValueWithEvent(m_stringValue); + m_combo->SetValueByUser(m_stringValue); m_value = selection; -- 2.47.2