38 #ifdef __G_IR_SCANNER__
39 #undef __G_IR_SCANNER__
41 #include <gdk/gdkkeysyms.h>
42 #include <glib/gi18n.h>
43 #include "gnc-date-edit.h"
48 #include "dialog-options.h"
49 #include "dialog-utils.h"
52 #include "gnc-icons.h"
54 #include "gnc-plugin-budget.h"
57 #include "gnc-session.h"
61 #include "option-util.h"
63 #include "gnc-component-manager.h"
67 #include "gnc-recurrence.h"
68 #include "Recurrence.h"
75 #define PLUGIN_PAGE_BUDGET_CM_CLASS "plugin-page-budget"
84 static void gnc_plugin_page_budget_finalize (GObject *
object);
87 gnc_plugin_page_budget_create_widget (
GncPluginPage *plugin_page);
88 static void gnc_plugin_page_budget_destroy_widget (
GncPluginPage *plugin_page);
89 static void gnc_plugin_page_budget_save_page (
90 GncPluginPage *plugin_page, GKeyFile *file,
const gchar *group);
92 GtkWidget *window, GKeyFile *file,
const gchar *group);
95 static gboolean gppb_button_press_cb(
96 GtkWidget *widget, GdkEventButton *event,
GncPluginPage *page);
100 static void gppb_selection_changed_cb(
104 static void gnc_plugin_page_budget_cmd_view_filter_by (
108 static void gnc_plugin_page_budget_cmd_open_account(
110 static void gnc_plugin_page_budget_cmd_open_subaccounts(
112 static void gnc_plugin_page_budget_cmd_delete_budget(
114 static void gnc_plugin_page_budget_cmd_view_options(
116 static void gnc_plugin_page_budget_cmd_estimate_budget(
119 static GtkActionEntry gnc_plugin_page_budget_actions [] =
122 {
"FakeToplevel",
"", NULL, NULL, NULL, NULL },
126 "OpenAccountAction", GNC_STOCK_OPEN_ACCOUNT, N_(
"Open _Account"), NULL,
127 N_(
"Open the selected account"),
128 G_CALLBACK (gnc_plugin_page_budget_cmd_open_account)
131 "OpenSubaccountsAction", GNC_STOCK_OPEN_ACCOUNT,
132 N_(
"Open _Subaccounts"), NULL,
133 N_(
"Open the selected account and all its subaccounts"),
134 G_CALLBACK (gnc_plugin_page_budget_cmd_open_subaccounts)
139 "DeleteBudgetAction", GNC_STOCK_DELETE_BUDGET, N_(
"_Delete Budget"),
140 NULL, N_(
"Delete this budget"),
141 G_CALLBACK (gnc_plugin_page_budget_cmd_delete_budget)
144 "OptionsBudgetAction", GTK_STOCK_PROPERTIES, N_(
"Budget Options"),
145 NULL, N_(
"Edit this budget's options"),
146 G_CALLBACK (gnc_plugin_page_budget_cmd_view_options)
149 "EstimateBudgetAction", GTK_STOCK_EXECUTE, N_(
"Estimate Budget"),
151 N_(
"Estimate a budget value for the selected accounts from past transactions"),
152 G_CALLBACK (gnc_plugin_page_budget_cmd_estimate_budget)
157 "ViewFilterByAction", NULL, N_(
"_Filter By..."), NULL, NULL,
158 G_CALLBACK (gnc_plugin_page_budget_cmd_view_filter_by)
163 static guint gnc_plugin_page_budget_n_actions =
164 G_N_ELEMENTS (gnc_plugin_page_budget_actions);
166 static const gchar *actions_requiring_account[] =
169 "OpenSubaccountsAction",
176 {
"OpenAccountAction", N_(
"Open") },
177 {
"DeleteBudgetAction", N_(
"Delete") },
178 {
"OptionsBudgetAction", N_(
"Options") },
179 {
"EstimateBudgetAction", N_(
"Estimate") },
185 GtkActionGroup *action_group;
187 GtkUIManager *ui_merge;
190 GtkTreeView *tree_view;
198 gboolean delete_budget;
207 #define GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(o) \
208 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_PAGE_BUDGET, GncPluginPageBudgetPrivate))
210 static GObjectClass *parent_class = NULL;
214 gnc_plugin_page_budget_get_type (
void)
216 static GType gnc_plugin_page_budget_type = 0;
218 if (gnc_plugin_page_budget_type == 0)
220 static const GTypeInfo our_info =
225 (GClassInitFunc) gnc_plugin_page_budget_class_init,
230 (GInstanceInitFunc) gnc_plugin_page_budget_init
233 gnc_plugin_page_budget_type =
234 g_type_register_static (GNC_TYPE_PLUGIN_PAGE,
235 "GncPluginPageBudget", &our_info, 0);
238 return gnc_plugin_page_budget_type;
250 g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
255 for ( ; item; item = g_list_next(item))
258 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(plugin_page);
259 if (priv->budget == budget)
261 LEAVE(
"existing budget page %p", plugin_page);
262 return GNC_PLUGIN_PAGE(plugin_page);
266 plugin_page = g_object_new(GNC_TYPE_PLUGIN_PAGE_BUDGET, NULL);
268 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(plugin_page);
269 priv->budget = budget;
270 priv->delete_budget = FALSE;
271 priv->key = *gnc_budget_get_guid(budget);
272 label = g_strdup_printf(
"%s: %s", _(
"Budget"), gnc_budget_get_name(budget));
273 g_object_set(G_OBJECT(plugin_page),
"page-name", label, NULL);
275 LEAVE(
"new budget page %p", plugin_page);
276 return GNC_PLUGIN_PAGE(plugin_page);
283 GObjectClass *object_class = G_OBJECT_CLASS (klass);
286 parent_class = g_type_class_peek_parent (klass);
288 object_class->finalize = gnc_plugin_page_budget_finalize;
290 gnc_plugin_class->
tab_icon = GNC_STOCK_BUDGET;
291 gnc_plugin_class->
plugin_name = GNC_PLUGIN_PAGE_BUDGET_NAME;
292 gnc_plugin_class->
create_widget = gnc_plugin_page_budget_create_widget;
293 gnc_plugin_class->
destroy_widget = gnc_plugin_page_budget_destroy_widget;
294 gnc_plugin_class->
save_page = gnc_plugin_page_budget_save_page;
295 gnc_plugin_class->
recreate_page = gnc_plugin_page_budget_recreate_page;
304 GtkActionGroup *action_group;
308 ENTER(
"page %p", plugin_page);
309 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(plugin_page);
312 parent = GNC_PLUGIN_PAGE(plugin_page);
313 g_object_set(G_OBJECT(plugin_page),
314 "page-name", _(
"Budget"),
315 "page-uri",
"default:",
316 "ui-description",
"gnc-plugin-page-budget-ui.xml",
325 "GncPluginPageBudgetActions");
326 gtk_action_group_add_actions (action_group,
327 gnc_plugin_page_budget_actions,
328 gnc_plugin_page_budget_n_actions,
333 priv->fd.visible_types = -1;
334 priv->fd.show_hidden = FALSE;
335 priv->fd.show_zero_total = TRUE;
338 recurrenceSet(&priv->r, 1, PERIOD_MONTH, NULL, WEEKEND_ADJ_NONE);
340 LEAVE(
"page %p, priv %p, action group %p",
341 plugin_page, priv, action_group);
346 gnc_plugin_page_budget_finalize (GObject *
object)
351 ENTER(
"object %p",
object);
352 page = GNC_PLUGIN_PAGE_BUDGET (
object);
353 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET (page));
355 G_OBJECT_CLASS (parent_class)->finalize (
object);
362 gnc_plugin_page_budget_close_cb (gpointer user_data)
370 gnc_plugin_page_budget_refresh_cb(GHashTable *changes, gpointer user_data)
376 page = GNC_PLUGIN_PAGE_BUDGET(user_data);
377 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
380 ei = gnc_gui_get_entity_events(changes, &priv->key);
383 if (ei->event_mask & QOF_EVENT_DESTROY)
389 priv->delete_budget = TRUE;
390 gnc_budget_view_delete_budget (priv->budget_view);
391 gnc_plugin_page_budget_close_cb(user_data);
394 if (ei->event_mask & QOF_EVENT_MODIFY)
396 DEBUG(
"refreshing budget view because budget was modified");
397 gnc_budget_view_refresh(priv->budget_view);
408 gnc_plugin_page_budget_create_widget (
GncPluginPage *plugin_page)
412 GtkTreeSelection *selection;
413 GtkTreeView *tree_view;
414 GtkWidget *scrolled_window;
415 const gchar *budget_guid_str;
417 ENTER(
"page %p", plugin_page);
418 page = GNC_PLUGIN_PAGE_BUDGET (plugin_page);
419 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
420 if (priv->budget_view != NULL)
422 LEAVE(
"widget = %p", priv->budget_view);
423 return GTK_WIDGET(priv->budget_view);
429 g_signal_connect(G_OBJECT(selection),
"changed",
430 G_CALLBACK(gppb_selection_changed_cb), plugin_page);
432 g_signal_connect(G_OBJECT(priv->budget_view),
"button-press-event",
433 G_CALLBACK(gppb_button_press_cb), plugin_page);
434 g_signal_connect(G_OBJECT(priv->budget_view),
"account-activated",
435 G_CALLBACK(gppb_account_activated_cb), page);
438 gnc_register_gui_component(PLUGIN_PAGE_BUDGET_CM_CLASS,
439 gnc_plugin_page_budget_refresh_cb,
440 gnc_plugin_page_budget_close_cb,
443 gnc_gui_component_set_session (priv->component_id,
444 gnc_get_current_session());
446 gnc_gui_component_watch_entity (priv->component_id,
447 gnc_budget_get_guid(priv->budget),
448 QOF_EVENT_DESTROY | QOF_EVENT_MODIFY);
450 LEAVE(
"widget = %p", priv->budget_view);
451 return GTK_WIDGET(priv->budget_view);
456 gnc_plugin_page_budget_destroy_widget (
GncPluginPage *plugin_page)
460 ENTER(
"page %p", plugin_page);
461 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(plugin_page);
463 if (priv->budget_view)
465 if (priv->delete_budget)
467 gnc_budget_view_delete_budget (priv->budget_view);
470 g_object_unref(G_OBJECT(priv->budget_view));
471 priv->budget_view = NULL;
474 gnc_gui_component_clear_watches (priv->component_id);
476 if (priv->component_id != NO_COMPONENT)
478 gnc_unregister_gui_component(priv->component_id);
479 priv->component_id = NO_COMPONENT;
482 LEAVE(
"widget destroyed");
486 #define BUDGET_GUID "Budget GncGUID"
500 gnc_plugin_page_budget_save_page (
GncPluginPage *plugin_page,
501 GKeyFile *key_file,
const gchar *group_name)
507 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET(plugin_page));
508 g_return_if_fail (key_file != NULL);
509 g_return_if_fail (group_name != NULL);
511 ENTER(
"page %p, key_file %p, group_name %s", plugin_page, key_file,
514 budget_page = GNC_PLUGIN_PAGE_BUDGET(plugin_page);
515 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(budget_page);
518 g_key_file_set_string(key_file, group_name, BUDGET_GUID, guid_str);
521 gnc_budget_view_save(priv->budget_view, key_file, group_name);
539 gnc_plugin_page_budget_recreate_page (GtkWidget *window, GKeyFile *key_file,
540 const gchar *group_name)
545 GError *error = NULL;
551 g_return_val_if_fail(key_file, NULL);
552 g_return_val_if_fail(group_name, NULL);
553 ENTER(
"key_file %p, group_name %s", key_file, group_name);
555 guid_str = g_key_file_get_string(key_file, group_name, BUDGET_GUID,
559 g_warning(
"error reading group %s key %s: %s",
560 group_name, BUDGET_GUID, error->message);
571 bgt = gnc_budget_lookup(&guid, book);
579 budget_page = GNC_PLUGIN_PAGE_BUDGET(page);
580 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(budget_page);
586 if (!gnc_budget_view_restore(priv->budget_view, key_file, group_name))
606 gppb_button_press_cb(GtkWidget *widget, GdkEventButton *event,
611 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
613 ENTER(
"widget %p, event %p, page %p", widget, event, page);
626 g_return_if_fail(GNC_IS_PLUGIN_PAGE_BUDGET (page));
628 window = GNC_PLUGIN_PAGE(page)->window;
636 gppb_selection_changed_cb(GtkTreeSelection *selection,
639 GtkActionGroup *action_group;
644 g_return_if_fail(GNC_IS_PLUGIN_PAGE_BUDGET(page));
652 g_return_if_fail(GTK_IS_TREE_SELECTION(selection));
653 view = gtk_tree_selection_get_tree_view (selection);
655 GNC_TREE_VIEW_ACCOUNT(view));
658 sensitive = (g_list_length(acct_list) > 0);
659 g_list_free(acct_list);
664 "sensitive", sensitive);
673 gnc_plugin_page_budget_cmd_open_account (GtkAction *action,
679 GList *acct_list, *tmp;
682 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET (page));
683 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
684 acct_list = gnc_budget_view_get_selected_accounts(priv->budget_view);
686 window = GNC_PLUGIN_PAGE (page)->window;
687 for (tmp = acct_list; tmp; tmp = g_list_next(tmp))
693 g_list_free(acct_list);
698 gnc_plugin_page_budget_cmd_open_subaccounts (GtkAction *action,
704 GList *acct_list, *tmp;
707 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET (page));
708 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
709 acct_list = gnc_budget_view_get_selected_accounts(priv->budget_view);
711 window = GNC_PLUGIN_PAGE (page)->window;
712 for (tmp = acct_list; tmp; tmp = g_list_next(tmp))
718 g_list_free(acct_list);
723 gnc_plugin_page_budget_cmd_delete_budget (GtkAction *action,
729 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
730 budget = priv->budget;
731 g_return_if_fail (GNC_IS_BUDGET(budget));
732 priv->delete_budget = TRUE;
733 gnc_budget_gui_delete_budget(budget);
742 gnc_plugin_page_budget_cmd_view_options (GtkAction *action,
752 GtkWidget *gbname, *gbtreeview, *gbnumperiods, *gbhb;
755 GtkTextBuffer *buffer;
756 GtkTextIter start, end;
758 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET (page));
759 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
763 builder = gtk_builder_new();
764 gnc_builder_add_from_file (builder,
"gnc-plugin-page-budget.glade",
"NumPeriods_Adj");
765 gnc_builder_add_from_file (builder,
"gnc-plugin-page-budget.glade",
"OptionsContainer");
767 priv->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"OptionsContainer"));
769 gtk_window_set_transient_for(
770 GTK_WINDOW(priv->dialog),
773 gbname = GTK_WIDGET(gtk_builder_get_object (builder,
"BudgetName"));
774 gtk_entry_set_text(GTK_ENTRY(gbname), gnc_budget_get_name(priv->budget));
776 gbtreeview = GTK_WIDGET(gtk_builder_get_object (builder,
"BudgetDescription"));
777 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gbtreeview));
778 gtk_text_buffer_set_text (buffer, gnc_budget_get_description(priv->budget), -1);
780 gbhb = GTK_WIDGET(gtk_builder_get_object (builder,
"BudgetPeriod"));
781 gr = GNC_RECURRENCE(gnc_recurrence_new());
782 gnc_recurrence_set(gr, gnc_budget_get_recurrence(priv->budget));
783 gtk_box_pack_start (GTK_BOX (gbhb), GTK_WIDGET(gr), TRUE, TRUE, 0);
784 gtk_widget_show (GTK_WIDGET(gr));
786 gbnumperiods = GTK_WIDGET(gtk_builder_get_object (builder,
"BudgetNumPeriods"));
787 gtk_spin_button_set_value(GTK_SPIN_BUTTON(gbnumperiods), gnc_budget_get_num_periods(priv->budget));
789 gtk_widget_show_all (priv->dialog);
790 result = gtk_dialog_run(GTK_DIALOG(priv->dialog));
794 case GTK_RESPONSE_OK:
795 name = (gchar *) gtk_entry_get_text(GTK_ENTRY(gbname));
801 label = g_strdup_printf(
"%s: %s", _(
"Budget"), name);
806 gtk_text_buffer_get_bounds (gtk_text_view_get_buffer(GTK_TEXT_VIEW (gbtreeview)), &start, &end);
807 desc = gtk_text_buffer_get_text (gtk_text_view_get_buffer(GTK_TEXT_VIEW (gbtreeview)), &start, &end, TRUE);
812 num_periods = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gbnumperiods));
815 r = gnc_recurrence_get(gr);
816 gnc_budget_set_recurrence(priv->budget, r);
818 case GTK_RESPONSE_CANCEL:
823 g_object_unref(G_OBJECT(builder));
824 gtk_widget_destroy(priv->dialog);
831 gnc_budget_gui_delete_budget(
GncBudget *budget)
835 g_return_if_fail(GNC_IS_BUDGET(budget));
836 name = gnc_budget_get_name (budget);
838 name = _(
"Unnamed Budget");
840 if (gnc_verify_dialog (NULL, FALSE, _(
"Delete %s?"), name))
842 gnc_suspend_gui_refresh ();
845 gnc_resume_gui_refresh ();
851 estimate_budget_helper(GtkTreeModel *model, GtkTreePath *path,
852 GtkTreeIter *iter, gpointer data)
855 guint num_periods, i;
860 g_return_if_fail(GNC_IS_PLUGIN_PAGE_BUDGET(page));
861 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
863 acct = gnc_budget_view_get_account_from_path(priv->budget_view, path);
865 num_periods = gnc_budget_get_num_periods(priv->budget);
867 for (i = 0; i < num_periods; i++)
869 num = recurrenceGetAccountPeriodValue(&priv->r, acct, i);
872 if (gnc_reverse_balance (acct))
878 gnc_budget_set_account_period_value(
879 priv->budget, acct, i, num);
889 gnc_plugin_page_budget_cmd_estimate_budget(GtkAction *action,
893 GtkTreeSelection *sel;
894 GtkWidget *dialog, *gde, *dtr, *hb;
900 g_return_if_fail (GNC_IS_PLUGIN_PAGE_BUDGET(page));
901 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
903 sel = gnc_budget_view_get_selection(priv->budget_view);
905 if (gtk_tree_selection_count_selected_rows(sel) <= 0)
907 dialog = gtk_message_dialog_new (
909 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
910 GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE,
"%s",
911 _(
"You must select at least one account to estimate."));
912 gtk_dialog_run (GTK_DIALOG(dialog));
913 gtk_widget_destroy(dialog);
917 builder = gtk_builder_new();
918 gnc_builder_add_from_file (builder,
"gnc-plugin-page-budget.glade",
"DigitsToRound_Adj");
919 gnc_builder_add_from_file (builder,
"gnc-plugin-page-budget.glade",
"BudgetEstimate");
921 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"BudgetEstimate"));
923 gtk_window_set_transient_for(
927 hb = GTK_WIDGET(gtk_builder_get_object (builder,
"StartDate_hbox"));
928 gde = gnc_date_edit_new (time (NULL), FALSE, FALSE);
929 gtk_box_pack_start (GTK_BOX (hb), gde, TRUE, TRUE, 0);
930 gtk_widget_show (gde);
932 date = recurrenceGetDate(&priv->r);
933 gnc_date_edit_set_gdate(GNC_DATE_EDIT(gde), &date);
935 dtr = GTK_WIDGET(gtk_builder_get_object (builder,
"DigitsToRound"));
936 gtk_spin_button_set_value(GTK_SPIN_BUTTON(dtr),
937 (gdouble)priv->sigFigs);
939 gtk_widget_show_all (dialog);
940 result = gtk_dialog_run(GTK_DIALOG(dialog));
943 case GTK_RESPONSE_OK:
944 r = gnc_budget_get_recurrence(priv->budget);
946 gnc_date_edit_get_gdate(GNC_DATE_EDIT(gde), &date);
947 recurrenceSet(&priv->r, recurrenceGetMultiplier(r),
948 recurrenceGetPeriodType(r), &date,
949 recurrenceGetWeekendAdjust(r));
951 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dtr));
953 gtk_tree_selection_selected_foreach(sel, estimate_budget_helper, page);
958 gtk_widget_destroy(dialog);
959 g_object_unref(G_OBJECT(builder));
964 gnc_plugin_page_budget_cmd_view_filter_by (GtkAction *action,
969 g_return_if_fail(GNC_IS_PLUGIN_PAGE_BUDGET(page));
970 ENTER(
"(action %p, page %p)", action, page);
972 priv = GNC_PLUGIN_PAGE_BUDGET_GET_PRIVATE(page);
973 account_filter_dialog_create(&priv->fd, GNC_PLUGIN_PAGE(page));
void gnc_budget_set_num_periods(GncBudget *budget, guint num_periods)
GncBudgetView * gnc_budget_view_new(GncBudget *budget, AccountFilterDialog *fd)
GncPluginPage * gnc_plugin_page_register_new(Account *account, gboolean subaccounts)
GtkWidget * gnc_plugin_page_get_window(GncPluginPage *page)
void gnc_budget_destroy(GncBudget *budget)
const GList * gnc_gobject_tracking_get_list(const gchar *name)
GncPluginPage *(* recreate_page)(GtkWidget *window, GKeyFile *file, const gchar *group)
gboolean gnc_main_window_button_press_cb(GtkWidget *whatever, GdkEventButton *event, GncPluginPage *page)
GList * gnc_tree_view_account_get_selected_accounts(GncTreeViewAccount *view)
utility functions for the GnuCash UI
gnc_numeric gnc_numeric_neg(gnc_numeric a)
#define DEBUG(format, args...)
gboolean string_to_guid(const gchar *string, GncGUID *guid)
GncPluginPage * gnc_plugin_page_budget_new(GncBudget *budget)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
GtkActionGroup * gnc_plugin_page_get_action_group(GncPluginPage *page)
#define ENTER(format, args...)
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Functions for adding content to a window.
QofBook * qof_session_get_book(const QofSession *session)
Functions providing a register page for the GnuCash UI.
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
GtkTreeView implementation for gnucash account tree.
#define GUID_ENCODING_LENGTH
void(* destroy_widget)(GncPluginPage *plugin_page)
const gchar * plugin_name
Gnome specific utility functions.
GtkTreeModel implementation to display account types in a GtkTreeView.
void gnc_budget_set_name(GncBudget *budget, const gchar *name)
GtkWidget *(* create_widget)(GncPluginPage *plugin_page)
void gnc_budget_set_description(GncBudget *budget, const gchar *description)
void gnc_main_window_close_page(GncPluginPage *page)
#define LEAVE(format, args...)
void(* save_page)(GncPluginPage *page, GKeyFile *file, const gchar *group)
void gnc_plugin_page_add_book(GncPluginPage *page, QofBook *book)
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
GtkActionGroup * gnc_plugin_page_create_action_group(GncPluginPage *page, const gchar *group_name)
void main_window_update_page_name(GncPluginPage *page, const gchar *name_in)
#define GNC_HOW_DENOM_SIGFIGS(n)
const gchar * QofLogModule