- //In the keyevent we don't know the index of the item
- //and the activated event gets called anyway...
- //
- //Also, activating with the space causes the treeview to
- //unselect all the items and then select the item in question
- //wx's behaviour is to just toggle the item's selection state
- //and leave the others alone
- listbox->m_spacePressed = true;
- }
-
- return ret;
-}
-}
-
-//-----------------------------------------------------------------------------
-// "select" and "deselect"
-//-----------------------------------------------------------------------------
-
-extern "C" {
-static gboolean gtk_listitem_select_cb( GtkTreeSelection* selection,
- GtkTreeModel* model,
- GtkTreePath* path,
- gboolean is_selected,
- wxListBox *listbox )
-{
- if (g_isIdle) wxapp_install_idle_handler();
-
- if (!listbox->m_hasVMT) return TRUE;
- if (g_blockEventsOnDrag) return TRUE;
-
- if (listbox->m_spacePressed) return FALSE; //see keyevent callback
- if (listbox->m_blockEvent) return TRUE;
-
- // NB: wxdocs explicitly say that this event only gets sent when
- // something is actually selected, plus the controls example
- // assumes so and passes -1 to the dogetclientdata funcs if not
-
- // OK, so basically we need to do a bit of a run-around here as
- // 1) is_selected says whether the item(s?) are CURRENTLY selected -
- // i.e. if is_selected is FALSE then the item is going to be
- // selected right now!
- // 2) However, since it is not already selected and the user
- // will expect it to be we need to manually select it and
- // return FALSE telling GTK we handled the selection
- if (is_selected) return TRUE;
-
- int nIndex = gtk_tree_path_get_indices(path)[0];
- GtkTreeEntry* entry = listbox->GtkGetEntry(nIndex);
-
- if(entry)
- {
- //Now, as mentioned above, we manually select the row that is/was going
- //to be selected anyway by GTK
- listbox->m_blockEvent = true; //if we don't block events we will lock the
- //app due to recursion!!
-
- GtkTreeSelection* selection =
- gtk_tree_view_get_selection(listbox->m_treeview);
- GtkTreeIter iter;
- gtk_tree_model_get_iter(GTK_TREE_MODEL(listbox->m_liststore), &iter, path);
- gtk_tree_selection_select_iter(selection, &iter);
-
- listbox->m_blockEvent = false;
-
- //Finally, send the wx event
- wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
- event.SetEventObject( listbox );
-
- // indicate whether this is a selection or a deselection
- event.SetExtraLong( 1 );
-
- event.SetInt(nIndex);
- event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry)));