#include "wx/tooltip.h"
#endif
-#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
GtkTreeViewColumn *col,
wxListBox *listbox)
{
- if (g_isIdle) wxapp_install_idle_handler();
-
if (g_blockEventsOnDrag) return;
if (g_blockEventsOnScroll) return;
if (listbox->IsSelected(sel))
{
GtkTreeEntry* entry = listbox->GtkGetEntry(sel);
-
+
if (entry)
{
event.SetInt(sel);
event.SetClientObject( (wxClientData*) gtk_tree_entry_get_userdata(entry) );
else if ( listbox->HasClientUntypedData() )
event.SetClientData( gtk_tree_entry_get_userdata(entry) );
-
+
g_object_unref (entry);
}
else
}
}
-//-----------------------------------------------------------------------------
-// "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"
//-----------------------------------------------------------------------------
gtk_listitem_changed_callback( GtkTreeSelection* selection, wxListBox *listbox )
{
if (g_blockEventsOnDrag) return;
-
+
if (listbox->m_blockEvent) return;
-
+
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
event.SetEventObject( listbox );
{
wxArrayInt selections;
listbox->GetSelections( selections );
-
+
if (selections.GetCount() == 0)
{
// indicate that this is a deselection
event.SetExtraLong( 0 );
event.SetInt( -1 );
-
+
listbox->GetEventHandler()->ProcessEvent( event );
-
+
return;
}
else
// indicate that this is a selection
event.SetExtraLong( 1 );
event.SetInt( selections[0] );
-
+
listbox->GetEventHandler()->ProcessEvent( event );
}
}
// indicate that this is a deselection
event.SetExtraLong( 0 );
event.SetInt( -1 );
-
+
listbox->GetEventHandler()->ProcessEvent( event );
-
+
return;
}
else
long style, const wxValidator& validator,
const wxString &name )
{
- m_needParent = true;
- m_acceptsFocus = true;
m_blockEvent = false;
if (!PreCreation( parent, pos, size ) ||
GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview );
-
+
g_signal_connect_after (selection, "changed",
G_CALLBACK (gtk_listitem_changed_callback), this);
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);
GtkTreeIter iter;
if (pos != nCurCount)
{
- 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_RET( GtkGetIteratorFor(pos, &iter),
+ wxT("internal wxListBox error in insertion") );
pIter = &iter;
}
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);
+ GtkSetItem(itercur, entry);
- g_object_unref (entry); //liststore always refs :)
+ g_object_unref (entry);
}
}
int wxListBox::DoAppend( const wxString& item )
{
- // Call DoInsertItems
- unsigned int nWhere = wxListBox::GetCount();
- wxArrayString aItems;
- aItems.Add(item);
- wxListBox::DoInsertItems(aItems, nWhere);
- return nWhere;
+ 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 );
+
+ GtkSetItem(itercur, entry);
+
+ g_object_unref (entry);
+
+ return GtkGetIndexFor(itercur);
}
void wxListBox::DoSetItems( const wxArrayString& items,
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( res, wxT("wrong listbox index") );
+ wxCHECK_RET( GtkGetIteratorFor(n, &iter), 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,
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
// ----------------------------------------------------------------------------
// string list access
// ----------------------------------------------------------------------------
-void wxListBox::SetString(unsigned int n, const wxString &string)
+void wxListBox::SetString(unsigned int n, const wxString& label)
{
wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetString") );
wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") );
GtkTreeEntry* entry = GtkGetEntry(n);
wxCHECK_RET( entry, wxT("wrong listbox index") );
- wxString label = string;
+ // update the item itself
+ gtk_tree_entry_set_label(entry, wxGTK_CONV(label));
- // RN: This may look wierd but the problem is that the TreeView
- // doesn't resort or update when changed above and there is no real
- // 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 (entry);
+ // and update the model which will refresh the tree too
+ GtkTreeIter iter;
+ wxCHECK_RET( GtkGetIteratorFor(n, &iter), _T("failed to get iterator") );
- bool bWasSelected = wxListBox::IsSelected(n);
- wxListBox::Delete(n);
+ // FIXME: this resets the checked status of a wxCheckListBox item
- wxArrayString aItems;
- aItems.Add(label);
- GtkInsertItems(aItems, &userdata, n);
- if (bWasSelected)
- wxListBox::GtkSetSelection(n, true, true);
+ GtkSetItem(iter, entry);
}
wxString wxListBox::GetString(unsigned int n) 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
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);
}
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;
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);
// ----------------------------------------------------------------------------
#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