X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/de6185e212ebc37ff11ff70278e3c4f68419b097..a97d569cbbf90ba8bb293214055c3a8c19d447b5:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 21fc6d64bf..ad3193f273 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -20,11 +20,11 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/checklst.h" + #include "wx/arrstr.h" #endif -#include "wx/arrstr.h" -#include "wx/checklst.h" -#include "wx/settings.h" #include "wx/gtk/private.h" #include "wx/gtk/treeentry_gtk.h" @@ -42,7 +42,6 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; -extern wxCursor g_globalCursor; @@ -106,7 +105,7 @@ gtk_listbox_row_activated_callback(GtkTreeView *treeview, (wxClientData*) gtk_tree_entry_get_userdata(entry) ); else if ( listbox->HasClientUntypedData() ) event.SetClientData( gtk_tree_entry_get_userdata(entry) ); - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); } else { @@ -158,7 +157,7 @@ gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox ) { - if (g_isIdle) wxapp_install_idle_handler(); + // don't need to install idle handler, its done from "event" signal if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnScroll) return FALSE; @@ -204,7 +203,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox ) { - if (g_isIdle) wxapp_install_idle_handler(); + // don't need to install idle handler, its done from "event" signal if (g_blockEventsOnDrag) return FALSE; @@ -241,13 +240,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, listbox->m_spacePressed = true; } - if (ret) - { - g_signal_stop_emission_by_name (widget, "key_press_event"); - return TRUE; - } - - return FALSE; + return ret; } } @@ -320,7 +313,7 @@ static gboolean gtk_listitem_select_cb( GtkTreeSelection* selection, listbox->GetEventHandler()->ProcessEvent( event ); - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); return FALSE; //We handled it/did it manually } @@ -374,8 +367,8 @@ static gint gtk_listbox_sort_callback(GtkTreeModel *model, int ret = strcasecmp(gtk_tree_entry_get_collate_key(entry), gtk_tree_entry_get_collate_key(entry2)); - g_object_unref(G_OBJECT(entry)); - g_object_unref(G_OBJECT(entry2)); + g_object_unref (entry); + g_object_unref (entry2); return ret; } @@ -399,13 +392,12 @@ static gboolean gtk_listbox_searchequal_callback(GtkTreeModel* model, WXLISTBOX_DATACOLUMN_ARG(listbox), &entry, -1); wxCHECK_MSG(entry, 0, wxT("Could not get entry")); - gchar* keycollatekey = g_utf8_collate_key(key, -1); + wxGtkString keycollatekey(g_utf8_collate_key(key, -1)); int ret = strcasecmp(keycollatekey, gtk_tree_entry_get_collate_key(entry)); - g_free(keycollatekey); - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); return ret != 0; } @@ -502,7 +494,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_tree_view_set_model(m_treeview, GTK_TREE_MODEL(m_liststore)); - g_object_unref(G_OBJECT(m_liststore)); //free on treeview destruction + g_object_unref (m_liststore); //free on treeview destruction // Disable the pop-up textctrl that enables searching - note that // the docs specify that even if this disabled (which we are doing) @@ -563,6 +555,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_container_add (GTK_CONTAINER (m_widget), GTK_WIDGET(m_treeview) ); gtk_widget_show( GTK_WIDGET(m_treeview) ); + m_focusWidget = GTK_WIDGET(m_treeview); wxListBox::DoInsertItems(wxArrayString(n, choices), 0); // insert initial items @@ -663,7 +656,7 @@ void wxListBox::GtkInsertItems(const wxArrayString& items, gtk_list_store_set(m_liststore, &itercur, 0, entry, -1); - g_object_unref(G_OBJECT(entry)); //liststore always refs :) + g_object_unref (entry); //liststore always refs :) } } @@ -765,7 +758,7 @@ void* wxListBox::DoGetItemClientData(unsigned int n) const wxCHECK_MSG(entry, NULL, wxT("could not get entry")); void* userdata = gtk_tree_entry_get_userdata( entry ); - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); return userdata; } @@ -783,7 +776,7 @@ void wxListBox::DoSetItemClientData(unsigned int n, void* clientData) wxCHECK_RET(entry, wxT("could not get entry")); gtk_tree_entry_set_userdata( entry, clientData ); - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); } void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) @@ -816,7 +809,7 @@ void wxListBox::SetString(unsigned int n, const wxString &string) // notification function... void* userdata = gtk_tree_entry_get_userdata(entry); gtk_tree_entry_set_userdata(entry, NULL); //don't delete on destroy - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); bool bWasSelected = wxListBox::IsSelected(n); wxListBox::Delete(n); @@ -845,7 +838,7 @@ wxString wxListBox::GetString(unsigned int n) const label.erase(0, 4); #endif // wxUSE_CHECKLISTBOX - g_object_unref(G_OBJECT(entry)); + g_object_unref (entry); return label; } @@ -880,8 +873,8 @@ int wxListBox::FindString( const wxString &item, bool bCase ) const int wxListBox::GetSelection() const { - wxCHECK_MSG( m_treeview != NULL, -1, wxT("invalid listbox")); - wxCHECK_MSG( HasFlag(wxLB_SINGLE), -1, + wxCHECK_MSG( m_treeview != NULL, wxNOT_FOUND, wxT("invalid listbox")); + wxCHECK_MSG( HasFlag(wxLB_SINGLE), wxNOT_FOUND, wxT("must be single selection listbox")); GtkTreeIter iter; @@ -889,7 +882,7 @@ int wxListBox::GetSelection() const // only works on single-sel if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) - return -1; + return wxNOT_FOUND; GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter); @@ -903,7 +896,7 @@ int wxListBox::GetSelection() const int wxListBox::GetSelections( wxArrayInt& aSelections ) const { - wxCHECK_MSG( m_treeview != NULL, -1, wxT("invalid listbox") ); + wxCHECK_MSG( m_treeview != NULL, wxNOT_FOUND, wxT("invalid listbox") ); aSelections.Empty(); @@ -944,7 +937,31 @@ bool wxListBox::IsSelected( int n ) const void wxListBox::DoSetSelection( int n, bool select ) { - return GtkSetSelection(n, select, true); //docs say no events here + // passing -1 to SetSelection() is documented to deselect all items + if ( n == wxNOT_FOUND ) + { + // ... and not generate any events in the process + GtkDeselectAll(); + return; + } + + wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetSelection") ); + + // don't generate the selection event + GtkSetSelection(n, select, true); +} + +void wxListBox::GtkDeselectAll() +{ + wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); + + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); + + m_blockEvent = true; + + gtk_tree_selection_unselect_all(selection); + + m_blockEvent = false; } void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent) @@ -1006,7 +1023,7 @@ int wxListBox::DoListHitTest(const wxPoint& point) const { // gtk_tree_view_get_path_at_pos() also gets items that are not visible and // we only want visible items we need to check for it manually here - if ( !GetClientRect().Inside(point) ) + if ( !GetClientRect().Contains(point) ) return wxNOT_FOUND; // need to translate from master window since it is in client coords @@ -1054,9 +1071,9 @@ GtkWidget *wxListBox::GetConnectWidget() return GTK_WIDGET(m_treeview); } -bool wxListBox::IsOwnGtkWindow( GdkWindow *window ) +GdkWindow *wxListBox::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const { - return (window == gtk_tree_view_get_bin_window(m_treeview)); + return gtk_tree_view_get_bin_window(m_treeview); } void wxListBox::DoApplyWidgetStyle(GtkRcStyle *style) @@ -1075,26 +1092,6 @@ void wxListBox::DoApplyWidgetStyle(GtkRcStyle *style) gtk_widget_modify_style( GTK_WIDGET(m_treeview), style ); } -void wxListBox::OnInternalIdle() -{ - //RN: Is this needed anymore? - wxCursor cursor = m_cursor; - if (g_globalCursor.Ok()) cursor = g_globalCursor; - - if (GTK_WIDGET(m_treeview)->window && cursor.Ok()) - { - /* I now set the cursor the anew in every OnInternalIdle call - as setting the cursor in a parent window also effects the - windows above so that checking for the current cursor is - not possible. */ - GdkWindow *window = gtk_tree_view_get_bin_window(m_treeview); - gdk_window_set_cursor( window, cursor.GetCursor() ); - } - - if (wxUpdateUIEvent::CanUpdate(this)) - UpdateWindowUI(wxUPDATE_UI_FROMIDLE); -} - wxSize wxListBox::DoGetBestSize() const { wxCHECK_MSG(m_treeview, wxDefaultSize, wxT("invalid tree view"));