X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc60925fb3dbcd8011b82f019d71106b2f8dd64f..d90443b8a2099cf0e8e5fec31571d0ba1c0818a9:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 634f2fd26e..dccdd75c77 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -119,11 +119,11 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), { if (g_blockEventsOnDrag) return; - if (listbox->HasFlag(wxLB_MULTIPLE) || listbox->HasFlag(wxLB_EXTENDED)) + if (listbox->HasFlag(wxLB_MULTIPLE | wxLB_EXTENDED)) { listbox->CalcAndSendEvent(); } - else + else // single selection { wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); event.SetEventObject( listbox ); @@ -169,22 +169,31 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), //----------------------------------------------------------------------------- extern "C" { -static gint +static gboolean gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), GdkEventKey *gdk_event, wxListBox *listbox ) { - if ((gdk_event->keyval == GDK_Return) || + if ((gdk_event->keyval == GDK_Return) || (gdk_event->keyval == GDK_ISO_Enter) || (gdk_event->keyval == GDK_KP_Enter)) { - int index = listbox->GetSelection(); + 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 ); - + GtkTreeEntry* entry = listbox->GtkGetEntry( index ); // indicate that this is a selection @@ -203,7 +212,7 @@ gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), /* bool ret = */ listbox->HandleWindowEvent( event ); g_object_unref (entry); - + // wxMac and wxMSW always invoke default action // if (!ret) { @@ -216,13 +225,13 @@ gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), gtk_window_activate_default( gtk_window ); } } - + // Always intercept, otherwise we'd get another dclick // event from row_activated return TRUE; } } - + return FALSE; } } @@ -321,7 +330,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) void wxListBox::Init() { - m_treeview = (GtkTreeView*) NULL; + m_treeview = NULL; #if wxUSE_CHECKLISTBOX m_hasCheckBoxes = false; #endif // wxUSE_CHECKLISTBOX @@ -352,7 +361,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, return false; } - m_widget = gtk_scrolled_window_new( (GtkAdjustment*) NULL, (GtkAdjustment*) NULL ); + m_widget = gtk_scrolled_window_new( NULL, NULL ); + g_object_ref(m_widget); if (style & wxLB_ALWAYS_SB) { gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(m_widget), @@ -365,7 +375,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, } - GtkScrolledWindowSetBorder(m_widget, style); + GTKScrolledWindowSetBorder(m_widget, style); m_treeview = GTK_TREE_VIEW( gtk_tree_view_new( ) ); @@ -412,17 +422,13 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_tree_view_set_enable_search(m_treeview, FALSE); GtkSelectionMode mode; - if (style & wxLB_MULTIPLE) + // GTK_SELECTION_EXTENDED is a deprecated synonym for GTK_SELECTION_MULTIPLE + if ( style & (wxLB_MULTIPLE | wxLB_EXTENDED) ) { mode = GTK_SELECTION_MULTIPLE; } - else if (style & wxLB_EXTENDED) - { - mode = GTK_SELECTION_EXTENDED; - } - else + else // no multi-selection flags specified { - // if style was 0 set single mode m_windowStyle |= wxLB_SINGLE; mode = GTK_SELECTION_SINGLE; } @@ -470,7 +476,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, g_signal_connect_after (selection, "changed", G_CALLBACK (gtk_listitem_changed_callback), this); - + return true; } @@ -495,10 +501,19 @@ void wxListBox::GtkEnableEvents() g_signal_handlers_unblock_by_func(selection, (gpointer) gtk_listitem_changed_callback, this); - + UpdateOldSelections(); } + +void wxListBox::Update() +{ + wxWindow::Update(); + + if (m_treeview) + gdk_window_process_updates(GTK_WIDGET(m_treeview)->window, TRUE); +} + // ---------------------------------------------------------------------------- // adding items // ---------------------------------------------------------------------------- @@ -560,7 +575,7 @@ void wxListBox::DoClear() InvalidateBestSize(); gtk_list_store_clear( m_liststore ); /* well, THAT was easy :) */ - + GtkEnableEvents(); } @@ -578,7 +593,7 @@ void wxListBox::DoDeleteOneItem(unsigned int n) // 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(); } @@ -605,7 +620,7 @@ int wxListBox::GtkGetIndexFor(GtkTreeIter& iter) const gint* pIntPath = gtk_tree_path_get_indices(path); - wxCHECK_MSG( pIntPath, wxNOT_FOUND, _T("failed to get iterator path") ); + wxCHECK_MSG( pIntPath, wxNOT_FOUND, wxT("failed to get iterator path") ); int idx = pIntPath[0]; @@ -692,7 +707,7 @@ void wxListBox::SetString(unsigned int n, const wxString& label) // and update the model which will refresh the tree too GtkTreeIter iter; - wxCHECK_RET( GtkGetIteratorFor(n, &iter), _T("failed to get iterator") ); + wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("failed to get iterator") ); // FIXME: this resets the checked status of a wxCheckListBox item @@ -798,7 +813,7 @@ void wxListBox::DoSetSelection( int n, bool select ) wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); GtkDisableEvents(); - + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); // passing -1 to SetSelection() is documented to deselect all items @@ -811,7 +826,7 @@ void wxListBox::DoSetSelection( int n, bool select ) wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetSelection") ); - + GtkTreeIter iter; wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("Invalid index") ); @@ -905,10 +920,10 @@ int wxListBox::DoListHitTest(const wxPoint& point) const // ---------------------------------------------------------------------------- #if wxUSE_TOOLTIPS -void wxListBox::ApplyToolTip( GtkTooltips *tips, const gchar *tip ) +void wxListBox::GTKApplyToolTip( GtkTooltips *tips, const gchar *tip ) { // RN: Is this needed anymore? - gtk_tooltips_set_tip( tips, GTK_WIDGET( m_treeview ), tip, (gchar*) NULL ); + gtk_tooltips_set_tip( tips, GTK_WIDGET( m_treeview ), tip, NULL ); } #endif // wxUSE_TOOLTIPS