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);
512 if (!g_strcmp0 (new_string, DEFAULT_COLOR) && old_string)
516 if (g_strcmp0 (new_string, old_string) != 0)
521 commodity = (gnc_commodity *)
522 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
534 index = gtk_combo_box_get_active (GTK_COMBO_BOX(aw->account_scu));
535 nonstd = (index != 0);
539 if (old_scu != new_scu)
542 string = gtk_entry_get_text (GTK_ENTRY(aw->code_entry));
544 if (g_strcmp0 (
string, old_string) != 0)
547 gtk_text_buffer_get_start_iter (aw->notes_text_buffer, &start);
548 gtk_text_buffer_get_end_iter (aw->notes_text_buffer, &end);
549 new_string = gtk_text_buffer_get_text (aw->notes_text_buffer, &start, &end,
552 if (g_strcmp0 (new_string, old_string))
556 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->opening_balance_button));
560 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->tax_related_button));
564 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->placeholder_button));
568 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->hidden_button));
572 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->auto_interest_button));
578 if (parent_account == NULL)
579 parent_account = gnc_book_get_root_account (aw->book);
583 flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(
584 aw->include_balance_sub_accts));
588 higher_balance_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(
589 aw->higher_balance_limit_edit),
590 &balance_limit, TRUE, NULL);
592 if (higher_balance_limit_valid == 0)
594 if (aw->balance_is_reversed)
603 if (higher_balance_limit_valid == -1)
605 if (aw->balance_is_reversed)
611 lower_balance_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(
612 aw->lower_balance_limit_edit),
613 &balance_limit, TRUE, NULL);
615 if (lower_balance_limit_valid == 0)
617 if (aw->balance_is_reversed)
626 if (lower_balance_limit_valid == -1)
628 if (aw->balance_is_reversed)
634 if ((higher_balance_limit_valid == -1) && (lower_balance_limit_valid == -1))
639 balance = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit));
643 LEAVE(
"zero balance");
647 if (gnc_reverse_balance (account))
650 date = gnc_date_edit_get_date (GNC_DATE_EDIT(aw->opening_balance_date_edit));
652 use_equity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(aw->opening_equity_radio));
656 if (!gnc_account_create_opening_balance (account, balance, date, aw->book))
658 const char *message = _(
"Could not create opening balance.");
659 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
669 LEAVE(
"no transfer account");
673 gnc_account_create_transfer_balance (aw->book, account, transfer, balance, date);
681 GList *children, *iter;
684 if (children == NULL)
687 for (iter = children; iter; iter = iter->next)
689 account = iter->data;
694 aw_call_destroy_callbacks (account);
700 set_children_types (account, type);
702 g_list_free (children);
710 g_return_if_fail (aw);
712 if (aw->dialog_type == NEW_ACCOUNT)
715 account = aw_get_account (aw);
716 g_return_if_fail (account);
721 set_children_types (account, aw->type);
728 gnc_suspend_gui_refresh ();
731 make_children_compatible (aw);
732 gnc_ui_to_account (aw);
734 gnc_resume_gui_refresh ();
737 if ((aw->dialog_type == NEW_ACCOUNT) && aw->next_name && *aw->next_name)
739 gnc_commodity *commodity;
744 gtk_container_remove (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
746 gtk_container_add (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
747 gtk_widget_show (GTK_WIDGET(aw->parent_tree));
749 aw_connect_selection_changed (aw);
750 gnc_suspend_gui_refresh ();
752 parent = aw_get_account (aw);
760 gnc_account_to_ui (aw);
762 gnc_account_window_set_name (aw);
765 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
767 gnc_account_commodity_from_type (aw, FALSE);
773 gnc_resume_gui_refresh ();
779 aw->created_account = aw_get_account (aw);
784 gnc_close_gui_component (aw->component_id);
789 add_children_to_expander (GObject *
object, GParamSpec *param_spec, gpointer data)
791 GtkExpander *expander = GTK_EXPANDER(
object);
793 GtkWidget *scrolled_window;
796 if (gtk_expander_get_expanded (expander) &&
797 !gtk_bin_get_child (GTK_BIN(expander)))
801 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
802 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_window),
803 GTK_POLICY_AUTOMATIC,
804 GTK_POLICY_AUTOMATIC);
805 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window),
807 gtk_container_add (GTK_CONTAINER(scrolled_window), GTK_WIDGET(view));
809 gtk_container_add (GTK_CONTAINER(expander), scrolled_window);
810 gtk_widget_set_vexpand (GTK_WIDGET(scrolled_window), TRUE);
811 gtk_widget_show_all (scrolled_window);
822 GtkWidget *dialog, *vbox, *hbox, *label, *expander;
829 account = aw_get_account (aw);
839 dialog = gtk_dialog_new_with_buttons (
"",
840 GTK_WINDOW(aw->dialog),
841 GTK_DIALOG_DESTROY_WITH_PARENT |
843 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
844 _(
"_OK"), GTK_RESPONSE_OK,
847 gtk_window_set_skip_taskbar_hint (GTK_WINDOW(dialog), TRUE);
849 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
850 gtk_box_set_homogeneous (GTK_BOX(hbox), FALSE);
851 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
852 gtk_box_set_homogeneous (GTK_BOX(vbox), FALSE);
854 gtk_box_pack_start (GTK_BOX(hbox),
855 gtk_image_new_from_icon_name (
"dialog-information",
856 GTK_ICON_SIZE_DIALOG), FALSE, FALSE, 0);
859 label = gtk_label_new (_(
"Give the children the same type?"));
860 gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
861 gtk_label_set_selectable (GTK_LABEL(label), TRUE);
862 gnc_label_set_alignment (label, 0.0, 0.0);
865 gnc_widget_style_context_add_class (GTK_WIDGET(label),
"gnc-class-title");
867 gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
870 str = g_strdup_printf (_(
"The children of the edited account have to be " 871 "changed to type \"%s\" to make them compatible."),
873 label = gtk_label_new (str);
875 gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
876 gtk_label_set_selectable (GTK_LABEL(label), TRUE);
877 gnc_label_set_alignment (label, 0.0, 0.0);
878 gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
881 expander = gtk_expander_new_with_mnemonic (_(
"_Show children accounts"));
882 gtk_expander_set_spacing (GTK_EXPANDER(expander), 6);
883 g_signal_connect (G_OBJECT(expander),
"notify::expanded",
884 G_CALLBACK(add_children_to_expander), account);
885 gtk_box_pack_start (GTK_BOX(vbox), expander, TRUE, TRUE, 0);
887 gtk_box_pack_start (GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
889 gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(dialog))),
890 hbox, TRUE, TRUE, 0);
893 gtk_container_set_border_width (GTK_CONTAINER(dialog), 5);
894 gtk_container_set_border_width (GTK_CONTAINER(hbox), 5);
895 gtk_box_set_spacing (GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(dialog))), 14);
897 gtk_widget_show_all (hbox);
899 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK);
901 result = (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_OK);
903 gtk_widget_destroy (dialog);
909 gnc_filter_parent_accounts (
Account *account, gpointer data)
912 Account *aw_account = aw_get_account (aw);
917 if (aw_account == NULL)
923 if (account == aw_account)
935 Account *root, *account, *parent;
936 gnc_commodity * commodity;
937 gchar *fullname, *fullname_parent;
938 const gchar *name, *separator;
939 gboolean higher_limit_valid;
940 gnc_numeric higher_balance_limit;
941 gboolean lower_limit_valid;
942 gnc_numeric lower_balance_limit;
945 root = gnc_book_get_root_account (aw->book);
950 name = gtk_entry_get_text (GTK_ENTRY(aw->name_entry));
951 if (g_strcmp0 (name,
"") == 0)
953 const char *message = _(
"The account must be given a name.");
954 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
961 (GNC_TREE_VIEW_ACCOUNT(aw->parent_tree));
969 fullname = g_strconcat (fullname_parent, separator, name, NULL);
973 g_free (fullname_parent);
976 if ((account != NULL) &&
979 const char *message = _(
"There is already an account with that name.");
980 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
981 LEAVE(
"duplicate name");
986 if (!gnc_filter_parent_accounts (parent, aw))
988 const char *message = _(
"You must choose a valid parent account.");
989 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
990 LEAVE(
"invalid parent");
997 const char *message = _(
"You must select an account type.");
998 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
999 LEAVE(
"invalid type");
1006 const char *message = _(
"The selected account type is incompatible with " 1007 "the one of the selected parent.");
1008 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1009 LEAVE(
"incompatible types");
1014 commodity = (gnc_commodity *)
1015 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
1018 const char *message = _(
"You must choose a commodity.");
1019 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1020 LEAVE(
"invalid commodity");
1025 higher_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit),
1026 &higher_balance_limit, TRUE, NULL);
1028 lower_limit_valid = gnc_amount_edit_expr_is_valid (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit),
1029 &lower_balance_limit, TRUE, NULL);
1031 if ((lower_limit_valid == 0) && (higher_limit_valid == 0))
1034 lower_balance_limit);
1038 const char *message = _(
"Balance limits must be different unless they are both zero.");
1039 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1040 LEAVE(
"invalid balance limit, both the same but not zero");
1043 else if (compare == -1)
1045 const char *message = _(
"The lower balance limit must be less than the higher limit.");
1046 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1047 LEAVE(
"invalid balance limit, lower limit not less than upper");
1063 account = aw_get_account (aw);
1070 if (!gnc_common_ok (aw))
1076 if (!verify_children_compatible (aw))
1089 gnc_numeric balance;
1093 if (!gnc_common_ok (aw))
1099 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT(aw->opening_balance_edit), NULL))
1101 const char *message = _(
"You must enter a valid opening balance " 1102 "or leave it blank.");
1103 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1108 balance = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit));
1112 gboolean use_equity;
1114 use_equity = gtk_toggle_button_get_active
1115 (GTK_TOGGLE_BUTTON(aw->opening_equity_radio));
1122 aw->transfer_tree));
1125 const char *message = _(
"You must select a transfer account or choose" 1126 " the opening balances equity account.");
1127 gnc_error_dialog (GTK_WINDOW(aw->dialog),
"%s", message);
1139 gnc_account_window_response_cb (GtkDialog *dialog,
1145 ENTER(
"dialog %p, response %d, aw %p", dialog, response, aw);
1148 case GTK_RESPONSE_OK:
1149 switch (aw->dialog_type)
1152 DEBUG(
"new acct dialog, OK");
1153 gnc_new_account_ok (aw);
1156 DEBUG(
"edit acct dialog, OK");
1157 gnc_edit_account_ok (aw);
1160 g_assert_not_reached ();
1164 case GTK_RESPONSE_HELP:
1165 switch (aw->dialog_type)
1168 DEBUG(
"new acct dialog, HELP");
1172 DEBUG(
"edit acct dialog, HELP");
1176 g_assert_not_reached ();
1180 case GTK_RESPONSE_CANCEL:
1183 gnc_close_gui_component (aw->component_id);
1190 gnc_account_window_destroy_cb (GtkWidget *
object, gpointer data)
1195 ENTER(
"object %p, aw %p",
object, aw);
1196 account = aw_get_account (aw);
1198 aw_clear_selection_handler (aw);
1199 gnc_suspend_gui_refresh ();
1201 switch (aw->dialog_type)
1204 if (account != NULL)
1211 DEBUG (
"account add window destroyed\n");
1218 PERR (
"unexpected dialog type\n");
1219 gnc_resume_gui_refresh ();
1224 gnc_unregister_gui_component (aw->component_id);
1226 gnc_resume_gui_refresh ();
1228 if (aw->subaccount_names)
1230 g_strfreev (aw->subaccount_names);
1231 aw->subaccount_names = NULL;
1232 aw->next_name = NULL;
1240 gnc_account_parent_changed_cb (GObject *selection, gpointer data)
1244 guint32 types, old_types;
1245 GtkTreeModelSort *s_model;
1246 GtkTreeModel *type_model;
1247 gboolean combo_set = FALSE;
1249 g_return_if_fail (aw);
1250 g_return_if_fail (selection == aw->selection);
1253 GNC_TREE_VIEW_ACCOUNT(aw->parent_tree));
1254 if (!parent_account)
1259 types = aw->valid_types;
1263 types = aw->valid_types &
1266 s_model = GTK_TREE_MODEL_SORT(gtk_combo_box_get_model (GTK_COMBO_BOX(aw->type_combo)));
1267 type_model = gtk_tree_model_sort_get_model (s_model);
1271 if (aw->type != aw->preferred_account_type &&
1272 (types & (1 << aw->preferred_account_type)) != 0)
1275 aw->type = aw->preferred_account_type;
1278 else if ((types & (1 << aw->type)) == 0)
1286 old_types = gnc_tree_model_account_types_get_mask (type_model);
1287 if (old_types != types)
1291 gnc_tree_model_account_types_set_mask (type_model, types);
1294 gnc_tree_model_account_types_set_active_combo (GTK_COMBO_BOX(aw->type_combo),
1297 gnc_account_window_set_name (aw);
1303 Account* account = aw_get_account (aw);
1304 gboolean type_ok = account_type_has_auto_interest_xfer (aw->type);
1306 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(aw->auto_interest_button),
1307 type_ok && pref_set);
1308 gtk_widget_set_sensitive (GTK_WIDGET(aw->auto_interest_button), type_ok);
1312 gnc_account_type_combo_changed_cb (GtkComboBox *combo, gpointer data)
1318 g_return_if_fail (aw != NULL);
1322 type_id = gnc_tree_model_account_types_get_active_combo (combo);
1331 aw->preferred_account_type = type_id;
1333 gnc_account_commodity_from_type (aw, TRUE);
1342 gtk_widget_set_sensitive (aw->opening_balance_page, sensitive);
1346 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1347 gnc_numeric_zero ());
1349 set_auto_interest_box (aw);
1353 gnc_account_type_view_create (
AccountWindow *aw, guint32 compat_types)
1355 GtkTreeModel *fmodel, *smodel;
1356 GtkCellRenderer *renderer;
1358 aw->valid_types &= compat_types;
1359 if (aw->valid_types == 0)
1362 aw->valid_types = compat_types | (1 << aw->type);
1363 aw->preferred_account_type = aw->type;
1365 else if ((aw->valid_types & (1 << aw->type)) != 0)
1368 aw->preferred_account_type = aw->type;
1370 else if ((aw->valid_types & (1 << last_used_account_type)) != 0)
1373 aw->type = last_used_account_type;
1374 aw->preferred_account_type = last_used_account_type;
1380 aw->preferred_account_type = aw->type;
1382 for (i = 0; i < 32; i++)
1383 if ((aw->valid_types & (1 << i)) != 0)
1390 fmodel = gnc_tree_model_account_types_filter_using_mask (aw->valid_types);
1392 smodel = gtk_tree_model_sort_new_with_model (fmodel);
1394 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(smodel),
1395 GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME,
1396 GTK_SORT_ASCENDING);
1398 gtk_combo_box_set_model (GTK_COMBO_BOX(aw->type_combo), smodel);
1400 renderer = gtk_cell_renderer_text_new ();
1401 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(aw->type_combo), renderer, TRUE);
1402 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(aw->type_combo), renderer,
1403 "text", GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME, NULL);
1405 g_signal_connect (G_OBJECT(aw->type_combo),
"changed",
1406 G_CALLBACK(gnc_account_type_combo_changed_cb), aw);
1408 g_object_unref (G_OBJECT(fmodel));
1410 gnc_tree_model_account_types_set_active_combo (GTK_COMBO_BOX(aw->type_combo),
1415 gnc_account_name_insert_text_cb (GtkWidget *entry,
1421 GtkEditable *editable = GTK_EDITABLE(entry);
1422 const gchar *separator = NULL;
1426 strsplit = g_strsplit (text, separator, 0);
1427 if (strsplit[1] != NULL)
1429 gchar *result = g_strjoinv (NULL, strsplit);
1430 g_signal_handlers_block_by_func (G_OBJECT(editable),
1431 G_CALLBACK(gnc_account_name_insert_text_cb),
1433 gtk_editable_insert_text (editable, result, g_utf8_strlen (result, -1), position);
1434 g_signal_handlers_unblock_by_func (G_OBJECT(editable),
1435 G_CALLBACK(gnc_account_name_insert_text_cb),
1437 g_signal_stop_emission_by_name (G_OBJECT(editable),
"insert_text");
1441 g_strfreev (strsplit);
1445 gnc_account_name_changed_cb (GtkWidget *widget, gpointer data)
1449 gnc_account_window_set_name (aw);
1453 gnc_account_color_default_cb (GtkWidget *widget, gpointer data)
1458 gdk_rgba_parse (&color, DEFAULT_COLOR);
1459 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(aw->color_entry_button), &color);
1467 gnc_commodity *currency;
1468 GtkTreeSelection *selection;
1469 Account *account = aw_get_account (aw);
1471 currency = (gnc_commodity *) gnc_general_select_get_selected (gsl);
1478 if (ob_account != account)
1480 gchar *dialog_msg = _(
"An account with opening balance already exists for the desired currency.");
1481 gchar *dialog_title = _(
"Cannot change currency");
1486 "%s", dialog_title);
1487 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
1489 gtk_dialog_run (GTK_DIALOG(dialog));
1490 gtk_widget_destroy (dialog);
1491 g_signal_handlers_block_by_func (gsl, commodity_changed_cb, data);
1493 g_signal_handlers_unblock_by_func (gsl, commodity_changed_cb, data);
1498 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1500 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT(aw->opening_balance_edit),
1501 gnc_commodity_print_info (currency, FALSE));
1503 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(aw->transfer_tree));
1504 gtk_tree_selection_unselect_all (selection);
1505 gnc_account_opening_balance_button_update (aw, currency);
1509 account_commodity_filter (GtkTreeSelection *selection,
1510 GtkTreeModel *unused_model,
1511 GtkTreePath *s_path,
1512 gboolean path_currently_selected,
1515 gnc_commodity *commodity;
1519 g_return_val_if_fail (GTK_IS_TREE_SELECTION(selection), FALSE);
1523 if (path_currently_selected)
1535 commodity = (gnc_commodity *)
1536 gnc_general_select_get_selected (GNC_GENERAL_SELECT(aw->commodity_edit));
1542 opening_equity_cb (GtkWidget *w, gpointer data)
1545 gboolean use_equity;
1547 use_equity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w));
1549 gtk_widget_set_sensitive (aw->transfer_account_scroll, !use_equity);
1561 gnc_account_window_create (GtkWindow *parent,
AccountWindow *aw)
1564 GtkWidget *date_edit;
1568 GtkBuilder *builder;
1569 GtkTreeSelection *selection;
1570 const gchar *tt = _(
"This Account contains Transactions.\nChanging this option is not possible.");
1573 ENTER(
"aw %p, modal %d", aw, aw->modal);
1574 builder = gtk_builder_new ();
1575 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"fraction_liststore");
1576 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_dialog");
1578 aw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_dialog"));
1579 awo = G_OBJECT(aw->dialog);
1582 gtk_window_set_transient_for (GTK_WINDOW(aw->dialog), parent);
1585 gtk_widget_set_name (GTK_WIDGET(aw->dialog),
"gnc-id-account");
1586 gnc_widget_style_context_add_class (GTK_WIDGET(aw->dialog),
"gnc-class-account");
1589 g_object_set_data (awo,
"dialog_info", aw);
1592 g_signal_connect (awo,
"response",
1593 G_CALLBACK(gnc_account_window_response_cb), aw);
1595 gtk_window_set_modal (GTK_WINDOW(aw->dialog), TRUE);
1597 aw->notebook = GTK_WIDGET(gtk_builder_get_object (builder,
"account_notebook"));
1598 aw->name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
1599 aw->description_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"description_entry"));
1600 aw->color_entry_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_entry_button"));
1601 aw->color_default_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_default_button"));
1602 aw->code_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"code_entry"));
1603 aw->notes_text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(GTK_WIDGET(
1604 gtk_builder_get_object (builder,
1607 box = GTK_WIDGET(gtk_builder_get_object (builder,
"commodity_hbox"));
1608 aw->commodity_edit = gnc_general_select_new (GNC_GENERAL_SELECT_TYPE_SELECT,
1609 gnc_commodity_edit_get_string,
1610 gnc_commodity_edit_new_select,
1611 &aw->commodity_mode);
1613 gtk_box_pack_start (GTK_BOX(box), aw->commodity_edit, TRUE, TRUE, 0);
1614 gtk_widget_show (aw->commodity_edit);
1616 if (xaccAccountGetSplitsSize (aw_get_account (aw)) != 0)
1618 gtk_widget_set_tooltip_text (aw->commodity_edit, tt);
1619 gtk_widget_set_sensitive (aw->commodity_edit, FALSE);
1622 label = GTK_WIDGET(gtk_builder_get_object (builder,
"security_label"));
1623 gnc_general_select_make_mnemonic_target (GNC_GENERAL_SELECT(aw->commodity_edit), label);
1625 g_signal_connect (G_OBJECT(aw->commodity_edit),
"changed",
1626 G_CALLBACK(commodity_changed_cb), aw);
1628 aw->account_scu = GTK_WIDGET(gtk_builder_get_object (builder,
"account_scu"));
1630 aw->parent_scroll = GTK_WIDGET(gtk_builder_get_object (builder,
"parent_scroll"));
1633 gtk_container_add (GTK_CONTAINER(aw->parent_scroll), GTK_WIDGET(aw->parent_tree));
1634 gtk_widget_show (GTK_WIDGET(aw->parent_tree));
1635 aw_connect_selection_changed (aw);
1637 aw->balance_grid = GTK_WIDGET(gtk_builder_get_object (builder,
"balance_grid"));
1639 box = GTK_WIDGET(gtk_builder_get_object (builder,
"higher_balance_limit_hbox"));
1640 aw->higher_balance_limit_edit = gnc_amount_edit_new ();
1641 gtk_box_pack_start (GTK_BOX(box), aw->higher_balance_limit_edit, TRUE, TRUE, 0);
1642 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1643 gnc_amount_edit_set_validate_on_change (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1644 gnc_amount_edit_show_warning_symbol (GNC_AMOUNT_EDIT(aw->higher_balance_limit_edit), TRUE);
1645 gtk_widget_show (aw->higher_balance_limit_edit);
1647 box = GTK_WIDGET(gtk_builder_get_object (builder,
"lower_balance_limit_hbox"));
1648 aw->lower_balance_limit_edit = gnc_amount_edit_new ();
1649 gtk_box_pack_start (GTK_BOX(box), aw->lower_balance_limit_edit, TRUE, TRUE, 0);
1650 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1651 gnc_amount_edit_set_validate_on_change (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1652 gnc_amount_edit_show_warning_symbol (GNC_AMOUNT_EDIT(aw->lower_balance_limit_edit), TRUE);
1653 gtk_widget_show (aw->lower_balance_limit_edit);
1655 aw->include_balance_sub_accts = GTK_WIDGET(gtk_builder_get_object (builder,
"include_sub_accts_tb"));
1657 aw->more_properties_page =
1658 gtk_notebook_get_nth_page (GTK_NOTEBOOK(aw->notebook), 1);
1660 aw->opening_balance_button = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_button"));
1661 aw->tax_related_button = GTK_WIDGET(gtk_builder_get_object (builder,
"tax_related_button"));
1662 aw->placeholder_button = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_button"));
1663 aw->hidden_button = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_button"));
1664 aw->auto_interest_button = GTK_WIDGET(gtk_builder_get_object (builder,
"auto_interest_button"));
1665 set_auto_interest_box (aw);
1668 box = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_box"));
1669 amount = gnc_amount_edit_new ();
1670 aw->opening_balance_edit = amount;
1671 gtk_box_pack_start (GTK_BOX(box), amount, TRUE, TRUE, 0);
1672 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT(amount), TRUE);
1673 gtk_widget_show (amount);
1675 label = GTK_WIDGET(gtk_builder_get_object (builder,
"balance_label"));
1676 gnc_amount_edit_make_mnemonic_target (GNC_AMOUNT_EDIT(amount), label);
1678 box = GTK_WIDGET(gtk_builder_get_object (builder,
"opening_balance_date_box"));
1679 label = GTK_WIDGET(gtk_builder_get_object (builder,
"date_label"));
1680 date_edit = gnc_date_edit_new (
gnc_time (NULL), 0, 0);
1681 gnc_date_make_mnemonic_target (GNC_DATE_EDIT(date_edit), label);
1682 aw->opening_balance_date_edit = date_edit;
1683 gtk_box_pack_start (GTK_BOX(box), date_edit, TRUE, TRUE, 0);
1684 gtk_widget_show (date_edit);
1686 aw->opening_balance_page =
1687 gtk_notebook_get_nth_page (GTK_NOTEBOOK(aw->notebook), 2);
1689 aw->opening_equity_radio = GTK_WIDGET(gtk_builder_get_object (builder,
1690 "opening_equity_radio"));
1692 box = GTK_WIDGET(gtk_builder_get_object (builder,
"transfer_account_scroll"));
1693 aw->transfer_account_scroll = box;
1696 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(aw->transfer_tree));
1697 gtk_tree_selection_set_select_function (selection, account_commodity_filter, aw, NULL);
1699 gtk_container_add (GTK_CONTAINER(box), GTK_WIDGET(aw->transfer_tree));
1700 gtk_widget_show (GTK_WIDGET(aw->transfer_tree));
1702 label = GTK_WIDGET(gtk_builder_get_object (builder,
"parent_label"));
1703 gtk_label_set_mnemonic_widget (GTK_LABEL(label), GTK_WIDGET(aw->parent_tree));
1706 aw->type_combo = GTK_WIDGET(gtk_builder_get_object (builder,
"account_type_combo"));
1716 if (xaccAccountGetSplitsSize (aw_get_account (aw)) != 0)
1723 gnc_account_type_view_create (aw, compat_types);
1725 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(aw->dialog), parent);
1727 gtk_widget_grab_focus (GTK_WIDGET(aw->name_entry));
1729 gtk_builder_connect_signals (builder, aw);
1730 g_object_unref (G_OBJECT(builder));
1742 name = gtk_entry_get_text (GTK_ENTRY(aw->name_entry));
1743 if (!name || *name ==
'\0')
1744 name = _(
"<No name>");
1753 fullname = g_strconcat (parent_name, separator, name, NULL);
1754 g_free (parent_name);
1757 fullname = g_strdup (name);
1768 if (!aw || !aw->parent_tree)
1771 fullname = get_ui_fullname (aw);
1773 if (aw->dialog_type == EDIT_ACCOUNT)
1774 title = g_strconcat(_(
"Edit Account"),
" - ", fullname, NULL);
1775 else if (aw->next_name && (g_strv_length (aw->next_name) > 0))
1777 const char *format = _(
"(%d) New Accounts");
1778 char *prefix = g_strdup_printf (format,
1779 g_strv_length (aw->next_name) + 1);
1781 title = g_strconcat (prefix,
" - ", fullname,
" …", NULL);
1785 title = g_strconcat (_(
"New Account"),
" - ", fullname, NULL);
1787 gtk_window_set_title (GTK_WINDOW(aw->dialog), title);
1794 close_handler (gpointer user_data)
1798 ENTER(
"aw %p, modal %d", aw, aw->modal);
1799 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(aw->dialog));
1801 gtk_widget_destroy (GTK_WIDGET(aw->dialog));
1820 gnc_account_window_set_name (aw);
1824 refresh_handler (GHashTable *changes, gpointer user_data)
1829 account = aw_get_account (aw);
1832 gnc_close_gui_component (aw->component_id);
1838 const EventInfo *info = gnc_gui_get_entity_events (changes, &aw->account);
1839 if (info && (info->event_mask & QOF_EVENT_DESTROY))
1841 gnc_close_gui_component (aw->component_id);
1845 gnc_ui_refresh_account_window (aw);
1849 gnc_ui_new_account_window_internal (GtkWindow *parent,
1852 gchar **subaccount_names,
1854 const gnc_commodity * default_commodity,
1857 const gnc_commodity *commodity, *parent_commodity;
1862 g_return_val_if_fail(book, NULL);
1868 aw->dialog_type = NEW_ACCOUNT;
1870 aw->valid_types = 0;
1871 for (list = valid_types; list; list = list->next)
1872 aw->valid_types |= (1 << GPOINTER_TO_INT (list->data));
1884 aw->type = last_used_account_type;
1888 gnc_suspend_gui_refresh ();
1890 if (subaccount_names && *subaccount_names)
1893 aw->subaccount_names = subaccount_names;
1894 aw->next_name = subaccount_names + 1;
1897 gnc_account_window_create (parent, aw);
1898 gnc_account_to_ui (aw);
1900 gnc_resume_gui_refresh ();
1902 if (default_commodity != NULL)
1904 commodity = default_commodity;
1907 gtk_entry_set_text (GTK_ENTRY(aw->name_entry),
1909 gtk_entry_set_text (GTK_ENTRY(aw->description_entry),
1915 commodity = parent_commodity;
1921 gnc_general_select_set_selected (GNC_GENERAL_SELECT(aw->commodity_edit),
1922 (gpointer) commodity);
1923 gnc_account_commodity_from_type (aw, FALSE);
1925 if (base_account == NULL)
1927 base_account = gnc_book_get_root_account (book);
1930 gtk_tree_view_collapse_all (aw->parent_tree);
1935 gtk_widget_show (aw->dialog);
1937 gnc_window_adjust_for_screen (GTK_WINDOW(aw->dialog));
1939 gnc_account_window_set_name (aw);
1941 aw->component_id = gnc_register_gui_component (DIALOG_NEW_ACCOUNT_CM_CLASS,
1943 modal ? NULL : close_handler,
1946 gnc_gui_component_set_session (aw->component_id, gnc_get_current_session());
1947 gnc_gui_component_watch_entity_type (aw->component_id,
1949 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
1954 gnc_split_account_name (QofBook *book,
const char *in_name,
Account **base_account)
1957 gchar **names, **ptr, **out_names;
1960 root = gnc_book_get_root_account (book);
1964 for (ptr = names; *ptr; ptr++)
1971 for (node = list; node; node = g_list_next (node))
1973 account = node->data;
1978 *base_account = account;
1991 out_names = g_strdupv (ptr);
2013 const gnc_commodity * default_commodity,
2019 Account *created_account = NULL;
2020 gchar ** subaccount_names;
2022 gboolean done = FALSE;
2024 ENTER(
"name %s, valid %p, commodity %p, account %p",
2025 name, valid_types, default_commodity, parent_acct);
2026 book = gnc_get_current_book ();
2027 if (!name || *name ==
'\0')
2029 subaccount_names = NULL;
2030 base_account = NULL;
2033 subaccount_names = gnc_split_account_name (book, name, &base_account);
2035 if (parent_acct != NULL)
2037 base_account = parent_acct;
2039 aw = gnc_ui_new_account_window_internal (parent, book, base_account,
2047 response = gtk_dialog_run (GTK_DIALOG(aw->dialog));
2050 gnc_account_window_response_cb (GTK_DIALOG(aw->dialog), response, (gpointer)aw);
2054 case GTK_RESPONSE_OK:
2055 created_account = aw->created_account;
2056 done = (created_account != NULL);
2059 case GTK_RESPONSE_HELP:
2071 return created_account;
2079 find_by_account (gpointer
find_data, gpointer user_data)
2102 if (account == NULL)
2105 aw = gnc_find_first_gui_component (DIALOG_EDIT_ACCOUNT_CM_CLASS,
2106 find_by_account, account);
2109 gtk_window_present (GTK_WINDOW(aw->dialog));
2115 aw->book = gnc_account_get_book (account);
2117 aw->dialog_type = EDIT_ACCOUNT;
2119 aw->subaccount_names = NULL;
2122 gnc_suspend_gui_refresh ();
2124 gnc_account_window_create (parent, aw);
2125 gnc_account_to_ui (aw);
2127 gnc_resume_gui_refresh ();
2129 gtk_widget_show_all (aw->dialog);
2130 if (xaccAccountGetSplitsSize (account) != 0)
2131 gtk_widget_hide (aw->opening_balance_page);
2134 if (parent_acct == NULL)
2135 parent_acct = account;
2137 gtk_tree_view_collapse_all (aw->parent_tree);
2142 gnc_account_window_set_name (aw);
2144 gnc_window_adjust_for_screen (GTK_WINDOW(aw->dialog));
2146 aw->component_id = gnc_register_gui_component (DIALOG_EDIT_ACCOUNT_CM_CLASS,
2150 gnc_gui_component_set_session (aw->component_id, gnc_get_current_session ());
2151 gnc_gui_component_watch_entity_type (aw->component_id,
2153 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
2155 gtk_window_present (GTK_WINDOW(aw->dialog));
2160 gnc_commodity *default_commodity)
2162 gnc_ui_new_account_window_internal (parent, book, NULL, NULL,
2163 valid_types, default_commodity, FALSE);
2176 g_return_if_fail(book != NULL);
2177 if (parent_acct && book)
2178 g_return_if_fail(gnc_account_get_book (parent_acct) == book);
2180 gnc_ui_new_account_window_internal (parent, book, parent_acct, NULL, NULL,
2195 gnc_ui_register_account_destroy_callback (
void (*cb)(
Account *))
2200 if (g_list_index (ac_destroy_cb_list, cb) == -1)
2201 ac_destroy_cb_list = g_list_append (ac_destroy_cb_list, cb);
2214 unsigned int num_digits = 1;
2216 g_return_if_fail (data->num_children > 0);
2218 const gchar *prefix = gtk_entry_get_text (GTK_ENTRY(data->prefix));
2219 interval = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->interval));
2220 digits = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->digits));
2225 num_digits = (
unsigned int)log10((
double)(data->num_children * interval)) + 1;
2227 if (digits <= num_digits)
2229 g_signal_handlers_block_by_func (GTK_SPIN_BUTTON(data->digits),
2230 (gpointer)gnc_account_renumber_digits_changed_cb,
2232 gtk_spin_button_set_value (GTK_SPIN_BUTTON(data->digits), num_digits);
2233 g_signal_handlers_unblock_by_func (GTK_SPIN_BUTTON(data->digits),
2234 (gpointer)gnc_account_renumber_digits_changed_cb,
2238 num_digits = digits;
2240 if (prefix && *prefix)
2241 str = g_strdup_printf (
"%s-%0*d", prefix, num_digits, interval);
2243 str = g_strdup_printf (
"%0*d", num_digits, interval);
2245 gtk_label_set_text (GTK_LABEL(data->example1), str);
2248 if (prefix && *prefix)
2249 str = g_strdup_printf (
"%s-%0*d", prefix, num_digits,
2250 interval * data->num_children);
2252 str = g_strdup_printf (
"%0*d", num_digits,
2253 interval * data->num_children);
2255 gtk_label_set_text (GTK_LABEL(data->example2), str);
2261 gnc_account_renumber_prefix_changed_cb (GtkEditable *editable,
2264 gnc_account_renumber_update_examples (data);
2268 gnc_account_renumber_interval_changed_cb (GtkSpinButton *spinbutton,
2271 gnc_account_renumber_update_examples (data);
2275 gnc_account_renumber_digits_changed_cb (GtkSpinButton *spinbutton,
2278 gnc_account_renumber_update_examples (data);
2282 gnc_account_renumber_response_cb (GtkDialog *dialog,
2286 if (response == GTK_RESPONSE_OK)
2291 unsigned int num_digits, i;
2293 gtk_widget_hide (data->dialog);
2295 if (children == NULL)
2297 PWARN(
"Can't renumber children of an account with no children!");
2301 const gchar *prefix = gtk_entry_get_text (GTK_ENTRY(data->prefix));
2302 interval = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->interval));
2303 num_digits = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(data->digits));
2305 gnc_set_busy_cursor (NULL, TRUE);
2306 for (tmp = children, i = 1; tmp; tmp = g_list_next (tmp), i += 1)
2309 if (prefix && *prefix)
2310 str = g_strdup_printf (
"%s-%0*d", prefix,
2311 num_digits, interval * i);
2313 str = g_strdup_printf (
"%0*d", num_digits, interval * i);
2318 gnc_unset_busy_cursor (NULL);
2319 g_list_free (children);
2321 gtk_widget_destroy (data->dialog);
2326 gnc_account_renumber_create_dialog (GtkWidget *window,
Account *account)
2329 GtkBuilder *builder;
2331 gchar *string, *fullname;
2339 data->parent = account;
2342 builder = gtk_builder_new ();
2343 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"interval_adjustment");
2344 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"digit_spin_adjustment");
2345 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_renumber_dialog");
2346 data->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_renumber_dialog"));
2347 gtk_window_set_transient_for (GTK_WINDOW(data->dialog), GTK_WINDOW(window));
2349 g_object_set_data_full (G_OBJECT(data->dialog),
"builder", builder,
2352 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"header_label"));
2354 string = g_strdup_printf (_(
"Renumber the immediate sub-accounts of '%s'?"),
2356 gtk_label_set_text (GTK_LABEL(widget),
string);
2360 data->prefix = GTK_WIDGET(gtk_builder_get_object (builder,
"prefix_entry"));
2361 data->interval = GTK_WIDGET(gtk_builder_get_object (builder,
"interval_spin"));
2362 data->digits = GTK_WIDGET(gtk_builder_get_object (builder,
"digit_spin"));
2363 data->example1 = GTK_WIDGET(gtk_builder_get_object (builder,
"example1_label"));
2364 data->example2 = GTK_WIDGET(gtk_builder_get_object (builder,
"example2_label"));
2367 gnc_account_renumber_update_examples (data);
2369 gtk_builder_connect_signals (builder, data);
2371 gtk_widget_show_all (data->dialog);
2375 default_color_button_cb (GtkButton *button, gpointer user_data)
2379 if (gdk_rgba_parse (&color, DEFAULT_COLOR))
2380 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(user_data), &color);
2384 update_account_color (
Account *acc,
const gchar *old_color,
const gchar *new_color, gboolean replace)
2386 PINFO(
"Account is '%s', old_color is '%s', new_color is '%s', replace is %d",
2392 if (!old_color || replace)
2395 if (g_strcmp0 (new_color, old_color) != 0)
2401 if (old_color && replace)
2407 enable_box_cb (GtkToggleButton *toggle_button, gpointer user_data)
2409 gboolean sensitive = FALSE;
2411 if (gtk_toggle_button_get_active (toggle_button))
2414 gtk_widget_set_sensitive (GTK_WIDGET(user_data), sensitive);
2418 gnc_account_cascade_properties_dialog (GtkWidget *window,
Account *account)
2421 GtkBuilder *builder;
2423 GtkWidget *color_button, *over_write, *color_button_default;
2424 GtkWidget *enable_color, *enable_placeholder, *enable_hidden;
2425 GtkWidget *color_box, *placeholder_box, *hidden_box;
2426 GtkWidget *placeholder_button, *hidden_button;
2428 gchar *string, *fullname;
2429 const char *color_string;
2430 gchar *old_color_string = NULL;
2437 builder = gtk_builder_new ();
2438 gnc_builder_add_from_file (builder,
"dialog-account.glade",
"account_cascade_dialog");
2439 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"account_cascade_dialog"));
2440 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
2443 enable_color = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_color"));
2444 color_box = GTK_WIDGET(gtk_builder_get_object (builder,
"color_box"));
2446 label = GTK_WIDGET(gtk_builder_get_object (builder,
"color_label"));
2447 over_write = GTK_WIDGET(gtk_builder_get_object (builder,
"replace_check"));
2448 color_button = GTK_WIDGET(gtk_builder_get_object (builder,
"color_button"));
2449 color_button_default = GTK_WIDGET(gtk_builder_get_object (builder,
"color_button_default"));
2451 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(color_button), FALSE);
2453 g_signal_connect (G_OBJECT(enable_color),
"toggled",
2454 G_CALLBACK(enable_box_cb), (gpointer)color_box);
2456 g_signal_connect (G_OBJECT(color_button_default),
"clicked",
2457 G_CALLBACK(default_color_button_cb), (gpointer)color_button);
2460 string = g_strdup_printf (_(
"Set the account color for account '%s' " 2461 "including all sub-accounts to the selected color"),
2463 gtk_label_set_text (GTK_LABEL(label),
string);
2469 color_string = DEFAULT_COLOR;
2471 old_color_string = g_strdup (color_string);
2473 if (!gdk_rgba_parse (&color, color_string))
2474 gdk_rgba_parse (&color, DEFAULT_COLOR);
2477 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_button), &color);
2480 enable_placeholder = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_placeholder"));
2481 placeholder_box = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_box"));
2482 label = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_label"));
2483 placeholder_button = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_check_button"));
2484 g_signal_connect (G_OBJECT(enable_placeholder),
"toggled",
2485 G_CALLBACK(enable_box_cb), (gpointer)placeholder_box);
2487 string = g_strdup_printf (_(
"Set the account placeholder value for account '%s' " 2488 "including all sub-accounts"),
2490 gtk_label_set_text (GTK_LABEL(label),
string);
2494 enable_hidden = GTK_WIDGET(gtk_builder_get_object (builder,
"enable_cascade_hidden"));
2495 hidden_box = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_box"));
2496 label = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_label"));
2497 hidden_button = GTK_WIDGET(gtk_builder_get_object (builder,
"hidden_check_button"));
2498 g_signal_connect (G_OBJECT(enable_hidden),
"toggled",
2499 G_CALLBACK(enable_box_cb), (gpointer)hidden_box);
2501 string = g_strdup_printf (_(
"Set the account hidden value for account '%s' " 2502 "including all sub-accounts"),
2504 gtk_label_set_text (GTK_LABEL(label),
string);
2509 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
2511 gtk_builder_connect_signals (builder, dialog);
2512 g_object_unref (G_OBJECT(builder));
2514 gtk_widget_show_all (dialog);
2516 response = gtk_dialog_run (GTK_DIALOG(dialog));
2518 if (response == GTK_RESPONSE_OK)
2522 gchar *new_color_string = NULL;
2523 gboolean color_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_color));
2524 gboolean placeholder_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_placeholder));
2525 gboolean hidden_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(enable_hidden));
2526 gboolean replace = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(over_write));
2527 gboolean placeholder = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(placeholder_button));
2528 gboolean hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(hidden_button));
2533 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_button), &new_color);
2534 new_color_string = gdk_rgba_to_string (&new_color);
2536 if (g_strcmp0 (new_color_string, DEFAULT_COLOR) == 0)
2538 g_free (new_color_string);
2539 new_color_string = NULL;
2543 update_account_color (account, old_color_string, new_color_string, replace);
2547 if (placeholder_active)
2557 for (GList *acct = accounts; acct; acct = g_list_next(acct))
2563 update_account_color (acct->data,
string, new_color_string, replace);
2566 if (placeholder_active)
2573 g_list_free (accounts);
2574 g_free (new_color_string);
2576 if (old_color_string)
2577 g_free (old_color_string);
2579 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...