diff --git a/include/wx/listbox.h b/include/wx/listbox.h index cc15c6764e..cd4c0fa6f8 100644 --- a/include/wx/listbox.h +++ b/include/wx/listbox.h @@ -96,10 +96,13 @@ public: int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); } - // For generating events in multiple and extended mode + // 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(); + wxArrayInt m_oldSelections; void UpdateOldSelections(); - void CalcAndSendEvent(); protected: virtual void DoSetFirstItem(int n) = 0; @@ -110,6 +113,11 @@ protected: virtual int DoListHitTest(const wxPoint& WXUNUSED(point)) const { return wxNOT_FOUND; } + // Send a listbox (de)selection or double click event. + // + // Returns true if the event was processed. + bool SendEvent(wxEventType evtType, int item, bool selected); + private: wxDECLARE_NO_COPY_CLASS(wxListBoxBase); }; diff --git a/src/common/lboxcmn.cpp b/src/common/lboxcmn.cpp index a9beae01cc..f7d4fb91a8 100644 --- a/src/common/lboxcmn.cpp +++ b/src/common/lboxcmn.cpp @@ -90,29 +90,33 @@ void wxListBoxBase::UpdateOldSelections() GetSelections( m_oldSelections ); } -static void LBSendEvent( wxCommandEvent &event, wxListBoxBase *listbox, int item ) +bool wxListBoxBase::SendEvent(wxEventType evtType, int item, bool selected) { - event.SetInt( item ); - event.SetString( listbox->GetString( item ) ); - if ( listbox->HasClientObjectData() ) - event.SetClientObject( listbox->GetClientObject(item) ); - else if ( listbox->HasClientUntypedData() ) - event.SetClientData( listbox->GetClientData(item) ); - listbox->HandleWindowEvent( event ); + wxCommandEvent event(evtType, GetId()); + event.SetEventObject(this); + + event.SetInt(item); + event.SetString(GetString(item)); + event.SetExtraLong(selected); + + if ( HasClientObjectData() ) + event.SetClientObject(GetClientObject(item)); + else if ( HasClientUntypedData() ) + event.SetClientData(GetClientData(item)); + + return HandleWindowEvent(event); } -void wxListBoxBase::CalcAndSendEvent() +bool wxListBoxBase::CalcAndSendEvent() { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId()); - event.SetEventObject( this ); - wxArrayInt selections; GetSelections(selections); + bool selected = true; if ( selections.empty() && m_oldSelections.empty() ) { // nothing changed, just leave - return; + return false; } const size_t countSel = selections.size(), @@ -131,14 +135,13 @@ void wxListBoxBase::CalcAndSendEvent() // nothing changed, just leave if ( !changed ) - return; + return false; } int item = wxNOT_FOUND; if ( selections.empty() ) { - // indicate that this is a deselection - event.SetExtraLong(0); + selected = false; item = m_oldSelections[0]; } else // we [still] have some selections @@ -155,14 +158,9 @@ void wxListBoxBase::CalcAndSendEvent() } } - if ( any_new_selected ) + if ( !any_new_selected ) { - // indicate that this is a selection - event.SetExtraLong(1); - } - else // no new items selected - { - // Now test if any new item is deselected + // No new items selected, now test if any new item is deselected bool any_new_deselected = false; for ( size_t idx = 0; idx < countSelOld; idx++ ) { @@ -177,7 +175,7 @@ void wxListBoxBase::CalcAndSendEvent() if ( any_new_deselected ) { // indicate that this is a selection - event.SetExtraLong(0); + selected = false; } else { @@ -191,7 +189,7 @@ void wxListBoxBase::CalcAndSendEvent() m_oldSelections = selections; - LBSendEvent(event, this, item); + return SendEvent(wxEVT_COMMAND_LISTBOX_SELECTED, item, selected); } // ---------------------------------------------------------------------------- diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index d36f5ab109..8d2d266c72 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -647,16 +647,13 @@ wxSize wxListBox::DoGetBestClientSize() const bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { - if ((param == LBN_SELCHANGE) && HasMultipleSelection()) - { - CalcAndSendEvent(); - return true; - } - wxEventType evtType; int n; if ( param == LBN_SELCHANGE ) { + if ( HasMultipleSelection() ) + return CalcAndSendEvent(); + evtType = wxEVT_COMMAND_LISTBOX_SELECTED; n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0); @@ -673,22 +670,8 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) return false; } - // retrieve the affected item - if ( n == wxNOT_FOUND ) - return false; - - wxCommandEvent event(evtType, m_windowId); - event.SetEventObject(this); - - if ( HasClientObjectData() ) - event.SetClientObject( GetClientObject(n) ); - else if ( HasClientUntypedData() ) - event.SetClientData( GetClientData(n) ); - - event.SetString(GetString(n)); - event.SetInt(n); - - return HandleWindowEvent(event); + // only send an event if we have a valid item + return n != wxNOT_FOUND && SendEvent(evtType, n, true /* selection */); } // ----------------------------------------------------------------------------