32 #include <glib/gi18n.h> 33 #include <gdk/gdkkeysyms.h> 47 static GtkEventBoxClass* gnc_item_list_parent_class;
48 static guint gnc_item_list_signals[LAST_SIGNAL];
50 gboolean _gnc_item_find_selection (GtkTreeModel* model, GtkTreePath* path,
51 GtkTreeIter* iter, gpointer data);
58 g_return_val_if_fail (item_list != NULL, 0);
59 g_return_val_if_fail (IS_GNC_ITEM_LIST (item_list), 0);
61 model = gnc_item_list_using_temp (item_list) ?
62 GTK_TREE_MODEL (item_list->temp_store) :
63 GTK_TREE_MODEL (item_list->list_store);
64 return gtk_tree_model_iter_n_children (model, NULL);
71 GtkTreeSelection* selection;
73 g_return_if_fail (IS_GNC_ITEM_LIST (item_list));
74 g_return_if_fail (item_list->list_store != NULL);
76 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (item_list->tree_view));
78 g_signal_handlers_block_matched (G_OBJECT (selection), G_SIGNAL_MATCH_DATA,
79 0, 0, NULL, NULL, item_list);
80 gtk_list_store_clear (item_list->list_store);
81 g_signal_handlers_unblock_matched (G_OBJECT (selection), G_SIGNAL_MATCH_DATA,
82 0, 0, NULL, NULL, item_list);
87 gnc_item_list_append (
GncItemList* item_list,
const char*
string)
91 g_return_if_fail (IS_GNC_ITEM_LIST (item_list));
92 g_return_if_fail (item_list->list_store != NULL);
93 g_return_if_fail (
string != NULL);
94 gtk_list_store_append (item_list->list_store, &iter);
95 gtk_list_store_set (item_list->list_store, &iter, 0,
string, -1);
100 gnc_item_list_set_sort_enabled (
GncItemList* item_list, gboolean enabled)
104 gtk_tree_sortable_set_sort_column_id
105 (GTK_TREE_SORTABLE (item_list->list_store),
111 gtk_tree_sortable_set_sort_column_id
112 (GTK_TREE_SORTABLE (item_list->list_store),
113 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
119 typedef struct _findSelectionData
122 const char* string_to_find;
123 GtkTreePath* found_path;
127 _gnc_item_find_selection (GtkTreeModel* model, GtkTreePath* path,
128 GtkTreeIter* iter, gpointer data)
134 gtk_tree_model_get (model, iter, 0, &iterStr, -1);
135 found = g_strcmp0 (to_find->string_to_find, iterStr) == 0;
139 to_find->found_path = gtk_tree_path_copy (path);
146 gnc_item_in_list (
GncItemList* item_list,
const char*
string)
151 g_return_val_if_fail (item_list != NULL, FALSE);
152 g_return_val_if_fail (IS_GNC_ITEM_LIST (item_list), FALSE);
155 to_find_data->item_list = item_list;
156 to_find_data->string_to_find = string;
158 gtk_tree_model_foreach (GTK_TREE_MODEL (item_list->list_store),
159 _gnc_item_find_selection,
162 result = (to_find_data->found_path != NULL);
163 g_free (to_find_data);
169 gnc_item_list_select (
GncItemList* item_list,
const char*
string)
171 GtkTreeSelection* tree_sel = NULL;
174 g_return_if_fail (item_list != NULL);
175 g_return_if_fail (IS_GNC_ITEM_LIST (item_list));
177 tree_sel = gtk_tree_view_get_selection (item_list->tree_view);
181 gtk_tree_selection_unselect_all (tree_sel);
186 to_find_data->item_list = item_list;
187 to_find_data->string_to_find = string;
189 gtk_tree_model_foreach (GTK_TREE_MODEL (item_list->list_store),
190 _gnc_item_find_selection,
193 if (to_find_data->found_path != NULL)
195 gtk_tree_view_set_cursor (item_list->tree_view, to_find_data->found_path, NULL,
197 gtk_tree_path_free (to_find_data->found_path);
199 gnc_item_list_show_selected (item_list);
202 g_free (to_find_data);
212 GtkTreeSelection *selection =
213 gtk_tree_view_get_selection (item_list->tree_view);
214 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
217 gtk_tree_model_get (model, &iter, 0, &
string, -1);
223 gnc_item_list_show_selected (
GncItemList* item_list)
225 GtkTreeSelection* selection;
229 g_return_if_fail (item_list != NULL);
230 g_return_if_fail (IS_GNC_ITEM_LIST (item_list));
232 selection = gtk_tree_view_get_selection (item_list->tree_view);
234 if (gtk_tree_selection_get_selected (selection, &model, &iter))
236 GtkTreePath* path = gtk_tree_model_get_path (model, &iter);
238 gtk_tree_view_scroll_to_cell (item_list->tree_view,
239 path, NULL, TRUE, 0.5, 0.0);
240 gtk_tree_path_free (path);
247 g_return_val_if_fail (item_list != NULL, 0);
248 g_return_val_if_fail (IS_GNC_ITEM_LIST (item_list), 0);
254 gnc_item_list_set_temp_store (
GncItemList *item_list, GtkListStore *store)
257 g_return_if_fail (item_list != 0);
259 item_list->temp_store = store;
262 gtk_tree_view_set_model (item_list->tree_view,
263 GTK_TREE_MODEL (item_list->temp_store));
267 gtk_tree_view_set_model (item_list->tree_view,
268 GTK_TREE_MODEL (item_list->list_store));
269 item_list->temp_store = NULL;
276 return item_list && item_list->temp_store;
282 item_list->scrollwin = NULL;
283 item_list->tree_view = NULL;
284 item_list->list_store = NULL;
285 item_list->temp_store = NULL;
286 item_list->cell_height = 0;
291 gnc_item_list_button_event (GtkWidget* widget, GdkEventButton* event,
301 g_return_val_if_fail (IS_GNC_ITEM_LIST (data), FALSE);
303 item_list = GNC_ITEM_LIST (data);
305 switch (event->button)
308 if (!gtk_tree_view_get_path_at_pos (item_list->tree_view,
319 gtk_tree_view_set_cursor (item_list->tree_view, path, NULL, FALSE);
321 model = GTK_TREE_MODEL (item_list->list_store);
322 success = gtk_tree_model_get_iter (model, &iter, path);
324 gtk_tree_path_free (path);
329 gtk_tree_model_get (model, &iter, 0, &
string, -1);
331 g_signal_emit (G_OBJECT (item_list),
332 gnc_item_list_signals[ACTIVATE_ITEM],
345 gnc_item_list_key_event (GtkWidget* widget, GdkEventKey* event, gpointer data)
351 switch (event->keyval)
357 g_signal_emit (G_OBJECT (item_list),
358 gnc_item_list_signals[ACTIVATE_ITEM],
361 g_signal_emit (G_OBJECT (item_list), gnc_item_list_signals[CHANGE_ITEM], 0,
366 case GDK_KEY_Page_Up:
367 case GDK_KEY_Page_Down:
371 case GDK_KEY_KP_Down:
372 case GDK_KEY_KP_Page_Up:
373 case GDK_KEY_KP_Page_Down:
379 g_signal_stop_emission_by_name (G_OBJECT (widget),
"key_press_event");
381 g_signal_emit_by_name (G_OBJECT (item_list),
"key_press_event", event,
391 GObjectClass* object_class = G_OBJECT_CLASS (item_list_class);
393 gnc_item_list_parent_class = g_type_class_peek_parent (item_list_class);
395 gtk_widget_class_set_css_name (GTK_WIDGET_CLASS(item_list_class),
"gnc-id-sheet-list");
397 gnc_item_list_signals[SELECT_ITEM] =
398 g_signal_new (
"select_item",
399 G_OBJECT_CLASS_TYPE (object_class),
403 g_cclosure_marshal_VOID__POINTER,
407 gnc_item_list_signals[CHANGE_ITEM] =
408 g_signal_new (
"change_item",
409 G_OBJECT_CLASS_TYPE (object_class),
413 g_cclosure_marshal_VOID__POINTER,
417 gnc_item_list_signals[ACTIVATE_ITEM] =
418 g_signal_new (
"activate_item",
419 G_OBJECT_CLASS_TYPE (object_class),
423 g_cclosure_marshal_VOID__POINTER,
427 item_list_class->select_item = NULL;
428 item_list_class->change_item = NULL;
429 item_list_class->activate_item = NULL;
434 gnc_item_list_get_type (
void)
436 static GType gnc_item_list_type = 0;
438 if (gnc_item_list_type == 0)
440 static const GTypeInfo gnc_item_list_info =
445 (GClassInitFunc) gnc_item_list_class_init,
450 (GInstanceInitFunc) gnc_item_list_init
454 g_type_register_static (GTK_TYPE_EVENT_BOX,
"GncItemList",
455 &gnc_item_list_info, 0);
458 return gnc_item_list_type;
463 tree_view_selection_changed (GtkTreeSelection* selection,
471 g_return_if_fail (data);
472 g_return_if_fail (selection);
474 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
477 gtk_tree_model_get (model, &iter, 0, &
string, -1);
479 g_signal_emit (G_OBJECT (item_list), gnc_item_list_signals[CHANGE_ITEM], 0,
487 gnc_item_list_get_cell_height (
GncItemList *item_list)
490 gint min_height, nat_height;
491 gtk_cell_renderer_get_preferred_height (item_list->renderer,
492 GTK_WIDGET(item_list->tree_view),
501 gnc_item_list_new (GtkListStore* list_store)
503 GtkWidget* tree_view;
504 GtkTreeViewColumn* column;
507 GNC_ITEM_LIST (g_object_new (GNC_TYPE_ITEM_LIST,
510 item_list->scrollwin =
511 GTK_SCROLLED_WINDOW (gtk_scrolled_window_new(NULL, NULL));
512 gtk_container_add (GTK_CONTAINER (item_list),
513 GTK_WIDGET (item_list->scrollwin));
515 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (item_list->scrollwin),
516 GTK_POLICY_AUTOMATIC,
517 GTK_POLICY_AUTOMATIC);
519 if (NULL == list_store)
520 list_store = gtk_list_store_new (1, G_TYPE_STRING);
522 g_object_ref (list_store);
523 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
524 g_object_unref (list_store);
526 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
527 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (
529 GTK_SELECTION_BROWSE);
530 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store),
531 0, GTK_SORT_ASCENDING);
533 item_list->renderer = gtk_cell_renderer_text_new();
534 column = gtk_tree_view_column_new_with_attributes (_ (
"List"),
538 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
540 gtk_container_add (GTK_CONTAINER (item_list->scrollwin), tree_view);
542 item_list->tree_view = GTK_TREE_VIEW (tree_view);
543 item_list->list_store = list_store;
545 g_signal_connect (G_OBJECT (tree_view),
"button_press_event",
546 G_CALLBACK (gnc_item_list_button_event), item_list);
548 g_signal_connect (G_OBJECT (tree_view),
"key_press_event",
549 G_CALLBACK (gnc_item_list_key_event), item_list);
551 g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (
552 GTK_TREE_VIEW (tree_view))),
"changed",
553 G_CALLBACK (tree_view_selection_changed), item_list);
555 return GTK_WIDGET (item_list);
Public Declarations for GncItemList class.
All type declarations for the whole Gnucash engine.
char * gnc_item_list_get_selection(GncItemList *item_list)
Retrieve the selected string from the item_list's active GtkListStore.