X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a236aa2058ccf3d36e9cafc20fa7375080c4be50..af7e24c33e1e6e00a7687ee965b921dbe60cdb36:/src/common/lboxcmn.cpp diff --git a/src/common/lboxcmn.cpp b/src/common/lboxcmn.cpp index 2d764f33bf..a9beae01cc 100644 --- a/src/common/lboxcmn.cpp +++ b/src/common/lboxcmn.cpp @@ -33,6 +33,8 @@ #include "wx/arrstr.h" #endif +#include "wx/log.h" + // ============================================================================ // implementation // ============================================================================ @@ -82,6 +84,116 @@ void wxListBoxBase::DeselectAll(int itemToLeaveSelected) } } +void wxListBoxBase::UpdateOldSelections() +{ + if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) + GetSelections( m_oldSelections ); +} + +static void LBSendEvent( wxCommandEvent &event, wxListBoxBase *listbox, int item ) +{ + 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 ); +} + +void wxListBoxBase::CalcAndSendEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId()); + event.SetEventObject( this ); + + wxArrayInt selections; + GetSelections(selections); + + if ( selections.empty() && m_oldSelections.empty() ) + { + // nothing changed, just leave + return; + } + + const size_t countSel = selections.size(), + countSelOld = m_oldSelections.size(); + if ( countSel == countSelOld ) + { + bool changed = false; + for ( size_t idx = 0; idx < countSel; idx++ ) + { + if (selections[idx] != m_oldSelections[idx]) + { + changed = true; + break; + } + } + + // nothing changed, just leave + if ( !changed ) + return; + } + + int item = wxNOT_FOUND; + if ( selections.empty() ) + { + // indicate that this is a deselection + event.SetExtraLong(0); + item = m_oldSelections[0]; + } + else // we [still] have some selections + { + // Now test if any new item is selected + bool any_new_selected = false; + for ( size_t idx = 0; idx < countSel; idx++ ) + { + item = selections[idx]; + if ( m_oldSelections.Index(item) == wxNOT_FOUND ) + { + any_new_selected = true; + break; + } + } + + 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 + bool any_new_deselected = false; + for ( size_t idx = 0; idx < countSelOld; idx++ ) + { + item = m_oldSelections[idx]; + if ( selections.Index(item) == wxNOT_FOUND ) + { + any_new_deselected = true; + break; + } + } + + if ( any_new_deselected ) + { + // indicate that this is a selection + event.SetExtraLong(0); + } + else + { + item = wxNOT_FOUND; // this should be impossible + } + } + } + + wxASSERT_MSG( item != wxNOT_FOUND, + "Logic error in wxListBox selection event generation code" ); + + m_oldSelections = selections; + + LBSendEvent(event, this, item); +} + // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- @@ -89,7 +201,7 @@ void wxListBoxBase::DeselectAll(int itemToLeaveSelected) void wxListBoxBase::Command(wxCommandEvent& event) { SetSelection(event.GetInt(), event.GetExtraLong() != 0); - (void)ProcessEvent(event); + (void)GetEventHandler()->ProcessEvent(event); } // ----------------------------------------------------------------------------