From 13bcc348811641ec19d2b378777c5edcf1b205a2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 15 Sep 2004 23:07:15 +0000 Subject: [PATCH] fixed sending duplicate EVT_COMBOBOX events; documented that GetValue() returns new value when called from EVT_COMBOBOX handler git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + docs/latex/wx/combobox.tex | 3 ++- include/wx/msw/combobox.h | 18 ++++++++++++++++-- src/msw/combobox.cpp | 38 ++++++++++++++++++++++++-------------- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 0f9d119721..1c3ceaeea3 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/docs/latex/wx/combobox.tex b/docs/latex/wx/combobox.tex index de4a644391..69c25dbccb 100644 --- a/docs/latex/wx/combobox.tex +++ b/docs/latex/wx/combobox.tex @@ -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} diff --git a/include/wx/msw/combobox.h b/include/wx/msw/combobox.h index cd0880a81f..dd03fe6e78 100644 --- a/include/wx/msw/combobox.h +++ b/include/wx/msw/combobox.h @@ -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) }; diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 5ac0ec4d72..0967e6e574 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -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 -- 2.45.2