static void gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), wxListBox *listbox ) { if (g_blockEventsOnDrag) return; if (listbox->HasFlag(wxLB_MULTIPLE | wxLB_EXTENDED)) { listbox->CalcAndSendEvent(); } else // single selection { wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); event.SetEventObject( listbox ); int index = listbox->GetSelection(); if (index == wxNOT_FOUND) { // indicate that this is a deselection event.SetExtraLong( 0 ); event.SetInt( -1 ); listbox->HandleWindowEvent( event ); return; } else { GtkTreeEntry* entry = listbox->GTKGetEntry( index ); // indicate that this is a selection event.SetExtraLong( 1 ); event.SetInt( index ); event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry))); if ( listbox->HasClientObjectData() ) event.SetClientObject( (wxClientData*) gtk_tree_entry_get_userdata(entry) ); else if ( listbox->HasClientUntypedData() ) event.SetClientData( gtk_tree_entry_get_userdata(entry) ); listbox->HandleWindowEvent( event ); g_object_unref (entry); } } }
void* wxListBox::DoGetItemClientData(unsigned int n) const { wxGtkObject<GtkTreeEntry> entry(GTKGetEntry(n)); wxCHECK_MSG(entry, NULL, wxT("could not get entry")); return gtk_tree_entry_get_userdata( entry ); }
static void gtk_listbox_row_activated_callback(GtkTreeView * WXUNUSED(treeview), GtkTreePath *path, GtkTreeViewColumn * WXUNUSED(col), wxListBox *listbox) { if (g_blockEventsOnDrag) return; if (g_blockEventsOnScroll) return; // This is triggered by either a double-click or a space press int sel = gtk_tree_path_get_indices(path)[0]; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() ); event.SetEventObject( listbox ); if (listbox->IsSelected(sel)) { GtkTreeEntry* entry = listbox->GTKGetEntry(sel); if (entry) { event.SetInt(sel); event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry))); if ( listbox->HasClientObjectData() ) 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 { wxLogSysError(wxT("Internal error - could not get entry for double-click")); event.SetInt(-1); } } else { event.SetInt(-1); } listbox->HandleWindowEvent( event ); }
static void gtk_tree_entry_destroy_cb(GtkTreeEntry* entry, wxListBox* listbox) { if (listbox->HasClientObjectData()) { gpointer userdata = gtk_tree_entry_get_userdata(entry); if (userdata) delete (wxClientData *)userdata; } }
void* wxListBox::DoGetItemClientData(unsigned int n) const { wxCHECK_MSG( IsValid(n), NULL, wxT("Invalid index passed to GetItemClientData") ); GtkTreeEntry* entry = GTKGetEntry(n); wxCHECK_MSG(entry, NULL, wxT("could not get entry")); void* userdata = gtk_tree_entry_get_userdata( entry ); g_object_unref (entry); return userdata; }
static gboolean gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), GdkEventKey *gdk_event, wxListBox *listbox ) { if ((gdk_event->keyval == GDK_Return) || (gdk_event->keyval == GDK_ISO_Enter) || (gdk_event->keyval == GDK_KP_Enter)) { 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 event.SetExtraLong( 1 ); event.SetInt( index ); event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry))); if ( listbox->HasClientObjectData() ) event.SetClientObject( (wxClientData*) gtk_tree_entry_get_userdata(entry) ); else if ( listbox->HasClientUntypedData() ) event.SetClientData( gtk_tree_entry_get_userdata(entry) ); /* bool ret = */ listbox->HandleWindowEvent( event ); g_object_unref (entry); // wxMac and wxMSW always invoke default action // if (!ret) { // DClick not handled -> invoke default action wxWindow *tlw = wxGetTopLevelParent( listbox ); if (tlw) { GtkWindow *gtk_window = GTK_WINDOW( tlw->GetHandle() ); if (gtk_window) gtk_window_activate_default( gtk_window ); } } // Always intercept, otherwise we'd get another dclick // event from row_activated return TRUE; } } return FALSE; }