]> git.saurik.com Git - wxWidgets.git/commitdiff
Make the wxComboCtrl's wxTextEntry interface more complete and consistent. All text...
authorJaakko Salli <jaakko.salli@dnainternet.net>
Fri, 17 Dec 2010 11:20:50 +0000 (11:20 +0000)
committerJaakko Salli <jaakko.salli@dnainternet.net>
Fri, 17 Dec 2010 11:20:50 +0000 (11:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66394 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/combo.h
src/common/combocmn.cpp
src/generic/odcombo.cpp

index f0c06eb48485694e28658dcb56f187d5ff6a4f96..6dd69ab8e0440ac06c854b985bb4e8a758fbbb49 100644 (file)
@@ -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; }
 
index 0de8dd9d36af487c0767eb73f8f780c07e2d0e0e..2f99796830cd1ab19dcbc167d88254a734b74219 100644 (file)
@@ -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)
index 160c1f47d42e1c8d70aa5950e93c39dcf9893657..557a5332685c56697bc9e748e28218c38fe23279 100644 (file)
@@ -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;