]> git.saurik.com Git - wxWidgets.git/commitdiff
fixed sending duplicate EVT_COMBOBOX events; documented that GetValue() returns new...
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 15 Sep 2004 23:07:15 +0000 (23:07 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 15 Sep 2004 23:07:15 +0000 (23:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/combobox.tex
include/wx/msw/combobox.h
src/msw/combobox.cpp

index 0f9d1197218849ac417257fbd9a972df40b0b606..1c3ceaeea3dbdc293760177e7ee16210d6e78bdd 100644 (file)
@@ -273,6 +273,7 @@ wxMSW:
 - fixed truncation of transferred data in wxConnection under unicode build
 - wxChoice and wxComboBox dropdown background can be set now too (Adrian Lupei)
 - fixed wxMaximizeEvent generation in wxFrame
+- don't send duplicate EVT_COMBOBOX events whenever selection changes any more
 
 wxUniv/X11:
 
index de4a644391dea7604933d5c53532942ba9291774..69c25dbccb9cadeb708a1404a9570012866fbec8 100644 (file)
@@ -36,7 +36,8 @@ See also \helpref{window styles overview}{windowstyles}.
 \twocolwidtha{7cm}
 \begin{twocollist}\itemsep=0pt
 \twocolitem{{\bf EVT\_COMBOBOX(id, func)}}{Process a wxEVT\_COMMAND\_COMBOBOX\_SELECTED event,
-when an item on the list is selected.}
+when an item on the list is selected. Note that calling 
+\helpref{GetValue}{wxcomboboxgetvalue} returns the new value of selection.}
 \twocolitem{{\bf EVT\_TEXT(id, func)}}{Process a wxEVT\_COMMAND\_TEXT\_UPDATED event,
 when the combobox text changes.}
 \end{twocollist}
index cd0880a81fa70fb715da9e4ea68074c64b103c20..dd03fe6e7825e89fb0d32a58ae526e4cda9f06d0 100644 (file)
@@ -27,7 +27,7 @@
 class WXDLLEXPORT wxComboBox: public wxChoice
 {
 public:
-    wxComboBox() { }
+    wxComboBox() { Init(); }
 
     wxComboBox(wxWindow *parent, wxWindowID id,
             const wxString& value = wxEmptyString,
@@ -38,6 +38,8 @@ public:
             const wxValidator& validator = wxDefaultValidator,
             const wxString& name = wxComboBoxNameStr)
     {
+        Init();
+
         Create(parent, id, value, pos, size, n, choices, style, validator, name);
     }
     wxComboBox(wxWindow *parent, wxWindowID id,
@@ -49,6 +51,8 @@ public:
             const wxValidator& validator = wxDefaultValidator,
             const wxString& name = wxComboBoxNameStr)
     {
+        Init();
+
         Create(parent, id, value, pos, size, choices, style, validator, name);
     }
 
@@ -75,7 +79,7 @@ public:
     // List functions: see wxChoice
 
     // Text field functions
-    wxString GetValue() const { return GetLabel(); }
+    wxString GetValue() const { return m_value; }
     virtual void SetValue(const wxString& value);
 
     // Clipboard operations
@@ -105,6 +109,16 @@ public:
 protected:
     virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
 
+    // common part of all ctors
+    void Init() { m_selectionOld = -1; }
+
+
+    // the previous selection (see MSWCommand() to see why it is needed)
+    int m_selectionOld;
+
+    // the current selection (also see MSWCommand())
+    wxString m_value;
+
 private:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox)
 };
index 5ac0ec4d7286aafd2fdb4c674244af0e06d60871..0967e6e57442e254735f2e320b5c0ca9d03af605 100644 (file)
@@ -301,18 +301,30 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
     {
         case CBN_SELCHANGE:
             sel = GetSelection();
-            if ( sel > -1 )
+
+            // somehow we get 2 CBN_SELCHANGE events with the same index when
+            // the user selects an item in the combobox -- ignore duplicates
+            if ( sel > -1 && sel != m_selectionOld )
             {
-                value = GetString(sel);
+                m_selectionOld = sel;
+
+                // GetValue() would still return the old value from here but
+                // according to the docs we should return the new value if the
+                // user calls it in his event handler, so update internal
+                // m_value
+                m_value = GetString(sel);
 
                 wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId());
                 event.SetInt(sel);
                 event.SetEventObject(this);
-                event.SetString(value);
+                event.SetString(m_value);
                 ProcessCommand(event);
             }
-            else
+            else // no valid selection
             {
+                m_selectionOld = sel;
+
+                // hence no EVT_TEXT neither
                 break;
             }
 
@@ -329,25 +341,21 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
                 // want the new one)
                 if ( sel == -1 )
                 {
-                    value = GetValue();
+                    m_value = GetValue();
                 }
                 else // we're synthesizing text updated event from sel change
                 {
-                    // We need to retrieve the current selection because the user
-                    // may have changed it in the previous handler (for CBN_SELCHANGE
-                    // above).
+                    // We need to retrieve the current selection because the
+                    // user may have changed it in the previous handler (for
+                    // CBN_SELCHANGE above).
                     sel = GetSelection();
                     if ( sel > -1 )
                     {
-                        value = GetString(sel);
+                        m_value = GetString(sel);
                     }
-                    // we need to do this because the user code expects
-                    // wxComboBox::GetValue() to return the new value from
-                    // "text updated" handler but it hadn't been updated yet
-                    SetValue(value);
                 }
 
-                event.SetString(value);
+                event.SetString(m_value);
                 event.SetEventObject(this);
                 ProcessCommand(event);
             }
@@ -472,6 +480,8 @@ void wxComboBox::SetValue(const wxString& value)
         SetStringSelection(value);
     else
         SetWindowText(GetHwnd(), value.c_str());
+
+    m_selectionOld = GetSelection();
 }
 
 // Clipboard operations