28 #include <glib/gi18n.h>
39 #include "gnc-component-manager.h"
44 #include "gnc-hooks.h"
45 #include "gnc-session.h"
46 #include "gnc-icons.h"
47 #include "gnc-ui-balances.h"
48 #include "dialog-utils.h"
49 #include "window-main-summarybar.h"
51 #define SAMPLE_ACCOUNT_VALUE "$1,000,000.00"
52 #define GNC_PREF_ACCOUNT_COLOR "show-account-color"
62 static void gnc_tree_view_account_finalize (GObject *
object);
63 static gboolean gnc_tree_view_search_compare (GtkTreeModel *model, gint column,
const gchar *key, GtkTreeIter *iter, gpointer search_data);
65 static void gtva_update_column_names (
GncTreeView *view);
66 static void gtva_currency_changed_cb (
void);
68 static gboolean gnc_tree_view_account_filter_helper (GtkTreeModel *model,
73 GtkTreeViewColumn *column,
74 GtkCellRenderer *renderer,
75 GncTreeViewAccountColumnTextEdited col_edited_cb);
77 static void tax_info_data_func (GtkTreeViewColumn *col,
78 GtkCellRenderer *renderer,
83 static void acc_color_data_func (GtkTreeViewColumn *col,
84 GtkCellRenderer *renderer,
89 static void gnc_tree_view_account_color_update (gpointer gsettings, gchar *key, gpointer user_data);
98 GSourceFunc filter_destroy;
100 GtkTreeViewColumn *name_column;
101 GtkTreeViewColumn *code_column;
102 GtkTreeViewColumn *desc_column;
103 GtkTreeViewColumn *present_report_column;
104 GtkTreeViewColumn *balance_report_column;
105 GtkTreeViewColumn *cleared_report_column;
106 GtkTreeViewColumn *reconciled_report_column;
107 GtkTreeViewColumn *future_min_report_column;
108 GtkTreeViewColumn *total_report_column;
109 GtkTreeViewColumn *notes_column;
111 gboolean show_account_color;
115 #define GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(o) \
116 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_VIEW_ACCOUNT, GncTreeViewAccountPrivate))
123 static GObjectClass *parent_class = NULL;
126 gnc_tree_view_account_get_type (
void)
128 static GType gnc_tree_view_account_type = 0;
130 if (gnc_tree_view_account_type == 0)
132 static const GTypeInfo our_info =
137 (GClassInitFunc) gnc_tree_view_account_class_init,
142 (GInstanceInitFunc) gnc_tree_view_account_init
145 gnc_tree_view_account_type = g_type_register_static (
146 GNC_TYPE_TREE_VIEW, GNC_TREE_VIEW_ACCOUNT_NAME,
150 return gnc_tree_view_account_type;
156 GObjectClass *o_class;
158 parent_class = g_type_class_peek_parent (klass);
161 o_class = G_OBJECT_CLASS (klass);
162 o_class->finalize = gnc_tree_view_account_finalize;
166 gnc_hook_add_dangler(HOOK_CURRENCY_CHANGED,
167 (GFunc)gtva_currency_changed_cb, NULL);
183 avi->include_type[i] = TRUE;
184 avi->show_hidden = FALSE;
192 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
195 GNC_PREF_ACCOUNT_COLOR,
196 gnc_tree_view_account_color_update,
199 gnc_init_account_view_info(&priv->avi);
203 gnc_tree_view_account_finalize (GObject *
object)
208 ENTER(
"view %p",
object);
209 g_return_if_fail (
object != NULL);
210 g_return_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (
object));
212 account_view = GNC_TREE_VIEW_ACCOUNT (
object);
214 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(account_view);
217 GNC_PREF_ACCOUNT_COLOR,
218 gnc_tree_view_account_color_update,
220 if (priv->filter_destroy)
222 priv->filter_destroy(priv->filter_data);
223 priv->filter_destroy = NULL;
225 priv->filter_fn = NULL;
227 if (G_OBJECT_CLASS (parent_class)->finalize)
228 (* G_OBJECT_CLASS (parent_class)->finalize) (
object);
237 gnc_tree_view_account_placeholder_toggled (GtkCellRendererToggle *cell,
238 const gchar *s_path_str,
244 gboolean placeholder;
247 tree_view = user_data;
248 s_path = gtk_tree_path_new_from_string (s_path_str);
252 placeholder = !gtk_cell_renderer_toggle_get_active (cell);
257 gtk_tree_path_free (s_path);
265 static GtkTreeModel *
266 sort_cb_setup_w_iters (GtkTreeModel *f_model,
267 GtkTreeIter *f_iter_a,
268 GtkTreeIter *f_iter_b,
276 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
277 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
280 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
289 sort_cb_setup (GtkTreeModel *f_model,
290 GtkTreeIter *f_iter_a,
291 GtkTreeIter *f_iter_b,
295 GtkTreeIter iter_a, iter_b;
297 sort_cb_setup_w_iters (f_model, f_iter_a, f_iter_b,
298 &iter_a, &iter_b, account_a, account_b);
302 sort_by_string (GtkTreeModel *f_model,
303 GtkTreeIter *f_iter1,
304 GtkTreeIter *f_iter2,
308 GtkTreeIter iter1, iter2;
309 const Account *account1, *account2;
311 gint column = GPOINTER_TO_INT(user_data);
314 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &account1, &account2);
317 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1);
318 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1);
329 sort_by_code (GtkTreeModel *f_model,
330 GtkTreeIter *f_iter_a,
331 GtkTreeIter *f_iter_b,
334 const Account *account_a, *account_b;
336 sort_cb_setup (f_model, f_iter_a, f_iter_b, &account_a, &account_b);
343 sort_by_xxx_value (xaccGetBalanceInCurrencyFn fn,
345 GtkTreeModel *f_model,
346 GtkTreeIter *f_iter_a,
347 GtkTreeIter *f_iter_b,
350 const Account *account_a, *account_b;
355 sort_cb_setup (f_model, f_iter_a, f_iter_b, &account_a, &account_b);
358 balance_a = gnc_ui_account_get_balance_full(fn, account_a, recurse, NULL, NULL);
359 balance_b = gnc_ui_account_get_balance_full(fn, account_b, recurse, NULL, NULL);
368 sort_by_present_value (GtkTreeModel *f_model,
369 GtkTreeIter *f_iter_a,
370 GtkTreeIter *f_iter_b,
373 return sort_by_xxx_value (xaccAccountGetPresentBalanceInCurrency, TRUE,
374 f_model, f_iter_a, f_iter_b, user_data);
378 sort_by_balance_value (GtkTreeModel *f_model,
379 GtkTreeIter *f_iter_a,
380 GtkTreeIter *f_iter_b,
383 return sort_by_xxx_value (xaccAccountGetBalanceInCurrency, TRUE,
384 f_model, f_iter_a, f_iter_b, user_data);
388 sort_by_cleared_value (GtkTreeModel *f_model,
389 GtkTreeIter *f_iter_a,
390 GtkTreeIter *f_iter_b,
393 return sort_by_xxx_value (xaccAccountGetClearedBalanceInCurrency, TRUE,
394 f_model, f_iter_a, f_iter_b, user_data);
398 sort_by_reconciled_value (GtkTreeModel *f_model,
399 GtkTreeIter *f_iter_a,
400 GtkTreeIter *f_iter_b,
403 return sort_by_xxx_value (xaccAccountGetReconciledBalanceInCurrency, TRUE,
404 f_model, f_iter_a, f_iter_b, user_data);
408 sort_by_future_min_value (GtkTreeModel *f_model,
409 GtkTreeIter *f_iter_a,
410 GtkTreeIter *f_iter_b,
413 return sort_by_xxx_value (xaccAccountGetProjectedMinimumBalanceInCurrency, TRUE,
414 f_model, f_iter_a, f_iter_b, user_data);
418 sort_by_total_value (GtkTreeModel *f_model,
419 GtkTreeIter *f_iter_a,
420 GtkTreeIter *f_iter_b,
423 return sort_by_xxx_value (xaccAccountGetBalanceInCurrency, TRUE,
424 f_model, f_iter_a, f_iter_b, user_data);
428 sort_by_placeholder (GtkTreeModel *f_model,
429 GtkTreeIter *f_iter_a,
430 GtkTreeIter *f_iter_b,
433 const Account *account_a, *account_b;
434 gboolean flag_a, flag_b;
437 sort_cb_setup (f_model, f_iter_a, f_iter_b, &account_a, &account_b);
445 else if (flag_a < flag_b)
451 sort_by_xxx_period_value (GtkTreeModel *f_model,
452 GtkTreeIter *f_iter_a,
453 GtkTreeIter *f_iter_b,
461 sort_cb_setup (f_model, f_iter_a, f_iter_b,
464 t1 = gnc_accounting_period_fiscal_start();
465 t2 = gnc_accounting_period_fiscal_end();
467 b1 = xaccAccountGetBalanceChangeForPeriod(acct1, t1, t2, recurse);
468 b2 = xaccAccountGetBalanceChangeForPeriod(acct2, t1, t2, recurse);
477 sort_by_balance_period_value (GtkTreeModel *f_model,
478 GtkTreeIter *f_iter_a,
479 GtkTreeIter *f_iter_b,
482 return sort_by_xxx_period_value (f_model, f_iter_a, f_iter_b, FALSE);
486 sort_by_total_period_value (GtkTreeModel *f_model,
487 GtkTreeIter *f_iter_a,
488 GtkTreeIter *f_iter_b,
491 return sort_by_xxx_period_value (f_model, f_iter_a, f_iter_b, TRUE);
507 tax_info_data_func (GtkTreeViewColumn *col,
508 GtkCellRenderer *renderer,
513 gchar *tax_info = NULL;
516 gtk_tree_model_get(model,
518 GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
522 path = gtk_tree_model_get_path(model, iter);
523 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path))
524 g_object_set(renderer,
"text",
525 (tax_info == NULL ?
"" : tax_info), NULL);
528 gchar *tax_info_sub_acct = NULL;
530 gtk_tree_model_get(model,
532 GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT,
535 if ((g_strcmp0 (tax_info_sub_acct,
"") == 0) ||
536 (tax_info_sub_acct == NULL))
537 g_object_set(renderer,
"text",
538 (tax_info == NULL ?
"" : tax_info), NULL);
541 if ((g_strcmp0 (tax_info,
"") == 0) ||
543 g_object_set(renderer,
"text",
544 (tax_info_sub_acct == NULL ?
"" : tax_info_sub_acct),
548 gchar *combined_tax_info;
549 combined_tax_info = g_strdup_printf (
"%s; %s",
550 (tax_info == NULL ?
"" : tax_info),
551 (tax_info_sub_acct == NULL ?
"" :
553 g_object_set(renderer,
"text", combined_tax_info, NULL);
554 g_free(combined_tax_info);
557 g_free(tax_info_sub_acct);
560 gtk_tree_path_free(path);
573 update_cell_renderers (GList *renderers, gchar *account_color)
575 GtkCellRenderer *cell;
579 for (node = renderers; node; node = node->next)
582 g_object_set (cell,
"cell-background", account_color, NULL);
594 acc_color_data_func (GtkTreeViewColumn *col,
595 GtkCellRenderer *renderer,
601 gchar *acc_color = NULL, *acc_cond_color = NULL;
607 gtk_tree_model_get(model,
609 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_ACCOUNT,
614 if ((item) && (*item !=
'\0'))
615 acc_color = g_strstrip(g_strdup(item));
619 if (acc_color && (!gdk_color_parse(acc_color, &color)))
627 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
628 if (priv->show_account_color)
629 acc_cond_color = acc_color;
631 column_name = g_object_get_data(G_OBJECT(col), PREF_NAME);
632 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (col));
635 if (g_strcmp0(column_name,
"account-color") == 0)
636 update_cell_renderers (renderers, acc_color);
638 update_cell_renderers (renderers, acc_cond_color);
640 g_list_free (renderers);
650 gnc_tree_view_account_color_update (gpointer gsettings, gchar *key, gpointer user_data)
655 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(user_data));
657 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
658 if (g_strcmp0 (key, GNC_PREF_ACCOUNT_COLOR) == 0)
676 GtkTreeModel *model, *f_model, *s_model;
677 GtkTreePath *virtual_root_path = NULL;
678 const gchar *sample_type, *sample_commodity;
680 GtkTreeViewColumn *tax_info_column, *acc_color_column;
681 GtkCellRenderer *renderer;
685 view = g_object_new (GNC_TYPE_TREE_VIEW_ACCOUNT,
686 "name",
"account_tree", NULL);
688 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(GNC_TREE_VIEW_ACCOUNT (view));
691 priv->show_account_color =
gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_ACCOUNT_COLOR);
698 virtual_root_path = gtk_tree_path_new_first ();
699 f_model = gtk_tree_model_filter_new (model, virtual_root_path);
702 g_object_unref(G_OBJECT(model));
703 if (virtual_root_path)
704 gtk_tree_path_free(virtual_root_path);
707 s_model = gtk_tree_model_sort_new_with_model(f_model);
708 g_object_unref(G_OBJECT(f_model));
709 gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
710 g_object_unref(G_OBJECT(s_model));
713 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
720 GNC_STOCK_ACCOUNT,
"Expenses:Entertainment",
721 GNC_TREE_MODEL_ACCOUNT_COL_NAME,
722 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
727 gtk_tree_view_column_set_cell_data_func(priv->name_column,
734 GNC_TREE_MODEL_ACCOUNT_COL_TYPE,
735 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
740 GNC_TREE_MODEL_ACCOUNT_COL_COMMODITY,
741 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
746 GNC_TREE_MODEL_ACCOUNT_COL_CODE,
747 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
751 "Sample account description.",
752 GNC_TREE_MODEL_ACCOUNT_COL_DESCRIPTION,
753 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
757 GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM,
758 GNC_TREE_VIEW_COLUMN_COLOR_NONE,
759 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
763 SAMPLE_ACCOUNT_VALUE,
764 GNC_TREE_MODEL_ACCOUNT_COL_PRESENT,
765 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT,
766 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
767 sort_by_present_value);
768 priv->present_report_column
770 SAMPLE_ACCOUNT_VALUE,
771 GNC_TREE_MODEL_ACCOUNT_COL_PRESENT_REPORT,
772 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT,
773 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
774 sort_by_present_value);
777 SAMPLE_ACCOUNT_VALUE,
778 GNC_TREE_MODEL_ACCOUNT_COL_BALANCE,
779 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE,
780 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
781 sort_by_balance_value);
782 priv->balance_report_column
784 SAMPLE_ACCOUNT_VALUE,
785 GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_REPORT,
786 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE,
787 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
788 sort_by_balance_value);
791 SAMPLE_ACCOUNT_VALUE,
792 GNC_TREE_MODEL_ACCOUNT_COL_BALANCE_PERIOD,
793 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_BALANCE_PERIOD,
794 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
795 sort_by_balance_period_value);
798 SAMPLE_ACCOUNT_VALUE,
799 GNC_TREE_MODEL_ACCOUNT_COL_CLEARED,
800 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_CLEARED,
801 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
802 sort_by_cleared_value);
803 priv->cleared_report_column
805 SAMPLE_ACCOUNT_VALUE,
806 GNC_TREE_MODEL_ACCOUNT_COL_CLEARED_REPORT,
807 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_CLEARED,
808 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
809 sort_by_cleared_value);
812 SAMPLE_ACCOUNT_VALUE,
813 GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED,
814 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_RECONCILED,
815 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
816 sort_by_reconciled_value);
817 priv->reconciled_report_column
819 SAMPLE_ACCOUNT_VALUE,
820 GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_REPORT,
821 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_RECONCILED,
822 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
823 sort_by_reconciled_value);
826 "Last Reconcile Date",
827 GNC_TREE_MODEL_ACCOUNT_COL_RECONCILED_DATE,
828 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
832 SAMPLE_ACCOUNT_VALUE,
833 GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN,
834 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_FUTURE_MIN,
835 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
836 sort_by_future_min_value);
837 priv->future_min_report_column
839 SAMPLE_ACCOUNT_VALUE,
840 GNC_TREE_MODEL_ACCOUNT_COL_FUTURE_MIN_REPORT,
841 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_FUTURE_MIN,
842 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
843 sort_by_future_min_value);
846 SAMPLE_ACCOUNT_VALUE,
847 GNC_TREE_MODEL_ACCOUNT_COL_TOTAL,
848 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL,
849 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
850 sort_by_total_value);
851 priv->total_report_column
853 SAMPLE_ACCOUNT_VALUE,
854 GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_REPORT,
855 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL,
856 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
857 sort_by_total_value);
860 SAMPLE_ACCOUNT_VALUE,
861 GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD,
862 GNC_TREE_MODEL_ACCOUNT_COL_COLOR_TOTAL_PERIOD,
863 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
864 sort_by_total_period_value);
870 GNC_TREE_VIEW_COLUMN_DATA_NONE,
871 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
877 g_object_set_data_full(G_OBJECT(acc_color_column), REAL_TITLE,
878 g_strdup(_(
"Account Color")), g_free);
880 gtk_tree_view_column_set_cell_data_func(acc_color_column,
887 "Sample account notes.",
888 GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
889 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
894 GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
895 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
899 gtk_tree_view_column_set_cell_data_func(tax_info_column,
908 Q_(
"Column letter for 'Placeholder'|P"),
910 GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER,
911 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
913 gnc_tree_view_account_placeholder_toggled);
916 gtva_update_column_names(view);
920 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model),
921 gnc_tree_view_account_filter_helper,
926 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model),
927 GNC_TREE_MODEL_ACCOUNT_COL_NAME,
931 gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(view), gnc_tree_view_search_compare, NULL, NULL);
933 gtk_widget_show(GTK_WIDGET(view));
935 return GTK_TREE_VIEW(view);
949 root = gnc_book_get_root_account (gnc_get_current_book ());
957 #define debug_path(fn, path) { \
958 gchar *path_string = gtk_tree_path_to_string(path); \
959 fn("tree path %s", path_string); \
960 g_free(path_string); \
967 GtkTreeModel *model, *f_model, *s_model;
968 GtkTreePath *path, *f_path, *s_path;
979 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
980 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
981 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
990 f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path);
991 gtk_tree_path_free(path);
994 LEAVE(
"no filter path");
999 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path);
1000 gtk_tree_path_free(f_path);
1001 debug_path(
LEAVE, s_path);
1008 GtkTreeIter *s_iter)
1010 GtkTreeModel *model, *f_model, *s_model;
1011 GtkTreeIter iter, f_iter;
1013 g_return_val_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(view), FALSE);
1014 g_return_val_if_fail(account != NULL, FALSE);
1015 g_return_val_if_fail(s_iter != NULL, FALSE);
1020 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1021 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1022 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
1024 GNC_TREE_MODEL_ACCOUNT(model), account, &iter))
1026 LEAVE(
"model_get_iter_from_account failed");
1031 gtk_tree_model_filter_convert_child_iter_to_iter (
1032 GTK_TREE_MODEL_FILTER(f_model), &f_iter, &iter);
1033 gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model),
1043 GtkTreeModel *s_model;
1049 if (account == NULL)
1051 LEAVE(
"no account");
1055 if (!gnc_tree_view_account_get_iter_from_account (view, account, &s_iter))
1057 LEAVE(
"view_get_iter_from_account failed");
1062 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1063 num_children = gtk_tree_model_iter_n_children(s_model, &s_iter);
1064 LEAVE(
"%d children", num_children);
1065 return num_children;
1083 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(account_view));
1084 g_return_if_fail(avi != NULL);
1086 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(account_view);
1113 ENTER(
"%p", account_view);
1114 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(account_view));
1115 g_return_if_fail(avi != NULL);
1117 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(account_view);
1122 sel_bits |= avi->include_type[i] ? (1 << i) : 0;
1126 account_view, gnc_tree_view_account_filter_by_view_info,
1133 gnc_tree_view_account_filter_helper (GtkTreeModel *model,
1141 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT (model), FALSE);
1142 g_return_val_if_fail (iter != NULL, FALSE);
1145 GNC_TREE_MODEL_ACCOUNT(model), iter);
1147 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
1148 if (priv->filter_fn)
1149 return priv->filter_fn(account, priv->filter_data);
1164 GSourceFunc destroy)
1168 ENTER(
"view %p, filter func %p, data %p, destroy %p",
1169 view, func, data, destroy);
1171 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(view));
1173 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
1174 if (priv->filter_destroy)
1176 priv->filter_destroy(priv->filter_data);
1178 priv->filter_destroy = destroy;
1179 priv->filter_data = data;
1180 priv->filter_fn = func;
1192 GtkTreeModel *f_model, *s_model;
1194 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(view));
1196 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1197 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1198 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
1202 gnc_tree_view_account_filter_by_view_info(
Account* acct, gpointer data)
1207 g_return_val_if_fail(GNC_IS_ACCOUNT(acct), FALSE);
1210 if (!avi->include_type[acct_type])
return FALSE;
1225 GtkTreePath *s_path)
1227 GtkTreeModel *model, *f_model, *s_model;
1228 GtkTreePath *path, *f_path;
1232 ENTER(
"view %p", view);
1233 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view), NULL);
1234 g_return_val_if_fail (s_path != NULL, NULL);
1236 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1237 f_path = gtk_tree_model_sort_convert_path_to_child_path (
1238 GTK_TREE_MODEL_SORT (s_model), s_path);
1241 LEAVE(
"no filter path");
1245 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1246 path = gtk_tree_model_filter_convert_path_to_child_path (
1247 GTK_TREE_MODEL_FILTER (f_model), f_path);
1248 gtk_tree_path_free(f_path);
1255 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
1256 if (!gtk_tree_model_get_iter (model, &iter, path))
1262 account = iter.user_data;
1263 gtk_tree_path_free(path);
1271 GtkTreeIter *s_iter)
1273 GtkTreeModel *model, *f_model;
1274 GtkTreeIter iter, f_iter;
1277 g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT(s_model), NULL);
1278 g_return_val_if_fail (s_iter != NULL, NULL);
1280 ENTER(
"model %p, iter %p", s_model, s_iter);
1282 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(s_model),
1285 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1286 gtk_tree_model_filter_convert_iter_to_child_iter (
1287 GTK_TREE_MODEL_FILTER(f_model), &iter, &f_iter);
1288 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
1290 GNC_TREE_MODEL_ACCOUNT(model), &iter);
1303 GtkTreeSelection *selection;
1304 GtkTreeModel *f_model, *s_model;
1305 GtkTreeIter iter, f_iter, s_iter;
1307 GtkSelectionMode mode;
1309 ENTER(
"view %p", view);
1310 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view), NULL);
1312 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
1313 mode = gtk_tree_selection_get_mode(selection);
1314 if ((mode != GTK_SELECTION_SINGLE) && (mode != GTK_SELECTION_BROWSE))
1318 if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter))
1320 LEAVE(
"no account, get_selected failed");
1324 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
1327 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1328 gtk_tree_model_filter_convert_iter_to_child_iter (
1329 GTK_TREE_MODEL_FILTER (f_model), &iter, &f_iter);
1331 account = iter.user_data;
1344 GtkTreeModel *model, *f_model, *s_model;
1345 GtkTreePath *path, *f_path, *s_path, *parent_path;
1346 GtkTreeSelection *selection;
1348 ENTER(
"view %p, account %p (%s)", view,
1350 g_return_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view));
1353 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
1354 gtk_tree_selection_unselect_all (selection);
1356 if (account == NULL)
1359 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1360 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1361 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
1364 GNC_TREE_MODEL_ACCOUNT(model), account);
1370 debug_path(
DEBUG, path);
1372 f_path = gtk_tree_model_filter_convert_child_path_to_path (
1373 GTK_TREE_MODEL_FILTER (f_model), path);
1374 gtk_tree_path_free(path);
1377 LEAVE(
"no filter path");
1380 debug_path(
DEBUG, f_path);
1382 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
1384 gtk_tree_path_free(f_path);
1387 LEAVE(
"no sort path");
1392 parent_path = gtk_tree_path_copy (s_path);
1393 if (gtk_tree_path_up (parent_path))
1398 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(view), parent_path);
1400 gtk_tree_path_free(parent_path);
1402 gtk_tree_selection_select_path (selection, s_path);
1406 while (gtk_events_pending ())
1407 gtk_main_iteration ();
1408 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
1409 debug_path(
LEAVE, s_path);
1410 gtk_tree_path_free(s_path);
1426 get_selected_accounts_helper (GtkTreeModel *s_model,
1427 GtkTreePath *s_path,
1428 GtkTreeIter *s_iter,
1432 GtkTreeModel *f_model;
1433 GtkTreeIter iter, f_iter;
1436 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
1439 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1440 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
1442 account = iter.user_data;
1445 if (gtvsi->priv->filter_fn == NULL || gtvsi->priv->filter_fn(account, gtvsi->priv->filter_data))
1447 gtvsi->return_list = g_list_append(gtvsi->return_list, account);
1461 GtkTreeSelection *selection;
1464 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view), NULL);
1466 info.return_list = NULL;
1467 info.priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
1468 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
1469 gtk_tree_selection_selected_foreach(selection, get_selected_accounts_helper, &info);
1470 return info.return_list;
1479 GList *account_list,
1482 GtkTreeModel *model, *f_model, *s_model;
1483 GtkTreePath *path, *f_path, *s_path, *parent_path;
1484 GtkTreeSelection *selection;
1488 g_return_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view));
1490 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1491 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
1492 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
1495 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
1496 gtk_tree_selection_unselect_all (selection);
1497 gtk_tree_view_collapse_all (GTK_TREE_VIEW(view));
1500 for (element = account_list; element; )
1502 account = element->data;
1503 element = g_list_next(element);
1505 if (account == NULL)
1524 f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model),
1526 gtk_tree_path_free(path);
1530 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
1532 gtk_tree_path_free(f_path);
1537 parent_path = gtk_tree_path_copy (s_path);
1538 if (gtk_tree_path_up (parent_path))
1543 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(view), parent_path);
1545 gtk_tree_path_free(parent_path);
1547 gtk_tree_selection_select_path (selection, s_path);
1548 if (show_last && (element == NULL))
1549 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
1550 gtk_tree_path_free(s_path);
1561 GtkTreeModel *s_model;
1562 GtkTreeSelection *selection;
1563 GtkTreePath *sp_account, *sp_start, *sp_end;
1564 GtkTreeIter si_account, si_start, si_end;
1565 gboolean have_start, have_end;
1570 g_return_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view));
1572 if (account == NULL)
1574 LEAVE(
"no account");
1578 if (!gnc_tree_view_account_get_iter_from_account (view, account, &si_account))
1580 LEAVE(
"view_get_iter_from_account failed");
1585 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
1586 num_children = gtk_tree_model_iter_n_children(s_model, &si_account);
1587 if (num_children == 0)
1589 LEAVE(
"no children");
1594 sp_account = gtk_tree_model_get_path (s_model, &si_account);
1595 gtk_tree_view_expand_row (GTK_TREE_VIEW(view), sp_account, TRUE);
1598 have_start = gtk_tree_model_iter_nth_child(s_model, &si_start, &si_account, 0);
1599 si_end = si_account;
1600 while (num_children)
1602 GtkTreeIter tmp_iter = si_end;
1603 have_end = gtk_tree_model_iter_nth_child(s_model, &si_end, &tmp_iter,
1606 num_children = gtk_tree_model_iter_n_children(s_model, &si_end);
1611 if (have_start && have_end)
1613 sp_start = gtk_tree_model_get_path (s_model, &si_start);
1614 sp_end = gtk_tree_model_get_path (s_model, &si_end);
1617 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
1618 gtk_tree_selection_select_range (selection, sp_start, sp_end);
1621 gtk_tree_path_free(sp_start);
1622 gtk_tree_path_free(sp_end);
1624 gtk_tree_path_free(sp_account);
1635 g_return_if_fail(view != NULL);
1636 g_return_if_fail(GNC_IS_TREE_VIEW_ACCOUNT(view));
1637 ENTER(
"view %p, account %p", view, account);
1639 path = gnc_tree_view_account_get_path_from_account(view, account);
1642 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(view), path);
1643 gtk_tree_path_free(path);
1655 GtkTreePath *s_path;
1658 ENTER(
"view %p", view);
1659 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view), NULL);
1661 gtk_tree_view_get_cursor (GTK_TREE_VIEW(view), &s_path, NULL);
1664 LEAVE(
"no account");
1669 gtk_tree_path_free(s_path);
1680 gtva_update_column_name (GtkTreeViewColumn *column,
1682 const gchar *mnemonic)
1686 g_return_if_fail(column);
1688 name = g_strdup_printf(fmt, mnemonic);
1689 gtk_tree_view_column_set_title(column, name);
1698 const gchar *mnemonic;
1700 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
1703 gtva_update_column_name(priv->present_report_column,
1705 _(
"Present (%s)"), mnemonic);
1706 gtva_update_column_name(priv->balance_report_column,
1708 _(
"Balance (%s)"), mnemonic);
1709 gtva_update_column_name(priv->cleared_report_column,
1711 _(
"Cleared (%s)"), mnemonic);
1712 gtva_update_column_name(priv->reconciled_report_column,
1714 _(
"Reconciled (%s)"), mnemonic);
1715 gtva_update_column_name(priv->future_min_report_column,
1717 _(
"Future Minimum (%s)"), mnemonic);
1718 gtva_update_column_name(priv->total_report_column,
1720 _(
"Total (%s)"), mnemonic);
1727 gtva_currency_changed_cb (
void)
1729 const GList *views, *ptr;
1732 for (ptr = views; ptr; ptr = g_list_next(ptr))
1734 gtva_update_column_names (ptr->data);
1741 account_cell_property_data_func (GtkTreeViewColumn *tree_column,
1742 GtkCellRenderer *cell,
1743 GtkTreeModel *s_model,
1744 GtkTreeIter *s_iter,
1748 gchar *
string = NULL;
1750 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
1758 g_object_set (G_OBJECT (cell),
"text",
string,
"xalign", 0.0, NULL);
1764 const gchar *column_title,
1765 const gchar *propname)
1767 GtkCellRenderer *renderer;
1768 GtkTreeViewColumn *column;
1770 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (view), NULL);
1771 g_return_val_if_fail (propname != NULL, NULL);
1774 propname, NULL,
"Sample text",
1780 g_object_set (G_OBJECT (renderer),
"xalign", 1.0, NULL);
1782 gtk_tree_view_column_set_cell_data_func (column, renderer,
1783 account_cell_property_data_func,
1784 g_strdup(propname), g_free);
1788 static void col_edited_helper(GtkCellRendererText *cell, gchar *path_string,
1789 gchar *new_text, gpointer _s_model)
1792 GtkTreeModel *s_model;
1794 GncTreeViewAccountColumnTextEdited col_edited_cb;
1795 GtkTreeViewColumn *col;
1797 col_edited_cb = g_object_get_data(G_OBJECT(cell),
1798 "column_edited_callback");
1799 col = GTK_TREE_VIEW_COLUMN(g_object_get_data(G_OBJECT(cell),
1801 s_model = GTK_TREE_MODEL(_s_model);
1803 if (!gtk_tree_model_get_iter_from_string(s_model, &s_iter, path_string))
1807 col_edited_cb(account, col, new_text);
1810 static void col_source_helper(GtkTreeViewColumn *col, GtkCellRenderer *cell,
1811 GtkTreeModel *s_model, GtkTreeIter *s_iter,
1812 gpointer _col_source_cb)
1816 GncTreeViewAccountColumnSource col_source_cb;
1818 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
1819 col_source_cb = (GncTreeViewAccountColumnSource) _col_source_cb;
1821 text = col_source_cb(account, col, cell);
1822 g_object_set (G_OBJECT (cell),
"text", text,
"xalign", 1.0, NULL);
1832 GtkTreeViewColumn *column,
1833 GtkCellRenderer *renderer,
1834 GncTreeViewAccountColumnTextEdited col_edited_cb)
1836 GtkTreeModel *s_model;
1838 if (col_edited_cb == NULL)
1840 g_object_set(G_OBJECT(renderer),
"editable", FALSE, NULL);
1841 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback", col_edited_cb);
1842 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(account_view));
1843 g_signal_handlers_disconnect_by_func(G_OBJECT(renderer), col_edited_cb, s_model);
1844 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1848 g_object_set(G_OBJECT(renderer),
"editable", TRUE, NULL);
1849 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback",
1851 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(account_view));
1852 g_signal_connect(G_OBJECT(renderer),
"edited",
1853 (GCallback) col_edited_helper, s_model);
1854 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1860 const gchar *column_title,
1861 GncTreeViewAccountColumnSource
1863 GncTreeViewAccountColumnTextEdited
1866 GtkCellRenderer *renderer;
1867 GtkTreeViewColumn *column;
1869 g_return_val_if_fail (GNC_IS_TREE_VIEW_ACCOUNT (account_view), NULL);
1871 renderer = gtk_cell_renderer_text_new ();
1872 g_object_set (G_OBJECT (renderer),
"xalign", 1.0, NULL);
1874 column = gtk_tree_view_column_new_with_attributes (column_title,
1878 gtva_setup_column_renderer_edited_cb(account_view, column,
1879 renderer, col_edited_cb);
1881 gtk_tree_view_column_set_cell_data_func (column, renderer,
1883 col_source_cb, NULL);
1890 #define FILTER_TREE_VIEW "types_tree_view"
1916 LEAVE(
" hide: hidden");
1920 if (!fd->show_zero_total)
1922 total = xaccAccountGetBalanceInCurrency (account, NULL, TRUE);
1925 LEAVE(
" hide: zero balance");
1930 if (!fd->show_unused)
1934 LEAVE(
" hide: unused");
1940 result = (fd->visible_types & (1 << acct_type)) ? TRUE : FALSE;
1941 LEAVE(
" %s", result ?
"show" :
"hide");
1956 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1958 ENTER(
"button %p", button);
1959 fd->show_hidden = gtk_toggle_button_get_active(button);
1961 LEAVE(
"show_hidden %d", fd->show_hidden);
1975 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1977 ENTER(
"button %p", button);
1978 fd->show_zero_total = gtk_toggle_button_get_active(button);
1980 LEAVE(
"show_zero %d", fd->show_zero_total);
1994 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1996 ENTER(
"button %p", button);
1997 fd->show_unused = gtk_toggle_button_get_active(button);
1999 LEAVE(
"show_unused %d", fd->show_unused);
2014 g_return_if_fail(GTK_IS_BUTTON(button));
2016 ENTER(
"button %p", button);
2017 fd->visible_types = 0;
2018 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(fd->model));
2020 LEAVE(
"types 0x%x", fd->visible_types);
2033 g_return_if_fail(GTK_IS_BUTTON(button));
2035 ENTER(
"button %p", button);
2036 fd->visible_types = -1;
2037 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(fd->model));
2039 LEAVE(
"types 0x%x", fd->visible_types);
2053 ENTER(
"button %p", button);
2070 gppat_filter_visible_set_func (GtkTreeViewColumn *column,
2071 GtkCellRenderer *renderer,
2072 GtkTreeModel *model,
2080 gtk_tree_model_get(model, iter, GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE, &type, -1);
2082 active = (fd->visible_types & (1 << type)) ? TRUE : FALSE;
2083 g_object_set (G_OBJECT (renderer),
"active", active, NULL);
2092 gppat_filter_visible_toggled_cb (GtkCellRendererToggle *renderer,
2096 GtkTreeModel *model = fd->model;
2101 ENTER(
"toggled %p", path_str);
2102 path = gtk_tree_path_new_from_string(path_str);
2104 if (gtk_tree_model_get_iter(model, &iter, path))
2106 gtk_tree_model_get(model, &iter, GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE, &type, -1);
2107 fd->visible_types ^= (1 << type);
2110 gtk_tree_path_free(path);
2111 LEAVE(
"types 0x%x", fd->visible_types);
2131 g_return_if_fail(GTK_IS_DIALOG(dialog));
2133 ENTER(
"dialog %p, response %d", dialog, response);
2135 if (response != GTK_RESPONSE_OK)
2137 fd->visible_types = fd->original_visible_types;
2138 fd->show_hidden = fd->original_show_hidden;
2139 fd->show_zero_total = fd->original_show_zero_total;
2140 fd->show_unused = fd->original_show_unused;
2145 gptemp = (gpointer *)fd->dialog;
2146 g_atomic_pointer_compare_and_exchange(&gptemp,
2148 fd->dialog = gptemp;
2149 gtk_widget_destroy(dialog);
2150 LEAVE(
"types 0x%x", fd->visible_types);
2156 GtkWidget *dialog, *button;
2158 GtkCellRenderer *renderer;
2159 GtkBuilder *builder;
2162 ENTER(
"(fd %p, page %p)", fd, page);
2166 gtk_window_present(GTK_WINDOW(fd->dialog));
2167 LEAVE(
"existing dialog");
2172 builder = gtk_builder_new();
2173 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"Filter By");
2174 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Filter By"));
2175 fd->dialog = dialog;
2176 gtk_window_set_transient_for(GTK_WINDOW(dialog),
2177 GTK_WINDOW(GNC_PLUGIN_PAGE(page)->window));
2179 title = g_strdup_printf(_(
"Filter %s by..."),
2181 gtk_window_set_title(GTK_WINDOW(dialog), title);
2185 fd->original_visible_types = fd->visible_types;
2186 fd->original_show_hidden = fd->show_hidden;
2187 fd->original_show_zero_total = fd->show_zero_total;
2188 fd->original_show_unused = fd->show_unused;
2191 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_hidden"));
2192 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
2194 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_zero"));
2195 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
2196 fd->show_zero_total);
2197 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_unused"));
2198 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
2202 view = GTK_TREE_VIEW(gtk_builder_get_object (builder, FILTER_TREE_VIEW));
2204 fd->model = gnc_tree_model_account_types_filter_using_mask
2206 gtk_tree_view_set_model(view, fd->model);
2207 g_object_unref (fd->model);
2209 renderer = gtk_cell_renderer_toggle_new();
2211 g_signal_connect(renderer,
"toggled",
2212 G_CALLBACK(gppat_filter_visible_toggled_cb), fd);
2214 gtk_tree_view_insert_column_with_data_func
2217 gppat_filter_visible_set_func, fd, NULL);
2219 gtk_tree_view_insert_column_with_attributes
2221 -1, _(
"Account Types"), gtk_cell_renderer_text_new(),
2222 "text", GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME, NULL);
2225 gtk_builder_connect_signals(builder, fd);
2226 g_object_unref(G_OBJECT(builder));
2229 gtk_widget_show_all(dialog);
2233 #define ACCT_COUNT "NumberOfOpenAccounts"
2234 #define ACCT_OPEN "OpenAccount%d"
2235 #define ACCT_SELECTED "SelectedAccount"
2236 #define SHOW_HIDDEN "ShowHidden"
2237 #define SHOW_ZERO "ShowZeroTotal"
2238 #define SHOW_UNUSED "ShowUnused"
2239 #define ACCT_TYPES "AccountTypes"
2244 const gchar *group_name;
2265 bar_t *bar = user_data;
2267 gchar *account_name;
2270 if (account == NULL)
2274 if (account_name == NULL)
2277 key = g_strdup_printf(ACCT_OPEN, ++bar->count);
2278 g_key_file_set_string(bar->key_file, bar->group_name, key, account_name);
2280 g_free(account_name);
2299 bar_t *bar = user_data;
2300 gchar *account_name;
2303 if (account == NULL)
2307 if (account_name == NULL)
2310 g_key_file_set_string(bar->key_file, bar->group_name, ACCT_SELECTED,
2312 g_free(account_name);
2318 GKeyFile *key_file,
const gchar *group_name)
2322 g_return_if_fail (key_file != NULL);
2323 g_return_if_fail (group_name != NULL);
2325 ENTER(
"view %p, key_file %p, group_name %s", view, key_file,
2328 g_key_file_set_integer(key_file, group_name, ACCT_TYPES,
2330 g_key_file_set_boolean(key_file, group_name, SHOW_HIDDEN,
2332 g_key_file_set_boolean(key_file, group_name, SHOW_ZERO,
2333 fd->show_zero_total);
2334 g_key_file_set_boolean(key_file, group_name, SHOW_UNUSED,
2337 bar.key_file = key_file;
2338 bar.group_name = group_name;
2340 tree_save_selected_row(view, &bar);
2341 gtk_tree_view_map_expanded_rows(
2342 GTK_TREE_VIEW(view), (GtkTreeViewMappingFunc) tree_save_expanded_row,
2344 g_key_file_set_integer(key_file, group_name, ACCT_COUNT, bar.count);
2358 const gchar *account_name)
2380 const gchar *account_name)
2395 GKeyFile *key_file,
const gchar *group_name)
2397 GError *error = NULL;
2403 show = g_key_file_get_boolean(key_file, group_name, SHOW_HIDDEN, &error);
2406 g_warning(
"error reading group %s key %s: %s",
2407 group_name, SHOW_HIDDEN, error->message);
2408 g_error_free(error);
2412 fd->show_hidden = show;
2414 show = g_key_file_get_boolean(key_file, group_name, SHOW_ZERO, &error);
2417 g_warning(
"error reading group %s key %s: %s",
2418 group_name, SHOW_ZERO, error->message);
2419 g_error_free(error);
2423 fd->show_zero_total = show;
2425 show = g_key_file_get_boolean(key_file, group_name, SHOW_UNUSED, &error);
2428 g_warning(
"error reading group %s key %s: %s",
2429 group_name, SHOW_UNUSED, error->message);
2430 g_error_free(error);
2434 fd->show_unused = show;
2436 i = g_key_file_get_integer(key_file, group_name, ACCT_TYPES, &error);
2439 g_warning(
"error reading group %s key %s: %s",
2440 group_name, ACCT_TYPES, error->message);
2441 g_error_free(error);
2445 fd->visible_types = i;
2448 count = g_key_file_get_integer(key_file, group_name, ACCT_COUNT, &error);
2451 for (i = 1; i <= count; i++)
2453 key = g_strdup_printf(ACCT_OPEN, i);
2454 value = g_key_file_get_string(key_file, group_name, key, &error);
2457 g_warning(
"error reading group %s key %s: %s",
2458 group_name, key, error->message);
2459 g_error_free(error);
2464 tree_restore_expanded_row(view, value);
2472 g_warning(
"error reading group %s key %s: %s",
2473 group_name, ACCT_COUNT, error->message);
2474 g_error_free(error);
2478 value = g_key_file_get_string(key_file, group_name, ACCT_SELECTED, NULL);
2481 tree_restore_selected_row(view, value);
2491 gnc_tree_view_account_name_edited_cb(
Account *account, GtkTreeViewColumn *col,
const gchar *new_name)
2499 if (existing != NULL && existing != account)
2501 PERR(
"account with the same name [%s] already exists.", new_name);
2509 gnc_tree_view_account_code_edited_cb(
Account *account, GtkTreeViewColumn *col,
const gchar *new_code)
2517 gnc_tree_view_account_description_edited_cb(
Account *account, GtkTreeViewColumn *col,
const gchar *new_desc)
2525 gnc_tree_view_account_notes_edited_cb(
Account *account, GtkTreeViewColumn *col,
const gchar *new_notes)
2534 GtkTreeViewColumn *column,
2535 GncTreeViewAccountColumnTextEdited edited_cb)
2537 GList *renderers_orig, *renderers;
2538 GtkCellRenderer *renderer;
2542 for (renderers_orig = renderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
2543 renderers && !GTK_IS_CELL_RENDERER_TEXT(renderers->data);
2544 renderers = renderers->next);
2545 renderer = GTK_CELL_RENDERER(renderers->data);
2546 g_list_free(renderers_orig);
2547 g_return_if_fail(renderer != NULL);
2548 gtva_setup_column_renderer_edited_cb(GNC_TREE_VIEW_ACCOUNT(view), column, renderer, edited_cb);
2553 GncTreeViewAccountColumnTextEdited edited_cb)
2556 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
2557 gtva_set_column_editor(view, priv->name_column, edited_cb);
2562 GncTreeViewAccountColumnTextEdited edited_cb)
2565 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
2566 gtva_set_column_editor(view, priv->code_column, edited_cb);
2571 GncTreeViewAccountColumnTextEdited edited_cb)
2574 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
2575 gtva_set_column_editor(view, priv->desc_column, edited_cb);
2580 GncTreeViewAccountColumnTextEdited edited_cb)
2583 priv = GNC_TREE_VIEW_ACCOUNT_GET_PRIVATE(view);
2584 gtva_set_column_editor(view, priv->notes_column, edited_cb);
2587 static gboolean gnc_tree_view_search_compare (GtkTreeModel *model, gint column,
const gchar *key, GtkTreeIter *iter, gpointer search_data)
2589 gchar *normalized_key;
2590 gchar *case_normalized_key = NULL;
2591 gboolean match = FALSE;
2593 normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL);
2595 case_normalized_key = g_utf8_casefold (normalized_key, -1);
2596 if (case_normalized_key)
2602 gchar *normalized_string;
2603 gchar *case_normalized_string = NULL;
2609 gtk_tree_model_get(model,iter,GNC_TREE_MODEL_ACCOUNT_COL_NAME,&str,-1);
2612 gtk_tree_model_get(model,iter,GNC_TREE_MODEL_ACCOUNT_COL_CODE,&str,-1);
2615 gtk_tree_model_get(model,iter,GNC_TREE_MODEL_ACCOUNT_COL_DESCRIPTION,&str,-1);
2622 normalized_string = g_utf8_normalize (str, -1, G_NORMALIZE_ALL);
2623 if (normalized_string)
2624 case_normalized_string = g_utf8_casefold (normalized_string, -1);
2625 if (case_normalized_string&&NULL!=strstr(case_normalized_string,case_normalized_key))
2629 g_free (normalized_string);
2630 g_free (case_normalized_string);
2637 g_free (normalized_key);
2638 g_free (case_normalized_key);
Account * gnc_account_get_parent(const Account *acc)
void gnc_tree_view_account_get_view_info(GncTreeViewAccount *account_view, AccountViewInfo *avi)
GtkTreeViewColumn * gnc_tree_view_account_add_property_column(GncTreeViewAccount *view, const gchar *column_title, const gchar *propname)
void qof_instance_get(const QofInstance *inst, const gchar *first_param,...)
Wrapper for g_object_get.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
GList * gnc_tree_view_account_get_selected_accounts(GncTreeViewAccount *view)
Account * gnc_tree_view_account_get_cursor_account(GncTreeViewAccount *view)
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *stock_icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
void xaccAccountSetNotes(Account *acc, const char *str)
int safe_utf8_collate(const char *da, const char *db)
GNCAccountType xaccAccountGetType(const Account *acc)
void gppat_filter_response_cb(GtkWidget *dialog, gint response, AccountFilterDialog *fd)
const char * xaccAccountGetCode(const Account *acc)
common utilities for manipulating a GtkTreeView within gnucash
#define DEBUG(format, args...)
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Account * gnc_tree_model_account_get_account(GncTreeModelAccount *model, GtkTreeIter *iter)
void xaccAccountSetCode(Account *acc, const char *str)
void gppat_filter_select_all_cb(GtkWidget *button, AccountFilterDialog *fd)
gboolean(* gnc_tree_view_account_filter_func)(Account *account, gpointer data)
gboolean gnc_numeric_zero_p(gnc_numeric a)
void gnc_tree_view_account_expand_to_account(GncTreeViewAccount *view, Account *account)
void gnc_tree_view_account_set_view_info(GncTreeViewAccount *account_view, AccountViewInfo *avi)
void gnc_tree_view_set_show_column_menu(GncTreeView *view, gboolean visible)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
void gppat_filter_clear_all_cb(GtkWidget *button, AccountFilterDialog *fd)
#define PERR(format, args...)
GtkTreeViewColumn * gnc_tree_view_add_numeric_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_color_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
#define ENTER(format, args...)
gboolean gnc_tree_model_account_get_iter_from_account(GncTreeModelAccount *model, Account *account, GtkTreeIter *iter)
gnc_commodity * gnc_default_report_currency(void)
void gnc_tree_view_account_set_selected_accounts(GncTreeViewAccount *view, GList *account_list, gboolean show_last)
gnc_commodity * gnc_default_currency(void)
void gppat_filter_show_hidden_toggled_cb(GtkToggleButton *button, AccountFilterDialog *fd)
gboolean xaccAccountIsHidden(const Account *acc)
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
int xaccAccountOrder(const Account *aa, const Account *ab)
gint gnc_tree_view_append_column(GncTreeView *view, GtkTreeViewColumn *column)
GtkTreeModel implementation for gnucash account tree.
GtkTreeViewColumn * gnc_tree_view_add_toggle_column(GncTreeView *view, const gchar *column_title, const gchar *column_short_title, const gchar *pref_name, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn, renderer_toggled toggle_edited_cb)
void gnc_tree_view_account_set_filter(GncTreeViewAccount *view, gnc_tree_view_account_filter_func func, gpointer data, GSourceFunc destroy)
GtkCellRenderer * gnc_tree_view_column_get_renderer(GtkTreeViewColumn *column)
QofBook * qof_session_get_book(const QofSession *session)
gchar * gnc_account_get_full_name(const Account *account)
Account handling public routines.
void gnc_tree_view_account_select_subaccounts(GncTreeViewAccount *view, Account *account)
void xaccAccountSetPlaceholder(Account *acc, gboolean val)
void gnc_tree_view_account_refilter(GncTreeViewAccount *view)
GtkTreeView implementation for gnucash account tree.
GtkTreeModel * gnc_tree_model_account_new(Account *root)
GtkTreeViewColumn * gnc_tree_view_account_add_custom_column(GncTreeViewAccount *account_view, const gchar *column_title, GncTreeViewAccountColumnSource col_source_cb, GncTreeViewAccountColumnTextEdited col_edited_cb)
GtkTreeView * gnc_tree_view_account_new_with_root(Account *root, gboolean show_root)
const char * xaccAccountGetDescription(const Account *acc)
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
void gnc_tree_view_configure_columns(GncTreeView *view)
General utilities for dealing with accounting periods.
gboolean gnc_plugin_page_account_tree_filter_accounts(Account *account, gpointer user_data)
Account * gnc_tree_view_account_get_account_from_iter(GtkTreeModel *s_model, GtkTreeIter *s_iter)
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
Account * gnc_tree_view_account_get_account_from_path(GncTreeViewAccount *view, GtkTreePath *s_path)
All type declarations for the whole Gnucash engine.
GtkTreeModel implementation to display account types in a GtkTreeView.
Generic api to store and retrieve preferences.
gint64 xaccAccountCountSplits(const Account *acc, gboolean include_children)
void gnc_tree_view_account_set_selected_account(GncTreeViewAccount *view, Account *account)
void gppat_filter_show_unused_toggled_cb(GtkToggleButton *button, AccountFilterDialog *fd)
gint gnc_tree_view_account_count_children(GncTreeViewAccount *view, Account *account)
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)
Account * gnc_tree_view_account_get_selected_account(GncTreeViewAccount *view)
#define LEAVE(format, args...)
void xaccAccountSetDescription(Account *acc, const char *str)
const char * xaccAccountGetName(const Account *acc)
const char * xaccAccountGetTypeStr(GNCAccountType type)
void xaccAccountSetName(Account *acc, const char *str)
Commodity handling public routines.
void gppat_filter_select_default_cb(GtkWidget *button, AccountFilterDialog *fd)
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)
void gppat_filter_show_zero_toggled_cb(GtkToggleButton *button, AccountFilterDialog *fd)