]> git.saurik.com Git - wxWidgets.git/commitdiff
[ 1560860 ] wxComboCtrl EVT_TEXT filtering.
authorRobert Roebling <robert@roebling.de>
Sat, 23 Sep 2006 09:04:25 +0000 (09:04 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 23 Sep 2006 09:04:25 +0000 (09:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41382 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 8d53347408a9b85a3f71f8561b916e95e0cf420c..25dc298df483175e21a1e8cd91f9373c89b2ec6d 100644 (file)
@@ -199,6 +199,10 @@ public:
     // (ie. wxComboPopup::SetStringValue doesn't get called).
     void SetText(const wxString& value);
 
+    // This method sets value and also optionally sends EVT_TEXT
+    // (needed by combo popups)
+    void SetValueWithEvent(const wxString& value, bool withEvent = true);
+
     //
     // Popup customization methods
     //
@@ -522,6 +526,8 @@ protected:
 private:
     void Init();
 
+    wxByte                  m_ignoreEvtText;  // Number of next EVT_TEXTs to ignore
+
     DECLARE_EVENT_TABLE()
 
     DECLARE_ABSTRACT_CLASS(wxComboCtrlBase)
index 564ee3cc5435ae2d80ccf4e8e2b79432a0b74e9f..4f6128e7768e670b40e7c7aae59d29c1c259a67f 100644 (file)
@@ -638,6 +638,7 @@ void wxComboCtrlBase::Init()
     m_btnState = 0;
     m_btnWidDefault = 0;
     m_blankButtonBg = false;
+    m_ignoreEvtText = 0;
     m_btnWid = m_btnHei = -1;
     m_btnSide = wxRIGHT;
     m_btnSpacingX = 0;
@@ -709,6 +710,14 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator)
         if ( HasFlag(wxTE_PROCESS_ENTER) )
             style |= wxTE_PROCESS_ENTER;
 
+        // Ignore EVT_TEXT generated by the constructor (but only
+        // if the event redirector already exists)
+        // NB: This must be " = 1" instead of "++";
+        if ( m_textEvtHandler )
+            m_ignoreEvtText = 1;
+        else
+            m_ignoreEvtText = 0;
+
         m_text = new wxTextCtrl(this, wxID_ANY, m_valueString,
                                 wxDefaultPosition, wxDefaultSize,
                                 style, validator);
@@ -1248,6 +1257,15 @@ wxBitmap& wxComboCtrlBase::GetBufferBitmap( const wxSize& sz ) const
 
 void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event)
 {
+    if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED )
+    {
+        if ( m_ignoreEvtText > 0 )
+        {
+            m_ignoreEvtText--;
+            return;
+        }
+    }
+
     // Change event id, object and string before relaying it forward
     event.SetId(GetId());
     wxString s = event.GetString();
@@ -1924,10 +1942,13 @@ wxString wxComboCtrlBase::GetValue() const
     return m_valueString;
 }
 
-void wxComboCtrlBase::SetValue(const wxString& value)
+void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent)
 {
     if ( m_text )
     {
+        if ( !withEvent )
+            m_ignoreEvtText++;
+
         m_text->SetValue(value);
         if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) )
             m_text->SelectAll();
@@ -1945,6 +1966,11 @@ void wxComboCtrlBase::SetValue(const wxString& value)
     }
 }
 
+void wxComboCtrlBase::SetValue(const wxString& value)
+{
+    SetValueWithEvent(value, false);
+}
+
 // In this SetValue variant wxComboPopup::SetStringValue is not called
 void wxComboCtrlBase::SetText(const wxString& value)
 {
@@ -1954,6 +1980,12 @@ void wxComboCtrlBase::SetText(const wxString& value)
 
     m_valueString = value;
 
+    if ( m_text )
+    {
+        m_ignoreEvtText++;
+        m_text->SetValue( value );
+    }
+
     Refresh();
 }
 
index 5f3f732a197982a3d451c3a015640570929cb37f..42e12d9e5f6c39d031515136d25a14066bf2087f 100644 (file)
@@ -210,7 +210,7 @@ void wxVListBoxComboPopup::DismissWithEvent()
     m_value = selection;
 
     if ( valStr != m_combo->GetValue() )
-        m_combo->SetValue(valStr);
+        m_combo->SetValueWithEvent(valStr);
 
     SendComboBoxEvent(selection);
 }