Don't send SELECTED events for an already selected item in wxGTK wxListBox.

Bring wxGTK in line with wxMSW behaviour and avoid sending the
wxEVT_COMMAND_LISTBOX_SELECTED events when the user clicks on an already
selected item.

Refactor wxMSW code to extract the logic to avoid such events into a reusable
in other ports wxListBoxBase::DoChangeSingleSelection() function. Also add
wxListBox::GTKOnSelectionChanged() to wxGTK to avoid having to make the new
function public just so that it could be called by GTK callback and make the
previously existing CalcAndSendEvent() protected as well.

This fixes a unit test failure in ListBoxTestCase::ClickEvents() under wxGTK.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-10-27 23:21:55 +00:00
parent af0b20630c
commit 24ee1bef74
5 changed files with 95 additions and 59 deletions

View File

@@ -49,7 +49,7 @@ public:
// multiple selection logic
virtual bool IsSelected(int n) const = 0;
virtual void SetSelection(int n) { DoSetSelection(n, true); }
virtual void SetSelection(int n);
void SetSelection(int n, bool select) { DoSetSelection(n, select); }
void Deselect(int n) { DoSetSelection(n, false); }
void DeselectAll(int itemToLeaveSelected = -1);
@@ -96,11 +96,6 @@ public:
int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); }
// For generating events in multiple and extended mode: compare the current
// selections with the previously recorded ones (in m_oldSelections) and
// send the appropriate event if they differ, otherwise just return false.
bool CalcAndSendEvent();
protected:
virtual void DoSetFirstItem(int n) = 0;
@@ -110,6 +105,17 @@ protected:
virtual int DoListHitTest(const wxPoint& WXUNUSED(point)) const
{ return wxNOT_FOUND; }
// Helper for the code generating events in single selection mode: updates
// m_oldSelections and return true if the selection really changed.
// Otherwise just returns false.
bool DoChangeSingleSelection(int item);
// Helper for generating events in multiple and extended mode: compare the
// current selections with the previously recorded ones (in
// m_oldSelections) and send the appropriate event if they differ,
// otherwise just return false.
bool CalcAndSendEvent();
// Send a listbox (de)selection or double click event.
//
// Returns true if the event was processed.
@@ -118,6 +124,9 @@ protected:
// Array storing the indices of all selected items that we already notified
// the user code about for multi selection list boxes.
//
// For single selection list boxes, we reuse this array to store the single
// currently selected item, this is used by DoChangeSingleSelection().
//
// TODO-OPT: wxSelectionStore would be more efficient for big list boxes.
wxArrayInt m_oldSelections;