X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05d790f834be56ea4f4a1d2896e9d56f2ef1d4f4..a22895511a250173cf7dd4403fc89f293a898067:/src/common/lboxcmn.cpp diff --git a/src/common/lboxcmn.cpp b/src/common/lboxcmn.cpp index 27def6167d..9b114d7c1b 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 // ============================================================================ @@ -101,91 +103,95 @@ static void LBSendEvent( wxCommandEvent &event, wxListBoxBase *listbox, int item void wxListBoxBase::CalcAndSendEvent() { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId() ); + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId()); event.SetEventObject( this ); wxArrayInt selections; - GetSelections( selections ); - - if ((selections.GetCount() == 0) && (m_oldSelections.GetCount() == 0)) - { - // nothing changed, just leave - return; - } - - if (selections.GetCount() == m_oldSelections.GetCount()) + 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++ ) { - bool changed = false; - size_t idx; - for (idx = 0; idx < selections.GetCount(); idx++) + if (selections[idx] != m_oldSelections[idx]) { - if (selections[idx] != m_oldSelections[idx]) - { - changed = true; - break; - } + changed = true; + break; } - - // nothing changed, just leave - if (!changed) - return; } - if (selections.GetCount() == 0) - { - // indicate that this is a deselection - event.SetExtraLong( 0 ); - int item = m_oldSelections[0]; - m_oldSelections = selections; - LBSendEvent( event, this, item ); - return; - } - - int item; + // 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; - size_t idx; - for (idx = 0; idx < selections.GetCount(); idx++) + for ( size_t idx = 0; idx < countSel; idx++ ) { item = selections[idx]; - if (m_oldSelections.Index(item) == wxNOT_FOUND) + if ( m_oldSelections.Index(item) == wxNOT_FOUND ) { any_new_selected = true; break; } } - - if (any_new_selected) + + if ( any_new_selected ) { // indicate that this is a selection - event.SetExtraLong( 1 ); - m_oldSelections = selections; - LBSendEvent( event, this, item ); - return; + event.SetExtraLong(1); } - - // Now test if any new item is deselected - bool any_new_deselected = false; - for (idx = 0; idx < m_oldSelections.GetCount(); idx++) + else // no new items selected { - item = m_oldSelections[idx]; - if (selections.Index(item) == wxNOT_FOUND) + // Now test if any new item is deselected + bool any_new_deselected = false; + for ( size_t idx = 0; idx < countSelOld; idx++ ) { - any_new_deselected = true; - break; + 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 } } - - if (any_new_deselected) - { - // indicate that this is a selection - event.SetExtraLong( 0 ); - m_oldSelections = selections; - LBSendEvent( event, this, item ); - return; - } - - wxLogError( wxT("Wrong wxListBox selection") ); + } + + wxASSERT_MSG( item != wxNOT_FOUND, + "Logic error in wxListBox selection event generation code" ); + + m_oldSelections = selections; + + LBSendEvent(event, this, item); } // ----------------------------------------------------------------------------