29 #include <glib/gi18n.h>
33 #include "gnc-component-manager.h"
41 #include "gnc-ui-balances.h"
44 #define TREE_MODEL_ACCOUNT_CM_CLASS "tree-model-account"
52 static void gnc_tree_model_account_finalize (GObject *
object);
53 static void gnc_tree_model_account_dispose (GObject *
object);
56 static void gnc_tree_model_account_tree_model_init (GtkTreeModelIface *iface);
57 static GtkTreeModelFlags gnc_tree_model_account_get_flags (GtkTreeModel *tree_model);
58 static int gnc_tree_model_account_get_n_columns (GtkTreeModel *tree_model);
59 static GType gnc_tree_model_account_get_column_type (GtkTreeModel *tree_model,
61 static gboolean gnc_tree_model_account_get_iter (GtkTreeModel *tree_model,
64 static GtkTreePath *gnc_tree_model_account_get_path (GtkTreeModel *tree_model,
66 static void gnc_tree_model_account_get_value (GtkTreeModel *tree_model,
70 static gboolean gnc_tree_model_account_iter_next (GtkTreeModel *tree_model,
72 static gboolean gnc_tree_model_account_iter_children (GtkTreeModel *tree_model,
75 static gboolean gnc_tree_model_account_iter_has_child (GtkTreeModel *tree_model,
77 static int gnc_tree_model_account_iter_n_children (GtkTreeModel *tree_model,
79 static gboolean gnc_tree_model_account_iter_nth_child (GtkTreeModel *tree_model,
83 static gboolean gnc_tree_model_account_iter_parent (GtkTreeModel *tree_model,
88 static void gnc_tree_model_account_event_handler (
QofInstance *entity,
98 gint event_handler_id;
99 const gchar *negative_color;
102 #define GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(o) \
103 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_MODEL_ACCOUNT, GncTreeModelAccountPrivate))
117 gnc_tree_model_account_update_color (gpointer gsettings, gchar *key, gpointer user_data)
123 g_return_if_fail(GNC_IS_TREE_MODEL_ACCOUNT(user_data));
125 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
127 priv->negative_color = use_red ?
"red" : NULL;
134 static GtkObjectClass *parent_class = NULL;
139 static GType gnc_tree_model_account_type = 0;
141 if (gnc_tree_model_account_type == 0)
143 static const GTypeInfo our_info =
148 (GClassInitFunc) gnc_tree_model_account_class_init,
153 (GInstanceInitFunc) gnc_tree_model_account_init
156 static const GInterfaceInfo tree_model_info =
158 (GInterfaceInitFunc) gnc_tree_model_account_tree_model_init,
163 gnc_tree_model_account_type = g_type_register_static (GNC_TYPE_TREE_MODEL,
164 GNC_TREE_MODEL_ACCOUNT_NAME,
167 g_type_add_interface_static (gnc_tree_model_account_type,
172 return gnc_tree_model_account_type;
178 GObjectClass *o_class;
180 parent_class = g_type_class_peek_parent (klass);
182 o_class = G_OBJECT_CLASS (klass);
185 o_class->finalize = gnc_tree_model_account_finalize;
186 o_class->dispose = gnc_tree_model_account_dispose;
197 ENTER(
"model %p", model);
198 while (model->
stamp == 0)
200 model->
stamp = g_random_int ();
205 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
208 priv->negative_color = red ?
"red" : NULL;
211 gnc_tree_model_account_update_color,
218 gnc_tree_model_account_finalize (GObject *
object)
223 g_return_if_fail (
object != NULL);
224 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (
object));
226 ENTER(
"model %p",
object);
228 model = GNC_TREE_MODEL_ACCOUNT (
object);
229 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
233 if (G_OBJECT_CLASS (parent_class)->finalize)
234 G_OBJECT_CLASS(parent_class)->finalize (
object);
239 gnc_tree_model_account_dispose (GObject *
object)
244 g_return_if_fail (
object != NULL);
245 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (
object));
247 ENTER(
"model %p",
object);
249 model = GNC_TREE_MODEL_ACCOUNT (
object);
250 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
252 if (priv->event_handler_id)
255 priv->event_handler_id = 0;
259 gnc_tree_model_account_update_color,
262 if (G_OBJECT_CLASS (parent_class)->dispose)
263 G_OBJECT_CLASS (parent_class)->dispose (
object);
279 ENTER(
"root %p", root);
281 for ( ; item; item = g_list_next(item))
284 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
285 if (priv->root == root)
287 g_object_ref(G_OBJECT(model));
288 LEAVE(
"returning existing model %p", model);
289 return GTK_TREE_MODEL(model);
293 model = g_object_new (GNC_TYPE_TREE_MODEL_ACCOUNT,
296 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
297 priv->book = gnc_get_current_book();
303 LEAVE(
"model %p", model);
304 return GTK_TREE_MODEL (model);
312 #define ITER_STRING_LEN 128
315 iter_to_string (GtkTreeIter *iter)
317 #ifdef G_THREADS_ENABLED
318 #ifndef HAVE_GLIB_2_32
319 static GStaticPrivate gtmits_buffer_key = G_STATIC_PRIVATE_INIT;
322 string = g_static_private_get (>mits_buffer_key);
325 string = g_malloc(ITER_STRING_LEN + 1);
326 g_static_private_set (>mits_buffer_key,
string, g_free);
329 static GPrivate gtmits_buffer_key = G_PRIVATE_INIT(g_free);
332 string = g_private_get (>mits_buffer_key);
335 string = g_malloc(ITER_STRING_LEN + 1);
336 g_private_set (>mits_buffer_key,
string);
340 static char string[ITER_STRING_LEN + 1];
344 snprintf(
string, ITER_STRING_LEN,
345 "[stamp:%x data:%p (%s), %p, %d]",
346 iter->stamp, iter->user_data,
348 iter->user_data2, GPOINTER_TO_INT(iter->user_data3));
350 strcpy(
string,
"(null)");
360 gnc_tree_model_account_tree_model_init (GtkTreeModelIface *iface)
362 iface->get_flags = gnc_tree_model_account_get_flags;
363 iface->get_n_columns = gnc_tree_model_account_get_n_columns;
364 iface->get_column_type = gnc_tree_model_account_get_column_type;
365 iface->get_iter = gnc_tree_model_account_get_iter;
366 iface->get_path = gnc_tree_model_account_get_path;
367 iface->get_value = gnc_tree_model_account_get_value;
368 iface->iter_next = gnc_tree_model_account_iter_next;
369 iface->iter_children = gnc_tree_model_account_iter_children;
370 iface->iter_has_child = gnc_tree_model_account_iter_has_child;
371 iface->iter_n_children = gnc_tree_model_account_iter_n_children;
372 iface->iter_nth_child = gnc_tree_model_account_iter_nth_child;
373 iface->iter_parent = gnc_tree_model_account_iter_parent;
376 static GtkTreeModelFlags
377 gnc_tree_model_account_get_flags (GtkTreeModel *tree_model)
383 gnc_tree_model_account_get_n_columns (GtkTreeModel *tree_model)
385 g_return_val_if_fail(GNC_IS_TREE_MODEL_ACCOUNT(tree_model), -1);
387 return GNC_TREE_MODEL_ACCOUNT_NUM_COLUMNS;
391 gnc_tree_model_account_get_column_type (GtkTreeModel *tree_model,
394 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (tree_model), G_TYPE_INVALID);
395 g_return_val_if_fail ((index < GNC_TREE_MODEL_ACCOUNT_NUM_COLUMNS) && (index >= 0), G_TYPE_INVALID);
399 case GNC_TREE_MODEL_ACCOUNT_COL_NAME:
400 case GNC_TREE_MODEL_ACCOUNT_COL_TYPE:
401 case GNC_TREE_MODEL_ACCOUNT_COL_COMMODITY:
402 case GNC_TREE_MODEL_ACCOUNT_COL_CODE:
403 case GNC_TREE_MODEL_ACCOUNT_COL_DESCRIPTION:
404 case GNC_TREE_MODEL_ACCOUNT_COL_PRESENT:
405 case GNC_TREE_MODEL_ACCOUNT_COL_PRESENT_REPORT:
406 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE:
407 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_REPORT:
408 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_PERIOD:
409 case GNC_TREE_MODEL_ACCOUNT_COL_CLEARED:
410 case GNC_TREE_MODEL_ACCOUNT_COL_CLEARED_REPORT:
411 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED:
412 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_REPORT:
413 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_DATE:
414 case GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN:
415 case GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN_REPORT:
416 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL:
417 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_REPORT:
418 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD:
419 case GNC_TREE_MODEL_ACCOUNT_COL_NOTES:
420 case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO:
421 case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
422 case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
424 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT:
425 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_ACCOUNT:
426 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE:
427 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE_PERIOD:
428 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_CLEARED:
429 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_RECONCILED:
430 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_FUTURE_MIN:
431 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL:
432 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL_PERIOD:
433 return G_TYPE_STRING;
435 case GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER:
436 return G_TYPE_BOOLEAN;
439 g_assert_not_reached ();
440 return G_TYPE_INVALID;
445 gnc_tree_model_account_get_iter (GtkTreeModel *tree_model,
454 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (tree_model), FALSE);
457 gchar *path_string = gtk_tree_path_to_string(path);
458 ENTER(
"model %p, iter %p, path %s", tree_model, iter, path_string);
462 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
463 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
465 if (gtk_tree_path_get_depth (path) <= 0)
471 indices = gtk_tree_path_get_indices (path);
474 LEAVE(
"bad root index");
479 account = priv->root;
480 for (i = 1; i < gtk_tree_path_get_depth (path); i++)
492 iter->stamp = model->
stamp;
493 iter->user_data = account;
494 iter->user_data2 = parent;
495 iter->user_data3 = GINT_TO_POINTER (indices[i - 1]);
497 LEAVE(
"iter %s", iter_to_string(iter));
502 gnc_tree_model_account_get_path (GtkTreeModel *tree_model,
511 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (model), NULL);
512 g_return_val_if_fail (iter != NULL, NULL);
513 g_return_val_if_fail (iter->user_data != NULL, NULL);
514 g_return_val_if_fail (iter->stamp == model->
stamp, NULL);
516 ENTER(
"model %p, iter %s", model, iter_to_string(iter));
518 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
519 if (priv->root == NULL)
525 account = (
Account *) iter->user_data;
526 parent = (
Account *) iter->user_data2;
528 path = gtk_tree_path_new ();
534 gtk_tree_path_free (path);
538 gtk_tree_path_prepend_index (path, i);
544 gtk_tree_path_prepend_index (path, 0);
547 gchar *path_string = gtk_tree_path_to_string(path);
548 LEAVE(
"path (4) %s", path_string);
561 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
563 g_value_set_static_string (value, priv->negative_color);
565 g_value_set_static_string (value, NULL);
581 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
582 if (acct == priv->root)
585 t1 = gnc_accounting_period_fiscal_start();
586 t2 = gnc_accounting_period_fiscal_end();
591 b3 = xaccAccountGetBalanceChangeForPeriod(acct, t1, t2, recurse);
592 if (gnc_reverse_balance (acct))
598 return g_strdup(xaccPrintAmount(b3, gnc_account_print_info(acct, TRUE)));
602 gnc_tree_model_account_get_value (GtkTreeModel *tree_model,
614 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (model));
615 g_return_if_fail (iter != NULL);
616 g_return_if_fail (iter->user_data != NULL);
617 g_return_if_fail (iter->stamp == model->
stamp);
619 ENTER(
"model %p, iter %s, col %d", tree_model,
620 iter_to_string(iter), column);
622 account = (
Account *) iter->user_data;
623 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
627 case GNC_TREE_MODEL_ACCOUNT_COL_NAME:
628 g_value_init (value, G_TYPE_STRING);
629 if (account == priv->root)
630 g_value_set_string (value, _(
"New top level account"));
634 case GNC_TREE_MODEL_ACCOUNT_COL_TYPE:
635 g_value_init (value, G_TYPE_STRING);
636 g_value_set_string (value,
639 case GNC_TREE_MODEL_ACCOUNT_COL_CODE:
640 g_value_init (value, G_TYPE_STRING);
643 case GNC_TREE_MODEL_ACCOUNT_COL_COMMODITY:
644 g_value_init (value, G_TYPE_STRING);
645 g_value_set_string (value,
648 case GNC_TREE_MODEL_ACCOUNT_COL_DESCRIPTION:
649 g_value_init (value, G_TYPE_STRING);
653 case GNC_TREE_MODEL_ACCOUNT_COL_PRESENT:
654 g_value_init (value, G_TYPE_STRING);
655 string = gnc_ui_account_get_print_balance(xaccAccountGetPresentBalanceInCurrency,
656 account, TRUE, &negative);
657 g_value_take_string (value,
string);
659 case GNC_TREE_MODEL_ACCOUNT_COL_PRESENT_REPORT:
660 g_value_init (value, G_TYPE_STRING);
661 string = gnc_ui_account_get_print_report_balance(xaccAccountGetPresentBalanceInCurrency,
662 account, TRUE, &negative);
663 g_value_take_string (value,
string);
665 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT:
666 g_value_init (value, G_TYPE_STRING);
667 string = gnc_ui_account_get_print_balance(xaccAccountGetPresentBalanceInCurrency,
668 account, TRUE, &negative);
669 gnc_tree_model_account_set_color(model, negative, value);
673 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE:
674 g_value_init (value, G_TYPE_STRING);
675 string = gnc_ui_account_get_print_balance(xaccAccountGetBalanceInCurrency,
676 account, TRUE, &negative);
677 g_value_take_string (value,
string);
679 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_REPORT:
680 g_value_init (value, G_TYPE_STRING);
681 string = gnc_ui_account_get_print_report_balance(xaccAccountGetBalanceInCurrency,
682 account, TRUE, &negative);
683 g_value_take_string (value,
string);
685 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE:
686 g_value_init (value, G_TYPE_STRING);
687 string = gnc_ui_account_get_print_balance(xaccAccountGetBalanceInCurrency,
688 account, TRUE, &negative);
689 gnc_tree_model_account_set_color(model, negative, value);
692 case GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_PERIOD:
693 g_value_init (value, G_TYPE_STRING);
694 string = gnc_tree_model_account_compute_period_balance(model, account, FALSE, &negative);
695 g_value_take_string (value,
string);
697 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE_PERIOD:
698 g_value_init (value, G_TYPE_STRING);
699 string = gnc_tree_model_account_compute_period_balance(model, account, FALSE, &negative);
700 gnc_tree_model_account_set_color(model, negative, value);
704 case GNC_TREE_MODEL_ACCOUNT_COL_CLEARED:
705 g_value_init (value, G_TYPE_STRING);
706 string = gnc_ui_account_get_print_balance(xaccAccountGetClearedBalanceInCurrency,
707 account, TRUE, &negative);
708 g_value_take_string (value,
string);
710 case GNC_TREE_MODEL_ACCOUNT_COL_CLEARED_REPORT:
711 g_value_init (value, G_TYPE_STRING);
712 string = gnc_ui_account_get_print_report_balance(xaccAccountGetClearedBalanceInCurrency,
713 account, TRUE, &negative);
714 g_value_take_string (value,
string);
716 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_CLEARED:
717 g_value_init (value, G_TYPE_STRING);
718 string = gnc_ui_account_get_print_balance(xaccAccountGetClearedBalanceInCurrency,
719 account, TRUE, &negative);
720 gnc_tree_model_account_set_color(model, negative, value);
724 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED:
725 g_value_init (value, G_TYPE_STRING);
726 string = gnc_ui_account_get_print_balance(xaccAccountGetReconciledBalanceInCurrency,
727 account, TRUE, &negative);
728 g_value_take_string (value,
string);
730 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_REPORT:
731 g_value_init (value, G_TYPE_STRING);
732 string = gnc_ui_account_get_print_report_balance(xaccAccountGetReconciledBalanceInCurrency,
733 account, TRUE, &negative);
734 g_value_take_string (value,
string);
736 case GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_DATE:
737 g_value_init (value, G_TYPE_STRING);
744 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_RECONCILED:
745 g_value_init (value, G_TYPE_STRING);
746 string = gnc_ui_account_get_print_balance(xaccAccountGetReconciledBalanceInCurrency,
747 account, TRUE, &negative);
748 gnc_tree_model_account_set_color(model, negative, value);
752 case GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN:
753 g_value_init (value, G_TYPE_STRING);
754 string = gnc_ui_account_get_print_balance(xaccAccountGetProjectedMinimumBalanceInCurrency,
755 account, TRUE, &negative);
756 g_value_take_string (value,
string);
758 case GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN_REPORT:
759 g_value_init (value, G_TYPE_STRING);
760 string = gnc_ui_account_get_print_report_balance(xaccAccountGetProjectedMinimumBalanceInCurrency,
761 account, TRUE, &negative);
762 g_value_take_string (value,
string);
764 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_FUTURE_MIN:
765 g_value_init (value, G_TYPE_STRING);
766 string = gnc_ui_account_get_print_balance(xaccAccountGetProjectedMinimumBalanceInCurrency,
767 account, TRUE, &negative);
768 gnc_tree_model_account_set_color(model, negative, value);
772 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL:
773 g_value_init (value, G_TYPE_STRING);
774 string = gnc_ui_account_get_print_balance(xaccAccountGetBalanceInCurrency,
775 account, TRUE, &negative);
776 g_value_take_string (value,
string);
778 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_REPORT:
779 g_value_init (value, G_TYPE_STRING);
780 string = gnc_ui_account_get_print_report_balance(xaccAccountGetBalanceInCurrency,
781 account, TRUE, &negative);
782 g_value_take_string (value,
string);
784 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL:
785 g_value_init (value, G_TYPE_STRING);
786 string = gnc_ui_account_get_print_balance(xaccAccountGetBalanceInCurrency,
787 account, TRUE, &negative);
788 gnc_tree_model_account_set_color(model, negative, value);
791 case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD:
792 g_value_init (value, G_TYPE_STRING);
793 string = gnc_tree_model_account_compute_period_balance(model, account, TRUE, &negative);
794 g_value_take_string (value,
string);
796 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL_PERIOD:
797 g_value_init (value, G_TYPE_STRING);
798 string = gnc_tree_model_account_compute_period_balance(model, account, TRUE, &negative);
799 gnc_tree_model_account_set_color(model, negative, value);
803 case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_ACCOUNT:
804 g_value_init (value, G_TYPE_STRING);
808 case GNC_TREE_MODEL_ACCOUNT_COL_NOTES:
809 g_value_init (value, G_TYPE_STRING);
813 case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO:
814 g_value_init (value, G_TYPE_STRING);
815 g_value_take_string (value, gnc_ui_account_get_tax_info_string (account));
818 case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
819 g_value_init (value, G_TYPE_STRING);
820 g_value_take_string (value, gnc_ui_account_get_tax_info_sub_acct_string (account));
823 case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
824 g_value_init (value, G_TYPE_STRING);
828 case GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER:
829 g_value_init (value, G_TYPE_BOOLEAN);
834 g_assert_not_reached ();
841 gnc_tree_model_account_iter_next (GtkTreeModel *tree_model,
848 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (model), FALSE);
849 g_return_val_if_fail (iter != NULL, FALSE);
850 g_return_val_if_fail (iter->user_data != NULL, FALSE);
851 g_return_val_if_fail (iter->stamp == model->
stamp, FALSE);
853 ENTER(
"model %p, iter %s", tree_model, iter_to_string(iter));
855 parent = (
Account *) iter->user_data2;
864 i = GPOINTER_TO_INT (iter->user_data3);
873 iter->user_data = account;
874 iter->user_data2 = parent;
875 iter->user_data3 = GINT_TO_POINTER (i + 1);
877 LEAVE(
"iter %s", iter_to_string(iter));
882 gnc_tree_model_account_iter_children (GtkTreeModel *tree_model,
884 GtkTreeIter *parent_iter)
890 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (tree_model), FALSE);
891 ENTER(
"model %p, iter %p (to be filed in), parent %s",
892 tree_model, iter, (parent_iter ? iter_to_string(parent_iter) :
"(null)"));
894 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
895 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
897 if (priv->root == NULL)
900 LEAVE(
"failed (no root)");
907 iter->user_data = priv->root;
908 iter->user_data2 = NULL;
909 iter->user_data3 = GINT_TO_POINTER (0);
910 iter->stamp = model->
stamp;
911 LEAVE(
"iter (2) %s", iter_to_string(iter));
919 parent = (
Account *)parent_iter->user_data;
925 LEAVE(
"failed (child account is null)");
929 iter->user_data = account;
930 iter->user_data2 = parent;
931 iter->user_data3 = GINT_TO_POINTER (0);
932 iter->stamp = model->
stamp;
933 LEAVE(
"iter (3) %s", iter_to_string(iter));
938 gnc_tree_model_account_iter_has_child (GtkTreeModel *tree_model,
944 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (tree_model), FALSE);
946 ENTER(
"model %p, iter %s", tree_model, iter_to_string(iter));
948 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
954 account = (
Account *) iter->user_data;
966 gnc_tree_model_account_iter_n_children (GtkTreeModel *tree_model,
972 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (tree_model), FALSE);
973 ENTER(
"model %p, iter %s", tree_model, iter_to_string(iter));
975 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
990 LEAVE(
"count is %d", num);
995 gnc_tree_model_account_iter_nth_child (GtkTreeModel *tree_model,
997 GtkTreeIter *parent_iter,
1006 gchar *parent_string;
1007 parent_string = g_strdup(iter_to_string(parent_iter));
1008 ENTER(
"model %p, iter %s, parent_iter %s, n %d",
1009 tree_model, iter_to_string(iter),
1011 g_free(parent_string);
1015 ENTER(
"model %p, iter %s, parent_iter (null), n %d",
1016 tree_model, iter_to_string(iter), n);
1020 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
1021 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
1028 LEAVE(
"bad root index");
1032 iter->user_data = priv->root;
1033 iter->user_data2 = NULL;
1034 iter->user_data3 = GINT_TO_POINTER (0);
1035 iter->stamp = model->
stamp;
1036 LEAVE(
"root %s", iter_to_string(iter));
1043 parent = (
Account *)parent_iter->user_data;
1045 if (account == NULL)
1048 LEAVE(
"failed (2)");
1052 iter->user_data = account;
1053 iter->user_data2 = parent;
1054 iter->user_data3 = GINT_TO_POINTER (n);
1055 iter->stamp = model->
stamp;
1056 LEAVE(
"iter (2) %s", iter_to_string(iter));
1061 gnc_tree_model_account_iter_parent (GtkTreeModel *tree_model,
1071 gchar *child_string;
1073 child_string = g_strdup(iter_to_string(child));
1074 ENTER(
"model %p, iter %s, child %s",
1075 tree_model, iter_to_string(iter),
1077 g_free(child_string);
1081 ENTER(
"model %p, iter %s, child (null)",
1082 tree_model, iter_to_string(iter));
1086 model = GNC_TREE_MODEL_ACCOUNT (tree_model);
1092 account = (
Account *) child->user_data;
1094 if (account == NULL)
1098 LEAVE(
"failed (1)");
1112 iter->user_data = account;
1113 iter->user_data2 = parent;
1114 iter->user_data3 = GINT_TO_POINTER (i);
1115 iter->stamp = model->
stamp;
1116 LEAVE(
"iter (2) %s", iter_to_string(iter));
1133 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (model), NULL);
1134 g_return_val_if_fail (iter != NULL, NULL);
1135 g_return_val_if_fail (iter->user_data != NULL, NULL);
1136 g_return_val_if_fail (iter->stamp == model->
stamp, NULL);
1138 return (
Account *) iter->user_data;
1155 ENTER(
"model %p, account %p, iter %p", model, account, iter);
1160 iter->user_data = account;
1161 iter->stamp = model->
stamp;
1163 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
1164 if (account == priv->root)
1166 iter->user_data2 = NULL;
1167 iter->user_data3 = GINT_TO_POINTER (0);
1168 LEAVE(
"Matched root");
1174 LEAVE(
"Root doesn't match");
1180 iter->user_data2 = parent;
1181 iter->user_data3 = GINT_TO_POINTER (i);
1182 LEAVE(
"iter %s", iter_to_string(iter));
1195 GtkTreeIter tree_iter;
1196 GtkTreePath *tree_path;
1198 ENTER(
"model %p, account %p", model, account);
1209 tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL(model), &tree_iter);
1212 gchar *path_string = gtk_tree_path_to_string(tree_path);
1213 LEAVE(
"path (2) %s", path_string);
1214 g_free(path_string);
1231 while (!model->
stamp);
1235 propagate_change(GtkTreeModel *model, GtkTreePath *path, gint toggle_if_num)
1240 if (!gtk_tree_path_up(path))
1244 if (gtk_tree_path_get_depth(path) == 0)
1248 if (gtk_tree_model_get_iter(model, &iter, path))
1250 gtk_tree_model_row_changed(model, path, &iter);
1251 if (gtk_tree_model_iter_n_children(model, &iter) == toggle_if_num)
1252 gtk_tree_model_row_has_child_toggled(model, path, &iter);
1256 while (gtk_tree_path_up(path) && gtk_tree_path_get_depth(path) > 0 &&
1257 gtk_tree_model_get_iter(model, &iter, path))
1259 gtk_tree_model_row_changed(model, path, &iter);
1292 gnc_tree_model_account_event_handler (
QofInstance *entity,
1298 const gchar *parent_name;
1299 GtkTreePath *path = NULL;
1303 g_return_if_fail(model);
1304 if (!GNC_IS_ACCOUNT(entity))
1307 ENTER(
"entity %p of type %d, model %p, event_data %p",
1308 entity, event_type, model, ed);
1309 priv = GNC_TREE_MODEL_ACCOUNT_GET_PRIVATE(model);
1311 account = GNC_ACCOUNT(entity);
1312 if (gnc_account_get_book(account) != priv->book)
1314 LEAVE(
"not in this book");
1319 LEAVE(
"not in this model");
1331 DEBUG(
"can't generate path");
1334 increment_stamp(model);
1335 if (!gnc_tree_model_account_get_iter(GTK_TREE_MODEL(model), &iter, path))
1337 DEBUG(
"can't generate iter");
1340 gtk_tree_model_row_inserted (GTK_TREE_MODEL(model), path, &iter);
1341 propagate_change(GTK_TREE_MODEL(model), path, 1);
1344 case QOF_EVENT_REMOVE:
1347 parent = ed->node ? GNC_ACCOUNT(ed->node) : priv->root;
1349 DEBUG(
"remove child %d of account %p (%s)", ed->idx, parent, parent_name);
1353 DEBUG(
"can't generate path");
1356 increment_stamp(model);
1357 gtk_tree_path_append_index (path, ed->idx);
1358 gtk_tree_model_row_deleted (GTK_TREE_MODEL(model), path);
1359 propagate_change(GTK_TREE_MODEL(model), path, 0);
1362 case QOF_EVENT_MODIFY:
1367 DEBUG(
"can't generate path");
1370 if (!gnc_tree_model_account_get_iter(GTK_TREE_MODEL(model), &iter, path))
1372 DEBUG(
"can't generate iter");
1375 gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &iter);
1376 propagate_change(GTK_TREE_MODEL(model), path, -1);
1380 LEAVE(
"unknown event type");
1385 gtk_tree_path_free(path);
Account * gnc_account_get_parent(const Account *acc)
const char * xaccAccountGetLastNum(const Account *acc)
const GList * gnc_gobject_tracking_get_list(const gchar *name)
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
utility functions for the GnuCash UI
GNCAccountType xaccAccountGetType(const Account *acc)
const char * xaccAccountGetCode(const Account *acc)
gnc_numeric gnc_numeric_neg(gnc_numeric a)
#define DEBUG(format, args...)
Account * gnc_tree_model_account_get_account(GncTreeModelAccount *model, GtkTreeIter *iter)
void(* QofEventHandler)(QofInstance *ent, QofEventId event_type, gpointer handler_data, gpointer event_data)
Handler invoked when an event is generated.
#define ENTER(format, args...)
#define gnc_leave_return_val_if_fail(test, val)
gboolean gnc_tree_model_account_get_iter_from_account(GncTreeModelAccount *model, Account *account, GtkTreeIter *iter)
gboolean gnc_numeric_negative_p(gnc_numeric a)
gint qof_event_register_handler(QofEventHandler handler, gpointer handler_data)
Register a handler for events.
const char * xaccAccountGetColor(const Account *acc)
char * qof_print_date(time64 secs)
GtkTreeModel implementation for gnucash account tree.
Account handling public routines.
GtkTreeModel * gnc_tree_model_account_new(Account *root)
const char * xaccAccountGetDescription(const Account *acc)
General utilities for dealing with accounting periods.
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Additional event handling code.
gint gnc_account_n_children(const Account *account)
All type declarations for the whole Gnucash engine.
gboolean xaccAccountGetReconcileLastDate(const Account *acc, time64 *last_date)
Generic api to store and retrieve preferences.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
GtkTreePath * gnc_tree_model_account_get_path_from_account(GncTreeModelAccount *model, Account *account)
gboolean xaccAccountGetPlaceholder(const Account *acc)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
Account * gnc_account_nth_child(const Account *parent, gint num)
gint gnc_account_child_index(const Account *parent, const Account *child)
Account * gnc_account_get_root(Account *acc)
const char * xaccAccountGetName(const Account *acc)
const char * xaccAccountGetTypeStr(GNCAccountType type)
GType gnc_tree_model_account_get_type(void)
Commodity handling public routines.
const gchar * QofLogModule
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
const char * xaccAccountGetNotes(const Account *acc)