28 #include <glib/gi18n.h> 38 #include "dialog-utils.h" 39 #include "gnc-amount-edit.h" 40 #include "gnc-general-select.h" 42 #include "gnc-commodity-edit.h" 43 #include "gnc-component-manager.h" 44 #include "gnc-date-edit.h" 46 #include "gnc-gui-query.h" 47 #include "gnc-session.h" 52 #include <gnc-locale-tax.h> 54 #define DIALOG_NEW_ACCOUNT_CM_CLASS "dialog-new-account" 55 #define DIALOG_EDIT_ACCOUNT_CM_CLASS "dialog-edit-account" 56 #define GNC_PREFS_GROUP "dialogs.account" 57 #define DEFAULT_COLOR "rgb(237,236,235)" 61 ACCOUNT_COL_FULLNAME = 0,
62 ACCOUNT_COL_FIELDNAME,
63 ACCOUNT_COL_OLD_VALUE,
64 ACCOUNT_COL_NEW_VALUE,
74 typedef struct _AccountWindow
80 AccountDialogType dialog_type;
85 gchar **subaccount_names;
92 GtkWidget *name_entry;
93 GtkWidget *description_entry;
94 GtkWidget *color_entry_button;
95 GtkWidget *color_default_button;
96 GtkWidget *code_entry;
97 GtkTextBuffer *notes_text_buffer;
99 GtkWidget *commodity_edit;
101 GtkWidget *account_scu;
105 GtkWidget *type_combo;
106 GtkTreeView *parent_tree;
107 GtkWidget *parent_scroll;
109 GtkWidget *more_properties_page;
111 GtkWidget *balance_grid;
112 GtkWidget *higher_balance_limit_edit;
113 GtkWidget *lower_balance_limit_edit;
114 GtkWidget *include_balance_sub_accts;
115 gboolean balance_is_reversed;
117 GtkWidget *opening_balance_button;
118 GtkWidget *opening_balance_edit;
119 GtkWidget *opening_balance_date_edit;
120 GtkWidget *opening_balance_page;
122 GtkWidget *opening_equity_radio;
123 GtkWidget *transfer_account_scroll;
124 GtkWidget *transfer_tree;
126 GtkWidget *tax_related_button;
127 GtkWidget *placeholder_button;
128 GtkWidget *hidden_button;
129 GtkWidget *auto_interest_button;
137 typedef struct _RenumberDialog
151 static QofLogModule log_module = GNC_MOD_GUI;
155 static GList *ac_destroy_cb_list = NULL;
160 void gnc_account_renumber_prefix_changed_cb (GtkEditable *editable,
RenumberDialog *data);
161 void gnc_account_renumber_interval_changed_cb (GtkSpinButton *spinbutton,
RenumberDialog *data);
162 void gnc_account_renumber_digits_changed_cb (GtkSpinButton *spinbutton,
RenumberDialog *data);
163 void gnc_account_renumber_response_cb (GtkDialog *dialog, gint response,
RenumberDialog *data);
165 void gnc_account_window_destroy_cb (GtkWidget *
object, gpointer data);
166 void opening_equity_cb (GtkWidget *w, gpointer data);
167 static void gnc_account_parent_changed_cb (GObject *selection, gpointer data);
168 void gnc_account_name_changed_cb (GtkWidget *widget, gpointer data);
169 void gnc_account_color_default_cb (GtkWidget *widget, gpointer data);
170 void gnc_account_name_insert_text_cb (GtkWidget *entry,
176 static gboolean account_commodity_filter (GtkTreeSelection* selection,
177 GtkTreeModel* unused_model,
179 gboolean path_currently_selected,
185 aw_call_destroy_callbacks (
Account* acc)
190 for (node = ac_destroy_cb_list; node; node = node->next)
209 if (aw->selection && aw->handler_id)
210 g_signal_handler_disconnect (aw->selection, aw->handler_id);
211 aw->selection = NULL;
218 aw_clear_selection_handler (aw);
219 aw->selection = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW(aw->parent_tree)));
220 aw->handler_id = g_signal_connect (G_OBJECT(aw->selection),
"changed",
221 G_CALLBACK(gnc_account_parent_changed_cb),
226 gnc_account_commodity_from_type (
AccountWindow * aw, gboolean update)
237 if (update && (new_mode != aw->commodity_mode))
239 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
242 aw->commodity_mode = new_mode;
246 gnc_account_opening_balance_button_update (
AccountWindow *aw, gnc_commodity *commodity)
248 Account *account = aw_get_account (aw);
250 gboolean has_splits = (xaccAccountGetSplitsSize (account) != 0);
254 gtk_widget_set_sensitive (aw->opening_balance_button, FALSE);
262 if (!gnc_using_equity_type_opening_balance_account (gnc_get_current_book()))
265 switch (aw->dialog_type)
268 gtk_widget_set_sensitive (aw->opening_balance_button, (ob_account == NULL ||
269 ob_account == account) &&
273 gtk_widget_set_sensitive (aw->opening_balance_button, ob_account == NULL);
283 gnc_commodity * commodity;
286 gboolean flag, nonstd_scu;
288 gnc_numeric balance_limit;
289 gboolean balance_limit_valid;
292 account = aw_get_account (aw);
302 gtk_entry_set_text (GTK_ENTRY(aw->name_entry),
string);
307 gtk_entry_set_text (GTK_ENTRY(aw->description_entry),
string);
312 string = DEFAULT_COLOR;
314 if (!gdk_rgba_parse (&color,
string))
315 gdk_rgba_parse (&color, DEFAULT_COLOR);
317 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
320 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
322 gnc_account_commodity_from_type (aw, FALSE);
328 index = log10 (index) + 1;
334 gtk_combo_box_set_active (GTK_COMBO_BOX(aw->account_scu), index);
339 gtk_entry_set_text (GTK_ENTRY(aw->code_entry),
string);
345 gtk_text_buffer_set_text (aw->notes_text_buffer,
string, strlen(
string));
347 gnc_account_opening_balance_button_update (aw, commodity);
350 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->opening_balance_button),
354 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->tax_related_button),
358 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->placeholder_button),
362 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->hidden_button),
365 aw->balance_is_reversed = gnc_reverse_balance (account);
369 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->include_balance_sub_accts),
373 if (balance_limit_valid)
375 if (aw->balance_is_reversed)
378 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit),
382 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit),
387 if (balance_limit_valid)
389 if (aw->balance_is_reversed)
392 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit),
396 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit),
400 set_auto_interest_box (aw);
405 gnc_account_create_transfer_balance (QofBook *book,
417 g_return_val_if_fail (account != NULL, FALSE);
418 g_return_val_if_fail (transfer != NULL, FALSE);
461 gnc_commodity *commodity;
463 const char *old_string;
468 gnc_numeric balance_limit;
469 gint higher_balance_limit_valid;
470 gint lower_balance_limit_valid;
471 gboolean use_equity, nonstd;
473 gint index, old_scu, new_scu;
474 GtkTextIter start, end;
476 account = aw_get_account (aw);
483 if (aw->dialog_type == EDIT_ACCOUNT
487 aw_call_destroy_callbacks (account);
495 last_used_account_type = aw->type;
497 string = gtk_entry_get_text (GTK_ENTRY(aw->name_entry));
499 if (g_strcmp0 (
string, old_string) != 0)
502 string = gtk_entry_get_text (GTK_ENTRY(aw->description_entry));
504 if (g_strcmp0 (
string, old_string) != 0)
507 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
508 char* new_string = gdk_rgba_to_string (&color);
509 if (!g_strcmp0 (new_string, DEFAULT_COLOR))
517 if (!g_strcmp0 (new_string, DEFAULT_COLOR) && old_string)
521 if (g_strcmp0 (new_string, old_string) != 0)
526 commodity = (gnc_commodity *)
527 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
539 index = gtk_combo_box_get_active (GTK_COMBO_BOX(aw->account_scu));
540 nonstd = (index != 0);
544 if (old_scu != new_scu)
547 string = gtk_entry_get_text (GTK_ENTRY(aw->code_entry));
549 if (g_strcmp0 (
string, old_string) != 0)
552 gtk_text_buffer_get_start_iter (aw->notes_text_buffer, &start);
553 gtk_text_buffer_get_end_iter (aw->notes_text_buffer, &end);
554 new_string = gtk_text_buffer_get_text (aw->notes_text_buffer, &start, &end,
557 if (g_strcmp0 (new_string, old_string))
561 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->opening_balance_button));
565 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->tax_related_button));
569 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->placeholder_button));
573 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->hidden_button));
577 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->auto_interest_button));
583 if (parent_account == NULL)
584 parent_account = gnc_book_get_root_account (aw->book);
588 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(
589 aw->include_balance_sub_accts));
593 higher_balance_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(
594 aw->higher_balance_limit_edit),
595 &balance_limit, TRUE, NULL);
597 if (higher_balance_limit_valid == 0)
599 if (aw->balance_is_reversed)
608 if (higher_balance_limit_valid == -1)
610 if (aw->balance_is_reversed)
616 lower_balance_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(
617 aw->lower_balance_limit_edit),
618 &balance_limit, TRUE, NULL);
620 if (lower_balance_limit_valid == 0)
622 if (aw->balance_is_reversed)
631 if (lower_balance_limit_valid == -1)
633 if (aw->balance_is_reversed)
639 if ((higher_balance_limit_valid == -1) && (lower_balance_limit_valid == -1))
644 balance = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit));
648 LEAVE(
"zero balance");
652 if (gnc_reverse_balance (account))
655 date = gnc_date_edit_get_date (GNC_DATE_EDIT(aw->opening_balance_date_edit));
657 use_equity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->opening_equity_radio));
661 if (!gnc_account_create_opening_balance (account, balance, date, aw->book))
663 const char *message = _(
"Could not create opening balance.");
664 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
674 LEAVE(
"no transfer account");
678 gnc_account_create_transfer_balance (aw->book, account, transfer, balance, date);
686 GList *children, *iter;
689 if (children == NULL)
692 for (iter = children; iter; iter = iter->next)
694 account = iter->data;
699 aw_call_destroy_callbacks (account);
705 set_children_types (account, type);
707 g_list_free (children);
715 g_return_if_fail (aw);
717 if (aw->dialog_type == NEW_ACCOUNT)
720 account = aw_get_account (aw);
721 g_return_if_fail (account);
726 set_children_types (account, aw->type);
733 gnc_suspend_gui_refresh ();
736 make_children_compatible (aw);
737 gnc_ui_to_account (aw);
739 gnc_resume_gui_refresh ();
742 if ((aw->dialog_type == NEW_ACCOUNT) && aw->next_name && *aw->next_name)
744 gnc_commodity *commodity;
749 gtk_container_remove (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
751 gtk_container_add (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
752 gtk_widget_show (GTK_WIDGET(aw->parent_tree));
754 aw_connect_selection_changed (aw);
755 gnc_suspend_gui_refresh ();
757 parent = aw_get_account (aw);
765 gnc_account_to_ui (aw);
767 gnc_account_window_set_name (aw);
770 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
772 gnc_account_commodity_from_type (aw, FALSE);
778 gnc_resume_gui_refresh ();
784 aw->created_account = aw_get_account (aw);
789 gnc_close_gui_component (aw->component_id);
794 add_children_to_expander (GObject *
object, GParamSpec *param_spec, gpointer data)
796 GtkExpander *expander = GTK_EXPANDER(
object);
798 GtkWidget *scrolled_window;
801 if (gtk_expander_get_expanded (expander) &&
802 !gtk_bin_get_child (GTK_BIN(expander)))
806 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
807 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_window),
808 GTK_POLICY_AUTOMATIC,
809 GTK_POLICY_AUTOMATIC);
810 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window),
812 gtk_container_add (GTK_CONTAINER(scrolled_window), GTK_WIDGET(view));
814 gtk_container_add (GTK_CONTAINER(expander), scrolled_window);
815 gtk_widget_set_vexpand (GTK_WIDGET(scrolled_window), TRUE);
816 gtk_widget_show_all (scrolled_window);
827 GtkWidget *dialog, *vbox, *hbox, *label, *expander;
834 account = aw_get_account (aw);
844 dialog = gtk_dialog_new_with_buttons (
"",
845 GTK_WINDOW(aw->dialog),
846 GTK_DIALOG_DESTROY_WITH_PARENT |
848 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
849 _(
"_OK"), GTK_RESPONSE_OK,
852 gtk_window_set_skip_taskbar_hint (GTK_WINDOW(dialog), TRUE);
854 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
855 gtk_box_set_homogeneous (GTK_BOX(hbox), FALSE);
856 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
857 gtk_box_set_homogeneous (GTK_BOX(vbox), FALSE);
859 gtk_box_pack_start (GTK_BOX(hbox),
860 gtk_image_new_from_icon_name (
"dialog-information",
861 GTK_ICON_SIZE_DIALOG), FALSE, FALSE, 0);
864 label = gtk_label_new (_(
"Give the children the same type?"));
865 gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
866 gtk_label_set_selectable (GTK_LABEL(label), TRUE);
867 gnc_label_set_alignment (label, 0.0, 0.0);
870 gnc_widget_style_context_add_class (GTK_WIDGET(label),
"gnc-class-title");
872 gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
875 str = g_strdup_printf (_(
"The children of the edited account have to be " 876 "changed to type \"%s\" to make them compatible."),
878 label = gtk_label_new (str);
880 gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
881 gtk_label_set_selectable (GTK_LABEL(label), TRUE);
882 gnc_label_set_alignment (label, 0.0, 0.0);
883 gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
886 expander = gtk_expander_new_with_mnemonic (_(
"_Show children accounts"));
887 gtk_expander_set_spacing (GTK_EXPANDER(expander), 6);
888 g_signal_connect (G_OBJECT(expander),
"notify::expanded",
889 G_CALLBACK(add_children_to_expander), account);
890 gtk_box_pack_start (GTK_BOX(vbox), expander, TRUE, TRUE, 0);
892 gtk_box_pack_start (GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
894 gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(dialog))),
895 hbox, TRUE, TRUE, 0);
898 gtk_container_set_border_width (GTK_CONTAINER(dialog), 5);
899 gtk_container_set_border_width (GTK_CONTAINER(hbox), 5);
900 gtk_box_set_spacing (GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(dialog))), 14);
902 gtk_widget_show_all (hbox);
904 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK);
906 result = (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_OK);
908 gtk_widget_destroy (dialog);
914 gnc_filter_parent_accounts (
Account *account, gpointer data)
917 Account *aw_account = aw_get_account (aw);
922 if (aw_account == NULL)
928 if (account == aw_account)
940 Account *root, *account, *parent;
941 gnc_commodity * commodity;
942 gchar *fullname, *fullname_parent;
943 const gchar *name, *separator;
944 gboolean higher_limit_valid;
945 gnc_numeric higher_balance_limit;
946 gboolean lower_limit_valid;
947 gnc_numeric lower_balance_limit;
950 root = gnc_book_get_root_account (aw->book);
955 name = gtk_entry_get_text (GTK_ENTRY(aw->name_entry));
956 if (g_strcmp0 (name,
"") == 0)
958 const char *message = _(
"The account must be given a name.");
959 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
966 (GNC_TREE_VIEW_ACCOUNT(aw->parent_tree));
974 fullname = g_strconcat (fullname_parent, separator, name, NULL);
978 g_free (fullname_parent);
981 if ((account != NULL) &&
984 const char *message = _(
"There is already an account with that name.");
985 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
986 LEAVE(
"duplicate name");
991 if (!gnc_filter_parent_accounts (parent, aw))
993 const char *message = _(
"You must choose a valid parent account.");
994 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
995 LEAVE(
"invalid parent");
1002 const char *message = _(
"You must select an account type.");
1003 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1004 LEAVE(
"invalid type");
1011 const char *message = _(
"The selected account type is incompatible with " 1012 "the one of the selected parent.");
1013 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1014 LEAVE(
"incompatible types");
1019 commodity = (gnc_commodity *)
1020 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
1023 const char *message = _(
"You must choose a commodity.");
1024 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1025 LEAVE(
"invalid commodity");
1030 higher_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit),
1031 &higher_balance_limit, TRUE, NULL);
1033 lower_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit),
1034 &lower_balance_limit, TRUE, NULL);
1036 if ((lower_limit_valid == 0) && (higher_limit_valid == 0))
1039 lower_balance_limit);
1043 const char *message = _(
"Balance limits must be different unless they are both zero.");
1044 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1045 LEAVE(
"invalid balance limit, both the same but not zero");
1048 else if (compare == -1)
1050 const char *message = _(
"The lower balance limit must be less than the higher limit.");
1051 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1052 LEAVE(
"invalid balance limit, lower limit not less than upper");
1068 account = aw_get_account (aw);
1075 if (!gnc_common_ok (aw))
1081 if (!verify_children_compatible (aw))
1094 gnc_numeric balance;
1098 if (!gnc_common_ok (aw))
1104 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT(aw->opening_balance_edit), NULL))
1106 const char *message = _(
"You must enter a valid opening balance " 1107 "or leave it blank.");
1108 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1113 balance = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit));
1117 gboolean use_equity;
1119 use_equity = gtk_toggle_button_get_active
1120 (GTK_TOGGLE_BUTTON(aw->opening_equity_radio));
1127 aw->transfer_tree));
1130 const char *message = _(
"You must select a transfer account or choose" 1131 " the opening balances equity account.");
1132 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1144 gnc_account_window_response_cb (GtkDialog *dialog,
1150 ENTER(
"dialog %p, response %d, aw %p", dialog, response, aw);
1153 case GTK_RESPONSE_OK:
1154 switch (aw->dialog_type)
1157 DEBUG(
"new acct dialog, OK");
1158 gnc_new_account_ok (aw);
1161 DEBUG(
"edit acct dialog, OK");
1162 gnc_edit_account_ok (aw);
1165 g_assert_not_reached ();
1169 case GTK_RESPONSE_HELP:
1170 switch (aw->dialog_type)
1173 DEBUG(
"new acct dialog, HELP");
1177 DEBUG(
"edit acct dialog, HELP");
1181 g_assert_not_reached ();
1185 case GTK_RESPONSE_CANCEL:
1188 gnc_close_gui_component (aw->component_id);
1195 gnc_account_window_destroy_cb (GtkWidget *
object, gpointer data)
1200 ENTER(
"object %p, aw %p",
object, aw);
1201 account = aw_get_account (aw);
1203 aw_clear_selection_handler (aw);
1204 gnc_suspend_gui_refresh ();
1206 switch (aw->dialog_type)
1209 if (account != NULL)
1216 DEBUG (
"account add window destroyed\n");
1223 PERR (
"unexpected dialog type\n");
1224 gnc_resume_gui_refresh ();
1229 gnc_unregister_gui_component (aw->component_id);
1231 gnc_resume_gui_refresh ();
1233 if (aw->subaccount_names)
1235 g_strfreev (aw->subaccount_names);
1236 aw->subaccount_names = NULL;
1237 aw->next_name = NULL;
1245 gnc_account_parent_changed_cb (GObject *selection, gpointer data)
1249 guint32 types, old_types;
1250 GtkTreeModelSort *s_model;
1251 GtkTreeModel *type_model;
1252 gboolean combo_set = FALSE;
1254 g_return_if_fail (aw);
1255 g_return_if_fail (selection == aw->selection);
1258 GNC_TREE_VIEW_ACCOUNT(aw->parent_tree));
1259 if (!parent_account)
1264 types = aw->valid_types;
1268 types = aw->valid_types &
1271 s_model = GTK_TREE_MODEL_SORT(gtk_combo_box_get_model (GTK_COMBO_BOX(aw->type_combo)));
1272 type_model = gtk_tree_model_sort_get_model (s_model);
1276 if (aw->type != aw->preferred_account_type &&
1277 (types & (1 << aw->preferred_account_type)) != 0)
1280 aw->type = aw->preferred_account_type;
1283 else if ((types & (1 << aw->type)) == 0)
1291 old_types = gnc_tree_model_account_types_get_mask (type_model);
1292 if (old_types != types)
1296 gnc_tree_model_account_types_set_mask (type_model, types);
1299 gnc_tree_model_account_types_set_active_combo (GTK_COMBO_BOX(aw->type_combo),
1302 gnc_account_window_set_name (aw);
1308 Account* account = aw_get_account (aw);
1309 gboolean type_ok = account_type_has_auto_interest_xfer (aw->type);
1311 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->auto_interest_button),
1312 type_ok && pref_set);
1313 gtk_widget_set_sensitive (GTK_WIDGET(aw->auto_interest_button), type_ok);
1317 gnc_account_type_combo_changed_cb (GtkComboBox *combo, gpointer data)
1323 g_return_if_fail (aw != NULL);
1327 type_id = gnc_tree_model_account_types_get_active_combo (combo);
1336 aw->preferred_account_type = type_id;
1338 gnc_account_commodity_from_type (aw, TRUE);
1347 gtk_widget_set_sensitive (aw->opening_balance_page, sensitive);
1351 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1352 gnc_numeric_zero ());
1354 set_auto_interest_box (aw);
1358 gnc_account_type_view_create (
AccountWindow *aw, guint32 compat_types)
1360 GtkTreeModel *fmodel, *smodel;
1361 GtkCellRenderer *renderer;
1363 aw->valid_types &= compat_types;
1364 if (aw->valid_types == 0)
1367 aw->valid_types = compat_types | (1 << aw->type);
1368 aw->preferred_account_type = aw->type;
1370 else if ((aw->valid_types & (1 << aw->type)) != 0)
1373 aw->preferred_account_type = aw->type;
1375 else if ((aw->valid_types & (1 << last_used_account_type)) != 0)
1378 aw->type = last_used_account_type;
1379 aw->preferred_account_type = last_used_account_type;
1385 aw->preferred_account_type = aw->type;
1387 for (i = 0; i < 32; i++)
1388 if ((aw->valid_types & (1 << i)) != 0)
1395 fmodel = gnc_tree_model_account_types_filter_using_mask (aw->valid_types);
1397 smodel = gtk_tree_model_sort_new_with_model (fmodel);
1399 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(smodel),
1400 GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME,
1401 GTK_SORT_ASCENDING);
1403 gtk_combo_box_set_model (GTK_COMBO_BOX(aw->type_combo), smodel);
1405 renderer = gtk_cell_renderer_text_new ();
1406 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(aw->type_combo), renderer, TRUE);
1407 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(aw->type_combo), renderer,
1408 "text", GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME, NULL);
1410 g_signal_connect (G_OBJECT(aw->type_combo),
"changed",
1411 G_CALLBACK(gnc_account_type_combo_changed_cb), aw);
1413 g_object_unref (G_OBJECT(fmodel));
1415 gnc_tree_model_account_types_set_active_combo (GTK_COMBO_BOX(aw->type_combo),
1420 gnc_account_name_insert_text_cb (GtkWidget *entry,
1426 GtkEditable *editable = GTK_EDITABLE(entry);
1427 const gchar *separator = NULL;
1431 strsplit = g_strsplit (text, separator, 0);
1432 if (strsplit[1] != NULL)
1434 gchar *result = g_strjoinv (NULL, strsplit);
1435 g_signal_handlers_block_by_func (G_OBJECT(editable),
1436 G_CALLBACK(gnc_account_name_insert_text_cb),
1438 gtk_editable_insert_text (editable, result, g_utf8_strlen (result, -1), position);
1439 g_signal_handlers_unblock_by_func (G_OBJECT(editable),
1440 G_CALLBACK(gnc_account_name_insert_text_cb),
1442 g_signal_stop_emission_by_name (G_OBJECT(editable),
"insert_text");
1446 g_strfreev (strsplit);
1450 gnc_account_name_changed_cb (GtkWidget *widget, gpointer data)
1454 gnc_account_window_set_name (aw);
1458 gnc_account_color_default_cb (GtkWidget *widget, gpointer data)
1463 gdk_rgba_parse (&color, DEFAULT_COLOR);
1464 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
1472 gnc_commodity *currency;
1473 GtkTreeSelection *selection;
1474 Account *account = aw_get_account (aw);
1476 currency = (gnc_commodity *) gnc_general_select_get_selected (gsl);
1483 if (ob_account != account)
1485 gchar *dialog_msg = _(
"An account with opening balance already exists for the desired currency.");
1486 gchar *dialog_title = _(
"Cannot change currency");
1491 "%s", dialog_title);
1492 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
1494 gtk_dialog_run (GTK_DIALOG(dialog));
1495 gtk_widget_destroy (dialog);
1496 g_signal_handlers_block_by_func (gsl, commodity_changed_cb, data);
1498 g_signal_handlers_unblock_by_func (gsl, commodity_changed_cb, data);
1503 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1505 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1506 gnc_commodity_print_info (currency, FALSE));
1508 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(aw->transfer_tree));
1509 gtk_tree_selection_unselect_all (selection);
1510 gnc_account_opening_balance_button_update (aw, currency);
1514 account_commodity_filter (GtkTreeSelection *selection,
1515 GtkTreeModel *unused_model,
1516 GtkTreePath *s_path,
1517 gboolean path_currently_selected,
1520 gnc_commodity *commodity;
1524 g_return_val_if_fail (GTK_IS_TREE_SELECTION(selection), FALSE);
1528 if (path_currently_selected)
1540 commodity = (gnc_commodity *)
1541 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
1547 opening_equity_cb (GtkWidget *w, gpointer data)
1550 gboolean use_equity;
1552 use_equity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w));
1554 gtk_widget_set_sensitive (aw->transfer_account_scroll, !use_equity);
1566 gnc_account_window_create (GtkWindow *parent,
AccountWindow *aw)
1569 GtkWidget *date_edit;
1573 GtkBuilder *builder;
1574 GtkTreeSelection *selection;
1575 const gchar *tt = _(
"This Account contains Transactions.\nChanging this option is not possible.");
1578 ENTER(
"aw %p, modal %d", aw, aw->modal);
1579 builder = gtk_builder_new ();
1580 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"fraction_liststore");
1581 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_dialog");
1583 aw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_dialog"));
1584 awo = G_OBJECT(aw->dialog);
1587 gtk_window_set_transient_for (GTK_WINDOW(aw->dialog), parent);
1590 gtk_widget_set_name (GTK_WIDGET(aw->dialog),
"gnc-id-account");
1591 gnc_widget_style_context_add_class (GTK_WIDGET(aw->dialog),
"gnc-class-account");
1594 g_object_set_data (awo,
"dialog_info", aw);
1597 g_signal_connect (awo,
"response",
1598 G_CALLBACK(gnc_account_window_response_cb), aw);
1600 gtk_window_set_modal (GTK_WINDOW(aw->dialog), TRUE);
1602 aw->notebook = GTK_WIDGET(gtk_builder_get_object (builder,
"account_notebook"));
1603 aw->name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
1604 aw->description_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"description_entry"));
1605 aw->color_entry_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_entry_button"));
1606 aw->color_default_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_default_button"));
1607 aw->code_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"code_entry"));
1608 aw->notes_text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(GTK_WIDGET(
1609 gtk_builder_get_object (builder,
1612 box = GTK_WIDGET(gtk_builder_get_object (builder,
"commodity_hbox"));
1613 aw->commodity_edit = gnc_general_select_new (GNC_GENERAL_SELECT_TYPE_SELECT,
1614 gnc_commodity_edit_get_string,
1615 gnc_commodity_edit_new_select,
1616 &aw->commodity_mode);
1618 gtk_box_pack_start (GTK_BOX(box), aw->commodity_edit, TRUE, TRUE, 0);
1619 gtk_widget_show (aw->commodity_edit);
1621 if (xaccAccountGetSplitsSize (aw_get_account (aw)) != 0)
1623 gtk_widget_set_tooltip_text (aw->commodity_edit, tt);
1624 gtk_widget_set_sensitive (aw->commodity_edit, FALSE);
1627 label = GTK_WIDGET(gtk_builder_get_object (builder,
"security_label"));
1628 gnc_general_select_make_mnemonic_target (GNC_GENERAL_SELECT(aw->commodity_edit), label);
1630 g_signal_connect (G_OBJECT(aw->commodity_edit),
"changed",
1631 G_CALLBACK(commodity_changed_cb), aw);
1633 aw->account_scu = GTK_WIDGET(gtk_builder_get_object (builder,
"account_scu"));
1635 aw->parent_scroll = GTK_WIDGET(gtk_builder_get_object (builder,
"parent_scroll"));
1638 gtk_container_add (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
1639 gtk_widget_show (GTK_WIDGET(aw->parent_tree));
1640 aw_connect_selection_changed (aw);
1642 aw->balance_grid = GTK_WIDGET(gtk_builder_get_object (builder,
"balance_grid"));
1644 box = GTK_WIDGET(gtk_builder_get_object (builder,
"higher_balance_limit_hbox"));
1645 aw->higher_balance_limit_edit = gnc_amount_edit_new ();
1646 gtk_box_pack_start (GTK_BOX(box), aw->higher_balance_limit_edit, TRUE, TRUE, 0);
1647 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1648 gnc_amount_edit_set_validate_on_change (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1649 gnc_amount_edit_show_warning_symbol (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1650 gtk_widget_show (aw->higher_balance_limit_edit);
1652 box = GTK_WIDGET(gtk_builder_get_object (builder,
"lower_balance_limit_hbox"));
1653 aw->lower_balance_limit_edit = gnc_amount_edit_new ();
1654 gtk_box_pack_start (GTK_BOX(box), aw->lower_balance_limit_edit, TRUE, TRUE, 0);
1655 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1656 gnc_amount_edit_set_validate_on_change (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1657 gnc_amount_edit_show_warning_symbol (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1658 gtk_widget_show (aw->lower_balance_limit_edit);
1660 aw->include_balance_sub_accts = GTK_WIDGET(gtk_builder_get_object (builder,
"include_sub_accts_tb"));
1662 aw->more_properties_page =
1663 gtk_notebook_get_nth_page (GTK_NOTEBOOK(aw->notebook), 1);
1665 aw->opening_balance_button = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_button"));
1666 aw->tax_related_button = GTK_WIDGET(gtk_builder_get_object (builder,
"tax_related_button"));
1667 aw->placeholder_button = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_button"));
1668 aw->hidden_button = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_button"));
1669 aw->auto_interest_button = GTK_WIDGET(gtk_builder_get_object (builder,
"auto_interest_button"));
1670 set_auto_interest_box (aw);
1673 box = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_box"));
1674 amount = gnc_amount_edit_new ();
1675 aw->opening_balance_edit = amount;
1676 gtk_box_pack_start (GTK_BOX(box), amount, TRUE, TRUE, 0);
1677 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(amount), TRUE);
1678 gtk_widget_show (amount);
1680 label = GTK_WIDGET(gtk_builder_get_object (builder,
"balance_label"));
1681 gnc_amount_edit_make_mnemonic_target (GNC_AMOUNT_EDIT(amount), label);
1683 box = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_date_box"));
1684 label = GTK_WIDGET(gtk_builder_get_object (builder,
"date_label"));
1685 date_edit = gnc_date_edit_new (
gnc_time (NULL), 0, 0);
1686 gnc_date_make_mnemonic_target (GNC_DATE_EDIT(date_edit), label);
1687 aw->opening_balance_date_edit = date_edit;
1688 gtk_box_pack_start (GTK_BOX(box), date_edit, TRUE, TRUE, 0);
1689 gtk_widget_show (date_edit);
1691 aw->opening_balance_page =
1692 gtk_notebook_get_nth_page (GTK_NOTEBOOK(aw->notebook), 2);
1694 aw->opening_equity_radio = GTK_WIDGET(gtk_builder_get_object (builder,
1695 "opening_equity_radio"));
1697 box = GTK_WIDGET(gtk_builder_get_object (builder,
"transfer_account_scroll"));
1698 aw->transfer_account_scroll = box;
1701 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(aw->transfer_tree));
1702 gtk_tree_selection_set_select_function (selection, account_commodity_filter, aw, NULL);
1704 gtk_container_add (GTK_CONTAINER(box), GTK_WIDGET(aw->transfer_tree));
1705 gtk_widget_show (GTK_WIDGET(aw->transfer_tree));
1707 label = GTK_WIDGET(gtk_builder_get_object (builder,
"parent_label"));
1708 gtk_label_set_mnemonic_widget (GTK_LABEL(label), GTK_WIDGET(aw->parent_tree));
1711 aw->type_combo = GTK_WIDGET(gtk_builder_get_object (builder,
"account_type_combo"));
1721 if (xaccAccountGetSplitsSize (aw_get_account (aw)) != 0)
1728 gnc_account_type_view_create (aw, compat_types);
1730 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(aw->dialog), parent);
1732 gtk_widget_grab_focus (GTK_WIDGET(aw->name_entry));
1734 gtk_builder_connect_signals (builder, aw);
1735 g_object_unref (G_OBJECT(builder));
1747 name = gtk_entry_get_text (GTK_ENTRY(aw->name_entry));
1748 if (!name || *name ==
'\0')
1749 name = _(
"<No name>");
1758 fullname = g_strconcat (parent_name, separator, name, NULL);
1759 g_free (parent_name);
1762 fullname = g_strdup (name);
1773 if (!aw || !aw->parent_tree)
1776 fullname = get_ui_fullname (aw);
1778 if (aw->dialog_type == EDIT_ACCOUNT)
1779 title = g_strconcat(_(
"Edit Account"),
" - ", fullname, NULL);
1780 else if (aw->next_name && (g_strv_length (aw->next_name) > 0))
1782 const char *format = _(
"(%d) New Accounts");
1783 char *prefix = g_strdup_printf (format,
1784 g_strv_length (aw->next_name) + 1);
1786 title = g_strconcat (prefix,
" - ", fullname,
" …", NULL);
1790 title = g_strconcat (_(
"New Account"),
" - ", fullname, NULL);
1792 gtk_window_set_title (GTK_WINDOW(aw->dialog), title);
1799 close_handler (gpointer user_data)
1803 ENTER(
"aw %p, modal %d", aw, aw->modal);
1804 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(aw->dialog));
1806 gtk_widget_destroy (GTK_WIDGET(aw->dialog));
1825 gnc_account_window_set_name (aw);
1829 refresh_handler (GHashTable *changes, gpointer user_data)
1834 account = aw_get_account (aw);
1837 gnc_close_gui_component (aw->component_id);
1843 const EventInfo *info = gnc_gui_get_entity_events (changes, &aw->account);
1844 if (info && (info->event_mask & QOF_EVENT_DESTROY))
1846 gnc_close_gui_component (aw->component_id);
1850 gnc_ui_refresh_account_window (aw);
1854 gnc_ui_new_account_window_internal (GtkWindow *parent,
1857 gchar **subaccount_names,
1859 const gnc_commodity * default_commodity,
1862 const gnc_commodity *commodity, *parent_commodity;
1867 g_return_val_if_fail(book, NULL);
1873 aw->dialog_type = NEW_ACCOUNT;
1875 aw->valid_types = 0;
1876 for (list = valid_types; list; list = list->next)
1877 aw->valid_types |= (1 << GPOINTER_TO_INT (list->data));
1889 aw->type = last_used_account_type;
1893 gnc_suspend_gui_refresh ();
1895 if (subaccount_names && *subaccount_names)
1898 aw->subaccount_names = subaccount_names;
1899 aw->next_name = subaccount_names + 1;
1902 gnc_account_window_create (parent, aw);
1903 gnc_account_to_ui (aw);
1905 gnc_resume_gui_refresh ();
1907 if (default_commodity != NULL)
1909 commodity = default_commodity;
1912 gtk_entry_set_text (GTK_ENTRY(aw->name_entry),
1914 gtk_entry_set_text (GTK_ENTRY(aw->description_entry),
1920 commodity = parent_commodity;
1926 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
1927 (gpointer) commodity);
1928 gnc_account_commodity_from_type (aw, FALSE);
1930 if (base_account == NULL)
1932 base_account = gnc_book_get_root_account (book);
1935 gtk_tree_view_collapse_all (aw->parent_tree);
1940 gtk_widget_show (aw->dialog);
1942 gnc_window_adjust_for_screen (GTK_WINDOW(aw->dialog));
1944 gnc_account_window_set_name (aw);
1946 aw->component_id = gnc_register_gui_component (DIALOG_NEW_ACCOUNT_CM_CLASS,
1948 modal ? NULL : close_handler,
1951 gnc_gui_component_set_session (aw->component_id, gnc_get_current_session());
1952 gnc_gui_component_watch_entity_type (aw->component_id,
1954 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
1959 gnc_split_account_name (QofBook *book,
const char *in_name,
Account **base_account)
1962 gchar **names, **ptr, **out_names;
1965 root = gnc_book_get_root_account (book);
1969 for (ptr = names; *ptr; ptr++)
1976 for (node = list; node; node = g_list_next (node))
1978 account = node->data;
1983 *base_account = account;
1996 out_names = g_strdupv (ptr);
2018 const gnc_commodity * default_commodity,
2024 Account *created_account = NULL;
2025 gchar ** subaccount_names;
2027 gboolean done = FALSE;
2029 ENTER(
"name %s, valid %p, commodity %p, account %p",
2030 name, valid_types, default_commodity, parent_acct);
2031 book = gnc_get_current_book ();
2032 if (!name || *name ==
'\0')
2034 subaccount_names = NULL;
2035 base_account = NULL;
2038 subaccount_names = gnc_split_account_name (book, name, &base_account);
2040 if (parent_acct != NULL)
2042 base_account = parent_acct;
2044 aw = gnc_ui_new_account_window_internal (parent, book, base_account,
2052 response = gtk_dialog_run (GTK_DIALOG(aw->dialog));
2055 gnc_account_window_response_cb (GTK_DIALOG(aw->dialog), response, (gpointer)aw);
2059 case GTK_RESPONSE_OK:
2060 created_account = aw->created_account;
2061 done = (created_account != NULL);
2064 case GTK_RESPONSE_HELP:
2076 return created_account;
2084 find_by_account (gpointer
find_data, gpointer user_data)
2107 if (account == NULL)
2110 aw = gnc_find_first_gui_component (DIALOG_EDIT_ACCOUNT_CM_CLASS,
2111 find_by_account, account);
2114 gtk_window_present (GTK_WINDOW(aw->dialog));
2120 aw->book = gnc_account_get_book (account);
2122 aw->dialog_type = EDIT_ACCOUNT;
2124 aw->subaccount_names = NULL;
2127 gnc_suspend_gui_refresh ();
2129 gnc_account_window_create (parent, aw);
2130 gnc_account_to_ui (aw);
2132 gnc_resume_gui_refresh ();
2134 gtk_widget_show_all (aw->dialog);
2135 if (xaccAccountGetSplitsSize (account) != 0)
2136 gtk_widget_hide (aw->opening_balance_page);
2139 if (parent_acct == NULL)
2140 parent_acct = account;
2142 gtk_tree_view_collapse_all (aw->parent_tree);
2147 gnc_account_window_set_name (aw);
2149 gnc_window_adjust_for_screen (GTK_WINDOW(aw->dialog));
2151 aw->component_id = gnc_register_gui_component (DIALOG_EDIT_ACCOUNT_CM_CLASS,
2155 gnc_gui_component_set_session (aw->component_id, gnc_get_current_session ());
2156 gnc_gui_component_watch_entity_type (aw->component_id,
2158 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
2160 gtk_window_present (GTK_WINDOW(aw->dialog));
2165 gnc_commodity *default_commodity)
2167 gnc_ui_new_account_window_internal (parent, book, NULL, NULL,
2168 valid_types, default_commodity, FALSE);
2181 g_return_if_fail(book != NULL);
2182 if (parent_acct && book)
2183 g_return_if_fail(gnc_account_get_book (parent_acct) == book);
2185 gnc_ui_new_account_window_internal (parent, book, parent_acct, NULL, NULL,
2200 gnc_ui_register_account_destroy_callback (
void (*cb)(
Account *))
2205 if (g_list_index (ac_destroy_cb_list, cb) == -1)
2206 ac_destroy_cb_list = g_list_append (ac_destroy_cb_list, cb);
2219 unsigned int num_digits = 1;
2221 g_return_if_fail (data->num_children > 0);
2223 const gchar *prefix = gtk_entry_get_text (GTK_ENTRY(data->prefix));
2224 interval = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->interval));
2225 digits = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->digits));
2230 num_digits = (
unsigned int)log10((
double)(data->num_children * interval)) + 1;
2232 if (digits <= num_digits)
2234 g_signal_handlers_block_by_func (GTK_SPIN_BUTTON(data->digits),
2235 (gpointer)gnc_account_renumber_digits_changed_cb,
2237 gtk_spin_button_set_value (GTK_SPIN_BUTTON(data->digits), num_digits);
2238 g_signal_handlers_unblock_by_func (GTK_SPIN_BUTTON(data->digits),
2239 (gpointer)gnc_account_renumber_digits_changed_cb,
2243 num_digits = digits;
2245 if (prefix && *prefix)
2246 str = g_strdup_printf (
"%s-%0*d", prefix, num_digits, interval);
2248 str = g_strdup_printf (
"%0*d", num_digits, interval);
2250 gtk_label_set_text (GTK_LABEL(data->example1), str);
2253 if (prefix && *prefix)
2254 str = g_strdup_printf (
"%s-%0*d", prefix, num_digits,
2255 interval * data->num_children);
2257 str = g_strdup_printf (
"%0*d", num_digits,
2258 interval * data->num_children);
2260 gtk_label_set_text (GTK_LABEL(data->example2), str);
2266 gnc_account_renumber_prefix_changed_cb (GtkEditable *editable,
2269 gnc_account_renumber_update_examples (data);
2273 gnc_account_renumber_interval_changed_cb (GtkSpinButton *spinbutton,
2276 gnc_account_renumber_update_examples (data);
2280 gnc_account_renumber_digits_changed_cb (GtkSpinButton *spinbutton,
2283 gnc_account_renumber_update_examples (data);
2287 gnc_account_renumber_response_cb (GtkDialog *dialog,
2291 if (response == GTK_RESPONSE_OK)
2296 unsigned int num_digits, i;
2298 gtk_widget_hide (data->dialog);
2300 if (children == NULL)
2302 PWARN(
"Can't renumber children of an account with no children!");
2306 const gchar *prefix = gtk_entry_get_text (GTK_ENTRY(data->prefix));
2307 interval = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->interval));
2308 num_digits = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->digits));
2310 gnc_set_busy_cursor (NULL, TRUE);
2311 for (tmp = children, i = 1; tmp; tmp = g_list_next (tmp), i += 1)
2314 if (prefix && *prefix)
2315 str = g_strdup_printf (
"%s-%0*d", prefix,
2316 num_digits, interval * i);
2318 str = g_strdup_printf (
"%0*d", num_digits, interval * i);
2323 gnc_unset_busy_cursor (NULL);
2324 g_list_free (children);
2326 gtk_widget_destroy (data->dialog);
2331 gnc_account_renumber_create_dialog (GtkWidget *window,
Account *account)
2334 GtkBuilder *builder;
2336 gchar *string, *fullname;
2344 data->parent = account;
2347 builder = gtk_builder_new ();
2348 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"interval_adjustment");
2349 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"digit_spin_adjustment");
2350 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_renumber_dialog");
2351 data->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_renumber_dialog"));
2352 gtk_window_set_transient_for (GTK_WINDOW(data->dialog), GTK_WINDOW(window));
2354 g_object_set_data_full (G_OBJECT(data->dialog),
"builder", builder,
2357 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"header_label"));
2359 string = g_strdup_printf (_(
"Renumber the immediate sub-accounts of '%s'?"),
2361 gtk_label_set_text (GTK_LABEL(widget),
string);
2365 data->prefix = GTK_WIDGET(gtk_builder_get_object (builder,
"prefix_entry"));
2366 data->interval = GTK_WIDGET(gtk_builder_get_object (builder,
"interval_spin"));
2367 data->digits = GTK_WIDGET(gtk_builder_get_object (builder,
"digit_spin"));
2368 data->example1 = GTK_WIDGET(gtk_builder_get_object (builder,
"example1_label"));
2369 data->example2 = GTK_WIDGET(gtk_builder_get_object (builder,
"example2_label"));
2372 gnc_account_renumber_update_examples (data);
2374 gtk_builder_connect_signals (builder, data);
2376 gtk_widget_show_all (data->dialog);
2380 default_color_button_cb (GtkButton *button, gpointer user_data)
2384 if (gdk_rgba_parse (&color, DEFAULT_COLOR))
2385 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(user_data), &color);
2389 update_account_color (
Account *acc,
const gchar *old_color,
const gchar *new_color, gboolean replace)
2391 PINFO(
"Account is '%s', old_color is '%s', new_color is '%s', replace is %d",
2397 if (!old_color || replace)
2400 if (g_strcmp0 (new_color, old_color) != 0)
2406 if (old_color && replace)
2412 enable_box_cb (GtkToggleButton *toggle_button, gpointer user_data)
2414 gboolean sensitive = FALSE;
2416 if (gtk_toggle_button_get_active (toggle_button))
2419 gtk_widget_set_sensitive (GTK_WIDGET(user_data), sensitive);
2423 gnc_account_cascade_properties_dialog (GtkWidget *window,
Account *account)
2426 GtkBuilder *builder;
2428 GtkWidget *color_button, *over_write, *color_button_default;
2429 GtkWidget *enable_color, *enable_placeholder, *enable_hidden;
2430 GtkWidget *color_box, *placeholder_box, *hidden_box;
2431 GtkWidget *placeholder_button, *hidden_button;
2433 gchar *string, *fullname;
2434 const char *color_string;
2435 gchar *old_color_string = NULL;
2442 builder = gtk_builder_new ();
2443 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_cascade_dialog");
2444 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_cascade_dialog"));
2445 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
2448 enable_color = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_color"));
2449 color_box = GTK_WIDGET(gtk_builder_get_object (builder,
"color_box"));
2451 label = GTK_WIDGET(gtk_builder_get_object (builder,
"color_label"));
2452 over_write = GTK_WIDGET(gtk_builder_get_object (builder,
"replace_check"));
2453 color_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_button"));
2454 color_button_default = GTK_WIDGET(gtk_builder_get_object (builder,
"color_button_default"));
2456 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(color_button), FALSE);
2458 g_signal_connect (G_OBJECT(enable_color),
"toggled",
2459 G_CALLBACK(enable_box_cb), (gpointer)color_box);
2461 g_signal_connect (G_OBJECT(color_button_default),
"clicked",
2462 G_CALLBACK(default_color_button_cb), (gpointer)color_button);
2465 string = g_strdup_printf (_(
"Set the account color for account '%s' " 2466 "including all sub-accounts to the selected color"),
2468 gtk_label_set_text (GTK_LABEL(label),
string);
2474 color_string = DEFAULT_COLOR;
2476 old_color_string = g_strdup (color_string);
2478 if (!gdk_rgba_parse (&color, color_string))
2479 gdk_rgba_parse (&color, DEFAULT_COLOR);
2482 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_button), &color);
2485 enable_placeholder = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_placeholder"));
2486 placeholder_box = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_box"));
2487 label = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_label"));
2488 placeholder_button = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_check_button"));
2489 g_signal_connect (G_OBJECT(enable_placeholder),
"toggled",
2490 G_CALLBACK(enable_box_cb), (gpointer)placeholder_box);
2492 string = g_strdup_printf (_(
"Set the account placeholder value for account '%s' " 2493 "including all sub-accounts"),
2495 gtk_label_set_text (GTK_LABEL(label),
string);
2499 enable_hidden = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_hidden"));
2500 hidden_box = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_box"));
2501 label = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_label"));
2502 hidden_button = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_check_button"));
2503 g_signal_connect (G_OBJECT(enable_hidden),
"toggled",
2504 G_CALLBACK(enable_box_cb), (gpointer)hidden_box);
2506 string = g_strdup_printf (_(
"Set the account hidden value for account '%s' " 2507 "including all sub-accounts"),
2509 gtk_label_set_text (GTK_LABEL(label),
string);
2514 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
2516 gtk_builder_connect_signals (builder, dialog);
2517 g_object_unref (G_OBJECT(builder));
2519 gtk_widget_show_all (dialog);
2521 response = gtk_dialog_run (GTK_DIALOG(dialog));
2523 if (response == GTK_RESPONSE_OK)
2527 gchar *new_color_string = NULL;
2528 gboolean color_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_color));
2529 gboolean placeholder_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_placeholder));
2530 gboolean hidden_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_hidden));
2531 gboolean replace = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(over_write));
2532 gboolean placeholder = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(placeholder_button));
2533 gboolean hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(hidden_button));
2538 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_button), &new_color);
2539 new_color_string = gdk_rgba_to_string (&new_color);
2541 if (g_strcmp0 (new_color_string, DEFAULT_COLOR) == 0)
2543 g_free (new_color_string);
2544 new_color_string = NULL;
2548 update_account_color (account, old_color_string, new_color_string, replace);
2552 if (placeholder_active)
2562 for (GList *acct = accounts; acct; acct = g_list_next(acct))
2568 update_account_color (acct->data,
string, new_color_string, replace);
2571 if (placeholder_active)
2578 g_list_free (accounts);
2579 g_free (new_color_string);
2581 if (old_color_string)
2582 g_free (old_color_string);
2584 gtk_widget_destroy (dialog);
void xaccAccountSetType(Account *acc, GNCAccountType tip)
Set the account's type.
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
gboolean xaccAccountGetAutoInterest(const Account *acc)
Get the "auto interest" flag for an account.
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3))...
Dialog box should only allow selection of a currency.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
Account * gnc_ui_new_accounts_from_name_window(GtkWindow *parent, const char *name)
Display a modal window for creating a new account.
guint32 xaccAccountTypesCompatibleWith(GNCAccountType type)
Return the bitmask of account types compatible with a given type.
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.
gboolean gnc_account_is_root(const Account *account)
This routine indicates whether the specified account is the root node of an account tree...
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
int xaccAccountGetCommoditySCUi(const Account *acc)
Return the 'internal' SCU setting.
gboolean xaccAccountGetNonStdSCU(const Account *acc)
Return boolean, indicating whether this account uses a non-standard SCU.
This file contains the functions to present a gui to the user for creating a new account or editing a...
void xaccAccountSetNotes(Account *acc, const char *str)
Set the account's notes.
GtkWindow * gnc_ui_get_main_window(GtkWidget *widget)
Get a pointer to the final GncMainWindow widget is rooted in.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
const char * xaccAccountGetCode(const Account *acc)
Get the account's accounting code.
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
void xaccAccountSetTaxRelated(Account *acc, gboolean tax_related)
DOCUMENT ME!
#define DEBUG(format, args...)
Print a debugging message.
Mutual Fund accounts will typically be shown in registers which show three columns: price...
void gnc_ui_new_account_with_types_and_commodity(GtkWindow *parent, QofBook *book, GList *valid_types, gnc_commodity *default_commodity)
Display a window for creating a new account.
void xaccAccountSetCode(Account *acc, const char *str)
Set the account's accounting code.
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
guint32 xaccAccountTypesValid(void)
Returns the bitmask of the account type enums that are valid.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
void xaccAccountSetHigherBalanceLimit(Account *acc, gnc_numeric balance)
Set the higher balance limit for the account.
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
void gnc_ui_edit_account_window(GtkWindow *parent, Account *account)
Display a window for editing the attributes of an existing account.
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
Account used to record multiple commodity transactions.
Dialog box should allow selection of anything.
gboolean xaccAccountGetLowerBalanceLimit(const Account *acc, gnc_numeric *balance)
Get the lower balance limit for the account.
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
#define PWARN(format, args...)
Log a warning.
Stock accounts will typically be shown in registers which show three columns: price, number of shares, and value.
const char * xaccAccountGetColor(const Account *acc)
Get the account's color.
#define xaccAccountGetGUID(X)
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
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 xaccAccountSetPlaceholder(Account *acc, gboolean val)
Set the "placeholder" flag for an account.
gboolean xaccAccountTypesCompatible(GNCAccountType parent_type, GNCAccountType child_type)
Return TRUE if accounts of type parent_type can have accounts of type child_type as children...
void xaccAccountClearLowerBalanceLimit(Account *acc)
Clear the lower balance limit for the account.
void xaccAccountSetColor(Account *acc, const char *str)
Set the account's Color.
void xaccAccountSetIncludeSubAccountBalances(Account *acc, gboolean inc_sub)
Set whether to include balances of sub accounts.
GtkTreeView implementation for gnucash account tree.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
GtkTreeView * gnc_tree_view_account_new_with_root(Account *root, gboolean show_root)
Create a new account tree view.
Dialog box should allow selection of anything but a currency and should include the "ALL" namespace t...
const char * xaccAccountGetDescription(const Account *acc)
Get the account's description.
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
Create a new account tree view.
GList * gnc_account_get_children_sorted(const Account *account)
This routine returns a GList of all children accounts of the specified account, ordered by xaccAccoun...
The bank account type denotes a savings or checking account held at a bank.
dialog_commodity_mode
The dialog commodity types are used to determine what commodity namespaces the currency dialog will p...
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
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 xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
void xaccAccountSetIsOpeningBalance(Account *acc, gboolean val)
Set the "opening-balance" flag for an account.
gboolean xaccAccountGetTaxRelated(const Account *acc)
DOCUMENT ME!
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gint gnc_account_n_children(const Account *account)
Return the number of children of the specified account.
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.
The currency account type indicates that the account is a currency trading account.
void xaccAccountSetCommoditySCU(Account *acc, int scu)
Set the SCU for the account.
GNCAccountType
The account types are used to determine how the transaction data in the account is displayed...
gboolean xaccAccountGetHidden(const Account *acc)
Get the "hidden" flag for an account.
GtkTreeModel implementation to display account types in a GtkTreeView.
Split * xaccMallocSplit(QofBook *book)
Constructor.
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...
void xaccAccountSetAutoInterest(Account *acc, gboolean val)
Set the "auto interest" flag for an account.
gnc_commodity * gnc_account_or_default_currency(const Account *account, gboolean *currency_from_account_found)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
gboolean xaccAccountGetIsOpeningBalance(const Account *acc)
Get the "opening-balance" flag for an account.
guint32 xaccParentAccountTypesCompatibleWith(GNCAccountType type)
Return the bitmask of parent account types compatible with a given type.
gboolean xaccAccountGetIncludeSubAccountBalances(const Account *acc)
Get whether to include balances of sub accounts.
void gnc_tree_view_account_set_selected_account(GncTreeViewAccount *view, Account *account)
This function selects an account in the account tree view.
GList * gnc_account_get_children(const Account *account)
This routine returns a GList of all children accounts of the specified account.
Account * gnc_ui_new_accounts_from_name_with_defaults(GtkWindow *parent, const char *name, GList *valid_types, const gnc_commodity *default_commodity, Account *parent_acct)
Display a modal window for creating a new account.
void xaccAccountSetHidden(Account *acc, gboolean val)
Set the "hidden" flag for an account.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gboolean xaccAccountHasAncestor(const Account *acc, const Account *ancestor)
Returns true if the account is 'ancestor' or has 'ancestor' as an ancestor.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an 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...
#define LEAVE(format, args...)
Print a function exit debugging message.
void xaccAccountSetLowerBalanceLimit(Account *acc, gnc_numeric balance)
Set the lower balance limit for the account.
gboolean xaccAccountGetHigherBalanceLimit(const Account *acc, gnc_numeric *balance)
Get the higher balance limit for the account.
Account * xaccMallocAccount(QofBook *book)
Constructor.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void xaccAccountSetDescription(Account *acc, const char *str)
Set the account's description.
void xaccAccountSetNonStdSCU(Account *acc, gboolean flag)
Set the flag indicating that this account uses a non-standard SCU.
Account * gnc_account_lookup_by_opening_balance(Account *account, gnc_commodity *commodity)
Find the opening balance account for the currency.
void xaccAccountClearHigherBalanceLimit(Account *acc)
Clear the higher balance limit for the account.
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
Equity account is used to balance the balance sheet.
const char * xaccAccountGetTypeStr(GNCAccountType type)
The xaccAccountGetTypeStr() routine returns a string suitable for use in the GUI/Interface.
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...
void xaccAccountSetName(Account *acc, const char *str)
Set the account's name.
"select" and "new" commodity windows
Commodity handling public routines.
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
const gchar * gnc_get_account_separator_string(void)
Returns the account separation character chosen by the user.
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)
Set the account's commodity.
const char * xaccAccountGetNotes(const Account *acc)
Get the account's notes.
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...