32 #include <glib/gi18n.h>
33 #include <gdk/gdkkeysyms.h>
34 #include <libgnomecanvas/libgnomecanvas.h>
37 #include "gnucash-item-list.h"
38 #include "gnucash-scrolled-window.h"
50 static GnomeCanvasWidgetClass *gnc_item_list_parent_class;
51 static guint gnc_item_list_signals[LAST_SIGNAL];
53 gboolean _gnc_item_find_selection(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
60 g_return_val_if_fail(item_list != NULL, 0);
61 g_return_val_if_fail(IS_GNC_ITEM_LIST(item_list), 0);
63 model = 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);
95 gtk_list_store_append (item_list->list_store, &iter);
96 gtk_list_store_set (item_list->list_store, &iter, 0,
string, -1);
101 gnc_item_list_set_sort_enabled(
GncItemList *item_list, gboolean enabled)
105 gtk_tree_sortable_set_sort_column_id
106 (GTK_TREE_SORTABLE (item_list->list_store),
112 gtk_tree_sortable_set_sort_column_id
113 (GTK_TREE_SORTABLE (item_list->list_store),
114 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
123 const char *string_to_find;
124 GtkTreePath *found_path;
128 _gnc_item_find_selection(GtkTreeModel *model, GtkTreePath *path, 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, FALSE);
196 gtk_tree_path_free(to_find_data->found_path);
198 gnc_item_list_show_selected(item_list);
201 g_free(to_find_data);
206 gnc_item_list_show_selected (
GncItemList *item_list)
208 GtkTreeSelection *selection;
213 g_return_if_fail(item_list != NULL);
214 g_return_if_fail(IS_GNC_ITEM_LIST(item_list));
216 selection = gtk_tree_view_get_selection (item_list->tree_view);
218 if (gtk_tree_selection_get_selected (selection, &model, &iter))
220 path = gtk_tree_model_get_path (model, &iter);
222 gtk_tree_view_scroll_to_cell (item_list->tree_view,
223 path, NULL, TRUE, 0.5, 0.0);
230 g_return_val_if_fail(item_list != NULL, 0);
231 g_return_val_if_fail(IS_GNC_ITEM_LIST(item_list), 0);
240 item_list->tree_view = NULL;
241 item_list->list_store = NULL;
242 item_list->frame = NULL;
247 gnc_item_list_button_event(GtkWidget *widget, GdkEventButton *event,
257 g_return_val_if_fail(IS_GNC_ITEM_LIST (data), FALSE);
259 item_list = GNC_ITEM_LIST (data);
261 switch (event->button)
264 if (!gtk_tree_view_get_path_at_pos (item_list->tree_view,
275 gtk_tree_view_set_cursor (item_list->tree_view, path, NULL, FALSE);
277 model = GTK_TREE_MODEL (item_list->list_store);
278 success = gtk_tree_model_get_iter (model, &iter, path);
280 gtk_tree_path_free (path);
285 gtk_tree_model_get (model, &iter, 0, &
string, -1);
287 g_signal_emit (G_OBJECT (item_list),
288 gnc_item_list_signals[ACTIVATE_ITEM],
301 gnc_item_list_key_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
304 GtkTreeSelection *selection = NULL;
309 switch (event->keyval)
312 selection = gtk_tree_view_get_selection (item_list->tree_view);
313 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
316 gtk_tree_model_get (model, &iter, 0, &
string, -1);
318 g_signal_emit (G_OBJECT (item_list),
319 gnc_item_list_signals[ACTIVATE_ITEM],
325 case GDK_KEY_Page_Up:
326 case GDK_KEY_Page_Down:
334 g_signal_stop_emission_by_name (G_OBJECT (widget),
"key_press_event");
336 g_signal_emit (G_OBJECT (item_list),
337 gnc_item_list_signals[KEY_PRESS_EVENT], 0, event);
346 GObjectClass *object_class = G_OBJECT_CLASS (item_list_class);
348 gnc_item_list_parent_class = g_type_class_peek_parent (item_list_class);
351 gnc_item_list_signals[SELECT_ITEM] =
352 g_signal_new (
"select_item",
353 G_OBJECT_CLASS_TYPE (object_class),
357 g_cclosure_marshal_VOID__POINTER,
361 gnc_item_list_signals[CHANGE_ITEM] =
362 g_signal_new (
"change_item",
363 G_OBJECT_CLASS_TYPE (object_class),
367 g_cclosure_marshal_VOID__POINTER,
371 gnc_item_list_signals[ACTIVATE_ITEM] =
372 g_signal_new (
"activate_item",
373 G_OBJECT_CLASS_TYPE (object_class),
377 g_cclosure_marshal_VOID__POINTER,
381 gnc_item_list_signals[KEY_PRESS_EVENT] =
382 g_signal_new (
"key_press_event",
383 G_OBJECT_CLASS_TYPE (object_class),
387 g_cclosure_marshal_VOID__BOXED,
391 item_list_class->select_item = NULL;
392 item_list_class->change_item = NULL;
393 item_list_class->activate_item = NULL;
394 item_list_class->key_press_event = NULL;
399 gnc_item_list_get_type (
void)
401 static GType gnc_item_list_type = 0;
403 if (gnc_item_list_type == 0)
405 static const GTypeInfo gnc_item_list_info =
410 (GClassInitFunc) gnc_item_list_class_init,
415 (GInstanceInitFunc) gnc_item_list_init
419 g_type_register_static (gnome_canvas_widget_get_type(),
"GncItemList",
420 &gnc_item_list_info, 0);
423 return gnc_item_list_type;
428 tree_view_selection_changed (GtkTreeSelection *selection,
436 g_return_if_fail(data);
437 g_return_if_fail(selection);
439 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
442 gtk_tree_model_get (model, &iter, 0, &
string, -1);
444 g_signal_emit (G_OBJECT (item_list), gnc_item_list_signals[CHANGE_ITEM], 0,
string);
450 gnc_item_list_new(GnomeCanvasGroup *parent, GtkListStore *list_store)
453 GtkWidget *tree_view;
454 GtkWidget *scrollwin;
455 GtkCellRenderer *renderer;
456 GtkTreeViewColumn *column;
457 GnomeCanvasItem *item;
460 frame = gtk_frame_new (NULL);
462 scrollwin = gnc_scrolled_window_new ();
463 gtk_container_add (GTK_CONTAINER (frame), scrollwin);
465 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin),
466 GTK_POLICY_AUTOMATIC,
467 GTK_POLICY_AUTOMATIC);
469 if (NULL == list_store)
470 list_store = gtk_list_store_new (1, G_TYPE_STRING);
472 g_object_ref(list_store);
473 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
474 g_object_unref(list_store);
478 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
479 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
480 GTK_SELECTION_BROWSE);
481 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(list_store),
482 0, GTK_SORT_ASCENDING);
484 renderer = gtk_cell_renderer_text_new ();
485 column = gtk_tree_view_column_new_with_attributes (_(
"List"),
489 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
491 gtk_container_add (GTK_CONTAINER (scrollwin), tree_view);
492 gtk_widget_show_all (frame);
494 item = gnome_canvas_item_new (parent, gnc_item_list_get_type(),
501 item_list = GNC_ITEM_LIST (item);
503 item_list->tree_view = GTK_TREE_VIEW (tree_view);
504 item_list->list_store = list_store;
505 item_list->frame = frame;
507 g_signal_connect (G_OBJECT(tree_view),
"button_press_event",
508 G_CALLBACK (gnc_item_list_button_event), item_list);
510 g_signal_connect (G_OBJECT (tree_view),
"key_press_event",
511 G_CALLBACK (gnc_item_list_key_event), item_list);
513 g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view))),
"changed",
514 G_CALLBACK (tree_view_selection_changed), item_list);
All type declarations for the whole Gnucash engine.