28 #include <glib/gi18n.h> 38 #include "gnc-component-manager.h" 42 #include "gnc-hooks.h" 43 #include "gnc-session.h" 44 #include "gnc-icons.h" 45 #include "gnc-ui-balances.h" 46 #include "dialog-utils.h" 47 #include "window-main-summarybar.h" 49 #define SAMPLE_OWNER_VALUE "$1,000,000.00" 54 static QofLogModule log_module = GNC_MOD_GUI;
59 static void gnc_tree_view_owner_finalize (GObject *
object);
61 static void gtvo_update_column_names (
GncTreeView *view);
62 static void gtvo_currency_changed_cb (
void);
64 static gboolean gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
69 static void gtvo_setup_column_renderer_edited_cb(
GncTreeViewOwner *owner_view,
70 GtkTreeViewColumn *column,
71 GtkCellRenderer *renderer,
72 GncTreeViewOwnerColumnTextEdited col_edited_cb);
81 GSourceFunc filter_destroy;
83 GtkTreeViewColumn *name_column;
84 GtkTreeViewColumn *id_column;
85 GtkTreeViewColumn *balance_report_column;
86 GtkTreeViewColumn *notes_column;
89 #define GNC_TREE_VIEW_OWNER_GET_PRIVATE(o) \ 90 ((GncTreeViewOwnerPrivate*)gnc_tree_view_owner_get_instance_private((GncTreeViewOwner*)o)) 97 static GObjectClass *parent_class = NULL;
99 G_DEFINE_TYPE_WITH_PRIVATE(
GncTreeViewOwner, gnc_tree_view_owner, GNC_TYPE_TREE_VIEW)
104 GObjectClass *o_class;
106 parent_class = g_type_class_peek_parent (klass);
109 o_class = G_OBJECT_CLASS (klass);
110 o_class->finalize = gnc_tree_view_owner_finalize;
112 gnc_hook_add_dangler(HOOK_CURRENCY_CHANGED,
113 (GFunc)gtvo_currency_changed_cb, NULL, NULL);
124 gnc_init_owner_view_info(OwnerViewInfo *ovi)
126 ovi->show_inactive = FALSE;
134 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
135 gnc_init_owner_view_info(&priv->ovi);
139 gnc_tree_view_owner_finalize (GObject *
object)
144 ENTER(
"view %p",
object);
145 g_return_if_fail (
object != NULL);
146 g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (
object));
148 owner_view = GNC_TREE_VIEW_OWNER (
object);
150 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(owner_view);
151 if (priv->filter_destroy)
153 priv->filter_destroy(priv->filter_data);
154 priv->filter_destroy = NULL;
156 priv->filter_fn = NULL;
158 if (G_OBJECT_CLASS (parent_class)->finalize)
159 (* G_OBJECT_CLASS (parent_class)->finalize) (
object);
168 gnc_tree_view_owner_active_toggled (GtkCellRendererToggle *cell,
169 const gchar *s_path_str,
178 tree_view = user_data;
179 s_path = gtk_tree_path_new_from_string (s_path_str);
183 active = !gtk_cell_renderer_toggle_get_active (cell);
184 gncOwnerSetActive (owner, active);
188 gtk_tree_path_free (s_path);
196 static GtkTreeModel *
197 sort_cb_setup_w_iters (GtkTreeModel *f_model,
198 GtkTreeIter *f_iter_a,
199 GtkTreeIter *f_iter_b,
207 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
208 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
211 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
220 sort_cb_setup (GtkTreeModel *f_model,
221 GtkTreeIter *f_iter_a,
222 GtkTreeIter *f_iter_b,
226 GtkTreeIter iter_a, iter_b;
228 sort_cb_setup_w_iters (f_model, f_iter_a, f_iter_b,
229 &iter_a, &iter_b, owner_a, owner_b);
233 sort_by_string (GtkTreeModel *f_model,
234 GtkTreeIter *f_iter1,
235 GtkTreeIter *f_iter2,
239 GtkTreeIter iter1, iter2;
242 gint column = GPOINTER_TO_INT(user_data);
245 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
248 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1);
249 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1);
260 sort_by_boolean (GtkTreeModel *f_model,
261 GtkTreeIter *f_iter1,
262 GtkTreeIter *f_iter2,
266 GtkTreeIter iter1, iter2;
268 gboolean *bool1, *bool2;
269 gint column = GPOINTER_TO_INT(user_data);
271 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
274 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &bool1, -1);
275 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &bool2, -1);
291 sort_by_xxx_value (GtkTreeModel *f_model,
292 GtkTreeIter *f_iter_a,
293 GtkTreeIter *f_iter_b,
297 gnc_numeric balance_a, balance_b;
301 sort_cb_setup (f_model, f_iter_a, f_iter_b, (
const GncOwner**)&owner_a, (
const GncOwner**)&owner_b);
303 balance_a = gnc_ui_owner_get_balance_full(owner_a, NULL, NULL);
304 balance_b = gnc_ui_owner_get_balance_full(owner_b, NULL, NULL);
313 sort_by_balance_value (GtkTreeModel *f_model,
314 GtkTreeIter *f_iter_a,
315 GtkTreeIter *f_iter_b,
318 return sort_by_xxx_value (f_model, f_iter_a, f_iter_b, user_data);
336 GtkTreeModel *model, *f_model, *s_model;
337 const gchar *sample_type, *sample_currency;
338 const gchar *owner_name = NULL, * owner_id = NULL;
345 case GNC_OWNER_NONE :
346 case GNC_OWNER_UNDEFINED :
347 PWARN(
"missing owner_type");
348 owner_name = _(
"Name");
349 owner_id = _(
"ID #");
351 case GNC_OWNER_CUSTOMER :
352 owner_name = _(
"Company Name");
353 owner_id = _(
"Customer Number");
356 owner_name = _(
"Job Name");
357 owner_id = _(
"Job Number");
359 case GNC_OWNER_VENDOR :
360 owner_name = _(
"Company Name");
361 owner_id = _(
"Vendor Number");
363 case GNC_OWNER_EMPLOYEE :
364 owner_name = _(
"Employee Name");
365 owner_id = _(
"Employee Number");
369 view = g_object_new (GNC_TYPE_TREE_VIEW_OWNER,
370 "name",
"gnc-id-owner-tree", NULL);
372 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(GNC_TREE_VIEW_OWNER (view));
378 f_model = gtk_tree_model_filter_new (model, NULL);
381 g_object_unref(G_OBJECT(model));
384 s_model = gtk_tree_model_sort_new_with_model(f_model);
385 g_object_unref(G_OBJECT(f_model));
386 gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
387 g_object_unref(G_OBJECT(s_model));
390 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
397 NULL,
"GnuCash Inc.",
398 GNC_TREE_MODEL_OWNER_COL_NAME,
399 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
403 GNC_TREE_MODEL_OWNER_COL_TYPE,
404 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
409 GNC_TREE_MODEL_OWNER_COL_ID,
410 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
413 NULL, sample_currency,
414 GNC_TREE_MODEL_OWNER_COL_CURRENCY,
415 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
418 NULL,
"GnuCash Inc.",
419 GNC_TREE_MODEL_OWNER_COL_ADDRESS_NAME,
420 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
423 NULL,
"Free Software Foundation",
424 GNC_TREE_MODEL_OWNER_COL_ADDRESS_1,
425 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
428 NULL,
"51 Franklin Street, Fifth Floor",
429 GNC_TREE_MODEL_OWNER_COL_ADDRESS_2,
430 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
433 NULL,
"Boston, MA 02110-1301",
434 GNC_TREE_MODEL_OWNER_COL_ADDRESS_3,
435 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
439 GNC_TREE_MODEL_OWNER_COL_ADDRESS_4,
440 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
443 NULL,
"+1-617-542-5942",
444 GNC_TREE_MODEL_OWNER_COL_PHONE,
445 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
448 NULL,
"+1-617-542-2652",
449 GNC_TREE_MODEL_OWNER_COL_FAX,
450 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
454 GNC_TREE_MODEL_OWNER_COL_EMAIL,
455 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
459 GNC_TREE_MODEL_OWNER_COL_BALANCE,
460 GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
461 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
462 sort_by_balance_value);
464 priv->balance_report_column
467 GNC_TREE_MODEL_OWNER_COL_BALANCE_REPORT,
468 GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
469 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
470 sort_by_balance_value);
474 "Sample owner notes.",
475 GNC_TREE_MODEL_OWNER_COL_NOTES,
476 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
479 C_(
"Column letter for 'Active'",
"A"),
480 GNC_OWNER_TREE_ACTIVE_COL,
481 GNC_TREE_MODEL_OWNER_COL_ACTIVE,
482 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
484 gnc_tree_view_owner_active_toggled);
487 gtvo_update_column_names(view);
491 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model),
492 gnc_tree_view_owner_filter_helper,
497 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model),
498 GNC_TREE_MODEL_OWNER_COL_NAME,
501 gtk_widget_show(GTK_WIDGET(view));
503 return GTK_TREE_VIEW(view);
510 #define debug_path(fn, path) { \ 511 gchar *path_string = gtk_tree_path_to_string(path); \ 512 fn("tree path %s", path_string); \ 513 g_free(path_string); \ 521 GtkTreeModel *model, *f_model, *s_model;
522 GtkTreePath *path, *f_path, *s_path;
524 ENTER(
"view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
533 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
534 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
535 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
544 f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path);
545 gtk_tree_path_free(path);
548 LEAVE(
"no filter path");
553 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path);
554 gtk_tree_path_free(f_path);
555 debug_path(
LEAVE, s_path);
564 GtkTreeModel *model, *f_model, *s_model;
565 GtkTreeIter iter, f_iter;
567 g_return_val_if_fail(GNC_IS_TREE_VIEW_OWNER(view), FALSE);
568 g_return_val_if_fail(owner != NULL, FALSE);
569 g_return_val_if_fail(s_iter != NULL, FALSE);
571 ENTER(
"view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
574 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
575 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
576 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
578 GNC_TREE_MODEL_OWNER(model), owner, &iter))
580 LEAVE(
"model_get_iter_from_owner failed");
585 gtk_tree_model_filter_convert_child_iter_to_iter (
586 GTK_TREE_MODEL_FILTER(f_model), &f_iter, &iter);
587 gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model),
599 gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
607 g_return_val_if_fail (GNC_IS_TREE_MODEL_OWNER (model), FALSE);
608 g_return_val_if_fail (iter != NULL, FALSE);
611 GNC_TREE_MODEL_OWNER(model), iter);
613 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
615 return priv->filter_fn(owner, priv->filter_data);
634 ENTER(
"view %p, filter func %p, data %p, destroy %p",
635 view, func, data, destroy);
637 g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
639 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
640 if (priv->filter_destroy)
642 priv->filter_destroy(priv->filter_data);
644 priv->filter_destroy = destroy;
645 priv->filter_data = data;
646 priv->filter_fn = func;
658 GtkTreeModel *f_model, *s_model;
660 g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
662 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
663 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
664 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
679 GtkTreeModel *model, *f_model, *s_model;
680 GtkTreePath *path, *f_path;
684 ENTER(
"view %p", view);
685 g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
686 g_return_val_if_fail (s_path != NULL, NULL);
688 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
689 f_path = gtk_tree_model_sort_convert_path_to_child_path (
690 GTK_TREE_MODEL_SORT (s_model), s_path);
693 LEAVE(
"no filter path");
697 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
698 path = gtk_tree_model_filter_convert_path_to_child_path (
699 GTK_TREE_MODEL_FILTER (f_model), f_path);
700 gtk_tree_path_free(f_path);
707 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
708 if (!gtk_tree_model_get_iter (model, &iter, path))
714 owner = iter.user_data;
715 gtk_tree_path_free(path);
716 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
725 GtkTreeModel *model, *f_model;
726 GtkTreeIter iter, f_iter;
729 g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT(s_model), NULL);
730 g_return_val_if_fail (s_iter != NULL, NULL);
732 ENTER(
"model %p, iter %p", s_model, s_iter);
734 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(s_model),
737 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
738 gtk_tree_model_filter_convert_iter_to_child_iter (
739 GTK_TREE_MODEL_FILTER(f_model), &iter, &f_iter);
740 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
742 GNC_TREE_MODEL_OWNER(model), &iter);
743 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
755 GtkTreeSelection *selection;
756 GtkTreeModel *f_model, *s_model;
757 GtkTreeIter iter, f_iter, s_iter;
759 GtkSelectionMode mode;
761 ENTER(
"view %p", view);
762 g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
764 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
765 mode = gtk_tree_selection_get_mode(selection);
766 if ((mode != GTK_SELECTION_SINGLE) && (mode != GTK_SELECTION_BROWSE))
770 if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter))
772 LEAVE(
"no owner, get_selected failed");
776 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
779 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
780 gtk_tree_model_filter_convert_iter_to_child_iter (
781 GTK_TREE_MODEL_FILTER (f_model), &iter, &f_iter);
783 owner = iter.user_data;
784 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
796 GtkTreeModel *model, *f_model, *s_model;
797 GtkTreePath *path, *f_path, *s_path;
798 GtkTreeSelection *selection;
800 ENTER(
"view %p, owner %p (%s)", view,
801 owner, gncOwnerGetName (owner));
802 g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (view));
805 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
806 gtk_tree_selection_unselect_all (selection);
811 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
812 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
813 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
816 GNC_TREE_MODEL_OWNER(model), owner);
822 debug_path(
DEBUG, path);
824 f_path = gtk_tree_model_filter_convert_child_path_to_path (
825 GTK_TREE_MODEL_FILTER (f_model), path);
826 gtk_tree_path_free(path);
829 LEAVE(
"no filter path");
832 debug_path(
DEBUG, f_path);
834 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
836 gtk_tree_path_free(f_path);
839 LEAVE(
"no sort path");
843 gtk_tree_selection_select_path (selection, s_path);
847 while (gtk_events_pending ())
848 gtk_main_iteration ();
849 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
850 debug_path(
LEAVE, s_path);
851 gtk_tree_path_free(s_path);
868 get_selected_owners_helper (GtkTreeModel *s_model,
874 GtkTreeModel *f_model;
875 GtkTreeIter iter, f_iter;
878 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
881 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
882 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
884 owner = iter.user_data;
887 if (gtvsi->priv->filter_fn == NULL || gtvsi->priv->filter_fn(owner, gtvsi->priv->filter_data))
889 gtvsi->return_list = g_list_append(gtvsi->return_list, owner);
899 gtvo_update_column_name (GtkTreeViewColumn *column,
901 const gchar *mnemonic)
905 g_return_if_fail(column);
907 name = g_strdup_printf(fmt, mnemonic);
908 gtk_tree_view_column_set_title(column, name);
917 const gchar *mnemonic;
919 priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
922 gtvo_update_column_name(priv->balance_report_column,
924 _(
"Balance (%s)"), mnemonic);
931 gtvo_currency_changed_cb (
void)
933 const GList *views, *ptr;
936 for (ptr = views; ptr; ptr = g_list_next(ptr))
938 gtvo_update_column_names (ptr->data);
946 owner_cell_kvp_data_func (GtkTreeViewColumn *tree_column,
947 GtkCellRenderer *cell,
948 GtkTreeModel *s_model,
953 GValue v = G_VALUE_INIT;
955 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
958 if (G_VALUE_HOLDS_STRING)
959 g_object_set (G_OBJECT (cell),
960 "text", g_value_get_string (&v),
966 static void col_edited_helper(GtkCellRendererText *cell, gchar *path_string,
967 gchar *new_text, gpointer _s_model)
970 GtkTreeModel *s_model;
972 GncTreeViewOwnerColumnTextEdited col_edited_cb;
973 GtkTreeViewColumn *col;
975 col_edited_cb = g_object_get_data(G_OBJECT(cell),
976 "column_edited_callback");
977 col = GTK_TREE_VIEW_COLUMN(g_object_get_data(G_OBJECT(cell),
979 s_model = GTK_TREE_MODEL(_s_model);
981 if (!gtk_tree_model_get_iter_from_string(s_model, &s_iter, path_string))
985 col_edited_cb(owner, col, new_text);
988 static void col_source_helper(GtkTreeViewColumn *col, GtkCellRenderer *cell,
989 GtkTreeModel *s_model, GtkTreeIter *s_iter,
990 gpointer _col_source_cb)
994 GncTreeViewOwnerColumnSource col_source_cb;
996 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
997 col_source_cb = (GncTreeViewOwnerColumnSource) _col_source_cb;
999 text = col_source_cb(owner, col, cell);
1000 g_object_set (G_OBJECT (cell),
"text", text,
"xalign", 1.0, NULL);
1010 GtkTreeViewColumn *column,
1011 GtkCellRenderer *renderer,
1012 GncTreeViewOwnerColumnTextEdited col_edited_cb)
1014 GtkTreeModel *s_model;
1016 if (col_edited_cb == NULL)
1018 g_object_set(G_OBJECT(renderer),
"editable", FALSE, NULL);
1019 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback", col_edited_cb);
1020 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1021 g_signal_handlers_disconnect_by_func(G_OBJECT(renderer), col_edited_cb, s_model);
1022 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1026 g_object_set(G_OBJECT(renderer),
"editable", TRUE, NULL);
1027 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback",
1029 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1030 g_signal_connect(G_OBJECT(renderer),
"edited",
1031 (GCallback) col_edited_helper, s_model);
1032 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1038 #define FILTER_TREE_VIEW "types_tree_view" 1058 ENTER(
"owner %p:%s", owner, gncOwnerGetName(owner));
1060 if (!fd->show_inactive && !gncOwnerGetActive (owner))
1062 LEAVE(
" hide: inactive");
1066 if (!fd->show_zero_total)
1071 LEAVE(
" hide: zero balance");
1089 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1091 ENTER(
"button %p", button);
1092 fd->show_inactive = !gtk_toggle_button_get_active(button);
1094 LEAVE(
"show_inactive %d", fd->show_inactive);
1107 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1109 ENTER(
"button %p", button);
1110 fd->show_zero_total = gtk_toggle_button_get_active(button);
1112 LEAVE(
"show_zero %d", fd->show_zero_total);
1131 g_return_if_fail(GTK_IS_DIALOG(dialog));
1133 ENTER(
"dialog %p, response %d", dialog, response);
1135 if (response != GTK_RESPONSE_OK)
1137 fd->show_inactive = fd->original_show_inactive;
1138 fd->show_zero_total = fd->original_show_zero_total;
1143 gptemp = (gpointer)fd->dialog;
1144 g_atomic_pointer_compare_and_exchange(&gptemp,
1145 (gpointer)dialog, NULL);
1146 fd->dialog = gptemp;
1147 gtk_widget_destroy(dialog);
1154 GtkWidget *dialog, *button;
1155 GtkBuilder *builder;
1158 ENTER(
"(fd %p, page %p)", fd, page);
1162 gtk_window_present(GTK_WINDOW(fd->dialog));
1163 LEAVE(
"existing dialog");
1168 builder = gtk_builder_new();
1169 gnc_builder_add_from_file (builder,
"gnc-tree-view-owner.glade",
"filter_by_dialog");
1170 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_by_dialog"));
1171 fd->dialog = dialog;
1172 gtk_window_set_transient_for(GTK_WINDOW(dialog),
1173 GTK_WINDOW(GNC_PLUGIN_PAGE(page)->window));
1175 title = g_strdup_printf(_(
"Filter %s by..."),
1177 gtk_window_set_title(GTK_WINDOW(dialog), title);
1181 fd->original_show_inactive = fd->show_inactive;
1182 fd->original_show_zero_total = fd->show_zero_total;
1185 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_inactive"));
1186 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1187 !fd->show_inactive);
1188 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_zero"));
1189 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1190 fd->show_zero_total);
1193 gtk_builder_connect_signals (builder, fd);
1194 g_object_unref(G_OBJECT(builder));
1197 gtk_widget_show_all (dialog);
1201 #define OWNER_SELECTED_LABEL "SelectedOwner" 1202 #define SHOW_INACTIVE_LABEL "ShowInactive" 1203 #define SHOW_ZERO_LABEL "ShowZeroTotal" 1208 const gchar *group_name;
1226 bar_t *bar = user_data;
1227 const gchar *owner_name;
1233 owner_name = gncOwnerGetName (owner);
1234 if (owner_name == NULL)
1237 g_key_file_set_string(bar->key_file, bar->group_name, OWNER_SELECTED_LABEL,
1244 GKeyFile *key_file,
const gchar *group_name)
1248 g_return_if_fail (key_file != NULL);
1249 g_return_if_fail (group_name != NULL);
1251 ENTER(
"view %p, key_file %p, group_name %s", view, key_file,
1254 g_key_file_set_boolean(key_file, group_name, SHOW_INACTIVE_LABEL,
1256 g_key_file_set_boolean(key_file, group_name, SHOW_ZERO_LABEL,
1257 fd->show_zero_total);
1259 bar.key_file = key_file;
1260 bar.group_name = group_name;
1261 tree_save_selected_row(view, &bar);
1275 GncOwnerType owner_type,
1276 const gchar *owner_guid_str)
1291 GKeyFile *key_file,
const gchar *group_name,
1292 GncOwnerType owner_type)
1294 GError *error = NULL;
1299 show = g_key_file_get_boolean(key_file, group_name, SHOW_INACTIVE_LABEL, &error);
1302 g_warning(
"error reading group %s key %s: %s",
1303 group_name, SHOW_INACTIVE_LABEL, error->message);
1304 g_error_free(error);
1308 fd->show_inactive = show;
1310 show = g_key_file_get_boolean(key_file, group_name, SHOW_ZERO_LABEL, &error);
1313 g_warning(
"error reading group %s key %s: %s",
1314 group_name, SHOW_ZERO_LABEL, error->message);
1315 g_error_free(error);
1319 fd->show_zero_total = show;
1322 value = g_key_file_get_string(key_file, group_name, OWNER_SELECTED_LABEL, NULL);
1325 tree_restore_selected_row(view, owner_type, value);
1336 GtkTreeViewColumn *column,
1337 GncTreeViewOwnerColumnTextEdited edited_cb)
1339 GList *renderers_orig, *renderers;
1340 GtkCellRenderer *renderer;
1344 for (renderers_orig = renderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
1345 renderers && !GTK_IS_CELL_RENDERER_TEXT(renderers->data);
1346 renderers = renderers->next);
1347 renderer = GTK_CELL_RENDERER(renderers->data);
1348 g_list_free(renderers_orig);
1349 g_return_if_fail(renderer != NULL);
1350 gtvo_setup_column_renderer_edited_cb(GNC_TREE_VIEW_OWNER(view), column, renderer, edited_cb);
void gnc_tree_view_owner_set_selected_owner(GncTreeViewOwner *view, GncOwner *owner)
This function selects an owner in the owner tree view.
GtkTreeView * gnc_tree_view_owner_new(GncOwnerType owner_type)
Create a new owner tree view for one type of owners.
Business Interface: Object OWNERs.
The instance data structure for a content plugin.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
Get a list of all known objects of a specified type.
void gnc_tree_view_owner_set_filter(GncTreeViewOwner *view, gnc_tree_view_owner_filter_func func, gpointer data, GSourceFunc destroy)
This function attaches a filter function to the given owner tree.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
void gnc_tree_view_owner_refilter(GncTreeViewOwner *view)
This function forces the owner tree filter to be evaluated.
GtkTreeView implementation for gnucash owner tree.
GtkTreeModel implementation for gnucash owner tree.
int safe_utf8_collate(const char *da, const char *db)
Collate two UTF-8 strings.
common utilities for manipulating a GtkTreeView within gnucash
GncOwner * gnc_tree_view_owner_get_owner_from_iter(GtkTreeModel *s_model, GtkTreeIter *s_iter)
This function returns the owner associated with the specified iter.
gboolean(* gnc_tree_view_owner_filter_func)(GncOwner *owner, gpointer data)
This is the description of a filter function used by the owner tree.
#define DEBUG(format, args...)
Print a debugging message.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
gboolean string_to_guid(const gchar *string, GncGUID *guid)
Given a string, replace the given guid with the parsed one unless the given value is null...
void gppot_filter_response_cb(GtkWidget *dialog, gint response, OwnerFilterDialog *fd)
The Filter dialog was closed.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
void gnc_tree_view_set_show_column_menu(GncTreeView *view, gboolean visible)
This function is called to set the "show-column-menu" property on this view.
int gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
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)
This function adds a new numeric column to a GncTreeView base view.
#define ENTER(format, args...)
Print a function entry debugging message.
gnc_commodity * gnc_default_report_currency(void)
Return the default currency for use in reports, as set by the user.
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
#define PWARN(format, args...)
Log a warning.
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)
This function adds a new toggle column to a GncTreeView base view.
QofBook * qof_session_get_book(const QofSession *session)
Returns the QofBook of this session.
GtkTreeModel * gnc_tree_model_owner_new(GncOwnerType owner_type)
Create a new GtkTreeModel for manipulating gnucash owners.
gnc_numeric gncOwnerGetBalanceInCurrency(const GncOwner *owner, const gnc_commodity *report_currency)
Given an owner, extract the open balance from the owner and then convert it to the desired currency...
void gnc_tree_view_configure_columns(GncTreeView *view)
Make all the correct columns visible, respecting their default visibility setting, their "always" visibility setting, and the last saved state if available.
General utilities for dealing with accounting periods.
int gncOwnerCompare(const GncOwner *a, const GncOwner *b)
Sort on name.
void gppot_filter_show_inactive_toggled_cb(GtkToggleButton *button, OwnerFilterDialog *fd)
The "only show active" button in the Filter dialog changed state.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
QofIdTypeConst gncOwnerTypeToQofIdType(GncOwnerType t)
Returns the QofIdType of the given GncOwnerType, or NULL if no suitable one exists.
GtkTreePath * gnc_tree_model_owner_get_path_from_owner(GncTreeModelOwner *model, GncOwner *owner)
Convert a model/owner pair into a gtk_tree_model_path.
GncOwner * gnc_tree_model_owner_get_owner(GncTreeModelOwner *model, GtkTreeIter *iter)
Convert a model/iter pair to a gnucash owner.
All type declarations for the whole Gnucash engine.
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new text column to a GncTreeView base view.
gboolean gnc_tree_model_owner_get_iter_from_owner(GncTreeModelOwner *model, GncOwner *owner, GtkTreeIter *iter)
Convert a model/owner pair into a gtk_tree_model_iter.
#define LEAVE(format, args...)
Print a function exit debugging message.
void gppot_filter_show_zero_toggled_cb(GtkToggleButton *button, OwnerFilterDialog *fd)
The "show zero totals" button in the Filter dialog changed state.
GncOwner * gnc_tree_view_owner_get_selected_owner(GncTreeViewOwner *view)
This function returns the owner associated with the selected item in the owner tree view...
GncOwner * gnc_tree_view_owner_get_owner_from_path(GncTreeViewOwner *view, GtkTreePath *s_path)
This function returns the owner associated with the specified path.
gboolean gnc_plugin_page_owner_tree_filter_owners(GncOwner *owner, gpointer user_data)
This function tells the owner tree view whether or not to filter out a particular owner...
The type used to store guids in C.
GncOwner * gncOwnerNew(void)
These two functions are mainly for the convenience of scheme code.
Commodity handling public routines.