X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/956689757d71e8190bd18d4ff8b0f40da7061fe3..2d7388d3e86cc692fb576902f71618c87d7e4b9c:/src/common/lboxcmn.cpp diff --git a/src/common/lboxcmn.cpp b/src/common/lboxcmn.cpp index 218ba8a71a..dfd4b69564 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 // ============================================================================ @@ -42,33 +44,6 @@ wxListBoxBase::~wxListBoxBase() // this destructor is required for Darwin } -// ---------------------------------------------------------------------------- -// adding items -// ---------------------------------------------------------------------------- - -void wxListBoxBase::InsertItems(unsigned int nItems, const wxString *items, unsigned int pos) -{ - wxArrayString aItems; - for ( unsigned int n = 0; n < nItems; n++ ) - { - aItems.Add(items[n]); - } - - DoInsertItems(aItems, pos); -} - - -void wxListBoxBase::Set(int nItems, const wxString* items, void **clientData) -{ - wxArrayString aItems; - for ( int n = 0; n < nItems; n++ ) - { - aItems.Add(items[n]); - } - - DoSetItems(aItems, clientData); -} - // ---------------------------------------------------------------------------- // selection // ---------------------------------------------------------------------------- @@ -109,6 +84,112 @@ 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.GetCount() == 0) && (m_oldSelections.GetCount() == 0)) + { + // nothing changed, just leave + return; + } + + if (selections.GetCount() == m_oldSelections.GetCount()) + { + bool changed = false; + size_t idx; + for (idx = 0; idx < selections.GetCount(); idx++) + { + if (selections[idx] != m_oldSelections[idx]) + { + 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; + // Now test if any new item is selected + bool any_new_selected = false; + size_t idx; + for (idx = 0; idx < selections.GetCount(); 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 ); + m_oldSelections = selections; + LBSendEvent( event, this, item ); + return; + } + + // Now test if any new item is deselected + bool any_new_deselected = false; + for (idx = 0; idx < m_oldSelections.GetCount(); 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 ); + m_oldSelections = selections; + LBSendEvent( event, this, item ); + return; + } + + wxLogError( wxT("Wrong wxListBox selection") ); +} + // ---------------------------------------------------------------------------- // misc // ----------------------------------------------------------------------------