40 #include <glib/gi18n.h> 50 #include "dialog-transfer.h" 51 #include "dialog-utils.h" 52 #include "assistant-hierarchy.h" 53 #include "assistant-stock-transaction.h" 54 #include "gnc-account-sel.h" 55 #include "gnc-component-manager.h" 59 #include "gnc-icons.h" 62 #include "gnc-session.h" 63 #include "gnc-split-reg.h" 70 #include "dialog-lot-viewer.h" 71 #include "window-reconcile.h" 72 #include "window-autoclear.h" 73 #include "window-main-summarybar.h" 75 #include "dialog-find-account.h" 79 static QofLogModule log_module = GNC_MOD_GUI;
88 typedef struct _delete_helper
91 gboolean has_ro_splits;
95 #define PLUGIN_PAGE_ACCT_TREE_CM_CLASS "plugin-page-acct-tree" 96 #define STATE_SECTION "Account Hierarchy" 98 #define DELETE_DIALOG_FILTER "filter" 99 #define DELETE_DIALOG_ACCOUNT "account" 100 #define DELETE_DIALOG_TRANS_MAS "trans_mas" 101 #define DELETE_DIALOG_SA_MAS "sa_mas" 102 #define DELETE_DIALOG_SA_TRANS_MAS "sa_trans_mas" 103 #define DELETE_DIALOG_SA_TRANS "sa_trans" 104 #define DELETE_DIALOG_SA_SPLITS "sa_has_split" 105 #define DELETE_DIALOG_OK_BUTTON "deletebutton" 116 GtkTreeView *tree_view;
121 #define GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(o) \ 122 ((GncPluginPageAccountTreePrivate*)gnc_plugin_page_account_tree_get_instance_private((GncPluginPageAccountTree*)o)) 128 static void gnc_plugin_page_account_tree_finalize (GObject *
object);
129 static void gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data);
131 static gboolean gnc_plugin_page_account_tree_focus_widget (
GncPluginPage *plugin_page);
132 static GtkWidget *gnc_plugin_page_account_tree_create_widget (
GncPluginPage *plugin_page);
133 static void gnc_plugin_page_account_tree_destroy_widget (
GncPluginPage *plugin_page);
134 static void gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page, GKeyFile *file,
const gchar *group);
135 static GncPluginPage *gnc_plugin_page_account_tree_recreate_page (GtkWidget *window, GKeyFile *file,
const gchar *group);
138 static void gnc_plugin_page_account_tree_summarybar_position_changed(gpointer prefs, gchar* pref, gpointer user_data);
139 static gboolean gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget, GdkEventButton *event,
GncPluginPage *page);
140 static void gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
142 GtkTreeViewColumn *col,
145 static void gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
147 static void accounting_period_changed_cb(gpointer prefs, gchar *pref, gpointer user_data);
150 void gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb, GtkWidget *dialog);
151 void gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b);
155 static void gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
156 static void gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
157 static void gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
158 static void gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
159 static void gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
160 static void gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
161 static void gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
162 static void gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
163 static void gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
164 static void gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
165 static void gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
166 static void gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
167 static void gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
168 static void gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
169 static void gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
170 static void gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
171 static void gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
172 static void gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
173 static void gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
174 static void gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
175 static void gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
176 static void gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
179 static int confirm_delete_account (GSimpleAction *simple,
188 static guint plugin_page_signals[LAST_SIGNAL] = { 0 };
191 static GActionEntry gnc_plugin_page_account_tree_actions [] =
193 {
"FileNewAccountAction", gnc_plugin_page_account_tree_cmd_new_account, NULL, NULL, NULL },
194 {
"FileAddAccountHierarchyAssistantAction", gnc_plugin_page_account_tree_cmd_file_new_hierarchy, NULL, NULL, NULL },
195 {
"EditOpenAccountAction", gnc_plugin_page_account_tree_cmd_open_account, NULL, NULL, NULL },
196 {
"EditOpenSubaccountsAction", gnc_plugin_page_account_tree_cmd_open_subaccounts, NULL, NULL, NULL },
197 {
"EditEditAccountAction", gnc_plugin_page_account_tree_cmd_edit_account, NULL, NULL, NULL },
198 {
"EditDeleteAccountAction", gnc_plugin_page_account_tree_cmd_delete_account, NULL, NULL, NULL },
199 {
"EditCascadeAccountAction", gnc_plugin_page_account_tree_cmd_cascade_account_properties, NULL, NULL, NULL },
200 {
"EditFindAccountAction", gnc_plugin_page_account_tree_cmd_find_account, NULL, NULL, NULL },
201 {
"EditFindAccountPopupAction", gnc_plugin_page_account_tree_cmd_find_account_popup, NULL, NULL, NULL },
202 {
"EditRenumberSubaccountsAction", gnc_plugin_page_account_tree_cmd_renumber_accounts, NULL, NULL, NULL },
203 {
"EditTaxOptionsAction", gnc_plugin_page_account_tree_cmd_edit_tax_options, NULL, NULL, NULL },
204 {
"ViewFilterByAction", gnc_plugin_page_account_tree_cmd_view_filter_by, NULL, NULL, NULL },
205 {
"ViewRefreshAction", gnc_plugin_page_account_tree_cmd_refresh, NULL, NULL, NULL },
206 {
"ActionsReconcileAction", gnc_plugin_page_account_tree_cmd_reconcile, NULL, NULL, NULL },
207 {
"ActionsAutoClearAction", gnc_plugin_page_account_tree_cmd_autoclear, NULL, NULL, NULL },
208 {
"ActionsTransferAction", gnc_plugin_page_account_tree_cmd_transfer, NULL, NULL, NULL },
209 {
"ActionsStockSplitAction", gnc_plugin_page_account_tree_cmd_stock_split, NULL, NULL, NULL },
210 {
"ActionsStockAssistantAction", gnc_plugin_page_account_tree_cmd_stock_assistant, NULL, NULL, NULL },
211 {
"ActionsLotsAction", gnc_plugin_page_account_tree_cmd_lots, NULL, NULL, NULL },
212 {
"ScrubAction", gnc_plugin_page_account_tree_cmd_scrub, NULL, NULL, NULL },
213 {
"ScrubSubAction", gnc_plugin_page_account_tree_cmd_scrub_sub, NULL, NULL, NULL },
214 {
"ScrubAllAction", gnc_plugin_page_account_tree_cmd_scrub_all, NULL, NULL, NULL },
217 static guint gnc_plugin_page_account_tree_n_actions = G_N_ELEMENTS(gnc_plugin_page_account_tree_actions);
220 static const gchar *gnc_plugin_load_ui_items [] =
229 "ActionsPlaceholder4",
230 "ActionsPlaceholder5",
231 "ActionsPlaceholder6",
240 static const gchar *actions_requiring_account_rw[] =
242 "EditEditAccountAction",
243 "EditDeleteAccountAction",
244 "ActionsReconcileAction",
245 "ActionsAutoClearAction",
251 static const gchar *actions_requiring_subaccounts_rw[] =
253 "EditRenumberSubaccountsAction",
254 "EditCascadeAccountAction",
260 static const gchar *actions_requiring_account_always[] =
262 "EditOpenAccountAction",
263 "EditOpenSubaccountsAction",
268 static const gchar* actions_requiring_priced_account[] =
270 "ActionsStockAssistantAction",
275 static const gchar* readonly_inactive_actions[] =
277 "FileNewAccountAction",
278 "FileAddAccountHierarchyAssistantAction",
279 "EditEditAccountAction",
280 "EditDeleteAccountAction",
281 "ActionsTransferAction",
282 "ActionsReconcileAction",
283 "ActionsAutoClearAction",
284 "ActionsStockSplitAction",
294 {
"EditOpenAccountAction", N_(
"Open") },
295 {
"EditEditAccountAction", N_(
"Edit") },
296 {
"FileNewAccountAction", N_(
"New") },
297 {
"EditDeleteAccountAction", N_(
"Delete") },
305 auto plugin_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE
306 (g_object_new (GNC_TYPE_PLUGIN_PAGE_ACCOUNT_TREE,
nullptr));
308 LEAVE(
"new account tree page %p", plugin_page);
309 return GNC_PLUGIN_PAGE (plugin_page);
314 static gboolean show_abort_verify = TRUE;
319 gnc_suspend_gui_refresh ();
324 finish_scrubbing (GncWindow *window, gulong handler_id)
326 g_signal_handler_disconnect (G_OBJECT(window), handler_id);
327 show_abort_verify = TRUE;
328 gnc_resume_gui_refresh ();
332 check_repair_abort_YN = N_(
"'Check & Repair' is currently running, do you want to abort it?");
339 if (show_abort_verify)
342 (GNC_PLUGIN_PAGE(page))), FALSE,
343 "%s", _(check_repair_abort_YN));
345 show_abort_verify = FALSE;
354 if (gnc_get_abort_scrub ())
367 GObjectClass *object_class = G_OBJECT_CLASS (klass);
370 object_class->finalize = gnc_plugin_page_account_tree_finalize;
372 gnc_plugin_class->
tab_icon = GNC_ICON_ACCOUNT;
373 gnc_plugin_class->
plugin_name = GNC_PLUGIN_PAGE_ACCOUNT_TREE_NAME;
374 gnc_plugin_class->
create_widget = gnc_plugin_page_account_tree_create_widget;
375 gnc_plugin_class->
destroy_widget = gnc_plugin_page_account_tree_destroy_widget;
376 gnc_plugin_class->
save_page = gnc_plugin_page_account_tree_save_page;
377 gnc_plugin_class->
recreate_page = gnc_plugin_page_account_tree_recreate_page;
379 gnc_plugin_class->
finish_pending = gnc_plugin_page_account_finish_pending;
381 plugin_page_signals[ACCOUNT_SELECTED] =
382 g_signal_new (
"account_selected",
383 G_OBJECT_CLASS_TYPE (object_class),
387 g_cclosure_marshal_VOID__POINTER,
395 GSimpleActionGroup *simple_action_group = NULL;
398 const GList *page_list;
400 ENTER(
"page %p", plugin_page);
401 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(plugin_page);
404 parent = GNC_PLUGIN_PAGE(plugin_page);
405 g_object_set (G_OBJECT(plugin_page),
406 "page-name", _(
"Accounts"),
407 "ui-description",
"gnc-plugin-page-account-tree.ui",
409 g_signal_connect (G_OBJECT (plugin_page),
"selected",
410 G_CALLBACK (gnc_plugin_page_account_tree_selected), plugin_page);
418 if (!page_list || plugin_page == page_list->data)
420 g_object_set_data (G_OBJECT(plugin_page), PLUGIN_PAGE_IMMUTABLE,
426 g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
427 gnc_plugin_page_account_tree_actions,
428 gnc_plugin_page_account_tree_n_actions,
432 priv->fd.visible_types = -1;
433 priv->fd.show_hidden = FALSE;
434 priv->fd.show_unused = TRUE;
435 priv->fd.show_zero_total = TRUE;
436 priv->fd.filter_override = g_hash_table_new (g_direct_hash, g_direct_equal);
438 LEAVE(
"page %p, priv %p, action group %p",
439 plugin_page, priv, simple_action_group);
443 gnc_plugin_page_account_tree_finalize (GObject *
object)
448 ENTER(
"object %p",
object);
449 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (
object);
450 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
451 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
452 g_return_if_fail (priv != NULL);
454 G_OBJECT_CLASS (gnc_plugin_page_account_tree_parent_class)->finalize (
object);
464 const GList *page_list;
475 for ( ; page_list; page_list = g_list_next(page_list))
477 plugin_page = GNC_PLUGIN_PAGE(page_list->data);
478 if (GTK_WINDOW(plugin_page->
window) == win)
483 plugin_page = GNC_PLUGIN_PAGE(page_list->data);
488 g_return_if_fail(plugin_page);
489 window = plugin_page->
window;
493 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
494 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
498 Account *root_account = gnc_get_current_root_account ();
499 Account *parent_account = NULL;
500 Account *temp_account = account;
502 g_hash_table_insert (priv->fd.filter_override, account, account);
505 while (parent_account != root_account)
509 g_hash_table_insert (priv->fd.filter_override, parent_account, parent_account);
510 temp_account = parent_account;
523 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
524 ENTER(
"page %p (tree view %p)", page, priv->tree_view);
532 LEAVE(
"account %p", account);
541 gnc_plugin_page_account_tree_focus_widget (
GncPluginPage *account_plugin_page)
543 if (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(account_plugin_page))
546 GtkTreeView *view = GTK_TREE_VIEW(priv->tree_view);
550 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
553 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
557 gnc_plugin_load_ui_items);
564 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
566 if (!gtk_widget_is_focus (GTK_WIDGET(view)))
567 gtk_widget_grab_focus (GTK_WIDGET(view));
575 gnc_plugin_page_account_refresh_cb (GHashTable *changes, gpointer user_data)
579 gnc_plugin_page_account_tree_cmd_refresh(NULL, NULL, user_data);
583 gnc_plugin_page_account_tree_close_cb (gpointer user_data)
594 "GncPluginPageAccountTreeActions",
595 "EditDeleteAccountAction");
597 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
605 "GncPluginPageAccountTreeActions",
606 "EditDeleteAccountAction");
608 g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
612 gnc_plugin_page_account_tree_create_widget (
GncPluginPage *plugin_page)
616 GtkTreeSelection *selection;
617 GtkTreeView *tree_view;
618 GtkWidget *scrolled_window;
619 GtkTreeViewColumn *col;
621 ENTER(
"page %p", plugin_page);
622 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
623 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
624 if (priv->widget != NULL)
626 LEAVE(
"widget = %p", priv->widget);
630 priv->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
631 gtk_box_set_homogeneous (GTK_BOX (priv->widget), FALSE);
632 gtk_widget_show (priv->widget);
635 gtk_widget_set_name (GTK_WIDGET(priv->widget),
"gnc-id-account-page");
637 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
638 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
639 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
640 gtk_widget_show (scrolled_window);
641 gtk_box_pack_start (GTK_BOX (priv->widget), scrolled_window,
646 GNC_TREE_VIEW(tree_view),
"description");
647 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
649 GNC_TREE_VIEW(tree_view),
"total");
650 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
652 g_object_set(G_OBJECT(tree_view),
653 "state-section", STATE_SECTION,
654 "show-column-menu", TRUE,
659 gnc_tree_view_account_set_code_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
660 gnc_tree_view_account_code_edited_cb);
661 gnc_tree_view_account_set_description_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
662 gnc_tree_view_account_description_edited_cb);
663 gnc_tree_view_account_set_notes_edited(GNC_TREE_VIEW_ACCOUNT(tree_view),
664 gnc_tree_view_account_notes_edited_cb);
668 (GFunc)gnc_plugin_page_account_editing_started_cd, page);
670 (GFunc)gnc_plugin_page_account_editing_finished_cb, page);
672 priv->tree_view = tree_view;
673 selection = gtk_tree_view_get_selection(tree_view);
674 g_signal_connect (G_OBJECT (selection),
"changed",
675 G_CALLBACK (gnc_plugin_page_account_tree_selection_changed_cb), page);
676 g_signal_connect (G_OBJECT (tree_view),
"button-press-event",
677 G_CALLBACK (gnc_plugin_page_account_tree_button_press_cb), page);
678 g_signal_connect (G_OBJECT (tree_view),
"row-activated",
679 G_CALLBACK (gnc_plugin_page_account_tree_double_click_cb), page);
681 gtk_tree_view_set_headers_visible(tree_view, TRUE);
682 gnc_plugin_page_account_tree_selection_changed_cb (NULL, page);
683 gtk_widget_show (GTK_WIDGET (tree_view));
684 gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET(tree_view));
686 priv->fd.tree_view = GNC_TREE_VIEW_ACCOUNT(priv->tree_view);
688 GNC_TREE_VIEW_ACCOUNT(tree_view),
692 gnc_register_gui_component(PLUGIN_PAGE_ACCT_TREE_CM_CLASS,
693 gnc_plugin_page_account_refresh_cb,
694 gnc_plugin_page_account_tree_close_cb,
696 gnc_gui_component_set_session (priv->component_id,
697 gnc_get_current_session());
699 plugin_page->
summarybar = gnc_main_window_summary_new();
700 gtk_box_pack_start (GTK_BOX (priv->widget), plugin_page->
summarybar,
703 gnc_plugin_page_account_tree_summarybar_position_changed(NULL, NULL, page);
705 GNC_PREF_SUMMARYBAR_POSITION_TOP,
706 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
709 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
710 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
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 (gpointer)accounting_period_changed_cb, page);
726 g_signal_connect (G_OBJECT(plugin_page),
"inserted",
731 gnc_tree_view_account_restore_filter (GNC_TREE_VIEW_ACCOUNT(priv->tree_view), &priv->fd,
734 LEAVE(
"widget = %p", priv->widget);
739 gnc_plugin_page_account_tree_destroy_widget (
GncPluginPage *plugin_page)
744 ENTER(
"page %p", plugin_page);
745 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page);
746 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
749 GNC_PREF_SUMMARYBAR_POSITION_TOP,
750 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
753 GNC_PREF_SUMMARYBAR_POSITION_BOTTOM,
754 (gpointer)gnc_plugin_page_account_tree_summarybar_position_changed,
758 (gpointer)accounting_period_changed_cb, page);
760 (gpointer)accounting_period_changed_cb, page);
762 (gpointer)accounting_period_changed_cb, page);
764 (gpointer)accounting_period_changed_cb, page);
766 (gpointer)accounting_period_changed_cb, page);
768 (gpointer)accounting_period_changed_cb, page);
771 gnc_tree_view_account_save_filter (GNC_TREE_VIEW_ACCOUNT(priv->tree_view), &priv->fd,
775 g_hash_table_destroy(priv->fd.filter_override);
781 g_idle_remove_by_data (plugin_page);
785 g_object_unref(G_OBJECT(priv->widget));
789 if (priv->component_id)
791 gnc_unregister_gui_component(priv->component_id);
792 priv->component_id = 0;
795 LEAVE(
"widget destroyed");
802 GSimpleActionGroup *simple_action_group = NULL;
805 gboolean has_account = FALSE;
806 gboolean subaccounts = FALSE;
808 g_return_if_fail (plugin_page && GNC_IS_PLUGIN_PAGE(plugin_page));
810 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE (plugin_page);
812 if (gtk_tree_view_get_selection (priv->tree_view))
815 has_account = (account != NULL);
822 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple_action_group));
828 allow_write && has_account);
832 allow_write && subaccounts);
836 g_signal_emit (plugin_page, plugin_page_signals[ACCOUNT_SELECTED], 0, account);
844 gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data)
847 g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page));
848 update_inactive_actions(plugin_page);
861 gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page,
863 const gchar *group_name)
868 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page));
869 g_return_if_fail (key_file != NULL);
870 g_return_if_fail (group_name != NULL);
872 ENTER(
"page %p, key_file %p, group_name %s", plugin_page, key_file,
875 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page);
876 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
878 gnc_tree_view_account_save(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
879 &priv->fd, key_file, group_name);
895 gnc_plugin_page_account_tree_recreate_page (GtkWidget *window,
897 const gchar *group_name)
903 g_return_val_if_fail(key_file, NULL);
904 g_return_val_if_fail(group_name, NULL);
905 ENTER(
"key_file %p, group_name %s", key_file, group_name);
909 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(page);
910 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
915 gnc_tree_view_account_restore(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
916 &priv->fd, key_file, group_name);
925 gnc_plugin_page_account_tree_summarybar_position_changed (gpointer prefs,
932 GtkPositionType position = GTK_POS_BOTTOM;
934 g_return_if_fail(user_data != NULL);
936 plugin_page = GNC_PLUGIN_PAGE(user_data);
937 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (user_data);
938 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
941 position = GTK_POS_TOP;
943 gtk_box_reorder_child(GTK_BOX(priv->widget),
945 (position == GTK_POS_TOP ? 0 : -1) );
956 gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget,
957 GdkEventButton *event,
961 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
963 ENTER(
"widget %p, event %p, page %p", widget, event, page);
977 gboolean include_subs)
985 window = GNC_PLUGIN_PAGE (page)->window;
991 gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
993 GtkTreeViewColumn *col,
999 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1000 g_return_if_fail (treeview);
1002 model = gtk_tree_view_get_model(treeview);
1003 if (gtk_tree_model_get_iter(model, &iter, path))
1011 if (gtk_tree_model_iter_has_child(model, &iter))
1015 if (gtk_tree_view_row_expanded(treeview, path))
1016 gtk_tree_view_collapse_row(treeview, path);
1018 gtk_tree_view_expand_row(treeview, path, FALSE);
1024 gppat_open_account_common (page, account, FALSE);
1030 gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
1034 update_inactive_actions (plugin_page);
1038 accounting_period_changed_cb (gpointer prefs, gchar *pref, gpointer user_data)
1040 gnc_plugin_page_account_tree_cmd_refresh (NULL, NULL, user_data);
1045 gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple,
1049 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1057 gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple,
1061 gnc_ui_hierarchy_assistant(FALSE);
1065 gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple,
1069 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1072 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1074 gppat_open_account_common (page, account, FALSE);
1078 gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple,
1082 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1085 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1087 gppat_open_account_common (page, account, TRUE);
1091 gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple,
1095 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1098 ENTER(
"action %p, page %p", simple, page);
1101 g_return_if_fail (account != NULL);
1108 gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple,
1112 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1115 ENTER(
"action %p, page %p", simple, page);
1119 gnc_find_account_dialog (window, NULL);
1124 gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple,
1128 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1132 ENTER(
"action %p, page %p", simple, page);
1138 gnc_find_account_dialog (window, account);
1143 gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple,
1147 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1151 ENTER(
"action %p, page %p", simple, page);
1157 if (account != NULL)
1158 gnc_account_cascade_properties_dialog (window, account);
1164 delete_account_helper (
Account * account, gpointer data)
1167 auto& splits{xaccAccountGetSplits (account)};
1170 helper_res->has_splits = !splits.empty();
1171 helper_res->has_ro_splits = std::any_of (splits.begin(), splits.end(), split_ro);
1173 return GINT_TO_POINTER (helper_res->has_splits || helper_res->has_ro_splits);
1181 set_ok_sensitivity(GtkWidget *dialog)
1185 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1186 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1188 sensitive = ((!sa_mas ||
1189 !gtk_widget_is_sensitive (sa_mas) ||
1190 gnc_account_sel_get_visible_account_num (GNC_ACCOUNT_SEL (sa_mas))) &&
1192 !gtk_widget_is_sensitive (trans_mas) ||
1193 gnc_account_sel_get_visible_account_num (GNC_ACCOUNT_SEL (trans_mas))));
1195 auto button = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON));
1196 gtk_widget_set_sensitive(button, sensitive);
1200 gppat_get_exclude_list (
Account *acc, gboolean exclude_subaccounts)
1202 GList *acct_list = NULL;
1204 if (exclude_subaccounts)
1207 acct_list = g_list_prepend (acct_list, acc);
1213 gppat_populate_gas_list(GtkWidget *dialog,
1215 gboolean exclude_subaccounts)
1221 g_return_if_fail(GTK_IS_DIALOG(dialog));
1224 account = GNC_ACCOUNT(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT));
1225 filter =
static_cast<GList*
>(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_FILTER));
1228 gnc_account_sel_set_acct_filters (gas, filter, NULL);
1231 exclude = gppat_get_exclude_list (account, exclude_subaccounts);
1232 gnc_account_sel_set_acct_exclude_filter (gas, exclude);
1233 g_list_free (exclude);
1235 gnc_account_sel_set_account (gas, NULL, TRUE);
1238 set_ok_sensitivity(dialog);
1242 gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb,
1245 g_return_if_fail(GTK_IS_DIALOG(dialog));
1248 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1249 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(trans_mas), !gtk_toggle_button_get_active(sa_mrb));
1258 gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b)
1260 GtkWidget *dialog = gtk_widget_get_toplevel(widget);
1261 auto subaccount_trans = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS));
1262 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1263 auto have_splits = g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS) !=
nullptr;
1265 gtk_widget_set_sensitive(widget, !gtk_toggle_button_get_active(b));
1268 if ((have_splits) && !gtk_widget_is_sensitive(sa_mas))
1269 gtk_widget_set_sensitive(subaccount_trans, TRUE);
1271 gtk_widget_set_sensitive(subaccount_trans, FALSE);
1273 set_ok_sensitivity(dialog);
1277 gppat_setup_account_selector (GtkBuilder *builder, GtkWidget *dialog,
1278 const gchar *hbox,
const gchar *sel_name)
1280 GtkWidget *selector = gnc_account_sel_new();
1281 GtkWidget *box = GTK_WIDGET(gtk_builder_get_object (builder, hbox));
1283 gtk_box_pack_start (GTK_BOX(box), selector, TRUE, TRUE, 0);
1286 if (g_strcmp0 (sel_name, DELETE_DIALOG_SA_MAS) == 0)
1287 g_object_set (selector,
"hide-placeholder", FALSE, NULL);
1289 g_object_set_data(G_OBJECT(dialog), sel_name, selector);
1291 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(selector), TRUE);
1292 gtk_widget_show_all(box);
1298 commodity_mismatch_dialog (
const Account* account, GtkWindow* parent)
1302 char* message = g_strdup_printf (
1303 _(
"Account %s does not have the same currency as the one you're " 1304 "moving transactions from.\nAre you sure you want to do this?"),
1306 GtkWidget* error_dialog =
1307 gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT,
1308 GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE,
1310 gtk_dialog_add_buttons (GTK_DIALOG(error_dialog),
1311 _(
"_Pick another account"), GTK_RESPONSE_CANCEL,
1312 _(
"_Do it anyway"), GTK_RESPONSE_ACCEPT,
1314 response = gtk_dialog_run (GTK_DIALOG (error_dialog));
1315 gtk_widget_destroy (error_dialog);
1317 g_free (account_name);
1325 GNCAccountSel *selector;
1327 gboolean for_account;
1331 adopter_set_account_and_match (
Adopter* adopter)
1333 if (!(adopter->selector &&
1334 gtk_widget_is_sensitive (GTK_WIDGET (adopter->selector))))
1336 adopter->new_account = gnc_account_sel_get_account(adopter->selector);
1338 if (!adopter->for_account && adopter->old_account && adopter->new_account)
1345 adopter_init (
Adopter* adopter, GtkWidget *selector,
Account* account,
1346 gboolean for_account)
1348 adopter->selector = GNC_ACCOUNT_SEL (selector);
1349 adopter->new_account = NULL;
1350 adopter->old_account = account;
1351 adopter->match = TRUE;
1352 adopter->for_account = for_account;
1356 adopter_match (
Adopter* adopter, GtkWindow *parent)
1359 if (adopter->match || adopter->for_account)
1361 result = commodity_mismatch_dialog (adopter->new_account, parent);
1362 return (result == GTK_RESPONSE_ACCEPT);
1374 account_subaccount (
Account* account)
1379 subaccount = GNC_ACCOUNT(subs->data);
1385 account_delete_dialog (
Account *account, GtkWindow *parent,
Adopters* adopt)
1387 GtkWidget *dialog = NULL;
1388 GtkWidget *widget = NULL;
1389 gchar *title = NULL;
1390 GtkBuilder *builder = gtk_builder_new();
1395 acct_name = g_strdup (_(
"(no name)"));
1397 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_delete_dialog");
1399 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_delete_dialog"));
1400 gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
1403 g_object_set_data_full (G_OBJECT(dialog), DELETE_DIALOG_FILTER, filter,
1404 (GDestroyNotify) g_list_free);
1405 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT, account);
1406 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"header"));
1407 title = g_strdup_printf(_(
"Deleting account %s"), acct_name);
1408 gtk_label_set_text(GTK_LABEL(widget), title);
1412 widget = GTK_WIDGET(gtk_builder_get_object (builder, DELETE_DIALOG_OK_BUTTON));
1413 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON, widget);
1417 adopter_init (&adopt->trans,
1418 gppat_setup_account_selector (builder, dialog,
1420 DELETE_DIALOG_TRANS_MAS),
1424 if (!xaccAccountGetSplits(account).empty())
1428 delete_account_helper(account, &delete_res2);
1429 if (delete_res2.has_ro_splits)
1431 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_rw")));
1432 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"trans_drb"));
1433 gtk_widget_set_sensitive(widget, FALSE);
1436 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1440 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"transactions")), FALSE);
1441 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1445 adopter_init (&adopt->subacct,
1446 gppat_setup_account_selector (builder, dialog,
1448 DELETE_DIALOG_SA_MAS),
1452 adopter_init (&adopt->subtrans,
1453 gppat_setup_account_selector (builder, dialog,
1454 "sa_trans_mas_hbox",
1455 DELETE_DIALOG_SA_TRANS_MAS),
1456 account_subaccount (account), FALSE);
1457 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS,
1458 GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")));
1464 &adopt->delete_res);
1465 if (adopt->delete_res.has_splits)
1467 if (adopt->delete_res.has_ro_splits)
1469 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_rw")));
1470 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_drb"));
1471 gtk_widget_set_sensitive(widget, FALSE);
1474 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1476 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(1));
1480 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(0));
1481 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1482 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1487 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccounts")), FALSE);
1488 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1489 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1493 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1495 gtk_builder_connect_signals(builder, dialog);
1496 g_object_unref(G_OBJECT(builder));
1502 gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple,
1506 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1513 GtkWidget *dialog = NULL;
1515 if (account == NULL)
1521 memset (&adopt, 0,
sizeof (adopt));
1527 #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") 1529 gnc_ui_object_references_show(EXPLANATION, list);
1538 acct_name = g_strdup (_(
"(no name)"));
1541 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);
1542 gnc_error_dialog(GTK_WINDOW(window),
"%s", message);
1552 do_delete_account (account, NULL, NULL, NULL);
1556 dialog = account_delete_dialog (account, GTK_WINDOW (window), &adopt);
1560 response = gtk_dialog_run(GTK_DIALOG(dialog));
1562 if (response != GTK_RESPONSE_ACCEPT)
1564 gtk_widget_destroy(dialog);
1567 adopter_set_account_and_match (&adopt.trans);
1568 adopter_set_account_and_match (&adopt.subacct);
1569 adopter_set_account_and_match (&adopt.subtrans);
1571 if (adopter_match (&adopt.trans, GTK_WINDOW (window)) &&
1572 adopter_match (&adopt.subacct, GTK_WINDOW (window)) &&
1573 adopter_match (&adopt.subtrans, GTK_WINDOW (window)))
1576 gtk_widget_destroy(dialog);
1577 if (confirm_delete_account (simple, page, adopt.trans.new_account,
1578 adopt.subtrans.new_account,
1579 adopt.subacct.new_account,
1580 adopt.delete_res) == GTK_RESPONSE_ACCEPT)
1582 do_delete_account (account, adopt.subacct.new_account,
1583 adopt.subtrans.new_account, adopt.trans.new_account);
1596 char *lines[6] = {0};
1602 lines[i] = g_strdup_printf (_(
"The account %s will be deleted."),
1606 if (!xaccAccountGetSplits (account).empty())
1611 lines[++i] = g_strdup_printf (_(
"All transactions in this account " 1612 "will be moved to the account %s."),
1618 lines[++i] = g_strdup (_(
"All transactions in this account " 1619 "will be deleted."));
1627 lines[++i] = g_strdup_printf (_(
"Its sub-account will be " 1628 "moved to the account %s."), name);
1633 lines[++i] = g_strdup (_(
"Its subaccount will be deleted."));
1637 lines[++i] = g_strdup_printf (_(
"All sub-account transactions " 1638 "will be moved to the " 1639 "account %s."), name);
1642 else if (delete_res.has_splits)
1644 lines[++i] = g_strdup(_(
"All sub-account transactions " 1645 "will be deleted."));
1650 lines[++i] = _(
"Are you sure you want to do this?");
1652 message = g_strjoinv(
" ", lines);
1653 for (
int j = 0; j < i; ++j)
1656 dialog = gtk_message_dialog_new(GTK_WINDOW(window),
1657 GTK_DIALOG_DESTROY_WITH_PARENT,
1658 GTK_MESSAGE_QUESTION,
1662 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
1663 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
1664 _(
"_Delete"), GTK_RESPONSE_ACCEPT,
1666 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1667 response = gtk_dialog_run(GTK_DIALOG(dialog));
1668 gtk_widget_destroy(dialog);
1675 GList *acct_list, *ptr;
1679 gnc_set_busy_cursor(NULL, TRUE);
1680 gnc_suspend_gui_refresh ();
1688 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1690 g_list_free(acct_list);
1696 gnc_account_foreach_descendant(account,
1702 gnc_account_foreach_descendant (account,
1703 [](
auto acc, [[maybe_unused]]
auto data)
1722 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1728 g_list_free(acct_list);
1742 gnc_resume_gui_refresh ();
1743 gnc_unset_busy_cursor(NULL);
1747 gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple,
1751 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1757 if (!window || !account)
1760 gnc_account_renumber_create_dialog(window, account);
1764 gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple,
1768 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1771 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1773 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1776 gtk_widget_queue_draw (priv->widget);
1782 gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple,
1786 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1789 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1790 ENTER(
"(action %p, page %p)", simple, page);
1792 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1793 account_filter_dialog_create(&priv->fd, GNC_PLUGIN_PAGE(page));
1798 gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple,
1802 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1805 RecnWindow *recnData;
1808 g_return_if_fail (account != NULL);
1821 window = GNC_PLUGIN_PAGE (page)->window;
1822 recnData = recnWindow (window, account);
1823 gnc_ui_reconcile_window_raise (recnData);
1827 gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple,
1831 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1834 AutoClearWindow *autoClearData;
1837 g_return_if_fail (account != NULL);
1839 window = GNC_PLUGIN_PAGE (page)->window;
1840 autoClearData = autoClearWindow (window, account);
1841 gnc_ui_autoclear_window_raise (autoClearData);
1845 gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple,
1849 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1854 window = GNC_PLUGIN_PAGE (page)->window;
1855 gnc_xfer_dialog (window, account);
1859 gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple,
1863 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1868 window = GNC_PLUGIN_PAGE (page)->window;
1869 gnc_stock_split_dialog (window, account);
1873 gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple,
1877 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1881 ENTER (
"(action %p, page %p)", simple, page);
1884 window = GNC_PLUGIN_PAGE(page)->window;
1885 gnc_stock_transaction_assistant (window, account);
1891 gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple,
1895 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1900 window = GNC_PLUGIN_PAGE (page)->window;
1901 gnc_tax_info_dialog (window, account);
1905 gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple,
1909 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1911 GtkWidget *window = GNC_PLUGIN_PAGE (page)->window;
1912 gnc_lot_viewer_dialog (GTK_WINDOW(window), account);
1916 scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
1918 if (event->length == 0)
return FALSE;
1920 switch (event->keyval)
1922 case GDK_KEY_Escape:
1924 gboolean abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget), FALSE,
1925 "%s", _(check_repair_abort_YN));
1939 gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple,
1943 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1946 gulong scrub_kp_handler_ID;
1948 g_return_if_fail (account != NULL);
1950 prepare_scrubbing ();
1952 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1953 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1954 G_CALLBACK(scrub_kp_handler), NULL);
1955 gnc_window_set_progressbar_window (window);
1958 xaccAccountScrubImbalance (account, gnc_window_show_progress);
1961 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1966 finish_scrubbing (window, scrub_kp_handler_ID);
1970 gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple,
1974 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1977 gulong scrub_kp_handler_ID;
1979 g_return_if_fail (account != NULL);
1981 prepare_scrubbing ();
1983 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1984 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1985 G_CALLBACK(scrub_kp_handler), NULL);
1986 gnc_window_set_progressbar_window (window);
1989 xaccAccountTreeScrubImbalance (account, gnc_window_show_progress);
1992 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1993 xaccAccountTreeScrubLots(account);
1997 finish_scrubbing (window, scrub_kp_handler_ID);
2001 gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple,
2005 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
2006 Account *root = gnc_get_current_root_account ();
2008 gulong scrub_kp_handler_ID;
2010 prepare_scrubbing ();
2012 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
2013 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
2014 G_CALLBACK(scrub_kp_handler), NULL);
2015 gnc_window_set_progressbar_window (window);
2018 xaccAccountTreeScrubImbalance (root, gnc_window_show_progress);
2020 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
2021 xaccAccountTreeScrubLots(root);
2025 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...
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.
void xaccAccountDestroyAllTransactions(Account *acc)
Destroy all of the transactions that parent splits in an account.
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...
gboolean gnc_main_window_all_finish_pending(void)
Tell all pages in all windows to finish any outstanding activities.
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.