X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33c6e437f5d7fc53f8f56eb9001498b03f976228..c4e43bea7b24f7b7f58e3f87786490cd81abf0a7:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 9d23c77735..3517dd9f71 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -32,7 +32,6 @@ #include "wx/tooltip.h" #endif -#include #include #include @@ -68,8 +67,6 @@ gtk_listbox_row_activated_callback(GtkTreeView *treeview, GtkTreeViewColumn *col, wxListBox *listbox) { - if (g_isIdle) wxapp_install_idle_handler(); - if (g_blockEventsOnDrag) return; if (g_blockEventsOnScroll) return; @@ -111,34 +108,6 @@ gtk_listbox_row_activated_callback(GtkTreeView *treeview, } } -//----------------------------------------------------------------------------- -// "key_press_event" -//----------------------------------------------------------------------------- - -extern "C" { -static gint -gtk_listbox_key_press_callback( GtkWidget *widget, - GdkEventKey *gdk_event, - wxListBox *listbox ) -{ - if (g_blockEventsOnDrag) return FALSE; - - if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) - { - wxNavigationKeyEvent new_event; - /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */ - new_event.SetDirection( (gdk_event->keyval == GDK_Tab) ); - /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */ - new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ); - new_event.SetCurrentFocus( listbox ); - if (listbox->GetEventHandler()->ProcessEvent( new_event )) - return TRUE; - } - - return FALSE; -} -} - //----------------------------------------------------------------------------- // "changed" //----------------------------------------------------------------------------- @@ -236,6 +205,7 @@ static void gtk_tree_entry_destroy_cb(GtkTreeEntry* entry, //----------------------------------------------------------------------------- // Sorting callback (standard CmpNoCase return value) //----------------------------------------------------------------------------- +#include extern "C" { static gint gtk_listbox_sort_callback(GtkTreeModel *model, @@ -259,8 +229,8 @@ static gint gtk_listbox_sort_callback(GtkTreeModel *model, //We compare collate keys here instead of calling g_utf8_collate //as it is rather slow (and even the docs reccommend this) - int ret = strcasecmp(gtk_tree_entry_get_collate_key(entry), - gtk_tree_entry_get_collate_key(entry2)); + int ret = strcmp(gtk_tree_entry_get_collate_key(entry), + gtk_tree_entry_get_collate_key(entry2)); g_object_unref (entry); g_object_unref (entry2); @@ -289,8 +259,8 @@ static gboolean gtk_listbox_searchequal_callback(GtkTreeModel* model, wxCHECK_MSG(entry, 0, wxT("Could not get entry")); wxGtkString keycollatekey(g_utf8_collate_key(key, -1)); - int ret = strcasecmp(keycollatekey, - gtk_tree_entry_get_collate_key(entry)); + int ret = strcmp(keycollatekey, + gtk_tree_entry_get_collate_key(entry)); g_object_unref (entry); @@ -334,7 +304,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, long style, const wxValidator& validator, const wxString &name ) { - m_needParent = true; m_blockEvent = false; if (!PreCreation( parent, pos, size ) || @@ -428,7 +397,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_tree_selection_set_mode( selection, mode ); // Handle sortable stuff - if(style & wxLB_SORT) + if(HasFlag(wxLB_SORT)) { // Setup sorting in ascending (wx) order gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(m_liststore), @@ -450,17 +419,12 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_widget_show( GTK_WIDGET(m_treeview) ); m_focusWidget = GTK_WIDGET(m_treeview); - wxListBox::DoInsertItems(wxArrayString(n, choices), 0); // insert initial items + Append(n, choices); // insert initial items // generate dclick events g_signal_connect_after(m_treeview, "row-activated", G_CALLBACK(gtk_listbox_row_activated_callback), this); - // for panel navigation - g_signal_connect (m_treeview, "key_press_event", - G_CALLBACK (gtk_listbox_key_press_callback), - this); - m_parent->DoAddChild( this ); PostCreation(size); @@ -480,42 +444,30 @@ wxListBox::~wxListBox() // adding items // ---------------------------------------------------------------------------- -void wxListBox::GtkInsertItems(const wxArrayString& items, - void** clientData, unsigned int pos) +int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) { - wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); + wxCHECK_MSG( m_treeview != NULL, wxNOT_FOUND, wxT("invalid listbox") ); InvalidateBestSize(); - // Create and set column ids and GValues - - unsigned int nNum = items.GetCount(); - unsigned int nCurCount = wxListBox::GetCount(); - wxASSERT_MSG(pos <= nCurCount, wxT("Invalid index passed to wxListBox")); - GtkTreeIter* pIter = NULL; // append by default GtkTreeIter iter; - if (pos != nCurCount) + if ( pos != GetCount() ) { - gboolean res = gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, NULL, //NULL = parent = get first - (int)pos ); - if(!res) - { - wxLogSysError(wxT("internal wxListBox error in insertion")); - return; - } + wxCHECK_MSG( GtkGetIteratorFor(pos, &iter), wxNOT_FOUND, + wxT("internal wxListBox error in insertion") ); pIter = &iter; } - for (unsigned int i = 0; i < nNum; ++i) + const unsigned int numItems = items.GetCount(); + for ( unsigned int i = 0; i < numItems; ++i ) { - wxString label = items[i]; - GtkTreeEntry* entry = gtk_tree_entry_new(); - gtk_tree_entry_set_label(entry, wxGTK_CONV(label)); + gtk_tree_entry_set_label(entry, wxGTK_CONV(items[i])); gtk_tree_entry_set_destroy_func(entry, (GtkTreeEntryDestroy)gtk_tree_entry_destroy_cb, this); @@ -526,89 +478,22 @@ void wxListBox::GtkInsertItems(const wxArrayString& items, GtkTreeIter itercur; gtk_list_store_insert_before(m_liststore, &itercur, pIter); -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - gtk_list_store_set(m_liststore, &itercur, - 0, FALSE, //FALSE == not toggled - 1, entry, -1); - } - else -#endif - gtk_list_store_set(m_liststore, &itercur, - 0, entry, -1); - - g_object_unref (entry); //liststore always refs :) - } -} - -void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) -{ - wxCHECK_RET( IsValidInsert(pos), wxT("invalid index in wxListBox::InsertItems") ); - - GtkInsertItems(items, NULL, pos); -} - -int wxListBox::DoAppend( const wxString& item ) -{ - wxCHECK_MSG( m_treeview != NULL, -1, wxT("invalid listbox") ); - - InvalidateBestSize(); - - GtkTreeEntry* entry = gtk_tree_entry_new(); - gtk_tree_entry_set_label( entry, wxGTK_CONV(item) ); - gtk_tree_entry_set_destroy_func(entry, - (GtkTreeEntryDestroy)gtk_tree_entry_destroy_cb, - this); - - GtkTreeIter itercur; - gtk_list_store_insert_before( m_liststore, &itercur, NULL ); - -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - gtk_list_store_set( m_liststore, &itercur, - 0, FALSE, //FALSE == not toggled - 1, entry, -1); - } - else -#endif - gtk_list_store_set(m_liststore, &itercur, - 0, entry, -1); - - g_object_unref (entry); //liststore always refs :) - - GtkTreePath* path = gtk_tree_model_get_path( - GTK_TREE_MODEL(m_liststore), - &itercur); - - gint* pIntPath = gtk_tree_path_get_indices(path); + GtkSetItem(itercur, entry); - if (pIntPath == NULL) - { - wxLogSysError(wxT("internal wxListBox error in insertion")); - return wxNOT_FOUND; + g_object_unref (entry); } - int index = pIntPath[0]; - - gtk_tree_path_free( path ); - - return index; -} + if ( !HasClientData() ) + m_clientDataItemsType = type; -void wxListBox::DoSetItems( const wxArrayString& items, - void **clientData) -{ - Clear(); - GtkInsertItems(items, clientData, 0); + return pos + numItems - 1; } // ---------------------------------------------------------------------------- // deleting items // ---------------------------------------------------------------------------- -void wxListBox::Clear() +void wxListBox::DoClear() { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); @@ -617,46 +502,59 @@ void wxListBox::Clear() gtk_list_store_clear( m_liststore ); /* well, THAT was easy :) */ } -void wxListBox::Delete(unsigned int n) +void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); InvalidateBestSize(); GtkTreeIter iter; - gboolean res = gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, NULL, //NULL = parent = get first - n - ); + wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("wrong listbox index") ); - wxCHECK_RET( res, wxT("wrong listbox index") ); - - //this returns false if iter is invalid (i.e. deleting item - //at end) but since we don't use iter, well... :) + // 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); } // ---------------------------------------------------------------------------- -// get GtkTreeEntry from position (note: you need to g_unref it if valid) +// helper functions for working with iterators // ---------------------------------------------------------------------------- -struct _GtkTreeEntry* wxListBox::GtkGetEntry(int n) const +bool wxListBox::GtkGetIteratorFor(unsigned pos, GtkTreeIter *iter) const { - GtkTreeIter iter; - gboolean res = gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, NULL, //NULL = parent = get first - n ); - - if (!res) + if ( !gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_liststore), + iter, NULL, pos) ) { - wxLogDebug(wxT("gtk_tree_model_iter_nth_child failed\n") - wxT("Passed in value was:[%i] List size:[%u]"), - n, wxListBox::GetCount() ); - return NULL; + wxLogDebug(wxT("gtk_tree_model_iter_nth_child(%u) failed"), pos); + return false; } + return true; +} + +int wxListBox::GtkGetIndexFor(GtkTreeIter& iter) const +{ + GtkTreePath *path = + gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter); + + gint* pIntPath = gtk_tree_path_get_indices(path); + + wxCHECK_MSG( pIntPath, wxNOT_FOUND, _T("failed to get iterator path") ); + + int idx = pIntPath[0]; + + gtk_tree_path_free( path ); + + return idx; +} + +// get GtkTreeEntry from position (note: you need to g_unref it if valid) +GtkTreeEntry *wxListBox::GtkGetEntry(unsigned n) const +{ + GtkTreeIter iter; + if ( !GtkGetIteratorFor(n, &iter) ) + return NULL; + GtkTreeEntry* entry = NULL; gtk_tree_model_get(GTK_TREE_MODEL(m_liststore), &iter, @@ -665,6 +563,23 @@ struct _GtkTreeEntry* wxListBox::GtkGetEntry(int n) const return entry; } +void wxListBox::GtkSetItem(GtkTreeIter& iter, const GtkTreeEntry *entry) +{ +#if wxUSE_CHECKLISTBOX + if ( m_hasCheckBoxes ) + { + gtk_list_store_set(m_liststore, &iter, + 0, FALSE, // FALSE == not toggled + 1, entry, + -1); + } + else +#endif // wxUSE_CHECKLISTBOX + { + gtk_list_store_set(m_liststore, &iter, 0, entry, -1); + } +} + // ---------------------------------------------------------------------------- // client data // ---------------------------------------------------------------------------- @@ -682,11 +597,6 @@ void* wxListBox::DoGetItemClientData(unsigned int n) const return userdata; } -wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const -{ - return (wxClientData*) wxListBox::DoGetItemClientData(n); -} - void wxListBox::DoSetItemClientData(unsigned int n, void* clientData) { wxCHECK_RET( IsValid(n), @@ -699,12 +609,6 @@ void wxListBox::DoSetItemClientData(unsigned int n, void* clientData) g_object_unref (entry); } -void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) -{ - // wxItemContainer already deletes data for us - wxListBox::DoSetItemClientData(n, (void*) clientData); -} - // ---------------------------------------------------------------------------- // string list access // ---------------------------------------------------------------------------- @@ -722,23 +626,11 @@ void wxListBox::SetString(unsigned int n, const wxString& label) // and update the model which will refresh the tree too GtkTreeIter iter; - if ( !gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_liststore), - &iter, NULL, n) ) - { - wxFAIL_MSG( wxT("failed to get iterator") ); - return; - } + wxCHECK_RET( GtkGetIteratorFor(n, &iter), _T("failed to get iterator") ); -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - gtk_list_store_set(m_liststore, &iter, - 0, FALSE, //FALSE == not toggled - 1, entry, -1); - } - else -#endif - gtk_list_store_set(m_liststore, &iter, 0, entry, -1); + // FIXME: this resets the checked status of a wxCheckListBox item + + GtkSetItem(iter, entry); } wxString wxListBox::GetString(unsigned int n) const @@ -796,14 +688,7 @@ int wxListBox::GetSelection() const if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return wxNOT_FOUND; - GtkTreePath* path = - gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter); - - int sel = gtk_tree_path_get_indices(path)[0]; - - gtk_tree_path_free(path); - - return sel; + return GtkGetIndexFor(iter); } int wxListBox::GetSelections( wxArrayInt& aSelections ) const @@ -837,12 +722,7 @@ bool wxListBox::IsSelected( int n ) const GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); GtkTreeIter iter; - gboolean res = gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, NULL, //NULL = parent = get first - n ); - - wxCHECK_MSG( res, false, wxT("Invalid index") ); + wxCHECK_MSG( GtkGetIteratorFor(n, &iter), false, wxT("Invalid index") ); return gtk_tree_selection_iter_is_selected(selection, &iter); } @@ -883,12 +763,7 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent) GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); GtkTreeIter iter; - gboolean res = gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, NULL, //NULL = parent = get first - n - ); - wxCHECK_RET( res, wxT("Invalid index") ); + wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("Invalid index") ); m_blockEvent = blockEvent; @@ -910,12 +785,8 @@ void wxListBox::DoSetFirstItem( int n ) return; GtkTreeIter iter; - gtk_tree_model_iter_nth_child( - GTK_TREE_MODEL(m_liststore), - &iter, - NULL, //NULL = parent = get first - n - ); + if ( !GtkGetIteratorFor(n, &iter) ) + return; GtkTreePath* path = gtk_tree_model_get_path( GTK_TREE_MODEL(m_liststore), &iter); @@ -969,10 +840,10 @@ int wxListBox::DoListHitTest(const wxPoint& point) const // ---------------------------------------------------------------------------- #if wxUSE_TOOLTIPS -void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) +void wxListBox::ApplyToolTip( GtkTooltips *tips, const gchar *tip ) { // RN: Is this needed anymore? - gtk_tooltips_set_tip( tips, GTK_WIDGET( m_treeview ), wxGTK_CONV(tip), (gchar*) NULL ); + gtk_tooltips_set_tip( tips, GTK_WIDGET( m_treeview ), tip, (gchar*) NULL ); } #endif // wxUSE_TOOLTIPS