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;
57 static void gnc_tree_view_owner_finalize (GObject *
object);
59 static void gtvo_update_column_names (GncTreeViewOwner *view);
60 static void gtvo_currency_changed_cb (
void);
62 static gboolean gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
67 static void gtvo_setup_column_renderer_edited_cb(GncTreeViewOwner *owner_view,
68 GtkTreeViewColumn *column,
69 GtkCellRenderer *renderer,
70 GncTreeViewOwnerColumnTextEdited col_edited_cb);
75 GncTreeView gnc_tree_view;
82 GSourceFunc filter_destroy;
84 GtkTreeViewColumn *name_column;
85 GtkTreeViewColumn *id_column;
86 GtkTreeViewColumn *balance_report_column;
87 GtkTreeViewColumn *notes_column;
95 G_DEFINE_TYPE(GncTreeViewOwner, gnc_tree_view_owner, GNC_TYPE_TREE_VIEW)
98 gnc_tree_view_owner_class_init (GncTreeViewOwnerClass *klass)
100 GObjectClass *o_class;
103 o_class = G_OBJECT_CLASS (klass);
104 o_class->finalize = gnc_tree_view_owner_finalize;
106 gnc_hook_add_dangler(HOOK_CURRENCY_CHANGED,
107 (GFunc)gtvo_currency_changed_cb, NULL, NULL);
118 gnc_init_owner_view_info(OwnerViewInfo *ovi)
120 ovi->show_inactive = FALSE;
124 gnc_tree_view_owner_init (GncTreeViewOwner *view)
126 gnc_init_owner_view_info(&view->ovi);
130 gnc_tree_view_owner_finalize (GObject *
object)
132 ENTER(
"view %p",
object);
133 g_return_if_fail (
object != NULL);
134 g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (
object));
136 GncTreeViewOwner *view = GNC_TREE_VIEW_OWNER (
object);
138 if (view->filter_destroy)
140 view->filter_destroy(view->filter_data);
141 view->filter_destroy = NULL;
143 view->filter_fn = NULL;
145 G_OBJECT_CLASS (gnc_tree_view_owner_parent_class)->finalize (
object);
154 gnc_tree_view_owner_active_toggled (GtkCellRendererToggle *cell,
155 const gchar *s_path_str,
158 GncTreeViewOwner *tree_view;
164 tree_view = user_data;
165 s_path = gtk_tree_path_new_from_string (s_path_str);
169 active = !gtk_cell_renderer_toggle_get_active (cell);
170 gncOwnerSetActive (owner, active);
174 gtk_tree_path_free (s_path);
182 static GtkTreeModel *
183 sort_cb_setup_w_iters (GtkTreeModel *f_model,
184 GtkTreeIter *f_iter_a,
185 GtkTreeIter *f_iter_b,
193 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
194 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
197 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
206 sort_cb_setup (GtkTreeModel *f_model,
207 GtkTreeIter *f_iter_a,
208 GtkTreeIter *f_iter_b,
212 GtkTreeIter iter_a, iter_b;
214 sort_cb_setup_w_iters (f_model, f_iter_a, f_iter_b,
215 &iter_a, &iter_b, owner_a, owner_b);
219 sort_by_string (GtkTreeModel *f_model,
220 GtkTreeIter *f_iter1,
221 GtkTreeIter *f_iter2,
225 GtkTreeIter iter1, iter2;
228 gint column = GPOINTER_TO_INT(user_data);
231 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
234 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1);
235 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1);
246 sort_by_string_natural (GtkTreeModel *f_model,
247 GtkTreeIter *f_iter1,
248 GtkTreeIter *f_iter2,
252 GtkTreeIter iter1, iter2;
253 gint column = GPOINTER_TO_INT(user_data);
258 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
260 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1);
261 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1);
275 sort_by_boolean (GtkTreeModel *f_model,
276 GtkTreeIter *f_iter1,
277 GtkTreeIter *f_iter2,
281 GtkTreeIter iter1, iter2;
283 gboolean *bool1, *bool2;
284 gint column = GPOINTER_TO_INT(user_data);
286 model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
289 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &bool1, -1);
290 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &bool2, -1);
306 sort_by_xxx_value (GtkTreeModel *f_model,
307 GtkTreeIter *f_iter_a,
308 GtkTreeIter *f_iter_b,
312 gnc_numeric balance_a, balance_b;
316 sort_cb_setup (f_model, f_iter_a, f_iter_b, (
const GncOwner**)&owner_a, (
const GncOwner**)&owner_b);
318 balance_a = gnc_ui_owner_get_balance_full(owner_a, NULL, NULL);
319 balance_b = gnc_ui_owner_get_balance_full(owner_b, NULL, NULL);
328 sort_by_balance_value (GtkTreeModel *f_model,
329 GtkTreeIter *f_iter_a,
330 GtkTreeIter *f_iter_b,
333 return sort_by_xxx_value (f_model, f_iter_a, f_iter_b, user_data);
350 GtkTreeModel *model, *f_model, *s_model;
351 const gchar *sample_type, *sample_currency;
352 const gchar *owner_name = NULL, * owner_id = NULL;
358 case GNC_OWNER_NONE :
359 case GNC_OWNER_UNDEFINED :
360 PWARN(
"missing owner_type");
361 owner_name = _(
"Name");
362 owner_id = _(
"ID #");
364 case GNC_OWNER_CUSTOMER :
365 owner_name = _(
"Company Name");
366 owner_id = _(
"Customer Number");
369 owner_name = _(
"Job Name");
370 owner_id = _(
"Job Number");
372 case GNC_OWNER_VENDOR :
373 owner_name = _(
"Company Name");
374 owner_id = _(
"Vendor Number");
376 case GNC_OWNER_EMPLOYEE :
377 owner_name = _(
"Employee Name");
378 owner_id = _(
"Employee Number");
382 GncTreeViewOwner *view = g_object_new (GNC_TYPE_TREE_VIEW_OWNER,
383 "name",
"gnc-id-owner-tree", NULL);
389 f_model = gtk_tree_model_filter_new (model, NULL);
392 g_object_unref(G_OBJECT(model));
395 s_model = gtk_tree_model_sort_new_with_model(f_model);
396 g_object_unref(G_OBJECT(f_model));
397 gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
398 g_object_unref(G_OBJECT(s_model));
401 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
408 NULL,
"GnuCash Inc.",
409 GNC_TREE_MODEL_OWNER_COL_NAME,
410 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
414 GNC_TREE_MODEL_OWNER_COL_TYPE,
415 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
420 GNC_TREE_MODEL_OWNER_COL_ID,
421 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
422 sort_by_string_natural);
424 NULL, sample_currency,
425 GNC_TREE_MODEL_OWNER_COL_CURRENCY,
426 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
429 NULL,
"GnuCash Inc.",
430 GNC_TREE_MODEL_OWNER_COL_ADDRESS_NAME,
431 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
434 NULL,
"Free Software Foundation",
435 GNC_TREE_MODEL_OWNER_COL_ADDRESS_1,
436 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
439 NULL,
"51 Franklin Street, Fifth Floor",
440 GNC_TREE_MODEL_OWNER_COL_ADDRESS_2,
441 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
444 NULL,
"Boston, MA 02110-1301",
445 GNC_TREE_MODEL_OWNER_COL_ADDRESS_3,
446 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
450 GNC_TREE_MODEL_OWNER_COL_ADDRESS_4,
451 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
454 NULL,
"+1-617-542-5942",
455 GNC_TREE_MODEL_OWNER_COL_PHONE,
456 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
459 NULL,
"+1-617-542-2652",
460 GNC_TREE_MODEL_OWNER_COL_FAX,
461 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
465 GNC_TREE_MODEL_OWNER_COL_EMAIL,
466 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
470 GNC_TREE_MODEL_OWNER_COL_BALANCE,
471 GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
472 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
473 sort_by_balance_value);
475 view->balance_report_column
478 GNC_TREE_MODEL_OWNER_COL_BALANCE_REPORT,
479 GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
480 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
481 sort_by_balance_value);
485 "Sample owner notes.",
486 GNC_TREE_MODEL_OWNER_COL_NOTES,
487 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
490 C_(
"Column letter for 'Active'",
"A"),
491 GNC_OWNER_TREE_ACTIVE_COL,
492 GNC_TREE_MODEL_OWNER_COL_ACTIVE,
493 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
495 gnc_tree_view_owner_active_toggled);
498 gtvo_update_column_names(view);
502 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model),
503 gnc_tree_view_owner_filter_helper,
508 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model),
509 GNC_TREE_MODEL_OWNER_COL_NAME,
512 gtk_widget_show(GTK_WIDGET(view));
514 return GTK_TREE_VIEW(view);
521 #define debug_path(fn, path) { \ 522 gchar *path_string = gtk_tree_path_to_string(path); \ 523 fn("tree path %s", path_string); \ 524 g_free(path_string); \ 529 gnc_tree_view_owner_get_path_from_owner (GncTreeViewOwner *view,
532 GtkTreeModel *model, *f_model, *s_model;
533 GtkTreePath *path, *f_path, *s_path;
535 ENTER(
"view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
544 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
545 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
546 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
555 f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path);
556 gtk_tree_path_free(path);
559 LEAVE(
"no filter path");
564 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path);
565 gtk_tree_path_free(f_path);
566 debug_path(
LEAVE, s_path);
571 gnc_tree_view_owner_get_iter_from_owner (GncTreeViewOwner *view,
575 GtkTreeModel *model, *f_model, *s_model;
576 GtkTreeIter iter, f_iter;
578 g_return_val_if_fail(GNC_IS_TREE_VIEW_OWNER(view), FALSE);
579 g_return_val_if_fail(owner != NULL, FALSE);
580 g_return_val_if_fail(s_iter != NULL, FALSE);
582 ENTER(
"view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
585 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
586 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
587 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
589 GNC_TREE_MODEL_OWNER(model), owner, &iter))
591 LEAVE(
"model_get_iter_from_owner failed");
596 gtk_tree_model_filter_convert_child_iter_to_iter (
597 GTK_TREE_MODEL_FILTER(f_model), &f_iter, &iter);
598 gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model),
610 gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
615 GncTreeViewOwner *view = data;
617 g_return_val_if_fail (GNC_IS_TREE_MODEL_OWNER (model), FALSE);
618 g_return_val_if_fail (iter != NULL, FALSE);
621 GNC_TREE_MODEL_OWNER(model), iter);
624 return view->filter_fn(owner, view->filter_data);
641 ENTER(
"view %p, filter func %p, data %p, destroy %p",
642 view, func, data, destroy);
644 g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
646 if (view->filter_destroy)
648 view->filter_destroy(view->filter_data);
650 view->filter_destroy = destroy;
651 view->filter_data = data;
652 view->filter_fn = func;
664 GtkTreeModel *f_model, *s_model;
666 g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
668 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
669 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
670 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
685 GtkTreeModel *model, *f_model, *s_model;
686 GtkTreePath *path, *f_path;
690 ENTER(
"view %p", view);
691 g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
692 g_return_val_if_fail (s_path != NULL, NULL);
694 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
695 f_path = gtk_tree_model_sort_convert_path_to_child_path (
696 GTK_TREE_MODEL_SORT (s_model), s_path);
699 LEAVE(
"no filter path");
703 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
704 path = gtk_tree_model_filter_convert_path_to_child_path (
705 GTK_TREE_MODEL_FILTER (f_model), f_path);
706 gtk_tree_path_free(f_path);
713 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
714 if (!gtk_tree_model_get_iter (model, &iter, path))
720 owner = iter.user_data;
721 gtk_tree_path_free(path);
722 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
731 GtkTreeModel *model, *f_model;
732 GtkTreeIter iter, f_iter;
735 g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT(s_model), NULL);
736 g_return_val_if_fail (s_iter != NULL, NULL);
738 ENTER(
"model %p, iter %p", s_model, s_iter);
740 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(s_model),
743 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
744 gtk_tree_model_filter_convert_iter_to_child_iter (
745 GTK_TREE_MODEL_FILTER(f_model), &iter, &f_iter);
746 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
748 GNC_TREE_MODEL_OWNER(model), &iter);
749 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
761 GtkTreeSelection *selection;
762 GtkTreeModel *f_model, *s_model;
763 GtkTreeIter iter, f_iter, s_iter;
765 GtkSelectionMode mode;
767 ENTER(
"view %p", view);
768 g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
770 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
771 mode = gtk_tree_selection_get_mode(selection);
772 if ((mode != GTK_SELECTION_SINGLE) && (mode != GTK_SELECTION_BROWSE))
776 if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter))
778 LEAVE(
"no owner, get_selected failed");
782 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
785 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
786 gtk_tree_model_filter_convert_iter_to_child_iter (
787 GTK_TREE_MODEL_FILTER (f_model), &iter, &f_iter);
789 owner = iter.user_data;
790 LEAVE(
"owner %p (%s)", owner, gncOwnerGetName (owner));
802 GtkTreeModel *model, *f_model, *s_model;
803 GtkTreePath *path, *f_path, *s_path;
804 GtkTreeSelection *selection;
806 ENTER(
"view %p, owner %p (%s)", view,
807 owner, gncOwnerGetName (owner));
808 g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (view));
811 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
812 gtk_tree_selection_unselect_all (selection);
817 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
818 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
819 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
822 GNC_TREE_MODEL_OWNER(model), owner);
828 debug_path(
DEBUG, path);
830 f_path = gtk_tree_model_filter_convert_child_path_to_path (
831 GTK_TREE_MODEL_FILTER (f_model), path);
832 gtk_tree_path_free(path);
835 LEAVE(
"no filter path");
838 debug_path(
DEBUG, f_path);
840 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
842 gtk_tree_path_free(f_path);
845 LEAVE(
"no sort path");
849 gtk_tree_selection_select_path (selection, s_path);
853 while (gtk_events_pending ())
854 gtk_main_iteration ();
855 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
856 debug_path(
LEAVE, s_path);
857 gtk_tree_path_free(s_path);
864 GncTreeViewOwner* view;
874 get_selected_owners_helper (GtkTreeModel *s_model,
880 GtkTreeModel *f_model;
881 GtkTreeIter iter, f_iter;
884 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
887 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
888 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
890 owner = iter.user_data;
893 if (gtvsi->view->filter_fn == NULL || gtvsi->view->filter_fn(owner, gtvsi->view->filter_data))
895 gtvsi->return_list = g_list_append(gtvsi->return_list, owner);
905 gtvo_update_column_name (GtkTreeViewColumn *column,
907 const gchar *mnemonic)
911 g_return_if_fail(column);
913 name = g_strdup_printf(fmt, mnemonic);
914 gtk_tree_view_column_set_title(column, name);
920 gtvo_update_column_names (GncTreeViewOwner *view)
924 gtvo_update_column_name(view->balance_report_column,
926 _(
"Balance (%s)"), mnemonic);
933 gtvo_currency_changed_cb (
void)
935 const GList *views, *ptr;
938 for (ptr = views; ptr; ptr = g_list_next(ptr))
940 gtvo_update_column_names (ptr->data);
948 owner_cell_kvp_data_func (GtkTreeViewColumn *tree_column,
949 GtkCellRenderer *cell,
950 GtkTreeModel *s_model,
955 GValue v = G_VALUE_INIT;
957 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
960 if (G_VALUE_HOLDS_STRING)
961 g_object_set (G_OBJECT (cell),
962 "text", g_value_get_string (&v),
968 static void col_edited_helper(GtkCellRendererText *cell, gchar *path_string,
969 gchar *new_text, gpointer _s_model)
972 GtkTreeModel *s_model;
974 GncTreeViewOwnerColumnTextEdited col_edited_cb;
975 GtkTreeViewColumn *col;
977 col_edited_cb = g_object_get_data(G_OBJECT(cell),
978 "column_edited_callback");
979 col = GTK_TREE_VIEW_COLUMN(g_object_get_data(G_OBJECT(cell),
981 s_model = GTK_TREE_MODEL(_s_model);
983 if (!gtk_tree_model_get_iter_from_string(s_model, &s_iter, path_string))
987 col_edited_cb(owner, col, new_text);
990 static void col_source_helper(GtkTreeViewColumn *col, GtkCellRenderer *cell,
991 GtkTreeModel *s_model, GtkTreeIter *s_iter,
992 gpointer _col_source_cb)
996 GncTreeViewOwnerColumnSource col_source_cb;
998 g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
999 col_source_cb = (GncTreeViewOwnerColumnSource) _col_source_cb;
1001 text = col_source_cb(owner, col, cell);
1002 g_object_set (G_OBJECT (cell),
"text", text,
"xalign", 1.0, NULL);
1011 gtvo_setup_column_renderer_edited_cb(GncTreeViewOwner *owner_view,
1012 GtkTreeViewColumn *column,
1013 GtkCellRenderer *renderer,
1014 GncTreeViewOwnerColumnTextEdited col_edited_cb)
1016 GtkTreeModel *s_model;
1018 if (col_edited_cb == NULL)
1020 g_object_set(G_OBJECT(renderer),
"editable", FALSE, NULL);
1021 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback", col_edited_cb);
1022 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1023 g_signal_handlers_disconnect_by_func(G_OBJECT(renderer), col_edited_cb, s_model);
1024 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1028 g_object_set(G_OBJECT(renderer),
"editable", TRUE, NULL);
1029 g_object_set_data(G_OBJECT(renderer),
"column_edited_callback",
1031 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1032 g_signal_connect(G_OBJECT(renderer),
"edited",
1033 (GCallback) col_edited_helper, s_model);
1034 g_object_set_data(G_OBJECT(renderer),
"column_view", column);
1040 #define FILTER_TREE_VIEW "types_tree_view" 1060 ENTER(
"owner %p:%s", owner, gncOwnerGetName(owner));
1062 if (!fd->show_inactive && !gncOwnerGetActive (owner))
1064 LEAVE(
" hide: inactive");
1068 if (!fd->show_zero_total)
1073 LEAVE(
" hide: zero balance");
1091 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1093 ENTER(
"button %p", button);
1094 fd->show_inactive = !gtk_toggle_button_get_active(button);
1096 LEAVE(
"show_inactive %d", fd->show_inactive);
1109 g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1111 ENTER(
"button %p", button);
1112 fd->show_zero_total = gtk_toggle_button_get_active(button);
1114 LEAVE(
"show_zero %d", fd->show_zero_total);
1133 g_return_if_fail(GTK_IS_DIALOG(dialog));
1135 ENTER(
"dialog %p, response %d", dialog, response);
1137 if (response != GTK_RESPONSE_OK)
1139 fd->show_inactive = fd->original_show_inactive;
1140 fd->show_zero_total = fd->original_show_zero_total;
1145 gptemp = (gpointer)fd->dialog;
1146 g_atomic_pointer_compare_and_exchange(&gptemp,
1147 (gpointer)dialog, NULL);
1148 fd->dialog = gptemp;
1149 gtk_widget_destroy(dialog);
1156 GtkWidget *dialog, *button;
1157 GtkBuilder *builder;
1160 ENTER(
"(fd %p, page %p)", fd, page);
1164 gtk_window_present(GTK_WINDOW(fd->dialog));
1165 LEAVE(
"existing dialog");
1170 builder = gtk_builder_new();
1171 gnc_builder_add_from_file (builder,
"gnc-tree-view-owner.glade",
"filter_by_dialog");
1172 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_by_dialog"));
1173 fd->dialog = dialog;
1174 gtk_window_set_transient_for(GTK_WINDOW(dialog),
1175 GTK_WINDOW(GNC_PLUGIN_PAGE(page)->window));
1177 title = g_strdup_printf(_(
"Filter %s by…"),
1179 gtk_window_set_title(GTK_WINDOW(dialog), title);
1183 fd->original_show_inactive = fd->show_inactive;
1184 fd->original_show_zero_total = fd->show_zero_total;
1187 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_inactive"));
1188 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1189 !fd->show_inactive);
1190 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_zero"));
1191 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1192 fd->show_zero_total);
1195 gtk_builder_connect_signals (builder, fd);
1196 g_object_unref(G_OBJECT(builder));
1199 gtk_widget_show_all (dialog);
1203 #define OWNER_SELECTED_LABEL "SelectedOwner" 1204 #define SHOW_INACTIVE_LABEL "ShowInactive" 1205 #define SHOW_ZERO_LABEL "ShowZeroTotal" 1210 const gchar *group_name;
1224 tree_save_selected_row (GncTreeViewOwner *view,
1228 bar_t *bar = user_data;
1229 const gchar *owner_name;
1235 owner_name = gncOwnerGetName (owner);
1236 if (owner_name == NULL)
1239 g_key_file_set_string(bar->key_file, bar->group_name, OWNER_SELECTED_LABEL,
1244 gnc_tree_view_owner_save(GncTreeViewOwner *view,
1246 GKeyFile *key_file,
const gchar *group_name)
1250 g_return_if_fail (key_file != NULL);
1251 g_return_if_fail (group_name != NULL);
1253 ENTER(
"view %p, key_file %p, group_name %s", view, key_file,
1256 g_key_file_set_boolean(key_file, group_name, SHOW_INACTIVE_LABEL,
1258 g_key_file_set_boolean(key_file, group_name, SHOW_ZERO_LABEL,
1259 fd->show_zero_total);
1261 bar.key_file = key_file;
1262 bar.group_name = group_name;
1263 tree_save_selected_row(view, &bar);
1276 tree_restore_selected_row (GncTreeViewOwner *view,
1277 GncOwnerType owner_type,
1278 const gchar *owner_guid_str)
1291 gnc_tree_view_owner_restore(GncTreeViewOwner *view,
1293 GKeyFile *key_file,
const gchar *group_name,
1294 GncOwnerType owner_type)
1296 GError *error = NULL;
1301 show = g_key_file_get_boolean(key_file, group_name, SHOW_INACTIVE_LABEL, &error);
1304 g_warning(
"error reading group %s key %s: %s",
1305 group_name, SHOW_INACTIVE_LABEL, error->message);
1306 g_error_free(error);
1310 fd->show_inactive = show;
1312 show = g_key_file_get_boolean(key_file, group_name, SHOW_ZERO_LABEL, &error);
1315 g_warning(
"error reading group %s key %s: %s",
1316 group_name, SHOW_ZERO_LABEL, error->message);
1317 g_error_free(error);
1321 fd->show_zero_total = show;
1324 value = g_key_file_get_string(key_file, group_name, OWNER_SELECTED_LABEL, NULL);
1327 tree_restore_selected_row(view, owner_type, value);
1337 gtvo_set_column_editor(GncTreeViewOwner *view,
1338 GtkTreeViewColumn *column,
1339 GncTreeViewOwnerColumnTextEdited edited_cb)
1341 GList *renderers_orig, *renderers;
1342 GtkCellRenderer *renderer;
1346 for (renderers_orig = renderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
1347 renderers && !GTK_IS_CELL_RENDERER_TEXT(renderers->data);
1348 renderers = renderers->next);
1349 renderer = GTK_CELL_RENDERER(renderers->data);
1350 g_list_free(renderers_orig);
1351 g_return_if_fail(renderer != NULL);
1352 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.
gint 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.
int safe_utf8_collate_natural(const char *da, const char *db)
Collate two UTF-8 strings naturally.
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.