From 681577f8891019388f52cb89de36306e0f4a73f7 Mon Sep 17 00:00:00 2001 From: Chris Shoemaker Date: Mon, 8 May 2006 02:54:03 +0000 Subject: [PATCH] Add begin/commit edit blocks to budget setters. Change to using the "destroy" method for budget deletion. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13954 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/backend/file/gnc-budget-xml-v2.c | 2 +- src/engine/gnc-budget.c | 72 ++++++++++++++++++++++------ src/engine/gnc-budget.h | 2 +- src/gnome/gnc-plugin-page-budget.c | 4 +- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/backend/file/gnc-budget-xml-v2.c b/src/backend/file/gnc-budget-xml-v2.c index 47f8ba97ea..a0bb4128ea 100644 --- a/src/backend/file/gnc-budget-xml-v2.c +++ b/src/backend/file/gnc-budget-xml-v2.c @@ -212,7 +212,7 @@ dom_tree_to_budget (xmlNodePtr node, QofBook *book) bgt = gnc_budget_new(book); if (!dom_tree_generic_parse (node, budget_handlers, bgt)) { PERR ("failed to parse budget tree"); - gnc_budget_free(bgt); + gnc_budget_destroy(bgt); bgt = NULL; } return bgt; diff --git a/src/engine/gnc-budget.c b/src/engine/gnc-budget.c index 392345d5ce..15d186b58f 100644 --- a/src/engine/gnc-budget.c +++ b/src/engine/gnc-budget.c @@ -46,6 +46,48 @@ struct gnc_budget_private{ guint num_periods; }; +static inline void commit_err (QofInstance *inst, QofBackendError errcode) +{ + PERR ("Failed to commit: %d", errcode); +} + +static void +gnc_budget_free(QofInstance *inst) +{ + GncBudget *budget = GNC_BUDGET(inst); + if (budget == NULL) + return; + + g_return_if_fail(GNC_IS_BUDGET(budget)); + + /* We first send the message that this object is about to be + * destroyed so that any GUI elements can remove it before it is + * actually gone. */ + qof_event_gen( &budget->inst.entity, QOF_EVENT_DESTROY, NULL); + + CACHE_REMOVE(budget->name); + CACHE_REMOVE(budget->description); + + qof_instance_release (&budget->inst); + g_free(budget); +} + +static inline void noop (QofInstance *inst) {} + +static void +gnc_budget_begin_edit(GncBudget *bgt) +{ + qof_begin_edit(QOF_INSTANCE(bgt)); +} + +static void +gnc_budget_commit_edit(GncBudget *bgt) +{ + if (!qof_commit_edit(QOF_INSTANCE(bgt))) return; + qof_commit_edit_part2(QOF_INSTANCE(bgt), commit_err, + noop, gnc_budget_free); +} + GncBudget* gnc_budget_new(QofBook *book) { @@ -72,24 +114,13 @@ gnc_budget_new(QofBook *book) } void -gnc_budget_free(GncBudget* budget) +gnc_budget_destroy(GncBudget *budget) { - if (budget == NULL) - return; - g_return_if_fail(GNC_IS_BUDGET(budget)); - + gnc_budget_begin_edit(budget); qof_instance_set_dirty(&budget->inst); - /* We first send the message that this object is about to be - * destroyed so that any GUI elements can remove it before it is - * actually gone. */ - qof_event_gen( &budget->inst.entity, QOF_EVENT_DESTROY, NULL); - - CACHE_REMOVE(budget->name); - CACHE_REMOVE(budget->description); - - qof_instance_release (&budget->inst); - g_free(budget); + budget->inst.do_free = TRUE; + gnc_budget_commit_edit(budget); } void @@ -97,8 +128,10 @@ gnc_budget_set_name(GncBudget* budget, const gchar* name) { g_return_if_fail(GNC_IS_BUDGET(budget) && name); + gnc_budget_begin_edit(budget); CACHE_REPLACE(budget->name, name); qof_instance_set_dirty(&budget->inst); + gnc_budget_commit_edit(budget); qof_event_gen( &budget->inst.entity, QOF_EVENT_MODIFY, NULL); } @@ -116,8 +149,10 @@ gnc_budget_set_description(GncBudget* budget, const gchar* description) g_return_if_fail(GNC_IS_BUDGET(budget)); g_return_if_fail(description); + gnc_budget_begin_edit(budget); CACHE_REPLACE(budget->description, description); qof_instance_set_dirty(&budget->inst); + gnc_budget_commit_edit(budget); qof_event_gen( &budget->inst.entity, QOF_EVENT_MODIFY, NULL); } @@ -133,8 +168,10 @@ void gnc_budget_set_recurrence(GncBudget *budget, const Recurrence *r) { g_return_if_fail(budget && r); + gnc_budget_begin_edit(budget); budget->recurrence = *r; qof_instance_set_dirty(&budget->inst); + gnc_budget_commit_edit(budget); qof_event_gen(&budget->inst.entity, QOF_EVENT_MODIFY, NULL); } @@ -158,8 +195,11 @@ void gnc_budget_set_num_periods(GncBudget* budget, guint num_periods) { g_return_if_fail(GNC_IS_BUDGET(budget)); + + gnc_budget_begin_edit(budget); budget->num_periods = num_periods; qof_instance_set_dirty(&budget->inst); + gnc_budget_commit_edit(budget); qof_event_gen( &budget->inst.entity, QOF_EVENT_MODIFY, NULL); } @@ -185,6 +225,7 @@ gnc_budget_set_account_period_value(GncBudget *budget, Account *account, gchar path[BUF_SIZE]; gchar *bufend; + gnc_budget_begin_edit(budget); frame = qof_instance_get_slots(QOF_INSTANCE(budget)); guid = xaccAccountGetGUID(account); bufend = guid_to_string_buff(guid, path); @@ -192,6 +233,7 @@ gnc_budget_set_account_period_value(GncBudget *budget, Account *account, kvp_frame_set_numeric(frame, path, val); qof_instance_set_dirty(&budget->inst); + gnc_budget_commit_edit(budget); qof_event_gen( &budget->inst.entity, QOF_EVENT_MODIFY, NULL); diff --git a/src/engine/gnc-budget.h b/src/engine/gnc-budget.h index b439cfcba2..cbed43bf47 100644 --- a/src/engine/gnc-budget.h +++ b/src/engine/gnc-budget.h @@ -86,7 +86,7 @@ gboolean gnc_budget_register(void); GncBudget *gnc_budget_new(QofBook *book); /** Deletes the given budget object.*/ -void gnc_budget_free(GncBudget* budget); +void gnc_budget_destroy(GncBudget* budget); const GUID* gnc_budget_get_guid(GncBudget* budget); #define gnc_budget_return_guid(X) \ diff --git a/src/gnome/gnc-plugin-page-budget.c b/src/gnome/gnc-plugin-page-budget.c index 9df0a58517..2c9d2bfb20 100644 --- a/src/gnome/gnc-plugin-page-budget.c +++ b/src/gnome/gnc-plugin-page-budget.c @@ -391,7 +391,7 @@ gnc_plugin_page_budget_create_widget (GncPluginPage *plugin_page) tree_view = gnc_tree_view_account_new(FALSE); g_object_set(G_OBJECT(tree_view), "gconf-section", GCONF_SECTION, NULL); - gnc_tree_view_configure_columns(GNC_TREE_VIEW(tree_view), "Name", NULL); + gnc_tree_view_configure_columns(GNC_TREE_VIEW(tree_view), NULL); priv->tree_view = tree_view; selection = gtk_tree_view_get_selection(tree_view); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); @@ -852,7 +852,7 @@ gnc_budget_gui_delete_budget(GncBudget *budget) if (gnc_verify_dialog (NULL, FALSE, _("Delete %s?"), name)) { gnc_suspend_gui_refresh (); - gnc_budget_free(budget); + gnc_budget_destroy(budget); // Views should close themselves because the CM will notify them. gnc_resume_gui_refresh (); }