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"
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"
79static QofLogModule log_module = GNC_MOD_GUI;
88typedef 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))
128static void gnc_plugin_page_account_tree_finalize (GObject *
object);
129static void gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data);
131static gboolean gnc_plugin_page_account_tree_focus_widget (
GncPluginPage *plugin_page);
132static GtkWidget *gnc_plugin_page_account_tree_create_widget (
GncPluginPage *plugin_page);
133static void gnc_plugin_page_account_tree_destroy_widget (
GncPluginPage *plugin_page);
134static void gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page, GKeyFile *file,
const gchar *group);
135static GncPluginPage *gnc_plugin_page_account_tree_recreate_page (GtkWidget *window, GKeyFile *file,
const gchar *group);
138static void gnc_plugin_page_account_tree_summarybar_position_changed(gpointer prefs, gchar* pref, gpointer user_data);
139static gboolean gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget, GdkEventButton *event,
GncPluginPage *page);
140static void gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
142 GtkTreeViewColumn *col,
145static void gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
147static void accounting_period_changed_cb(gpointer prefs, gchar *pref, gpointer user_data);
150void gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb, GtkWidget *dialog);
151void gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b);
155static void gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
156static void gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
157static void gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
158static void gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
159static void gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
160static void gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
161static void gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
162static void gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
163static void gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
164static void gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
165static void gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
166static void gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
167static void gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
168static void gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
169static void gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
170static void gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
171static void gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
172static void gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
173static void gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
174static void gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
175static void gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
176static void gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
179static int confirm_delete_account (GSimpleAction *simple,
188static guint plugin_page_signals[LAST_SIGNAL] = { 0 };
191static 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 },
217static guint gnc_plugin_page_account_tree_n_actions = G_N_ELEMENTS(gnc_plugin_page_account_tree_actions);
220static const gchar *gnc_plugin_load_ui_items [] =
229 "ActionsPlaceholder4",
230 "ActionsPlaceholder5",
231 "ActionsPlaceholder6",
240static const gchar *actions_requiring_account_rw[] =
242 "EditEditAccountAction",
243 "EditDeleteAccountAction",
244 "ActionsReconcileAction",
245 "ActionsAutoClearAction",
251static const gchar *actions_requiring_subaccounts_rw[] =
253 "EditRenumberSubaccountsAction",
254 "EditCascadeAccountAction",
260static const gchar *actions_requiring_account_always[] =
262 "EditOpenAccountAction",
263 "EditOpenSubaccountsAction",
268static const gchar* actions_requiring_priced_account[] =
270 "ActionsStockAssistantAction",
275static 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);
314static gboolean show_abort_verify = TRUE;
319 gnc_suspend_gui_refresh ();
324finish_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 ();
332check_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);
443gnc_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);
541gnc_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));
575gnc_plugin_page_account_refresh_cb (GHashTable *changes, gpointer user_data)
579 gnc_plugin_page_account_tree_cmd_refresh(NULL, NULL, user_data);
583gnc_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);
612gnc_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);
739gnc_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 priv->tree_view = NULL;
796 LEAVE(
"widget destroyed");
803 GSimpleActionGroup *simple_action_group = NULL;
806 gboolean has_account = FALSE;
807 gboolean subaccounts = FALSE;
809 g_return_if_fail (plugin_page && GNC_IS_PLUGIN_PAGE(plugin_page));
811 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE (plugin_page);
813 if (gtk_tree_view_get_selection (priv->tree_view))
816 has_account = (account != NULL);
823 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple_action_group));
829 allow_write && has_account);
833 allow_write && subaccounts);
837 g_signal_emit (plugin_page, plugin_page_signals[ACCOUNT_SELECTED], 0, account);
845gnc_plugin_page_account_tree_selected (GObject *
object, gpointer user_data)
848 g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page));
849 update_inactive_actions(plugin_page);
862gnc_plugin_page_account_tree_save_page (
GncPluginPage *plugin_page,
864 const gchar *group_name)
869 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page));
870 g_return_if_fail (key_file != NULL);
871 g_return_if_fail (group_name != NULL);
873 ENTER(
"page %p, key_file %p, group_name %s", plugin_page, key_file,
876 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page);
877 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
879 gnc_tree_view_account_save(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
880 &priv->fd, key_file, group_name);
896gnc_plugin_page_account_tree_recreate_page (GtkWidget *window,
898 const gchar *group_name)
904 g_return_val_if_fail(key_file, NULL);
905 g_return_val_if_fail(group_name, NULL);
906 ENTER(
"key_file %p, group_name %s", key_file, group_name);
910 account_page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(page);
911 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(account_page);
916 gnc_tree_view_account_restore(GNC_TREE_VIEW_ACCOUNT(priv->tree_view),
917 &priv->fd, key_file, group_name);
926gnc_plugin_page_account_tree_summarybar_position_changed (gpointer prefs,
933 GtkPositionType position = GTK_POS_BOTTOM;
935 g_return_if_fail(user_data != NULL);
937 plugin_page = GNC_PLUGIN_PAGE(user_data);
938 page = GNC_PLUGIN_PAGE_ACCOUNT_TREE (user_data);
939 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
942 position = GTK_POS_TOP;
944 gtk_box_reorder_child(GTK_BOX(priv->widget),
946 (position == GTK_POS_TOP ? 0 : -1) );
957gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget,
958 GdkEventButton *event,
962 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
964 ENTER(
"widget %p, event %p, page %p", widget, event, page);
978 gboolean include_subs)
986 window = GNC_PLUGIN_PAGE (page)->window;
992gnc_plugin_page_account_tree_double_click_cb (GtkTreeView *treeview,
994 GtkTreeViewColumn *col,
1000 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1001 g_return_if_fail (treeview);
1003 model = gtk_tree_view_get_model(treeview);
1004 if (gtk_tree_model_get_iter(model, &iter, path))
1012 if (gtk_tree_model_iter_has_child(model, &iter))
1016 if (gtk_tree_view_row_expanded(treeview, path))
1017 gtk_tree_view_collapse_row(treeview, path);
1019 gtk_tree_view_expand_row(treeview, path, FALSE);
1025 gppat_open_account_common (page, account, FALSE);
1031gnc_plugin_page_account_tree_selection_changed_cb (GtkTreeSelection *selection,
1035 update_inactive_actions (plugin_page);
1039accounting_period_changed_cb (gpointer prefs, gchar *pref, gpointer user_data)
1041 gnc_plugin_page_account_tree_cmd_refresh (NULL, NULL, user_data);
1046gnc_plugin_page_account_tree_cmd_new_account (GSimpleAction *simple,
1050 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1058gnc_plugin_page_account_tree_cmd_file_new_hierarchy (GSimpleAction *simple,
1062 gnc_ui_hierarchy_assistant(FALSE);
1066gnc_plugin_page_account_tree_cmd_open_account (GSimpleAction *simple,
1070 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1073 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1075 gppat_open_account_common (page, account, FALSE);
1079gnc_plugin_page_account_tree_cmd_open_subaccounts (GSimpleAction *simple,
1083 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1086 g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (page));
1088 gppat_open_account_common (page, account, TRUE);
1092gnc_plugin_page_account_tree_cmd_edit_account (GSimpleAction *simple,
1096 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1099 ENTER(
"action %p, page %p", simple, page);
1102 g_return_if_fail (account != NULL);
1109gnc_plugin_page_account_tree_cmd_find_account (GSimpleAction *simple,
1113 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1116 ENTER(
"action %p, page %p", simple, page);
1120 gnc_find_account_dialog (window, NULL);
1125gnc_plugin_page_account_tree_cmd_find_account_popup (GSimpleAction *simple,
1129 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1133 ENTER(
"action %p, page %p", simple, page);
1139 gnc_find_account_dialog (window, account);
1144gnc_plugin_page_account_tree_cmd_cascade_account_properties (GSimpleAction *simple,
1148 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1152 ENTER(
"action %p, page %p", simple, page);
1158 if (account != NULL)
1159 gnc_account_cascade_properties_dialog (window, account);
1165delete_account_helper (
Account * account, gpointer data)
1168 auto& splits{xaccAccountGetSplits (account)};
1171 helper_res->has_splits = !splits.empty();
1172 helper_res->has_ro_splits = std::any_of (splits.begin(), splits.end(), split_ro);
1174 return GINT_TO_POINTER (helper_res->has_splits || helper_res->has_ro_splits);
1182set_ok_sensitivity(GtkWidget *dialog)
1186 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1187 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1189 sensitive = ((!sa_mas ||
1190 !gtk_widget_is_sensitive (sa_mas) ||
1191 gnc_account_sel_get_visible_account_num (GNC_ACCOUNT_SEL (sa_mas))) &&
1193 !gtk_widget_is_sensitive (trans_mas) ||
1194 gnc_account_sel_get_visible_account_num (GNC_ACCOUNT_SEL (trans_mas))));
1196 auto button = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON));
1197 gtk_widget_set_sensitive(button, sensitive);
1201gppat_get_exclude_list (
Account *acc, gboolean exclude_subaccounts)
1203 GList *acct_list = NULL;
1205 if (exclude_subaccounts)
1208 acct_list = g_list_prepend (acct_list, acc);
1214gppat_populate_gas_list(GtkWidget *dialog,
1216 gboolean exclude_subaccounts)
1222 g_return_if_fail(GTK_IS_DIALOG(dialog));
1225 account = GNC_ACCOUNT(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT));
1226 filter =
static_cast<GList*
>(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_FILTER));
1229 gnc_account_sel_set_acct_filters (gas, filter, NULL);
1232 exclude = gppat_get_exclude_list (account, exclude_subaccounts);
1233 gnc_account_sel_set_acct_exclude_filter (gas, exclude);
1234 g_list_free (exclude);
1236 gnc_account_sel_set_account (gas, NULL, TRUE);
1239 set_ok_sensitivity(dialog);
1243gppat_populate_trans_mas_list(GtkToggleButton *sa_mrb,
1246 g_return_if_fail(GTK_IS_DIALOG(dialog));
1249 auto trans_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_TRANS_MAS));
1250 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(trans_mas), !gtk_toggle_button_get_active(sa_mrb));
1259gppat_set_insensitive_iff_rb_active(GtkWidget *widget, GtkToggleButton *b)
1261 GtkWidget *dialog = gtk_widget_get_toplevel(widget);
1262 auto subaccount_trans = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS));
1263 auto sa_mas = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_MAS));
1264 auto have_splits = g_object_get_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS) !=
nullptr;
1266 gtk_widget_set_sensitive(widget, !gtk_toggle_button_get_active(b));
1269 if ((have_splits) && !gtk_widget_is_sensitive(sa_mas))
1270 gtk_widget_set_sensitive(subaccount_trans, TRUE);
1272 gtk_widget_set_sensitive(subaccount_trans, FALSE);
1274 set_ok_sensitivity(dialog);
1278gppat_setup_account_selector (GtkBuilder *builder, GtkWidget *dialog,
1279 const gchar *hbox,
const gchar *sel_name)
1281 GtkWidget *selector = gnc_account_sel_new();
1282 GtkWidget *box = GTK_WIDGET(gtk_builder_get_object (builder, hbox));
1284 gtk_box_pack_start (GTK_BOX(box), selector, TRUE, TRUE, 0);
1287 if (g_strcmp0 (sel_name, DELETE_DIALOG_SA_MAS) == 0)
1288 g_object_set (selector,
"hide-placeholder", FALSE, NULL);
1290 g_object_set_data(G_OBJECT(dialog), sel_name, selector);
1292 gppat_populate_gas_list(dialog, GNC_ACCOUNT_SEL(selector), TRUE);
1293 gtk_widget_show_all(box);
1299commodity_mismatch_dialog (
const Account* account, GtkWindow* parent)
1303 char* message = g_strdup_printf (
1304 _(
"Account %s does not have the same currency as the one you're "
1305 "moving transactions from.\nAre you sure you want to do this?"),
1307 GtkWidget* error_dialog =
1308 gtk_message_dialog_new (parent, GTK_DIALOG_DESTROY_WITH_PARENT,
1309 GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE,
1311 gtk_dialog_add_buttons (GTK_DIALOG(error_dialog),
1312 _(
"_Pick another account"), GTK_RESPONSE_CANCEL,
1313 _(
"_Do it anyway"), GTK_RESPONSE_ACCEPT,
1315 response = gtk_dialog_run (GTK_DIALOG (error_dialog));
1316 gtk_widget_destroy (error_dialog);
1318 g_free (account_name);
1326 GNCAccountSel *selector;
1328 gboolean for_account;
1332adopter_set_account_and_match (
Adopter* adopter)
1334 if (!(adopter->selector &&
1335 gtk_widget_is_sensitive (GTK_WIDGET (adopter->selector))))
1337 adopter->new_account = gnc_account_sel_get_account(adopter->selector);
1339 if (!adopter->for_account && adopter->old_account && adopter->new_account)
1346adopter_init (
Adopter* adopter, GtkWidget *selector,
Account* account,
1347 gboolean for_account)
1349 adopter->selector = GNC_ACCOUNT_SEL (selector);
1350 adopter->new_account = NULL;
1351 adopter->old_account = account;
1352 adopter->match = TRUE;
1353 adopter->for_account = for_account;
1357adopter_match (
Adopter* adopter, GtkWindow *parent)
1360 if (adopter->match || adopter->for_account)
1362 result = commodity_mismatch_dialog (adopter->new_account, parent);
1363 return (result == GTK_RESPONSE_ACCEPT);
1375account_subaccount (
Account* account)
1380 subaccount = GNC_ACCOUNT(subs->data);
1386account_delete_dialog (
Account *account, GtkWindow *parent,
Adopters* adopt)
1388 GtkWidget *dialog = NULL;
1389 GtkWidget *widget = NULL;
1390 gchar *title = NULL;
1391 GtkBuilder *builder = gtk_builder_new();
1396 acct_name = g_strdup (
_(
"(no name)"));
1398 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_delete_dialog");
1400 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_delete_dialog"));
1401 gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
1404 g_object_set_data_full (G_OBJECT(dialog), DELETE_DIALOG_FILTER, filter,
1405 (GDestroyNotify) g_list_free);
1406 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_ACCOUNT, account);
1407 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"header"));
1408 title = g_strdup_printf(
_(
"Deleting account %s"), acct_name);
1409 gtk_label_set_text(GTK_LABEL(widget), title);
1413 widget = GTK_WIDGET(gtk_builder_get_object (builder, DELETE_DIALOG_OK_BUTTON));
1414 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_OK_BUTTON, widget);
1418 adopter_init (&adopt->trans,
1419 gppat_setup_account_selector (builder, dialog,
1421 DELETE_DIALOG_TRANS_MAS),
1425 if (!xaccAccountGetSplits(account).empty())
1429 delete_account_helper(account, &delete_res2);
1430 if (delete_res2.has_ro_splits)
1432 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_rw")));
1433 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"trans_drb"));
1434 gtk_widget_set_sensitive(widget, FALSE);
1437 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1441 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"transactions")), FALSE);
1442 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"trans_ro")));
1446 adopter_init (&adopt->subacct,
1447 gppat_setup_account_selector (builder, dialog,
1449 DELETE_DIALOG_SA_MAS),
1453 adopter_init (&adopt->subtrans,
1454 gppat_setup_account_selector (builder, dialog,
1455 "sa_trans_mas_hbox",
1456 DELETE_DIALOG_SA_TRANS_MAS),
1457 account_subaccount (account), FALSE);
1458 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_TRANS,
1459 GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")));
1465 &adopt->delete_res);
1466 if (adopt->delete_res.has_splits)
1468 if (adopt->delete_res.has_ro_splits)
1470 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_rw")));
1471 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_drb"));
1472 gtk_widget_set_sensitive(widget, FALSE);
1475 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1477 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(1));
1481 g_object_set_data(G_OBJECT(dialog), DELETE_DIALOG_SA_SPLITS, GINT_TO_POINTER(0));
1482 gtk_widget_set_sensitive (GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1483 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1488 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccounts")), FALSE);
1489 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object (builder,
"subaccount_trans")), FALSE);
1490 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder,
"sa_trans_ro")));
1494 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1496 gtk_builder_connect_signals(builder, dialog);
1497 g_object_unref(G_OBJECT(builder));
1503gnc_plugin_page_account_tree_cmd_delete_account (GSimpleAction *simple,
1507 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1514 GtkWidget *dialog = NULL;
1516 if (account == NULL)
1522 memset (&adopt, 0,
sizeof (adopt));
1528#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")
1530 gnc_ui_object_references_show(EXPLANATION, list);
1539 acct_name = g_strdup (
_(
"(no name)"));
1542 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);
1543 gnc_error_dialog(GTK_WINDOW(window),
"%s", message);
1553 do_delete_account (account, NULL, NULL, NULL);
1557 dialog = account_delete_dialog (account, GTK_WINDOW (window), &adopt);
1561 response = gtk_dialog_run(GTK_DIALOG(dialog));
1563 if (response != GTK_RESPONSE_ACCEPT)
1565 gtk_widget_destroy(dialog);
1568 adopter_set_account_and_match (&adopt.trans);
1569 adopter_set_account_and_match (&adopt.subacct);
1570 adopter_set_account_and_match (&adopt.subtrans);
1572 if (adopter_match (&adopt.trans, GTK_WINDOW (window)) &&
1573 adopter_match (&adopt.subacct, GTK_WINDOW (window)) &&
1574 adopter_match (&adopt.subtrans, GTK_WINDOW (window)))
1577 gtk_widget_destroy(dialog);
1578 if (confirm_delete_account (simple, page, adopt.trans.new_account,
1579 adopt.subtrans.new_account,
1580 adopt.subacct.new_account,
1581 adopt.delete_res) == GTK_RESPONSE_ACCEPT)
1583 do_delete_account (account, adopt.subacct.new_account,
1584 adopt.subtrans.new_account, adopt.trans.new_account);
1597 char *lines[6] = {0};
1603 lines[i] = g_strdup_printf (
_(
"The account %s will be deleted."),
1607 if (!xaccAccountGetSplits (account).empty())
1612 lines[++i] = g_strdup_printf (
_(
"All transactions in this account "
1613 "will be moved to the account %s."),
1619 lines[++i] = g_strdup (
_(
"All transactions in this account "
1620 "will be deleted."));
1628 lines[++i] = g_strdup_printf (
_(
"Its sub-account will be "
1629 "moved to the account %s."), name);
1634 lines[++i] = g_strdup (
_(
"Its subaccount will be deleted."));
1638 lines[++i] = g_strdup_printf (
_(
"All sub-account transactions "
1639 "will be moved to the "
1640 "account %s."), name);
1643 else if (delete_res.has_splits)
1645 lines[++i] = g_strdup(
_(
"All sub-account transactions "
1646 "will be deleted."));
1651 lines[++i] =
_(
"Are you sure you want to do this?");
1653 message = g_strjoinv(
" ", lines);
1654 for (
int j = 0; j < i; ++j)
1657 dialog = gtk_message_dialog_new(GTK_WINDOW(window),
1658 GTK_DIALOG_DESTROY_WITH_PARENT,
1659 GTK_MESSAGE_QUESTION,
1663 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
1664 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
1665 _(
"_Delete"), GTK_RESPONSE_ACCEPT,
1667 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1668 response = gtk_dialog_run(GTK_DIALOG(dialog));
1669 gtk_widget_destroy(dialog);
1676 GList *acct_list, *ptr;
1680 gnc_set_busy_cursor(NULL, TRUE);
1681 gnc_suspend_gui_refresh ();
1689 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1691 g_list_free(acct_list);
1697 gnc_account_foreach_descendant(account,
1703 gnc_account_foreach_descendant (account,
1704 [](
auto acc, [[maybe_unused]]
auto data)
1723 for (ptr = acct_list; ptr; ptr = g_list_next(ptr))
1729 g_list_free(acct_list);
1743 gnc_resume_gui_refresh ();
1744 gnc_unset_busy_cursor(NULL);
1748gnc_plugin_page_account_tree_cmd_renumber_accounts (GSimpleAction *simple,
1752 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1758 if (!window || !account)
1761 gnc_account_renumber_create_dialog(window, account);
1765gnc_plugin_page_account_tree_cmd_refresh (GSimpleAction *simple,
1769 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1772 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1774 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1777 gtk_widget_queue_draw (priv->widget);
1783gnc_plugin_page_account_tree_cmd_view_filter_by (GSimpleAction *simple,
1787 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1790 g_return_if_fail(GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(page));
1791 ENTER(
"(action %p, page %p)", simple, page);
1793 priv = GNC_PLUGIN_PAGE_ACCOUNT_TREE_GET_PRIVATE(page);
1794 account_filter_dialog_create(&priv->fd, GNC_PLUGIN_PAGE(page));
1799gnc_plugin_page_account_tree_cmd_reconcile (GSimpleAction *simple,
1803 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1806 RecnWindow *recnData;
1809 g_return_if_fail (account != NULL);
1822 window = GNC_PLUGIN_PAGE (page)->window;
1823 recnData = recnWindow (window, account);
1824 gnc_ui_reconcile_window_raise (recnData);
1828gnc_plugin_page_account_tree_cmd_autoclear (GSimpleAction *simple,
1832 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1835 AutoClearWindow *autoClearData;
1838 g_return_if_fail (account != NULL);
1840 window = GNC_PLUGIN_PAGE (page)->window;
1841 autoClearData = autoClearWindow (window, account);
1842 gnc_ui_autoclear_window_raise (autoClearData);
1846gnc_plugin_page_account_tree_cmd_transfer (GSimpleAction *simple,
1850 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1855 window = GNC_PLUGIN_PAGE (page)->window;
1856 gnc_xfer_dialog (window, account);
1860gnc_plugin_page_account_tree_cmd_stock_split (GSimpleAction *simple,
1864 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1869 window = GNC_PLUGIN_PAGE (page)->window;
1870 gnc_stock_split_dialog (window, account);
1874gnc_plugin_page_account_tree_cmd_stock_assistant (GSimpleAction *simple,
1878 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1882 ENTER (
"(action %p, page %p)", simple, page);
1885 window = GNC_PLUGIN_PAGE(page)->window;
1886 gnc_stock_transaction_assistant (window, account);
1892gnc_plugin_page_account_tree_cmd_edit_tax_options (GSimpleAction *simple,
1896 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1901 window = GNC_PLUGIN_PAGE (page)->window;
1902 gnc_tax_info_dialog (window, account);
1906gnc_plugin_page_account_tree_cmd_lots (GSimpleAction *simple,
1910 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1912 GtkWidget *window = GNC_PLUGIN_PAGE (page)->window;
1913 gnc_lot_viewer_dialog (GTK_WINDOW(window), account);
1917scrub_kp_handler (GtkWidget *widget, GdkEventKey *event, gpointer data)
1919 if (event->length == 0)
return FALSE;
1921 switch (event->keyval)
1923 case GDK_KEY_Escape:
1925 gboolean abort_scrub = gnc_verify_dialog (GTK_WINDOW(widget), FALSE,
1926 "%s",
_(check_repair_abort_YN));
1940gnc_plugin_page_account_tree_cmd_scrub (GSimpleAction *simple,
1944 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1947 gulong scrub_kp_handler_ID;
1949 g_return_if_fail (account != NULL);
1951 prepare_scrubbing ();
1953 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1954 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1955 G_CALLBACK(scrub_kp_handler), NULL);
1956 gnc_window_set_progressbar_window (window);
1959 xaccAccountScrubImbalance (account, gnc_window_show_progress);
1962 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1967 finish_scrubbing (window, scrub_kp_handler_ID);
1971gnc_plugin_page_account_tree_cmd_scrub_sub (GSimpleAction *simple,
1975 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
1978 gulong scrub_kp_handler_ID;
1980 g_return_if_fail (account != NULL);
1982 prepare_scrubbing ();
1984 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
1985 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
1986 G_CALLBACK(scrub_kp_handler), NULL);
1987 gnc_window_set_progressbar_window (window);
1990 xaccAccountTreeScrubImbalance (account, gnc_window_show_progress);
1993 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
1994 xaccAccountTreeScrubLots(account);
1998 finish_scrubbing (window, scrub_kp_handler_ID);
2002gnc_plugin_page_account_tree_cmd_scrub_all (GSimpleAction *simple,
2006 auto page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data);
2007 Account *root = gnc_get_current_root_account ();
2009 gulong scrub_kp_handler_ID;
2011 prepare_scrubbing ();
2013 window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
2014 scrub_kp_handler_ID = g_signal_connect (G_OBJECT(window),
"key-press-event",
2015 G_CALLBACK(scrub_kp_handler), NULL);
2016 gnc_window_set_progressbar_window (window);
2019 xaccAccountTreeScrubImbalance (root, gnc_window_show_progress);
2021 if (g_getenv(
"GNC_AUTO_SCRUB_LOTS") != NULL)
2022 xaccAccountTreeScrubLots(root);
2026 finish_scrubbing (window, scrub_kp_handler_ID);
Account public routines (C++ api)
High-Level API for imposing Lot constraints.
Cleanup functions for business objects.
convert single-entry accounts to clean double-entry
API for Transactions and Splits (journal entries)
This file contains the functions to present a gui to the user for creating a new account or editing a...
This file contains the functions to present a dialog box with a list of object references and an expl...
All type declarations for the whole Gnucash engine.
Gnome specific utility functions.
Provide the menus to create a chart of account page.
Functions providing a chart of account page.
Functions providing a register page for the GnuCash UI.
Generic api to store and retrieve preferences.
Functions to load, save and get gui state.
GtkTreeModel implementation to display account types in a GtkTreeView.
GtkTreeView implementation for gnucash account tree.
utility functions for the GnuCash UI
Functions that are supported by all types of windows.
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
void xaccAccountDestroyAllTransactions(Account *acc)
Destroy all of the transactions that parent splits in an account.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
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...
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship,...
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
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...
GList * gnc_account_get_children(const Account *account)
This routine returns a GList of all children accounts of the specified account.
#define xaccAccountGetGUID(X)
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false.
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
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...
gint gnc_account_n_children(const Account *account)
Return the number of children of the specified account.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
GSimpleActionGroup * gnc_plugin_page_create_action_group(GncPluginPage *page, const gchar *group_name)
Create the GSimpleActionGroup object associated with this page.
GtkWidget * gnc_plugin_page_get_window(GncPluginPage *page)
Retrieve a pointer to the GncMainWindow (GtkWindow) containing this page.
void gnc_plugin_page_disconnect_page_changed(GncPluginPage *page)
Disconnect the page_changed_id signal callback.
void gnc_plugin_page_add_book(GncPluginPage *page, QofBook *book)
Add a book reference to the specified 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.
GSimpleActionGroup * gnc_plugin_page_get_action_group(GncPluginPage *page)
Retrieve the GSimpleActionGroup object associated with this page.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
void xaccAccountMoveAllSplits(Account *accfrom, Account *accto)
The xaccAccountMoveAllSplits() routine reassigns each of the splits in accfrom to accto.
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
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...
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.
gboolean gnc_main_window_all_finish_pending(void)
Tell all pages in all windows to finish any outstanding activities.
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.
GAction * gnc_main_window_find_action(GncMainWindow *window, const gchar *action_name)
Find the GAction in the main window.
void gnc_main_window_init_short_names(GncMainWindow *window, GncToolBarShortNames *toolbar_labels)
Update the labels of the toolbar items with short names.
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Display a data plugin page in a window.
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_main_window_close_page(GncPluginPage *page)
Remove a data plugin page from a window and display the previous page.
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).
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).
GncPluginPage * gnc_plugin_page_account_tree_new(void)
Create a new "account tree" plugin page.
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
void gnc_tree_view_configure_columns(GncTreeView *view)
Make all the correct columns visible, respecting their default visibility setting,...
const gchar * gnc_tree_view_get_state_section(GncTreeView *view)
Get the name of the state section this tree view is associated with.
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.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
Get a list of all known objects of a specified type.
void gnc_ui_edit_account_window(GtkWindow *parent, Account *account)
Display a window for editing the attributes of an existing account.
void gnc_ui_new_account_window(GtkWindow *parent, QofBook *book, Account *parent_acct)
Display a window for creating a new account.
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.
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...
void gnc_tree_view_account_refilter(GncTreeViewAccount *view)
This function forces the account tree filter to be evaluated.
Account * gnc_tree_view_account_get_account_from_path(GncTreeViewAccount *view, GtkTreePath *s_path)
This function returns the account associated with the specified path.
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
Create a new account tree view.
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.
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.
void gnc_tree_view_account_set_selected_account(GncTreeViewAccount *view, Account *account)
This function selects an account in the account tree view.
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 ...
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.
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...
GList * qof_instance_get_referring_object_list(const QofInstance *inst)
Returns a list of objects which refer to a specific object.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.
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.
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.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
GncPluginPage * gnc_plugin_page_register_new(Account *account, gboolean subaccounts)
Create a new "register" plugin page, given a pointer to an account.
void gncScrubBusinessAccountTree(Account *acc, QofPercentageFunc percentagefunc)
The gncScrubBusinessAccountTreeLots() function will call gncScrubBusinessAccount() on the given accou...
void gncScrubBusinessAccount(Account *acc, QofPercentageFunc percentagefunc)
The gncScrubBusinessAccount() function will call all scrub functions relevant for a given account on ...
gboolean gnc_get_ongoing_scrub(void)
The gnc_get_ongoing_scrub () method returns TRUE if a scrub operation is ongoing.
void xaccAccountScrubLots(Account *acc)
The xaccAccountScrubLots() routine makes sure that every split in the account is assigned to a lot,...
void gnc_set_abort_scrub(gboolean abort)
The gnc_set_abort_scrub () method causes a currently running scrub operation to stop,...
void xaccAccountScrubOrphans(Account *acc, QofPercentageFunc percentagefunc)
The xaccAccountScrubOrphans() method performs this scrub only for the indicated account,...
void xaccAccountTreeScrubOrphans(Account *acc, QofPercentageFunc percentagefunc)
The xaccAccountTreeScrubOrphans() method performs this scrub for the indicated account and its childr...
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
The type used to store guids in C.
The class data structure for a content plugin.
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...
const gchar * tab_icon
The relative name of the icon that should be shown on the tab for this page.
const gchar * plugin_name
The textual name of this plugin.
void(* destroy_widget)(GncPluginPage *plugin_page)
Function called to destroy the display widget for a particular type of plugin.
gboolean(* finish_pending)(GncPluginPage *plugin_page)
This function vector is called to finish any outstanding activities.
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.
GtkWidget *(* create_widget)(GncPluginPage *plugin_page)
Function called to create the display widget for a particular type of plugin.
gboolean(* focus_page_function)(GncPluginPage *plugin_page)
This function performs specific actions to set the focus on a specific widget.
The instance data structure for a content plugin.
GtkWidget * window
The window that contains the display widget for this plugin.
GtkWidget * summarybar
The summary bar widget (if any) that is associated with this plugin.