39 #include <glib/gi18n.h> 44 #include "gnc-component-manager.h" 49 #define ITER_IS_NAMESPACE GINT_TO_POINTER(1) 50 #define ITER_IS_COMMODITY GINT_TO_POINTER(2) 53 static QofLogModule log_module = GNC_MOD_GUI;
58 static void gnc_tree_model_commodity_finalize (GObject *
object);
59 static void gnc_tree_model_commodity_dispose (GObject *
object);
61 static void gnc_tree_model_commodity_tree_model_init (GtkTreeModelIface *iface);
62 static GtkTreeModelFlags gnc_tree_model_commodity_get_flags (GtkTreeModel *tree_model);
63 static int gnc_tree_model_commodity_get_n_columns (GtkTreeModel *tree_model);
64 static GType gnc_tree_model_commodity_get_column_type (GtkTreeModel *tree_model,
66 static gboolean gnc_tree_model_commodity_get_iter (GtkTreeModel *tree_model,
69 static GtkTreePath *gnc_tree_model_commodity_get_path (GtkTreeModel *tree_model,
71 static void gnc_tree_model_commodity_get_value (GtkTreeModel *tree_model,
75 static gboolean gnc_tree_model_commodity_iter_next (GtkTreeModel *tree_model,
77 static gboolean gnc_tree_model_commodity_iter_children (GtkTreeModel *tree_model,
80 static gboolean gnc_tree_model_commodity_iter_has_child (GtkTreeModel *tree_model,
82 static int gnc_tree_model_commodity_iter_n_children (GtkTreeModel *tree_model,
84 static gboolean gnc_tree_model_commodity_iter_nth_child (GtkTreeModel *tree_model,
88 static gboolean gnc_tree_model_commodity_iter_parent (GtkTreeModel *tree_model,
91 static void gnc_tree_model_commodity_event_handler (QofInstance *entity,
100 gnc_commodity_table *commodity_table;
101 gint event_handler_id;
104 #define GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(o) \ 105 ((GncTreeModelCommodityPrivate*)gnc_tree_model_commodity_get_instance_private((GncTreeModelCommodity*)o)) 108 static GObjectClass *parent_class = NULL;
112 G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
113 gnc_tree_model_commodity_tree_model_init))
118 GObjectClass *o_class = G_OBJECT_CLASS (klass);
120 parent_class = g_type_class_peek_parent (klass);
122 o_class->finalize = gnc_tree_model_commodity_finalize;
123 o_class->dispose = gnc_tree_model_commodity_dispose;
129 while (model->
stamp == 0)
131 model->
stamp = g_random_int ();
136 gnc_tree_model_commodity_finalize (GObject *
object)
141 g_return_if_fail (
object != NULL);
142 g_return_if_fail (GNC_IS_TREE_MODEL_COMMODITY (
object));
144 ENTER(
"model %p",
object);
146 model = GNC_TREE_MODEL_COMMODITY (
object);
147 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
149 priv->commodity_table = NULL;
151 G_OBJECT_CLASS (parent_class)->finalize (
object);
156 gnc_tree_model_commodity_dispose (GObject *
object)
161 g_return_if_fail (
object != NULL);
162 g_return_if_fail (GNC_IS_TREE_MODEL_COMMODITY (
object));
164 ENTER(
"model %p",
object);
165 model = GNC_TREE_MODEL_COMMODITY (
object);
166 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
168 if (priv->event_handler_id)
171 priv->event_handler_id = 0;
174 if (G_OBJECT_CLASS (parent_class)->dispose)
175 G_OBJECT_CLASS (parent_class)->dispose (
object);
189 for ( ; item; item = g_list_next(item))
192 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
193 if (priv->commodity_table == ct)
195 g_object_ref(G_OBJECT(model));
196 LEAVE(
"returning existing model %p", model);
197 return GTK_TREE_MODEL(model);
201 model = g_object_new (GNC_TYPE_TREE_MODEL_COMMODITY, NULL);
202 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
204 priv->commodity_table = ct;
206 priv->event_handler_id =
210 return GTK_TREE_MODEL (model);
217 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), FALSE);
218 g_return_val_if_fail (iter != NULL, FALSE);
219 g_return_val_if_fail (iter->user_data != NULL, FALSE);
220 g_return_val_if_fail (iter->stamp == model->
stamp, FALSE);
222 return (iter->user_data == ITER_IS_NAMESPACE);
229 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), FALSE);
230 g_return_val_if_fail (iter != NULL, FALSE);
231 g_return_val_if_fail (iter->user_data != NULL, FALSE);
232 g_return_val_if_fail (iter->stamp == model->
stamp, FALSE);
234 return (iter->user_data == ITER_IS_COMMODITY);
237 gnc_commodity_namespace *
241 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), NULL);
242 g_return_val_if_fail (iter != NULL, NULL);
243 g_return_val_if_fail (iter->user_data != NULL, NULL);
244 g_return_val_if_fail (iter->stamp == model->
stamp, NULL);
246 if (iter->user_data != ITER_IS_NAMESPACE)
248 return (gnc_commodity_namespace *)iter->user_data2;
255 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), NULL);
256 g_return_val_if_fail (iter != NULL, NULL);
257 g_return_val_if_fail (iter->user_data != NULL, NULL);
258 g_return_val_if_fail (iter->stamp == model->
stamp, NULL);
260 if (iter->user_data != ITER_IS_COMMODITY)
262 return (gnc_commodity *)iter->user_data2;
269 #define debug_path(fn, path) { \ 270 gchar *path_string = gtk_tree_path_to_string(path); \ 271 fn("tree path %s", path_string? path_string : "NULL"); \ 272 g_free(path_string); \ 275 #define ITER_STRING_LEN 128 278 iter_to_string (GtkTreeIter *iter)
280 gnc_commodity_namespace *name_space;
281 gnc_commodity *commodity = NULL;
282 #ifdef G_THREADS_ENABLED 283 static GPrivate gtmits_buffer_key = G_PRIVATE_INIT(g_free);
286 string = g_private_get (>mits_buffer_key);
289 string = g_malloc(ITER_STRING_LEN + 1);
290 g_private_set (>mits_buffer_key,
string);
293 static char string[ITER_STRING_LEN + 1];
297 switch (GPOINTER_TO_INT(iter->user_data))
299 case GPOINTER_TO_INT(ITER_IS_NAMESPACE):
300 name_space = (gnc_commodity_namespace *) iter->user_data2;
301 snprintf(
string, ITER_STRING_LEN,
302 "[stamp:%x data:%d (NAMESPACE), %p (%s), %d]",
303 iter->stamp, GPOINTER_TO_INT(iter->user_data),
305 GPOINTER_TO_INT(iter->user_data3));
308 case GPOINTER_TO_INT(ITER_IS_COMMODITY):
309 commodity = (gnc_commodity *) iter->user_data2;
310 snprintf(
string, ITER_STRING_LEN,
311 "[stamp:%x data:%d (COMMODITY), %p (%s), %d]",
312 iter->stamp, GPOINTER_TO_INT(iter->user_data),
314 GPOINTER_TO_INT(iter->user_data3));
318 snprintf(
string, ITER_STRING_LEN,
319 "[stamp:%x data:%d (UNKNOWN), %p, %d]",
321 GPOINTER_TO_INT(iter->user_data),
323 GPOINTER_TO_INT(iter->user_data3));
336 gnc_tree_model_commodity_tree_model_init (GtkTreeModelIface *iface)
338 iface->get_flags = gnc_tree_model_commodity_get_flags;
339 iface->get_n_columns = gnc_tree_model_commodity_get_n_columns;
340 iface->get_column_type = gnc_tree_model_commodity_get_column_type;
341 iface->get_iter = gnc_tree_model_commodity_get_iter;
342 iface->get_path = gnc_tree_model_commodity_get_path;
343 iface->get_value = gnc_tree_model_commodity_get_value;
344 iface->iter_next = gnc_tree_model_commodity_iter_next;
345 iface->iter_children = gnc_tree_model_commodity_iter_children;
346 iface->iter_has_child = gnc_tree_model_commodity_iter_has_child;
347 iface->iter_n_children = gnc_tree_model_commodity_iter_n_children;
348 iface->iter_nth_child = gnc_tree_model_commodity_iter_nth_child;
349 iface->iter_parent = gnc_tree_model_commodity_iter_parent;
352 static GtkTreeModelFlags
353 gnc_tree_model_commodity_get_flags (GtkTreeModel *tree_model)
359 gnc_tree_model_commodity_get_n_columns (GtkTreeModel *tree_model)
361 return GNC_TREE_MODEL_COMMODITY_NUM_COLUMNS;
365 gnc_tree_model_commodity_get_column_type (GtkTreeModel *tree_model,
368 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), G_TYPE_INVALID);
369 g_return_val_if_fail ((index < GNC_TREE_MODEL_COMMODITY_NUM_COLUMNS) && (index >= 0), G_TYPE_INVALID);
373 case GNC_TREE_MODEL_COMMODITY_COL_MNEMONIC:
374 case GNC_TREE_MODEL_COMMODITY_COL_NAMESPACE:
375 case GNC_TREE_MODEL_COMMODITY_COL_FULLNAME:
376 case GNC_TREE_MODEL_COMMODITY_COL_PRINTNAME:
377 case GNC_TREE_MODEL_COMMODITY_COL_CUSIP:
378 case GNC_TREE_MODEL_COMMODITY_COL_UNIQUE_NAME:
379 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_SOURCE:
380 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_TZ:
381 case GNC_TREE_MODEL_COMMODITY_COL_USER_SYMBOL:
382 return G_TYPE_STRING;
383 case GNC_TREE_MODEL_COMMODITY_COL_FRACTION:
385 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_FLAG:
386 case GNC_TREE_MODEL_COMMODITY_COL_VISIBILITY:
387 return G_TYPE_BOOLEAN;
389 g_assert_not_reached ();
390 return G_TYPE_INVALID;
395 gnc_tree_model_commodity_get_iter (GtkTreeModel *tree_model,
401 gnc_commodity_table *ct;
402 gnc_commodity_namespace *name_space;
403 gnc_commodity *commodity = NULL;
408 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), FALSE);
409 g_return_val_if_fail (iter != NULL, FALSE);
410 g_return_val_if_fail (path != NULL, FALSE);
412 depth = gtk_tree_path_get_depth (path);
413 ENTER(
"model %p, iter %p, path %p (depth %d)", tree_model, iter, path, depth);
414 debug_path(
DEBUG, path);
419 LEAVE(
"depth too small");
424 LEAVE(
"depth too big");
429 model = GNC_TREE_MODEL_COMMODITY (tree_model);
430 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
431 ct = priv->commodity_table;
434 LEAVE(
"no commodity table");
440 i = gtk_tree_path_get_indices (path)[0];
441 name_space = g_list_nth_data (list, i);
444 LEAVE(
"invalid path at namespace");
451 iter->stamp = model->
stamp;
452 iter->user_data = ITER_IS_NAMESPACE;
453 iter->user_data2 = name_space;
454 iter->user_data3 = GINT_TO_POINTER(i);
455 LEAVE(
"iter (ns) %s", iter_to_string(iter));
461 i = gtk_tree_path_get_indices (path)[1];
462 commodity = g_list_nth_data (list, i);
465 LEAVE(
"invalid path at commodity");
470 iter->stamp = model->
stamp;
471 iter->user_data = ITER_IS_COMMODITY;
472 iter->user_data2 = commodity;
473 iter->user_data3 = GINT_TO_POINTER(i);
474 LEAVE(
"iter (cm) %s", iter_to_string(iter));
479 gnc_tree_model_commodity_get_path (GtkTreeModel *tree_model,
485 gnc_commodity_table *ct;
486 gnc_commodity_namespace *name_space;
489 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), NULL);
490 model = GNC_TREE_MODEL_COMMODITY (tree_model);
491 g_return_val_if_fail (iter != NULL, NULL);
492 g_return_val_if_fail (iter->user_data != NULL, NULL);
493 g_return_val_if_fail (iter->user_data2 != NULL, NULL);
494 g_return_val_if_fail (iter->stamp == model->
stamp, NULL);
495 ENTER(
"model %p, iter %p (%s)", tree_model, iter, iter_to_string(iter));
498 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
499 ct = priv->commodity_table;
502 LEAVE(
"no commodity table");
506 if (iter->user_data == ITER_IS_NAMESPACE)
510 path = gtk_tree_path_new ();
511 gtk_tree_path_append_index (path, GPOINTER_TO_INT(iter->user_data3));
512 debug_path(
LEAVE, path);
521 path = gtk_tree_path_new ();
522 gtk_tree_path_append_index (path, g_list_index (ns_list, name_space));
523 gtk_tree_path_append_index (path, GPOINTER_TO_INT(iter->user_data3));
524 debug_path(
LEAVE, path);
529 gnc_tree_model_commodity_get_value (GtkTreeModel *tree_model,
535 gnc_commodity_namespace *name_space;
536 gnc_commodity *commodity;
537 gnc_quote_source *source;
539 g_return_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model));
540 g_return_if_fail (iter != NULL);
541 g_return_if_fail (iter->user_data != NULL);
542 g_return_if_fail (iter->user_data2 != NULL);
543 g_return_if_fail (iter->stamp == model->
stamp);
545 if (iter->user_data == ITER_IS_NAMESPACE)
547 name_space = (gnc_commodity_namespace *)iter->user_data2;
550 case GNC_TREE_MODEL_COMMODITY_COL_NAMESPACE:
551 g_value_init (value, G_TYPE_STRING);
555 g_value_init (value, G_TYPE_STRING);
556 g_value_set_string (value,
"");
558 case GNC_TREE_MODEL_COMMODITY_COL_FRACTION:
559 g_value_init (value, G_TYPE_INT);
560 g_value_set_int (value, 0);
562 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_FLAG:
563 g_value_init (value, G_TYPE_BOOLEAN);
564 g_value_set_boolean (value, FALSE);
566 case GNC_TREE_MODEL_COMMODITY_COL_VISIBILITY:
567 g_value_init (value, G_TYPE_BOOLEAN);
568 g_value_set_boolean (value, FALSE);
574 commodity = (gnc_commodity *)iter->user_data2;
577 case GNC_TREE_MODEL_COMMODITY_COL_MNEMONIC:
578 g_value_init (value, G_TYPE_STRING);
582 case GNC_TREE_MODEL_COMMODITY_COL_NAMESPACE:
583 g_value_init (value, G_TYPE_STRING);
586 g_value_set_string (value, NULL);
588 case GNC_TREE_MODEL_COMMODITY_COL_FULLNAME:
589 g_value_init (value, G_TYPE_STRING);
593 case GNC_TREE_MODEL_COMMODITY_COL_PRINTNAME:
594 g_value_init (value, G_TYPE_STRING);
598 case GNC_TREE_MODEL_COMMODITY_COL_CUSIP:
599 g_value_init (value, G_TYPE_STRING);
603 case GNC_TREE_MODEL_COMMODITY_COL_UNIQUE_NAME:
604 g_value_init (value, G_TYPE_STRING);
608 case GNC_TREE_MODEL_COMMODITY_COL_FRACTION:
609 g_value_init (value, G_TYPE_INT);
613 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_FLAG:
614 g_value_init (value, G_TYPE_BOOLEAN);
618 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_SOURCE:
619 g_value_init (value, G_TYPE_STRING);
628 g_value_set_static_string (value,
"");
631 case GNC_TREE_MODEL_COMMODITY_COL_QUOTE_TZ:
632 g_value_init (value, G_TYPE_STRING);
640 g_value_set_static_string (value,
"");
643 case GNC_TREE_MODEL_COMMODITY_COL_USER_SYMBOL:
644 g_value_init (value, G_TYPE_STRING);
648 case GNC_TREE_MODEL_COMMODITY_COL_VISIBILITY:
649 g_value_init (value, G_TYPE_BOOLEAN);
650 g_value_set_boolean (value, TRUE);
653 g_assert_not_reached ();
658 gnc_tree_model_commodity_iter_next (GtkTreeModel *tree_model,
663 gnc_commodity_table *ct;
664 gnc_commodity_namespace *name_space;
668 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), FALSE);
669 model = GNC_TREE_MODEL_COMMODITY (tree_model);
670 g_return_val_if_fail (iter != NULL, FALSE);
671 g_return_val_if_fail (iter->user_data != NULL, FALSE);
672 g_return_val_if_fail (iter->user_data2 != NULL, FALSE);
673 g_return_val_if_fail (iter->stamp == model->
stamp, FALSE);
675 ENTER(
"model %p, iter %p(%s)", tree_model, iter, iter_to_string(iter));
676 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
677 if (iter->user_data == ITER_IS_NAMESPACE)
679 ct = priv->commodity_table;
682 else if (iter->user_data == ITER_IS_COMMODITY)
689 LEAVE(
"unknown iter type");
693 n = GPOINTER_TO_INT(iter->user_data3) + 1;
694 iter->user_data2 = g_list_nth_data(list, n);
695 if (iter->user_data2 == NULL)
697 LEAVE(
"no next iter");
700 iter->user_data3 = GINT_TO_POINTER(n);
701 LEAVE(
"iter %p(%s)", iter, iter_to_string(iter));
707 gnc_tree_model_commodity_iter_children (GtkTreeModel *tree_model,
713 gnc_commodity_table *ct;
714 gnc_commodity_namespace *name_space;
717 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), FALSE);
719 ENTER(
"model %p, iter %p, parent %p (%s)",
720 tree_model, iter, parent, iter_to_string(parent));
721 model = GNC_TREE_MODEL_COMMODITY (tree_model);
722 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
726 ct = priv->commodity_table;
730 LEAVE(
"no namespaces");
734 iter->stamp = model->
stamp;
735 iter->user_data = ITER_IS_NAMESPACE;
736 iter->user_data2 = g_list_nth_data(list, 0);
737 iter->user_data3 = GINT_TO_POINTER(0);
738 LEAVE(
"ns iter %p (%s)", iter, iter_to_string(iter));
742 if (parent->user_data == ITER_IS_NAMESPACE)
744 name_space = (gnc_commodity_namespace *)parent->user_data2;
748 LEAVE(
"no commodities");
752 iter->stamp = model->
stamp;
753 iter->user_data = ITER_IS_COMMODITY;
754 iter->user_data2 = g_list_nth_data(list, 0);
755 iter->user_data3 = GINT_TO_POINTER(0);
756 LEAVE(
"cm iter %p (%s)", iter, iter_to_string(iter));
765 gnc_tree_model_commodity_iter_has_child (GtkTreeModel *tree_model,
768 gnc_commodity_namespace *name_space;
771 g_return_val_if_fail (iter != NULL, FALSE);
772 ENTER(
"model %p, iter %p (%s)", tree_model,
773 iter, iter_to_string(iter));
775 if (iter->user_data != ITER_IS_NAMESPACE)
777 LEAVE(
"no children (not ns)");
781 name_space = (gnc_commodity_namespace *)iter->user_data2;
783 LEAVE(
"%s children", list ?
"has" :
"no");
788 gnc_tree_model_commodity_iter_n_children (GtkTreeModel *tree_model,
793 gnc_commodity_table *ct;
794 gnc_commodity_namespace *name_space;
797 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), -1);
799 ENTER(
"model %p, iter %p (%s)", tree_model, iter, iter_to_string(iter));
800 model = GNC_TREE_MODEL_COMMODITY (tree_model);
801 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
805 ct = priv->commodity_table;
807 LEAVE(
"ns list length %d", g_list_length(list));
808 return g_list_length (list);
811 if (iter->user_data == ITER_IS_NAMESPACE)
813 name_space = (gnc_commodity_namespace *)iter->user_data2;
815 LEAVE(
"cm list length %d", g_list_length(list));
816 return g_list_length (list);
824 gnc_tree_model_commodity_iter_nth_child (GtkTreeModel *tree_model,
831 gnc_commodity_table *ct;
832 gnc_commodity_namespace *name_space;
835 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), FALSE);
836 g_return_val_if_fail (iter != NULL, FALSE);
838 ENTER(
"model %p, iter %p, parent %p (%s)",
839 tree_model, iter, parent, iter_to_string(parent));
840 model = GNC_TREE_MODEL_COMMODITY (tree_model);
841 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
845 ct = priv->commodity_table;
848 iter->stamp = model->
stamp;
849 iter->user_data = ITER_IS_NAMESPACE;
850 iter->user_data2 = g_list_nth_data(list, n);
851 iter->user_data3 = GINT_TO_POINTER(n);
852 LEAVE(
"ns iter %p (%s)", iter, iter_to_string(iter));
853 return iter->user_data2 != NULL;
856 if (parent->user_data == ITER_IS_NAMESPACE)
858 name_space = (gnc_commodity_namespace *)parent->user_data2;
861 iter->stamp = model->
stamp;
862 iter->user_data = ITER_IS_COMMODITY;
863 iter->user_data2 = g_list_nth_data(list, n);
864 iter->user_data3 = GINT_TO_POINTER(n);
865 LEAVE(
"cm iter %p (%s)", iter, iter_to_string(iter));
866 return iter->user_data2 != NULL;
875 gnc_tree_model_commodity_iter_parent (GtkTreeModel *tree_model,
881 gnc_commodity_table *ct;
882 gnc_commodity_namespace *name_space;
885 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (tree_model), FALSE);
886 g_return_val_if_fail (iter != NULL, FALSE);
887 g_return_val_if_fail (child != NULL, FALSE);
889 ENTER(
"model %p, iter %p, child %p (%s)",
890 tree_model, iter, child, iter_to_string(child));
891 model = GNC_TREE_MODEL_COMMODITY (tree_model);
892 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
894 if (child->user_data == ITER_IS_NAMESPACE)
896 LEAVE(
"ns has no parent");
900 ct = priv->commodity_table;
904 iter->stamp = model->
stamp;
905 iter->user_data = ITER_IS_NAMESPACE;
906 iter->user_data2 = name_space;
907 iter->user_data3 = GINT_TO_POINTER(g_list_index(list, name_space));
908 LEAVE(
"ns iter %p (%s)", iter, iter_to_string(iter));
923 gnc_commodity *commodity,
926 gnc_commodity_namespace *name_space;
930 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), FALSE);
931 g_return_val_if_fail ((commodity != NULL), FALSE);
932 g_return_val_if_fail ((iter != NULL), FALSE);
934 ENTER(
"model %p, commodity %p, iter %p", model, commodity, iter);
937 if (name_space == NULL)
939 LEAVE(
"no namespace");
950 n = g_list_index(list, commodity);
953 LEAVE(
"not in list");
957 iter->stamp = model->
stamp;
958 iter->user_data = ITER_IS_COMMODITY;
959 iter->user_data2 = commodity;
960 iter->user_data3 = GINT_TO_POINTER(n);
961 LEAVE(
"iter %s", iter_to_string(iter));
972 gnc_commodity *commodity)
974 GtkTreeIter tree_iter;
975 GtkTreePath *tree_path;
977 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), NULL);
978 g_return_val_if_fail (commodity != NULL, NULL);
979 ENTER(
"model %p, commodity %p", model, commodity);
987 tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL(model), &tree_iter);
990 gchar *path_string = gtk_tree_path_to_string(tree_path);
991 LEAVE(
"path (2) %s", path_string);
1008 gnc_commodity_namespace *name_space,
1015 g_return_val_if_fail (GNC_IS_TREE_MODEL_COMMODITY (model), FALSE);
1016 g_return_val_if_fail ((name_space != NULL), FALSE);
1017 g_return_val_if_fail ((iter != NULL), FALSE);
1019 ENTER(
"model %p, namespace %p, iter %p", model, name_space, iter);
1021 priv = GNC_TREE_MODEL_COMMODITY_GET_PRIVATE(model);
1029 n = g_list_index(list, name_space);
1036 iter->stamp = model->
stamp;
1037 iter->user_data = ITER_IS_NAMESPACE;
1038 iter->user_data2 = name_space;
1039 iter->user_data3 = GINT_TO_POINTER(n);
1040 LEAVE(
"iter %s", iter_to_string(iter));
1049 typedef struct _remove_data
1055 static GSList *pending_removals = NULL;
1073 GtkTreeModel *tree_model;
1074 GtkTreeIter tmp_iter;
1076 ENTER(
"model %p, iter (%p)%s", model, iter, iter_to_string(iter));
1086 while (model->
stamp == 0);
1087 iter->stamp = model->
stamp;
1090 tree_model = GTK_TREE_MODEL(model);
1091 path = gnc_tree_model_commodity_get_path(tree_model, iter);
1092 gtk_tree_model_row_inserted(tree_model, path, iter);
1099 if (gtk_tree_path_up(path) &&
1100 gtk_tree_path_get_depth(path) > 0 &&
1101 gtk_tree_model_get_iter(tree_model, &tmp_iter, path))
1104 gtk_tree_model_row_changed(tree_model, path, &tmp_iter);
1107 if (gtk_tree_model_iter_n_children(tree_model, &tmp_iter) == 1)
1108 gtk_tree_model_row_has_child_toggled(tree_model, path, &tmp_iter);
1111 while (gtk_tree_path_up(path) &&
1112 gtk_tree_path_get_depth(path) > 0 &&
1113 gtk_tree_model_get_iter(tree_model, &tmp_iter, path))
1115 gtk_tree_model_row_changed(tree_model, path, &tmp_iter);
1118 gtk_tree_path_free(path);
1124 if (gnc_tree_model_commodity_iter_has_child(tree_model, iter))
1126 path = gnc_tree_model_commodity_get_path(tree_model, iter);
1127 gtk_tree_model_row_has_child_toggled(tree_model, path, iter);
1128 gtk_tree_path_free(path);
1149 GtkTreeModel *tree_model;
1152 g_return_if_fail(GNC_IS_TREE_MODEL_COMMODITY(model));
1153 g_return_if_fail(path);
1155 debug_path(
ENTER, path);
1157 tree_model = GTK_TREE_MODEL(model);
1167 while (model->
stamp == 0);
1170 gtk_tree_model_row_deleted(tree_model, path);
1173 if (gtk_tree_path_up(path) &&
1174 gtk_tree_path_get_depth(path) > 0 &&
1175 gtk_tree_model_get_iter(tree_model, &iter, path) &&
1176 !gtk_tree_model_iter_has_child(tree_model, &iter))
1178 DEBUG(
"parent toggled, iter %s", iter_to_string(&iter));
1179 gtk_tree_model_row_has_child_toggled(tree_model, path, &iter);
1203 gnc_tree_model_commodity_do_deletions (gpointer unused)
1208 while (pending_removals)
1211 pending_removals = g_slist_delete_link(pending_removals, pending_removals);
1215 debug_path(
DEBUG, data->path);
1218 gnc_tree_model_commodity_row_delete(data->model, data->path);
1220 gtk_tree_path_free(data->path);
1263 gnc_tree_model_commodity_event_handler (QofInstance *entity,
1266 gpointer event_data)
1277 g_return_if_fail(GNC_IS_TREE_MODEL_COMMODITY(model));
1279 ENTER(
"entity %p, event %d, model %p, event data %p",
1280 entity, event_type, user_data, event_data);
1283 if (pending_removals)
1284 gnc_tree_model_commodity_do_deletions(NULL);
1287 if (GNC_IS_COMMODITY(entity))
1289 gnc_commodity *commodity;
1291 commodity = GNC_COMMODITY(entity);
1293 if (event_type != QOF_EVENT_DESTROY)
1302 else if (GNC_IS_COMMODITY_NAMESPACE(entity))
1304 gnc_commodity_namespace *name_space;
1306 name_space = GNC_COMMODITY_NAMESPACE(entity);
1308 if (event_type != QOF_EVENT_DESTROY)
1327 DEBUG(
"add %s", name);
1328 gnc_tree_model_commodity_row_add (model, &iter);
1331 case QOF_EVENT_REMOVE:
1333 DEBUG(
"remove %s", name);
1334 path = gtk_tree_model_get_path (GTK_TREE_MODEL(model), &iter);
1337 LEAVE(
"not in model");
1342 data->model = model;
1344 pending_removals = g_slist_append (pending_removals, data);
1345 g_idle_add_full(G_PRIORITY_HIGH_IDLE,
1346 gnc_tree_model_commodity_do_deletions, NULL, NULL);
1351 case QOF_EVENT_MODIFY:
1352 DEBUG(
"change %s", name);
1353 path = gtk_tree_model_get_path (GTK_TREE_MODEL(model), &iter);
1356 LEAVE(
"not in model");
1359 gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &iter);
1360 gtk_tree_path_free(path);
1365 LEAVE(
"ignored event for %s", name);
GtkTreeModel implementation for gnucash commodities.
const char * gnc_commodity_get_cusip(const gnc_commodity *cm)
Retrieve the 'exchange code' for the specified commodity.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
gnc_commodity * gnc_tree_model_commodity_get_commodity(GncTreeModelCommodity *model, GtkTreeIter *iter)
Convert a model/iter pair to a gnucash commodity.
gboolean gnc_tree_model_commodity_get_iter_from_commodity(GncTreeModelCommodity *model, gnc_commodity *commodity, GtkTreeIter *iter)
Convert a commodity pointer into a GtkTreeIter.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
Get a list of all known objects of a specified type.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
GtkTreePath * gnc_tree_model_commodity_get_path_from_commodity(GncTreeModelCommodity *model, gnc_commodity *commodity)
Convert a commodity pointer into a GtkTreePath.
const char * gnc_commodity_namespace_get_gui_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure in a form suitable to present to the user...
utility functions for the GnuCash UI
gboolean gnc_commodity_get_quote_flag(const gnc_commodity *cm)
Retrieve the automatic price quote flag for the specified commodity.
const char * gnc_commodity_get_quote_tz(const gnc_commodity *cm)
Retrieve the automatic price quote timezone for the specified commodity.
#define DEBUG(format, args...)
Print a debugging message.
gnc_commodity_namespace * gnc_tree_model_commodity_get_namespace(GncTreeModelCommodity *model, GtkTreeIter *iter)
Convert a model/iter pair to a gnucash commodity namespace.
The instance private data for a commodity database tree model.
int stamp
The state of the model.
#define ENTER(format, args...)
Print a function entry debugging message.
GList * gnc_commodity_namespace_get_commodity_list(const gnc_commodity_namespace *name_space)
Return a list of all commodity data structures in the specified namespace.
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure.
gint qof_event_register_handler(QofEventHandler handler, gpointer user_data)
Register a handler for events.
gint QofEventId
Define the type of events allowed.
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
GtkTreeModel * gnc_tree_model_commodity_new(QofBook *book, gnc_commodity_table *ct)
Create a new GtkTreeModel for manipulating gnucash commodities.
gboolean gnc_tree_model_commodity_get_iter_from_namespace(GncTreeModelCommodity *model, gnc_commodity_namespace *name_space, GtkTreeIter *iter)
Convert a commodity namespace pointer into a GtkTreeIter.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
const char * gnc_commodity_get_nice_symbol(const gnc_commodity *cm)
Retrieve a symbol for the specified commodity, suitable for display to the user.
The class data structure for a commodity tree model.
All type declarations for the whole Gnucash engine.
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
gboolean gnc_tree_model_commodity_iter_is_commodity(GncTreeModelCommodity *model, GtkTreeIter *iter)
Determine whether or not the specified GtkTreeIter points to a commodity.
gnc_quote_source * gnc_commodity_get_quote_source(const gnc_commodity *cm)
Retrieve the automatic price quote source for the specified commodity.
gboolean gnc_tree_model_commodity_iter_is_namespace(GncTreeModelCommodity *model, GtkTreeIter *iter)
Determine whether or not the specified GtkTreeIter points to a commodity namespace.
gnc_commodity_namespace * gnc_commodity_get_namespace_ds(const gnc_commodity *cm)
Retrieve the namespace data structure for the specified commodity.
#define LEAVE(format, args...)
Print a function exit debugging message.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
const char * gnc_quote_source_get_internal_name(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the internal name of this quote source.
GList * gnc_commodity_table_get_namespaces_list(const gnc_commodity_table *table)
Return a list of all namespace data structures in the commodity table.
The instance data structure for a commodity tree model.