X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8c72fce145ad5a90bbfbe655f791cde889d14ed..e53d24bab105c6a510523a5f1f10b721968b8cbe:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 7fbd69425f..5c1bbc56b1 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -119,107 +119,15 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), { if (g_blockEventsOnDrag) return; - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); - event.SetEventObject( listbox ); - if (listbox->HasFlag(wxLB_MULTIPLE) || listbox->HasFlag(wxLB_EXTENDED)) { - wxArrayInt selections; - listbox->GetSelections( selections ); - - if ((selections.GetCount() == 0) && (listbox->m_oldSelection.GetCount() == 0)) - { - // nothing changed, just leave - return; - } - - if (selections.GetCount() == listbox->m_oldSelection.GetCount()) - { - bool changed = false; - size_t idx; - for (idx = 0; idx < selections.GetCount(); idx++) - { - if (selections[idx] != listbox->m_oldSelection[idx]) - { - changed = true; - break; - } - } - - // nothing changed, just leave - if (!changed) - return; - } - - if (selections.GetCount() == 0) - { - // indicate that this is a deselection - event.SetExtraLong( 0 ); - - // take first item in old selection - event.SetInt( listbox->m_oldSelection[0] ); - event.SetString( listbox->GetString( listbox->m_oldSelection[0] ) ); - - listbox->m_oldSelection = selections; - - listbox->HandleWindowEvent( event ); - - return; - } - - // Now test if any new item is selected - bool any_new_selected = false; - size_t idx; - for (idx = 0; idx < selections.GetCount(); idx++) - { - int item = selections[idx]; - if (listbox->m_oldSelection.Index(item) == wxNOT_FOUND) - { - event.SetInt( item ); - event.SetString( listbox->GetString( item ) ); - any_new_selected = true; - break; - } - } - - if (any_new_selected) - { - // indicate that this is a selection - event.SetExtraLong( 1 ); - - listbox->m_oldSelection = selections; - listbox->HandleWindowEvent( event ); - return; - } - - // Now test if any new item is deselected - bool any_new_deselected = false; - for (idx = 0; idx < listbox->m_oldSelection.GetCount(); idx++) - { - int item = listbox->m_oldSelection[idx]; - if (selections.Index(item) == wxNOT_FOUND) - { - event.SetInt( item ); - event.SetString( listbox->GetString( item ) ); - any_new_deselected = true; - break; - } - } - - if (any_new_deselected) - { - // indicate that this is a selection - event.SetExtraLong( 0 ); - - listbox->m_oldSelection = selections; - listbox->HandleWindowEvent( event ); - return; - } - - wxLogError( wxT("Wrong wxListBox selection") ); + listbox->CalcAndSendEvent(); } else { + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); + event.SetEventObject( listbox ); + int index = listbox->GetSelection(); if (index == wxNOT_FOUND) { @@ -270,10 +178,19 @@ gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), (gdk_event->keyval == GDK_ISO_Enter) || (gdk_event->keyval == GDK_KP_Enter)) { - int index = listbox->GetSelection(); - if (index != wxNOT_FOUND) + int index = -1; + if (!listbox->HasMultipleSelection()) + index = listbox->GetSelection(); + else { + wxArrayInt sels; + if (listbox->GetSelections( sels ) < 1) + return FALSE; + index = sels[0]; + } + if (index != wxNOT_FOUND) + { wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() ); event.SetEventObject( listbox ); @@ -588,7 +505,7 @@ void wxListBox::GtkEnableEvents() g_signal_handlers_unblock_by_func(selection, (gpointer) gtk_listitem_changed_callback, this); - GtkUpdateOldSelection(); + UpdateOldSelections(); } // ---------------------------------------------------------------------------- @@ -634,6 +551,8 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, AssignNewItemClientData(GtkGetIndexFor(itercur), clientData, i, type); } + UpdateOldSelections(); + return pos + numItems - 1; } @@ -645,9 +564,13 @@ void wxListBox::DoClear() { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); + GtkDisableEvents(); // just in case + InvalidateBestSize(); gtk_list_store_clear( m_liststore ); /* well, THAT was easy :) */ + + GtkEnableEvents(); } void wxListBox::DoDeleteOneItem(unsigned int n) @@ -656,12 +579,16 @@ void wxListBox::DoDeleteOneItem(unsigned int n) InvalidateBestSize(); + GtkDisableEvents(); // just in case + GtkTreeIter iter; wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("wrong listbox index") ); // this returns false if iter is invalid (e.g. deleting item at end) but // since we don't use iter, we ignore the return value gtk_list_store_remove(m_liststore, &iter); + + GtkEnableEvents(); } // ---------------------------------------------------------------------------- @@ -845,7 +772,7 @@ int wxListBox::GetSelections( wxArrayInt& aSelections ) const aSelections.Empty(); - int i = 0; + int i = 0; GtkTreeIter iter; GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); @@ -912,12 +839,6 @@ void wxListBox::DoSetSelection( int n, bool select ) GtkEnableEvents(); } -void wxListBox::GtkUpdateOldSelection() -{ - if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) - GetSelections( m_oldSelection ); -} - void wxListBox::DoScrollToCell(int n, float alignY, float alignX) { wxCHECK_RET( m_treeview, wxT("invalid listbox") );