38 #include <glib/gi18n.h> 48 #include "dialog-transfer.h" 49 #include "dialog-utils.h" 50 #include "assistant-hierarchy.h" 51 #include "assistant-stock-transaction.h" 52 #include "gnc-account-sel.h" 53 #include "gnc-component-manager.h" 57 #include "gnc-icons.h" 60 #include "gnc-session.h" 61 #include "gnc-split-reg.h" 68 #include "dialog-lot-viewer.h" 69 #include "window-reconcile.h" 70 #include "window-autoclear.h" 71 #include "window-main-summarybar.h" 73 #include "dialog-find-account.h" 77 static QofLogModule log_module = GNC_MOD_GUI;
86 typedef struct _delete_helper
89 gboolean has_ro_splits;
93 #define PLUGIN_PAGE_ACCT_TREE_CM_CLASS "plugin-page-acct-tree" 94 #define STATE_SECTION "Account Hierarchy" 96 #define DELETE_DIALOG_FILTER "filter" 97 #define DELETE_DIALOG_ACCOUNT "account" 98 #define DELETE_DIALOG_TRANS_MAS "trans_mas" 99 #define DELETE_DIALOG_SA_MAS "sa_mas" 100 #define DELETE_DIALOG_SA_TRANS_MAS "sa_trans_mas" 101 #define DELETE_DIALOG_SA_TRANS "sa_trans" 102 #define DELETE_DIALOG_SA_SPLITS "sa_has_split" 103 #define DELETE_DIALOG_OK_BUTTON "deletebutton" 114 GtkTreeView *tree_view;
119 #define GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(o) \ 120 ((GncPluginPageAccountTreePrivate*)gnc_plugin_page_account_tree_get_instance_private((GncPluginPageAccountTree*)o)) 126 static void gnc_plugin_page_account_tree_finalize (GObject *
object);
127 static void gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data);
129 static gboolean gnc_plugin_page_account_tree_focus_widget (
GncPluginPage *plugin_page);
130 static GtkWidget *gnc_plugin_page_account_tree_create_widget (
GncPluginPage *plugin_page);
131 static void gnc_plugin_page_account_tree_destroy_widget (
GncPluginPage *plugin_page);
132 static void gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page, GKeyFile *file,
const gchar *group);
133 static GncPluginPage *gnc_plugin_page_account_tree_recreate_page (GtkWidget *window, GKeyFile *file,
const gchar *group);
136 static void gnc_plugin_page_account_tree_summarybar_position_changed(gpointer prefs, gchar* pref, gpointer user_data);
137 static gboolean gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget, GdkEventButton *event,
GncPluginPage *page);
138 static void gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
140 GtkTreeViewColumn *col,
143 static void gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
145 static void accounting_period_changed_cb(gpointer prefs, gchar *pref, gpointer user_data);
148 void gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb, GtkWidget *dialog);
149 void gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b);
153 static void gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
154 static void gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
155 static void gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
156 static void gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
157 static void gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
158 static void gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
159 static void gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
160 static void gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
161 static void gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
162 static void gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
163 static void gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
164 static void gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
165 static void gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
166 static void gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
167 static void gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
168 static void gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
169 static void gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
170 static void gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
171 static void gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
172 static void gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
173 static void gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
174 static void gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
177 static int confirm_delete_account (GSimpleAction *simple,
186 static guint plugin_page_signals[LAST_SIGNAL] = { 0 };
189 static GActionEntry gnc_plugin_page_account_tree_actions [] =
191 {
"FileNewAccountAction", gnc_plugin_page_account_tree_cmd_new_account, NULL, NULL, NULL },
192 {
"FileAddAccountHierarchyAssistantAction", gnc_plugin_page_account_tree_cmd_file_new_hierarchy, NULL, NULL, NULL },
193 {
"EditOpenAccountAction", gnc_plugin_page_account_tree_cmd_open_account, NULL, NULL, NULL },
194 {
"EditOpenSubaccountsAction", gnc_plugin_page_account_tree_cmd_open_subaccounts, NULL, NULL, NULL },
195 {
"EditEditAccountAction", gnc_plugin_page_account_tree_cmd_edit_account, NULL, NULL, NULL },
196 {
"EditDeleteAccountAction", gnc_plugin_page_account_tree_cmd_delete_account, NULL, NULL, NULL },
197 {
"EditCascadeAccountAction", gnc_plugin_page_account_tree_cmd_cascade_account_properties, NULL, NULL, NULL },
198 {
"EditFindAccountAction", gnc_plugin_page_account_tree_cmd_find_account, NULL, NULL, NULL },
199 {
"EditFindAccountPopupAction", gnc_plugin_page_account_tree_cmd_find_account_popup, NULL, NULL, NULL },
200 {
"EditRenumberSubaccountsAction", gnc_plugin_page_account_tree_cmd_renumber_accounts, NULL, NULL, NULL },
201 {
"EditTaxOptionsAction", gnc_plugin_page_account_tree_cmd_edit_tax_options, NULL, NULL, NULL },
202 {
"ViewFilterByAction", gnc_plugin_page_account_tree_cmd_view_filter_by, NULL, NULL, NULL },
203 {
"ViewRefreshAction", gnc_plugin_page_account_tree_cmd_refresh, NULL, NULL, NULL },
204 {
"ActionsReconcileAction", gnc_plugin_page_account_tree_cmd_reconcile, NULL, NULL, NULL },
205 {
"ActionsAutoClearAction", gnc_plugin_page_account_tree_cmd_autoclear, NULL, NULL, NULL },
206 {
"ActionsTransferAction", gnc_plugin_page_account_tree_cmd_transfer, NULL, NULL, NULL },
207 {
"ActionsStockSplitAction", gnc_plugin_page_account_tree_cmd_stock_split, NULL, NULL, NULL },
208 {
"ActionsStockAssistantAction", gnc_plugin_page_account_tree_cmd_stock_assistant, NULL, NULL, NULL },
209 {
"ActionsLotsAction", gnc_plugin_page_account_tree_cmd_lots, NULL, NULL, NULL },
210 {
"ScrubAction", gnc_plugin_page_account_tree_cmd_scrub, NULL, NULL, NULL },
211 {
"ScrubSubAction", gnc_plugin_page_account_tree_cmd_scrub_sub, NULL, NULL, NULL },
212 {
"ScrubAllAction", gnc_plugin_page_account_tree_cmd_scrub_all, NULL, NULL, NULL },
215 static guint gnc_plugin_page_account_tree_n_actions = G_N_ELEMENTS(gnc_plugin_page_account_tree_actions);
218 static const gchar *gnc_plugin_load_ui_items [] =
227 "ActionsPlaceholder4",
228 "ActionsPlaceholder5",
229 "ActionsPlaceholder6",
238 static const gchar *actions_requiring_account_rw[] =
240 "EditEditAccountAction",
241 "EditDeleteAccountAction",
242 "ActionsReconcileAction",
243 "ActionsAutoClearAction",
249 static const gchar *actions_requiring_subaccounts_rw[] =
251 "EditRenumberSubaccountsAction",
252 "EditCascadeAccountAction",
258 static const gchar *actions_requiring_account_always[] =
260 "EditOpenAccountAction",
261 "EditOpenSubaccountsAction",
266 static const gchar* actions_requiring_priced_account[] =
268 "ActionsStockAssistantAction",
273 static const gchar* readonly_inactive_actions[] =
275 "FileNewAccountAction",
276 "FileAddAccountHierarchyAssistantAction",
277 "EditEditAccountAction",
278 "EditDeleteAccountAction",
279 "ActionsTransferAction",
280 "ActionsReconcileAction",
281 "ActionsAutoClearAction",
282 "ActionsStockSplitAction",
292 {
"EditOpenAccountAction", N_(
"Open") },
293 {
"EditEditAccountAction", N_(
"Edit") },
294 {
"FileNewAccountAction", N_(
"New") },
295 {
"EditDeleteAccountAction", N_(
"Delete") },
303 auto plugin_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE
304 (g_object_new (GNC_TYPE_PLUGIN_PAGE_ACCOUNT_TREE,
nullptr));
306 LEAVE(
"new account tree page %p", plugin_page);
307 return GNC_PLUGIN_PAGE (plugin_page);
312 static gboolean show_abort_verify = TRUE;
317 gnc_suspend_gui_refresh ();
322 finish_scrubbing (GncWindow *window, gulong handler_id)
324 g_signal_handler_disconnect (G_OBJECT(window), handler_id);
325 show_abort_verify = TRUE;
326 gnc_resume_gui_refresh ();
330 check_repair_abort_YN = N_(
"'Check & Repair' is currently running, do you want to abort it?");
337 if (show_abort_verify)
340 (GNC_PLUGIN_PAGE(page))), FALSE,
341 "%s", _(check_repair_abort_YN));
343 show_abort_verify = FALSE;
352 if (gnc_get_abort_scrub ())
365 GObjectClass *object_class = G_OBJECT_CLASS (klass);
368 object_class->finalize = gnc_plugin_page_account_tree_finalize;
370 gnc_plugin_class->
tab_icon = GNC_ICON_ACCOUNT;
371 gnc_plugin_class->
plugin_name = GNC_PLUGIN_PAGE_ACCOUNT_TREE_NAME;
372 gnc_plugin_class->
create_widget = gnc_plugin_page_account_tree_create_widget;
373 gnc_plugin_class->
destroy_widget = gnc_plugin_page_account_tree_destroy_widget;
374 gnc_plugin_class->
save_page = gnc_plugin_page_account_tree_save_page;
375 gnc_plugin_class->
recreate_page = gnc_plugin_page_account_tree_recreate_page;
377 gnc_plugin_class->
finish_pending = gnc_plugin_page_account_finish_pending;
379 plugin_page_signals[ACCOUNT_SELECTED] =
380 g_signal_new (
"account_selected",
381 G_OBJECT_CLASS_TYPE (object_class),
385 g_cclosure_marshal_VOID__POINTER,
393 GSimpleActionGroup *simple_action_group = NULL;
396 const GList *page_list;
398 ENTER(
"page %p", plugin_page);
399 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(plugin_page);
402 parent = GNC_PLUGIN_PAGE(plugin_page);
403 g_object_set (G_OBJECT(plugin_page),
404 "page-name", _(
"Accounts"),
405 "ui-description",
"gnc-plugin-page-account-tree.ui",
407 g_signal_connect (G_OBJECT (plugin_page),
"selected",
408 G_CALLBACK (gnc_plugin_page_account_tree_selected), plugin_page);
416 if (!page_list || plugin_page == page_list->data)
418 g_object_set_data (G_OBJECT(plugin_page), PLUGIN_PAGE_IMMUTABLE,
424 g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
425 gnc_plugin_page_account_tree_actions,
426 gnc_plugin_page_account_tree_n_actions,
430 priv->fd.visible_types = -1;
431 priv->fd.show_hidden = FALSE;
432 priv->fd.show_unused = TRUE;
433 priv->fd.show_zero_total = TRUE;
434 priv->fd.filter_override = g_hash_table_new (g_direct_hash, g_direct_equal);
436 LEAVE(
"page %p, priv %p, action group %p",
437 plugin_page, priv, simple_action_group);
441 gnc_plugin_page_account_tree_finalize (GObject *
object)
446 ENTER(
"object %p",
object);
447 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (
object);
448 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
449 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
450 g_return_if_fail (priv != NULL);
452 G_OBJECT_CLASS (gnc_plugin_page_account_tree_parent_class)->finalize (
object);
462 const GList *page_list;
473 for ( ; page_list; page_list = g_list_next(page_list))
475 plugin_page = GNC_PLUGIN_PAGE(page_list->data);
476 if (GTK_WINDOW(plugin_page->
window) == win)
481 plugin_page = GNC_PLUGIN_PAGE(page_list->data);
486 g_return_if_fail(plugin_page);
487 window = plugin_page->
window;
491 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
492 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
496 Account *root_account = gnc_get_current_root_account ();
497 Account *parent_account = NULL;
498 Account *temp_account = account;
500 g_hash_table_insert (priv->fd.filter_override, account, account);
503 while (parent_account != root_account)
507 g_hash_table_insert (priv->fd.filter_override, parent_account, parent_account);
508 temp_account = parent_account;
521 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
522 ENTER(
"page %p (tree view %p)", page, priv->tree_view);
530 LEAVE(
"account %p", account);
539 gnc_plugin_page_account_tree_focus_widget (
GncPluginPage *account_plugin_page)
541 if (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(account_plugin_page))
544 GtkTreeView *view = GTK_TREE_VIEW(priv->tree_view);
548 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
551 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
555 gnc_plugin_load_ui_items);
562 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
564 if (!gtk_widget_is_focus (GTK_WIDGET(view)))
565 gtk_widget_grab_focus (GTK_WIDGET(view));
573 gnc_plugin_page_account_refresh_cb (GHashTable *changes, gpointer user_data)
577 gnc_plugin_page_account_tree_cmd_refresh(NULL, NULL, user_data);
581 gnc_plugin_page_account_tree_close_cb (gpointer user_data)
592 "GncPluginPageAccountTreeActions",
593 "EditDeleteAccountAction");
595 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
603 "GncPluginPageAccountTreeActions",
604 "EditDeleteAccountAction");
606 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
610 gnc_plugin_page_account_tree_create_widget (
GncPluginPage *plugin_page)
614 GtkTreeSelection *selection;
615 GtkTreeView *tree_view;
616 GtkWidget *scrolled_window;
617 GtkTreeViewColumn *col;
619 ENTER(
"page %p", plugin_page);
620 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
621 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
622 if (priv->widget != NULL)
624 LEAVE(
"widget = %p", priv->widget);
628 priv->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
629 gtk_box_set_homogeneous (GTK_BOX (priv->widget), FALSE);
630 gtk_widget_show (priv->widget);
633 gtk_widget_set_name (GTK_WIDGET(priv->widget),
"gnc-id-account-page");
635 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
636 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
637 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
638 gtk_widget_show (scrolled_window);
639 gtk_box_pack_start (GTK_BOX (priv->widget), scrolled_window,
644 GNC_TREE_VIEW(tree_view),
"description");
645 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
647 GNC_TREE_VIEW(tree_view),
"total");
648 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
650 g_object_set(G_OBJECT(tree_view),
651 "state-section", STATE_SECTION,
652 "show-column-menu", TRUE,
657 gnc_tree_view_account_set_code_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
658 gnc_tree_view_account_code_edited_cb);
659 gnc_tree_view_account_set_description_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
660 gnc_tree_view_account_description_edited_cb);
661 gnc_tree_view_account_set_notes_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
662 gnc_tree_view_account_notes_edited_cb);
666 (GFunc)gnc_plugin_page_account_editing_started_cd, page);
668 (GFunc)gnc_plugin_page_account_editing_finished_cb, page);
670 priv->tree_view = tree_view;
671 selection = gtk_tree_view_get_selection(tree_view);
672 g_signal_connect (G_OBJECT (selection),
"changed",
673 G_CALLBACK (gnc_plugin_page_account_tree_selection_changed_cb), page);
674 g_signal_connect (G_OBJECT (tree_view),
"button-press-event",
675 G_CALLBACK (gnc_plugin_page_account_tree_button_press_cb), page);
676 g_signal_connect (G_OBJECT (tree_view),
"row-activated",
677 G_CALLBACK (gnc_plugin_page_account_tree_double_click_cb), page);
679 gtk_tree_view_set_headers_visible(tree_view, TRUE);
680 gnc_plugin_page_account_tree_selection_changed_cb (NULL, page);
681 gtk_widget_show (GTK_WIDGET (tree_view));
682 gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET(tree_view));
684 priv->fd.tree_view = GNC_TREE_VIEW_ACCOUNT(priv->tree_view);
686 GNC_TREE_VIEW_ACCOUNT(tree_view),
690 gnc_register_gui_component(PLUGIN_PAGE_ACCT_TREE_CM_CLASS,
691 gnc_plugin_page_account_refresh_cb,
692 gnc_plugin_page_account_tree_close_cb,
694 gnc_gui_component_set_session (priv->component_id,
695 gnc_get_current_session());
697 plugin_page->
summarybar = gnc_main_window_summary_new();
698 gtk_box_pack_start (GTK_BOX (priv->widget), plugin_page->
summarybar,
701 gnc_plugin_page_account_tree_summarybar_position_changed(NULL, NULL, page);
703 GNC_PREF_SUMMARYBAR_POSITION_TOP,
704 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
707 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
708 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
712 (gpointer)accounting_period_changed_cb, page);
714 (gpointer)accounting_period_changed_cb, page);
716 (gpointer)accounting_period_changed_cb, page);
718 (gpointer)accounting_period_changed_cb, page);
720 (gpointer)accounting_period_changed_cb, page);
722 (gpointer)accounting_period_changed_cb, page);
724 g_signal_connect (G_OBJECT(plugin_page),
"inserted",
729 gnc_tree_view_account_restore_filter (GNC_TREE_VIEW_ACCOUNT(priv->tree_view), &priv->fd,
732 LEAVE(
"widget = %p", priv->widget);
737 gnc_plugin_page_account_tree_destroy_widget (
GncPluginPage *plugin_page)
742 ENTER(
"page %p", plugin_page);
743 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
744 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
747 GNC_PREF_SUMMARYBAR_POSITION_TOP,
748 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
751 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
752 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
756 gnc_tree_view_account_save_filter (GNC_TREE_VIEW_ACCOUNT(priv->tree_view), &priv->fd,
760 g_hash_table_destroy(priv->fd.filter_override);
766 g_idle_remove_by_data (plugin_page);
770 g_object_unref(G_OBJECT(priv->widget));
774 if (priv->component_id)
776 gnc_unregister_gui_component(priv->component_id);
777 priv->component_id = 0;
780 LEAVE(
"widget destroyed");
787 GSimpleActionGroup *simple_action_group = NULL;
790 gboolean has_account = FALSE;
791 gboolean subaccounts = FALSE;
793 g_return_if_fail (plugin_page && GNC_IS_PLUGIN_PAGE(plugin_page));
795 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE (plugin_page);
797 if (gtk_tree_view_get_selection (priv->tree_view))
800 has_account = (account != NULL);
807 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple_action_group));
813 allow_write && has_account);
817 allow_write && subaccounts);
821 g_signal_emit (plugin_page, plugin_page_signals[ACCOUNT_SELECTED], 0, account);
829 gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data)
832 g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page));
833 update_inactive_actions(plugin_page);
846 gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page,
848 const gchar *group_name)
853 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page));
854 g_return_if_fail (key_file != NULL);
855 g_return_if_fail (group_name != NULL);
857 ENTER(
"page %p, key_file %p, group_name %s", plugin_page, key_file,
860 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page);
861 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
863 gnc_tree_view_account_save(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
864 &priv->fd, key_file, group_name);
880 gnc_plugin_page_account_tree_recreate_page (GtkWidget *window,
882 const gchar *group_name)
888 g_return_val_if_fail(key_file, NULL);
889 g_return_val_if_fail(group_name, NULL);
890 ENTER(
"key_file %p, group_name %s", key_file, group_name);
894 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(page);
895 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
900 gnc_tree_view_account_restore(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
901 &priv->fd, key_file, group_name);
910 gnc_plugin_page_account_tree_summarybar_position_changed (gpointer prefs,
917 GtkPositionType position = GTK_POS_BOTTOM;
919 g_return_if_fail(user_data != NULL);
921 plugin_page = GNC_PLUGIN_PAGE(user_data);
922 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (user_data);
923 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
926 position = GTK_POS_TOP;
928 gtk_box_reorder_child(GTK_BOX(priv->widget),
930 (position == GTK_POS_TOP ? 0 : -1) );
941 gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget,
942 GdkEventButton *event,
946 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
948 ENTER(
"widget %p, event %p, page %p", widget, event, page);
962 gboolean include_subs)
970 window = GNC_PLUGIN_PAGE (page)->window;
976 gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
978 GtkTreeViewColumn *col,
984 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
985 g_return_if_fail (treeview);
987 model = gtk_tree_view_get_model(treeview);
988 if (gtk_tree_model_get_iter(model, &iter, path))
996 if (gtk_tree_model_iter_has_child(model, &iter))
1000 if (gtk_tree_view_row_expanded(treeview, path))
1001 gtk_tree_view_collapse_row(treeview, path);
1003 gtk_tree_view_expand_row(treeview, path, FALSE);
1009 gppat_open_account_common (page, account, FALSE);
1015 gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
1019 update_inactive_actions (plugin_page);
1023 accounting_period_changed_cb (gpointer prefs, gchar *pref, gpointer user_data)
1025 gnc_plugin_page_account_tree_cmd_refresh (NULL, NULL, user_data);
1030 gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple,
1034 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1042 gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple,
1046 gnc_ui_hierarchy_assistant(FALSE);
1050 gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple,
1054 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1057 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1059 gppat_open_account_common (page, account, FALSE);
1063 gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple,
1067 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1070 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1072 gppat_open_account_common (page, account, TRUE);
1076 gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple,
1080 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1083 ENTER(
"action %p, page %p", simple, page);
1086 g_return_if_fail (account != NULL);
1093 gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple,
1097 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1100 ENTER(
"action %p, page %p", simple, page);
1104 gnc_find_account_dialog (window, NULL);
1109 gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple,
1113 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1117 ENTER(
"action %p, page %p", simple, page);
1123 gnc_find_account_dialog (window, account);
1128 gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple,
1132 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1136 ENTER(
"action %p, page %p", simple, page);
1142 if (account != NULL)
1143 gnc_account_cascade_properties_dialog (window, account);
1149 delete_account_helper (
Account * account, gpointer data)
1152 auto splits{xaccAccountGetSplits (account)};
1154 if (!splits.empty())
1156 helper_res->has_splits = TRUE;
1157 for (
auto s : splits)
1162 helper_res->has_ro_splits = TRUE;
1168 return GINT_TO_POINTER (helper_res->has_splits || helper_res->has_ro_splits);
1176 set_ok_sensitivity(GtkWidget *dialog)
1178 gint sa_mas_cnt, trans_mas_cnt;
1181 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1182 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1183 sa_mas_cnt = gnc_account_sel_get_visible_account_num(GNC_ACCOUNT_SEL(sa_mas));
1184 trans_mas_cnt = gnc_account_sel_get_visible_account_num(GNC_ACCOUNT_SEL(trans_mas));
1186 sensitive = (((NULL == sa_mas) ||
1187 (!gtk_widget_is_sensitive(sa_mas) || sa_mas_cnt)) &&
1188 ((NULL == trans_mas) ||
1189 (!gtk_widget_is_sensitive(trans_mas) || trans_mas_cnt)));
1191 auto button = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON));
1192 gtk_widget_set_sensitive(button, sensitive);
1196 gppat_get_exclude_list (
Account *acc, gboolean exclude_subaccounts)
1198 GList *acct_list = NULL;
1200 if (exclude_subaccounts)
1203 acct_list = g_list_prepend (acct_list, acc);
1209 gppat_populate_gas_list(GtkWidget *dialog,
1211 gboolean exclude_subaccounts)
1217 g_return_if_fail(GTK_IS_DIALOG(dialog));
1220 account = GNC_ACCOUNT(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT));
1221 filter =
static_cast<GList*
>(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_FILTER));
1224 gnc_account_sel_set_acct_filters (gas, filter, NULL);
1227 exclude = gppat_get_exclude_list (account, exclude_subaccounts);
1228 gnc_account_sel_set_acct_exclude_filter (gas, exclude);
1229 g_list_free (exclude);
1231 gnc_account_sel_set_account (gas, NULL, TRUE);
1234 set_ok_sensitivity(dialog);
1238 gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb,
1241 g_return_if_fail(GTK_IS_DIALOG(dialog));
1244 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1245 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(trans_mas), !gtk_toggle_button_get_active(sa_mrb));
1254 gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b)
1256 GtkWidget *dialog = gtk_widget_get_toplevel(widget);
1257 auto subaccount_trans = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS));
1258 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1259 auto have_splits = g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS) !=
nullptr;
1261 gtk_widget_set_sensitive(widget, !gtk_toggle_button_get_active(b));
1264 if ((have_splits) && !gtk_widget_is_sensitive(sa_mas))
1265 gtk_widget_set_sensitive(subaccount_trans, TRUE);
1267 gtk_widget_set_sensitive(subaccount_trans, FALSE);
1269 set_ok_sensitivity(dialog);
1273 gppat_setup_account_selector (GtkBuilder *builder, GtkWidget *dialog,
1274 const gchar *hbox,
const gchar *sel_name)
1276 GtkWidget *selector = gnc_account_sel_new();
1277 GtkWidget *box = GTK_WIDGET(gtk_builder_get_object (builder, hbox));
1279 gtk_box_pack_start (GTK_BOX(box), selector, TRUE, TRUE, 0);
1282 if (g_strcmp0 (sel_name, DELETE_DIALOG_SA_MAS) == 0)
1283 g_object_set (selector,
"hide-placeholder", FALSE, NULL);
1285 g_object_set_data(G_OBJECT(dialog), sel_name, selector);
1287 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(selector), TRUE);
1288 gtk_widget_show_all(box);
1294 commodity_mismatch_dialog (
const Account* account, GtkWindow* parent)
1298 char* message = g_strdup_printf (
1299 _(
"Account %s does not have the same currency as the one you're " 1300 "moving transactions from.\nAre you sure you want to do this?"),
1302 GtkWidget* error_dialog =
1303 gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT,
1304 GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE,
1306 gtk_dialog_add_buttons (GTK_DIALOG(error_dialog),
1307 _(
"_Pick another account"), GTK_RESPONSE_CANCEL,
1308 _(
"_Do it anyway"), GTK_RESPONSE_ACCEPT,
1310 response = gtk_dialog_run (GTK_DIALOG (error_dialog));
1311 gtk_widget_destroy (error_dialog);
1320 GNCAccountSel *selector;
1322 gboolean for_account;
1326 adopter_set_account_and_match (
Adopter* adopter)
1328 if (!(adopter->selector &&
1329 gtk_widget_is_sensitive (GTK_WIDGET (adopter->selector))))
1331 adopter->new_account = gnc_account_sel_get_account(adopter->selector);
1333 if (!adopter->for_account && adopter->old_account && adopter->new_account)
1340 adopter_init (
Adopter* adopter, GtkWidget *selector,
Account* account,
1341 gboolean for_account)
1343 adopter->selector = GNC_ACCOUNT_SEL (selector);
1344 adopter->new_account = NULL;
1345 adopter->old_account = account;
1346 adopter->match = TRUE;
1347 adopter->for_account = for_account;
1351 adopter_match (
Adopter* adopter, GtkWindow *parent)
1354 if (adopter->match || adopter->for_account)
1356 result = commodity_mismatch_dialog (adopter->new_account, parent);
1357 return (result == GTK_RESPONSE_ACCEPT);
1369 account_subaccount (
Account* account)
1374 subaccount = GNC_ACCOUNT(subs->data);
1380 account_delete_dialog (
Account *account, GtkWindow *parent,
Adopters* adopt)
1382 GtkWidget *dialog = NULL;
1383 GtkWidget *widget = NULL;
1384 gchar *title = NULL;
1385 GtkBuilder *builder = gtk_builder_new();
1390 acct_name = g_strdup (_(
"(no name)"));
1392 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_delete_dialog");
1394 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_delete_dialog"));
1395 gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
1398 g_object_set_data_full (G_OBJECT(dialog), DELETE_DIALOG_FILTER, filter,
1399 (GDestroyNotify) g_list_free);
1400 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT, account);
1401 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"header"));
1402 title = g_strdup_printf(_(
"Deleting account %s"), acct_name);
1403 gtk_label_set_text(GTK_LABEL(widget), title);
1407 widget = GTK_WIDGET(gtk_builder_get_object (builder, DELETE_DIALOG_OK_BUTTON));
1408 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON, widget);
1412 adopter_init (&adopt->trans,
1413 gppat_setup_account_selector (builder, dialog,
1415 DELETE_DIALOG_TRANS_MAS),
1419 if (!xaccAccountGetSplits(account).empty())
1423 delete_account_helper(account, &delete_res2);
1424 if (delete_res2.has_ro_splits)
1426 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_rw")));
1427 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"trans_drb"));
1428 gtk_widget_set_sensitive(widget, FALSE);
1431 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1435 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"transactions")), FALSE);
1436 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1440 adopter_init (&adopt->subacct,
1441 gppat_setup_account_selector (builder, dialog,
1443 DELETE_DIALOG_SA_MAS),
1447 adopter_init (&adopt->subtrans,
1448 gppat_setup_account_selector (builder, dialog,
1449 "sa_trans_mas_hbox",
1450 DELETE_DIALOG_SA_TRANS_MAS),
1451 account_subaccount (account), FALSE);
1452 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS,
1453 GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")));
1459 &adopt->delete_res);
1460 if (adopt->delete_res.has_splits)
1462 if (adopt->delete_res.has_ro_splits)
1464 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_rw")));
1465 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_drb"));
1466 gtk_widget_set_sensitive(widget, FALSE);
1469 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1471 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(1));
1475 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(0));
1476 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1477 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1482 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccounts")), FALSE);
1483 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1484 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1488 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1490 gtk_builder_connect_signals(builder, dialog);
1491 g_object_unref(G_OBJECT(builder));
1497 gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple,
1501 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1508 GtkWidget *dialog = NULL;
1510 if (account == NULL)
1513 memset (&adopt, 0,
sizeof (adopt));
1519 #define EXPLANATION _("The list below shows objects which make use of the account which you want to delete.\nBefore you can delete it, you must either delete those objects or else modify them so they make use\nof another account") 1521 gnc_ui_object_references_show(EXPLANATION, list);
1529 acct_name = g_strdup (_(
"(no name)"));
1532 gchar* message = g_strdup_printf(_(
"The account \"%s\" has more than one subaccount.\n\nMove the subaccounts or delete them before attempting to delete this account."), acct_name);
1533 gnc_error_dialog(GTK_WINDOW(window),
"%s", message);
1542 do_delete_account (account, NULL, NULL, NULL);
1546 dialog = account_delete_dialog (account, GTK_WINDOW (window), &adopt);
1550 response = gtk_dialog_run(GTK_DIALOG(dialog));
1552 if (response != GTK_RESPONSE_ACCEPT)
1554 gtk_widget_destroy(dialog);
1557 adopter_set_account_and_match (&adopt.trans);
1558 adopter_set_account_and_match (&adopt.subacct);
1559 adopter_set_account_and_match (&adopt.subtrans);
1561 if (adopter_match (&adopt.trans, GTK_WINDOW (window)) &&
1562 adopter_match (&adopt.subacct, GTK_WINDOW (window)) &&
1563 adopter_match (&adopt.subtrans, GTK_WINDOW (window)))
1566 gtk_widget_destroy(dialog);
1567 if (confirm_delete_account (simple, page, adopt.trans.new_account,
1568 adopt.subtrans.new_account,
1569 adopt.subacct.new_account,
1570 adopt.delete_res) == GTK_RESPONSE_ACCEPT)
1572 do_delete_account (account, adopt.subacct.new_account,
1573 adopt.subtrans.new_account, adopt.trans.new_account);
1586 char *lines[6] = {0};
1592 lines[i] = g_strdup_printf (_(
"The account %s will be deleted."),
1596 if (!xaccAccountGetSplits (account).empty())
1601 lines[++i] = g_strdup_printf (_(
"All transactions in this account " 1602 "will be moved to the account %s."),
1608 lines[++i] = g_strdup (_(
"All transactions in this account " 1609 "will be deleted."));
1617 lines[++i] = g_strdup_printf (_(
"Its sub-account will be " 1618 "moved to the account %s."), name);
1623 lines[++i] = g_strdup (_(
"Its subaccount will be deleted."));
1627 lines[++i] = g_strdup_printf (_(
"All sub-account transactions " 1628 "will be moved to the " 1629 "account %s."), name);
1632 else if (delete_res.has_splits)
1634 lines[++i] = g_strdup(_(
"All sub-account transactions " 1635 "will be deleted."));
1640 lines[++i] = _(
"Are you sure you want to do this?");
1642 message = g_strjoinv(
" ", lines);
1643 for (
int j = 0; j < i; ++j)
1646 dialog = gtk_message_dialog_new(GTK_WINDOW(window),
1647 GTK_DIALOG_DESTROY_WITH_PARENT,
1648 GTK_MESSAGE_QUESTION,
1652 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
1653 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
1654 _(
"_Delete"), GTK_RESPONSE_ACCEPT,
1656 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1657 response = gtk_dialog_run(GTK_DIALOG(dialog));
1658 gtk_widget_destroy(dialog);
1665 GList *acct_list, *ptr;
1669 gnc_set_busy_cursor(NULL, TRUE);
1670 gnc_suspend_gui_refresh ();
1678 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1680 g_list_free(acct_list);
1701 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1707 g_list_free(acct_list);
1721 gnc_resume_gui_refresh ();
1722 gnc_unset_busy_cursor(NULL);
1726 gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple,
1730 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1736 if (!window || !account)
1739 gnc_account_renumber_create_dialog(window, account);
1743 gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple,
1747 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1750 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1752 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1755 gtk_widget_queue_draw (priv->widget);
1761 gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple,
1765 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1768 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1769 ENTER(
"(action %p, page %p)", simple, page);
1771 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1772 account_filter_dialog_create(&priv->fd, GNC_PLUGIN_PAGE(page));
1777 gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple,
1781 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1784 RecnWindow *recnData;
1787 g_return_if_fail (account != NULL);
1800 window = GNC_PLUGIN_PAGE (page)->window;
1801 recnData = recnWindow (window, account);
1802 gnc_ui_reconcile_window_raise (recnData);
1806 gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple,
1810 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1813 AutoClearWindow *autoClearData;
1816 g_return_if_fail (account != NULL);
1818 window = GNC_PLUGIN_PAGE (page)->window;
1819 autoClearData = autoClearWindow (window, account);
1820 gnc_ui_autoclear_window_raise (autoClearData);
1824 gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple,
1828 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1833 window = GNC_PLUGIN_PAGE (page)->window;
1834 gnc_xfer_dialog (window, account);
1838 gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple,
1842 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1847 window = GNC_PLUGIN_PAGE (page)->window;
1848 gnc_stock_split_dialog (window, account);
1852 gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple,
1856 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1860 ENTER (
"(action %p, page %p)", simple, page);
1863 window = GNC_PLUGIN_PAGE(page)->window;
1864 gnc_stock_transaction_assistant (window, account);
1870 gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple,
1874 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1879 window = GNC_PLUGIN_PAGE (page)->window;
1880 gnc_tax_info_dialog (window, account);
1884 gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple,
1888 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1890 GtkWidget *window = GNC_PLUGIN_PAGE (page)->window;
1891 gnc_lot_viewer_dialog (GTK_WINDOW(window), account);
1895 scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
1897 if (event->length == 0)
return FALSE;
1899 switch (event->keyval)
1901 case GDK_KEY_Escape:
1903 gboolean abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget), FALSE,
1904 "%s", _(check_repair_abort_YN));
1918 gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple,
1922 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1925 gulong scrub_kp_handler_ID;
1927 g_return_if_fail (account != NULL);
1929 prepare_scrubbing ();
1931 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1932 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1933 G_CALLBACK(scrub_kp_handler), NULL);
1934 gnc_window_set_progressbar_window (window);
1937 xaccAccountScrubImbalance (account, gnc_window_show_progress);
1940 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1945 finish_scrubbing (window, scrub_kp_handler_ID);
1949 gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple,
1953 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1956 gulong scrub_kp_handler_ID;
1958 g_return_if_fail (account != NULL);
1960 prepare_scrubbing ();
1962 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1963 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1964 G_CALLBACK(scrub_kp_handler), NULL);
1965 gnc_window_set_progressbar_window (window);
1968 xaccAccountTreeScrubImbalance (account, gnc_window_show_progress);
1971 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1972 xaccAccountTreeScrubLots(account);
1976 finish_scrubbing (window, scrub_kp_handler_ID);
1980 gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple,
1984 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1985 Account *root = gnc_get_current_root_account ();
1987 gulong scrub_kp_handler_ID;
1989 prepare_scrubbing ();
1991 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1992 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1993 G_CALLBACK(scrub_kp_handler), NULL);
1994 gnc_window_set_progressbar_window (window);
1997 xaccAccountTreeScrubImbalance (root, gnc_window_show_progress);
1999 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
2000 xaccAccountTreeScrubLots(root);
2004 finish_scrubbing (window, scrub_kp_handler_ID);
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
GncPluginPage * gnc_plugin_page_register_new(Account *account, gboolean subaccounts)
Create a new "register" plugin page, given a pointer to an account.
Account * gnc_plugin_page_account_tree_get_current_account(GncPluginPageAccountTree *page)
Given a pointer to an account tree plugin page, return the selected account (if any).
Functions to load, save and get gui state.
High-Level API for imposing Lot constraints.
GtkWidget * gnc_plugin_page_get_window(GncPluginPage *page)
Retrieve a pointer to the GncMainWindow (GtkWindow) containing this page.
const gchar * tab_icon
The relative name of the icon that should be shown on the tab for this page.
gboolean(* focus_page_function)(GncPluginPage *plugin_page)
This function performs specific actions to set the focus on a specific widget.
void gnc_main_window_update_menu_and_toolbar(GncMainWindow *window, GncPluginPage *page, const gchar **ui_updates)
Update the main window menu with the placeholders listed in ui_updates and load the page specific too...
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.
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.
gboolean gnc_main_window_button_press_cb(GtkWidget *whatever, GdkEventButton *event, GncPluginPage *page)
Callback function invoked when the user clicks in the content of any Gnucash window.
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.
void gnc_plugin_page_account_tree_open(Account *account, GtkWindow *win)
Given a pointer to an account, the account tree will open and the account will be selected (if any)...
This file contains the functions to present a gui to the user for creating a new account or editing a...
void gnc_account_foreach_descendant(const Account *acc, AccountCb thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling 'func' on each...
GncPluginPage * gnc_plugin_page_account_tree_new(void)
Create a new "account tree" plugin page.
void gnc_tree_view_account_set_editing_finished_cb(GncTreeViewAccount *view, GFunc editing_finished_cb, gpointer editing_cb_data)
Setup the callback for when the user finishes editing the account tree so actions can be enabled like...
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
gboolean gnc_get_ongoing_scrub(void)
The gnc_get_ongoing_scrub () method returns TRUE if a scrub operation is ongoing. ...
utility functions for the GnuCash UI
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
GncPluginPage *(* recreate_page)(GtkWidget *window, GKeyFile *file, const gchar *group)
Create a new page based on the information saved during a previous instantiation of gnucash...
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
void gnc_main_window_init_short_names(GncMainWindow *window, GncToolBarShortNames *toolbar_labels)
Update the labels of the toolbar items with short names.
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
Functions that are supported by all types of windows.
GSimpleActionGroup * gnc_plugin_page_get_action_group(GncPluginPage *page)
Retrieve the GSimpleActionGroup object associated with this page.
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling 'func' on each...
GtkWidget * window
The window that contains the display widget for this plugin.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
GSimpleActionGroup * gnc_plugin_page_create_action_group(GncPluginPage *page, const gchar *group_name)
Create the GSimpleActionGroup object associated with this page.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
void xaccAccountScrubLots(Account *acc)
The xaccAccountScrubLots() routine makes sure that every split in the account is assigned to a lot...
void xaccAccountMoveAllSplits(Account *accfrom, Account *accto)
The xaccAccountMoveAllSplits() routine reassigns each of the splits in accfrom to accto...
void gnc_tree_view_account_set_editing_started_cb(GncTreeViewAccount *view, GFunc editing_started_cb, gpointer editing_cb_data)
Setup the callback for when the user starts editing the account tree so actions can be disabled like ...
GtkTreeViewColumn * gnc_tree_view_find_column_by_name(GncTreeView *view, const gchar *wanted)
Find a tree column given the "pref name" used with saved state.
#define ENTER(format, args...)
Print a function entry debugging message.
Cleanup functions for business objects.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
This file contains the functions to present a dialog box with a list of object references and an expl...
void gnc_ui_edit_account_window(GtkWindow *parent, Account *account)
Display a window for editing the attributes of an existing account.
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Display a data plugin page in a window.
void(* destroy_widget)(GncPluginPage *plugin_page)
Function called to destroy the display widget for a particular type of plugin.
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
#define xaccAccountGetGUID(X)
void gnc_set_abort_scrub(gboolean abort)
The gnc_set_abort_scrub () method causes a currently running scrub operation to stop, if abort is TRUE; gnc_set_abort_scrub(FALSE) must be called before any scrubbing operation.
convert single-entry accounts to clean double-entry
GAction * gnc_main_window_find_action_in_group(GncMainWindow *window, const gchar *group_name, const gchar *action_name)
Find the GAction in a specific action group for window.
void gnc_tree_view_account_set_filter(GncTreeViewAccount *view, gnc_tree_view_account_filter_func func, gpointer data, GSourceFunc destroy)
This function attaches a filter function to the given account tree.
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
Functions providing a register page for the GnuCash UI.
The class data structure for a content plugin.
void gnc_tree_view_account_refilter(GncTreeViewAccount *view)
This function forces the account tree filter to be evaluated.
GtkTreeView implementation for gnucash account tree.
Account public routines (C++ api)
GAction * gnc_main_window_find_action(GncMainWindow *window, const gchar *action_name)
Find the GAction in the main window.
void xaccAccountTreeScrubOrphans(Account *acc, QofPercentageFunc percentagefunc)
The xaccAccountTreeScrubOrphans() method performs this scrub for the indicated account and its childr...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
void gnc_plugin_page_disconnect_page_changed(GncPluginPage *page)
Disconnect the page_changed_id signal callback.
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
Create a new account tree view.
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.
gboolean gnc_plugin_page_account_tree_filter_accounts(Account *account, gpointer user_data)
This function tells the account tree view whether or not to filter out a particular account...
const gchar * plugin_name
The textual name of this plugin.
void gncScrubBusinessAccount(Account *acc, QofPercentageFunc percentagefunc)
The gncScrubBusinessAccount() function will call all scrub functions relevant for a given account on ...
void gnc_tree_view_account_clear_model_cache(GncTreeViewAccount *view)
This function clears the tree model account cache so the values will be updated/refreshed.
GtkWidget *(* create_widget)(GncPluginPage *plugin_page)
Function called to create the display widget for a particular type of plugin.
Account * gnc_tree_view_account_get_account_from_path(GncTreeViewAccount *view, GtkTreePath *s_path)
This function returns the account associated with the specified path.
void xaccAccountScrubOrphans(Account *acc, QofPercentageFunc percentagefunc)
The xaccAccountScrubOrphans() method performs this scrub only for the indicated account, and not for any of its children.
Gnome specific utility functions.
gint gnc_account_n_children(const Account *account)
Return the number of children of the specified account.
gboolean(* finish_pending)(GncPluginPage *plugin_page)
This function vector is called to finish any outstanding activities.
All type declarations for the whole Gnucash engine.
void gnc_ui_new_account_window(GtkWindow *parent, QofBook *book, Account *parent_acct)
Display a window for creating a new account.
void(* save_page)(GncPluginPage *page, GKeyFile *file, const gchar *group)
Save enough information about this page so that it can be recreated next time the user starts gnucash...
GtkTreeModel implementation to display account types in a GtkTreeView.
GList * qof_instance_get_referring_object_list(const QofInstance *inst)
Returns a list of objects which refer to a specific object.
const gchar * gnc_tree_view_get_state_section(GncTreeView *view)
Get the name of the state section this tree view is associated with.
Generic api to store and retrieve preferences.
GList * gnc_account_get_descendants(const Account *account)
This routine returns a flat list of all of the accounts that are descendants of the specified account...
Functions providing a chart of account page.
void gnc_tree_view_account_set_selected_account(GncTreeViewAccount *view, Account *account)
This function selects an account in the account tree view.
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
GList * gnc_account_get_children(const Account *account)
This routine returns a GList of all children accounts of the specified account.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
Provide the menus to create a chart of account page.
void gnc_plugin_page_inserted_cb(GncPluginPage *page, gpointer user_data)
Set up the page_changed callback for when the current page is changed.
void gnc_main_window_close_page(GncPluginPage *page)
Remove a data plugin page from a window and display the previous page.
Account * gnc_tree_view_account_get_selected_account(GncTreeViewAccount *view)
This function returns the account associated with the selected item in the account tree view...
#define LEAVE(format, args...)
Print a function exit debugging message.
void gnc_plugin_page_add_book(GncPluginPage *page, QofBook *book)
Add a book reference to the specified page.
void gncScrubBusinessAccountTree(Account *acc, QofPercentageFunc percentagefunc)
The gncScrubBusinessAccountTreeLots() function will call gncScrubBusinessAccount() on the given accou...
gint gnc_list_length_cmp(const GList *list, size_t len)
Scans the GList elements the minimum number of iterations required to test it against a specified siz...
API for Transactions and Splits (journal entries)
The type used to store guids in C.
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
GtkWidget * summarybar
The summary bar widget (if any) that is associated with this plugin.
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.