66 #include <glib/gi18n.h>
68 #include "dialog-utils.h"
70 #include "gnc-date-edit.h"
78 #include "gnc-component-manager.h"
81 #define DIALOG_PREFERENCES_CM_CLASS "dialog-newpreferences"
82 #define GNC_PREFS_GROUP "dialogs.preferences"
83 #define PREF_PREFIX_LEN sizeof("pref/") - 1
84 #define PREFS_WIDGET_HASH "prefs_widget_hash"
85 #define NOTEBOOK "notebook"
92 gboolean gnc_account_separator_validate_cb (GtkEntry *entry, GdkEvent *event, GtkWidget *dialog);
118 static gchar *gnc_account_separator_is_valid (
const gchar *separator,
119 gchar **normalized_separator)
121 QofBook *book = gnc_get_current_book();
122 GList *conflict_accts = NULL;
123 gchar *message = NULL;
125 *normalized_separator = gnc_normalize_account_separator (separator);
131 g_list_free (conflict_accts);
149 GtkWidget *label, *image;
153 gchar *conflict_msg = gnc_account_separator_is_valid (gtk_entry_get_text (entry), &separator);
155 label = g_object_get_data(G_OBJECT(dialog),
"sample_account");
156 DEBUG(
"Sample Account pointer is %p", label );
163 sample = g_strdup_printf(_(
"Income%sSalary%sTaxable"),
164 separator, separator);
165 PINFO(
" Label set to '%s'", sample);
166 gtk_label_set_text(GTK_LABEL(label), sample);
170 image = g_object_get_data(G_OBJECT(dialog),
"separator_error");
171 DEBUG(
"Separator Error Image pointer is %p", image );
175 gtk_widget_set_tooltip_text(GTK_WIDGET(image), conflict_msg);
176 gtk_widget_show (GTK_WIDGET(image));
177 g_free ( conflict_msg );
180 gtk_widget_hide (GTK_WIDGET(image));
187 gnc_account_separator_validate_cb (GtkEntry *entry, GdkEvent *event, GtkWidget *dialog)
190 gchar *conflict_msg = gnc_account_separator_is_valid (gtk_entry_get_text (entry), &separator);
196 gnc_warning_dialog(dialog,
"%s", conflict_msg);
197 g_free ( conflict_msg );
216 gnc_prefs_compare_addins (
addition *a,
243 gnc_preferences_add_page_internal (
const gchar *filename,
244 const gchar *widgetname,
245 const gchar *tabname,
249 gboolean error = FALSE;
252 ENTER(
"file %s, widget %s, tab %s full page %d",
253 filename, widgetname, tabname, full_page);
255 add_in = g_malloc(
sizeof(
addition));
258 g_critical(
"Unable to allocate memory.\n");
263 add_in->
filename = g_strdup(filename);
265 add_in->
tabname = g_strdup(tabname);
269 g_critical(
"Unable to allocate memory.\n");
278 ptr = g_slist_find_custom(
add_ins, add_in, (GCompareFunc)gnc_prefs_compare_addins);
282 preexisting = ptr->data;
286 g_warning(
"New tab %s(%s/%s/%s) conflicts with existing tab %s(%s/%s/full)",
294 g_warning(
"New tab %s(%s/%s/%s) conflicts with existing tab %s(%s/%s/partial)",
327 const gchar *widgetname,
328 const gchar *tabname)
330 gnc_preferences_add_page_internal(filename, widgetname, tabname, TRUE);
342 const gchar *widgetname,
343 const gchar *tabname)
345 gnc_preferences_add_page_internal(filename, widgetname, tabname, FALSE);
365 gnc_prefs_build_widget_table (GtkBuilder *builder,
368 GHashTable *prefs_table;
369 GSList *interesting, *runner;
374 prefs_table = g_object_get_data(G_OBJECT(dialog), PREFS_WIDGET_HASH);
376 interesting = gtk_builder_get_objects(builder);
378 for (runner = interesting; runner; runner = g_slist_next(runner))
380 widget = runner->data;
381 if (GTK_IS_WIDGET(widget))
383 wname = gtk_widget_get_name(widget);
384 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
385 DEBUG(
"Widget type is %s and buildable get name is %s", wname, name);
386 if (g_str_has_prefix (name,
"pref"))
387 g_hash_table_insert(prefs_table, (gchar *)name, widget);
390 g_slist_free(interesting);
413 gnc_prefs_find_page (GtkNotebook *notebook,
const gchar *name)
417 const gchar *child_name;
419 g_return_val_if_fail (GTK_IS_NOTEBOOK (notebook), NULL);
420 g_return_val_if_fail (name, NULL);
424 n_pages = gtk_notebook_get_n_pages (notebook);
426 for (i = 0; i < n_pages; i++)
428 child = gtk_notebook_get_nth_page (notebook, i);
429 g_return_val_if_fail (child, NULL);
431 child_name = gtk_notebook_get_tab_label_text (notebook, child);
432 g_return_val_if_fail (child_name, NULL);
434 if (g_utf8_collate (name, child_name) == 0)
436 LEAVE(
"found at index: %d", i);
459 gnc_prefs_move_table_entry (GtkWidget *child,
463 GtkAttachOptions x_opts, y_opts;
464 gint bottom, top, left, right, x_pad, y_pad;
466 ENTER(
"child %p, copy data %p", child, data);
467 gtk_container_child_get(GTK_CONTAINER(copydata->
table_from), child,
468 "bottom-attach", &bottom,
469 "left-attach", &left,
470 "right-attach", &right,
472 "x-options", &x_opts,
474 "y-options", &y_opts,
479 gtk_container_remove(GTK_CONTAINER(copydata->
table_from), child);
480 gtk_table_attach(copydata->
table_to, child, left, right,
482 x_opts, y_opts, x_pad, y_pad);
483 g_object_unref(child);
500 gnc_preferences_build_page (gpointer data,
504 GtkWidget *dialog, *existing_content, *new_content, *label;
505 GtkNotebook *notebook;
512 ENTER(
"add_in %p, dialog %p", data, user_data);
517 builder = gtk_builder_new();
520 widgetname = g_strsplit(add_in->
widgetname,
",", -1);
522 for (i = 0; widgetname[i]; i++)
524 DEBUG(
"Opening %s to get content %s", add_in->
filename, widgetname[i]);
525 gnc_builder_add_from_file (builder, add_in->
filename, widgetname[i]);
528 DEBUG(
"Widget Content is %s", widgetname[i - 1]);
529 new_content = GTK_WIDGET(gtk_builder_get_object (builder, widgetname[i - 1]));
531 g_strfreev(widgetname);
535 gnc_prefs_build_widget_table(builder, dialog);
540 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, dialog);
543 notebook = g_object_get_data(G_OBJECT(dialog), NOTEBOOK);
547 label = gtk_label_new(add_in->
tabname);
548 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
549 gtk_notebook_append_page(notebook, new_content, label);
550 g_object_unref(G_OBJECT(builder));
551 LEAVE(
"appended page");
556 if (!GTK_IS_TABLE(new_content))
558 g_critical(
"The object name %s in file %s is not a GtkTable. It cannot "
559 "be added to the preferences dialog.",
561 g_object_unref(G_OBJECT(builder));
565 g_object_get(G_OBJECT(new_content),
"n-columns", &cols, NULL);
568 g_critical(
"The table %s in file %s does not have four columns. It cannot "
569 "be added to the preferences dialog.",
571 g_object_unref(G_OBJECT(builder));
577 existing_content = gnc_prefs_find_page(notebook, add_in->
tabname);
579 if (!existing_content)
583 existing_content = gtk_table_new(0, 4, FALSE);
584 gtk_container_set_border_width(GTK_CONTAINER(existing_content), 6);
585 label = gtk_label_new(add_in->
tabname);
586 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
587 gtk_notebook_append_page(notebook, existing_content, label);
588 gtk_widget_show_all(existing_content);
589 DEBUG(
"created new page %s, appended it", add_in->
tabname);
593 g_object_get(G_OBJECT(existing_content),
"n-rows", &rows, NULL);
598 DEBUG(
"rows is %d", rows);
601 label = gtk_label_new(
"");
602 gtk_widget_show(label);
603 gtk_table_attach(GTK_TABLE(existing_content), label, 0, 1, rows, rows + 1,
604 GTK_FILL, GTK_FILL, 0, 0);
610 copydata.
table_to = GTK_TABLE(existing_content);
612 gtk_container_foreach(GTK_CONTAINER(new_content), gnc_prefs_move_table_entry,
615 g_object_ref_sink(new_content);
616 g_object_unref(G_OBJECT(builder));
618 LEAVE(
"added content to page");
623 tab_cmp (GtkWidget *page_a, GtkWidget *page_b, GtkNotebook *notebook)
625 return g_utf8_collate (gtk_notebook_get_tab_label_text (notebook, page_a),
626 gtk_notebook_get_tab_label_text (notebook, page_b));
631 gnc_prefs_sort_pages (GtkNotebook *notebook)
634 GList *tabs = NULL, *iter = NULL;
636 g_return_if_fail (GTK_IS_NOTEBOOK (notebook));
639 n_pages = gtk_notebook_get_n_pages (notebook);
640 for (i = n_pages - 1; i >= 0; i--)
641 tabs = g_list_prepend (tabs, gtk_notebook_get_nth_page (notebook, i));
644 tabs = g_list_sort_with_data (tabs, (GCompareDataFunc) tab_cmp, notebook);
647 for (i = 0, iter = tabs; iter; i++, iter = iter->next)
648 gtk_notebook_reorder_child (notebook, GTK_WIDGET (iter->data), i);
659 gnc_prefs_split_widget_name (
const gchar *name, gchar **group, gchar **pref)
661 const gchar *group_with_pref = name + PREF_PREFIX_LEN;
662 gchar **splits = g_strsplit (group_with_pref,
"/", 0);
664 *group = g_strdup (splits[0]);
665 *pref = g_strdup (splits[1]);
678 gnc_prefs_connect_font_button (GtkFontButton *fb)
683 g_return_if_fail(GTK_IS_FONT_BUTTON(fb));
685 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(fb)), &group, &pref);
691 gtk_widget_show_all(GTK_WIDGET(fb));
704 gnc_prefs_connect_radio_button (GtkRadioButton *button)
709 g_return_if_fail(GTK_IS_RADIO_BUTTON(button));
711 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(button)), &group, &pref);
733 gnc_prefs_connect_check_button (GtkCheckButton *button)
738 g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
740 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(button)), &group, &pref);
762 gnc_prefs_connect_spin_button (GtkSpinButton *spin)
767 g_return_if_fail(GTK_IS_SPIN_BUTTON(spin));
769 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(spin)), &group, &pref);
790 gnc_prefs_connect_combo_box (GtkComboBox *box)
795 g_return_if_fail(GTK_IS_COMBO_BOX(box));
797 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(box)), &group, &pref);
818 gnc_prefs_connect_currency_edit (
GNCCurrencyEdit *gce,
const gchar *boxname )
824 g_return_if_fail(GNC_IS_CURRENCY_EDIT(gce));
826 gnc_prefs_split_widget_name (boxname, &group, &pref);
833 gtk_widget_show_all(GTK_WIDGET(gce));
845 gnc_prefs_connect_entry (GtkEntry *entry)
850 g_return_if_fail(GTK_IS_ENTRY(entry));
852 gnc_prefs_split_widget_name (gtk_buildable_get_name(GTK_BUILDABLE(entry)), &group, &pref);
874 gnc_prefs_connect_period_select (
GncPeriodSelect *period,
const gchar *boxname )
879 g_return_if_fail(GNC_IS_PERIOD_SELECT(period));
881 gnc_prefs_split_widget_name (boxname, &group, &pref);
898 gnc_prefs_connect_date_edit (
GNCDateEdit *gde ,
const gchar *boxname )
903 g_return_if_fail(GNC_IS_DATE_EDIT(gde));
905 gnc_prefs_split_widget_name (boxname, &group, &pref);
938 case GTK_RESPONSE_HELP:
943 gnc_save_window_size(GNC_PREFS_GROUP, GTK_WINDOW(dialog));
944 gnc_unregister_gui_component_by_data(DIALOG_PREFERENCES_CM_CLASS,
946 gtk_widget_destroy(GTK_WIDGET(dialog));
968 gnc_prefs_connect_one (
const gchar *name,
975 if (GTK_IS_FONT_BUTTON(widget))
977 DEBUG(
" %s - entry", name);
978 gnc_prefs_connect_font_button(GTK_FONT_BUTTON(widget));
980 else if (GTK_IS_RADIO_BUTTON(widget))
982 DEBUG(
" %s - radio button", name);
983 gnc_prefs_connect_radio_button(GTK_RADIO_BUTTON(widget));
985 else if (GTK_IS_CHECK_BUTTON(widget))
987 DEBUG(
" %s - check button", name);
988 gnc_prefs_connect_check_button(GTK_CHECK_BUTTON(widget));
990 else if (GTK_IS_SPIN_BUTTON(widget))
992 DEBUG(
" %s - spin button", name);
993 gnc_prefs_connect_spin_button(GTK_SPIN_BUTTON(widget));
995 else if (GTK_IS_COMBO_BOX(widget))
997 DEBUG(
" %s - combo box", name);
998 gnc_prefs_connect_combo_box(GTK_COMBO_BOX(widget));
1000 else if (GTK_IS_ENTRY(widget))
1002 DEBUG(
" %s - entry", name);
1003 gnc_prefs_connect_entry(GTK_ENTRY(widget));
1005 else if (GTK_IS_HBOX(widget))
1008 GtkWidget *widget_child;
1009 GList* child = gtk_container_get_children(GTK_CONTAINER(widget));
1010 widget_child = child->data;
1012 DEBUG(
" %s - hbox", name);
1013 DEBUG(
"Hbox widget type is %s and name is %s", gtk_widget_get_name(GTK_WIDGET(widget_child)), name);
1015 if (GNC_IS_CURRENCY_EDIT(widget_child))
1017 DEBUG(
" %s - currency_edit", name);
1018 gnc_prefs_connect_currency_edit(GNC_CURRENCY_EDIT(widget_child), name );
1020 else if (GNC_IS_PERIOD_SELECT(widget_child))
1022 DEBUG(
" %s - period_Select", name);
1023 gnc_prefs_connect_period_select(GNC_PERIOD_SELECT(widget_child), name );
1025 else if (GNC_IS_DATE_EDIT(widget_child))
1027 DEBUG(
" %s - date_edit", name);
1028 gnc_prefs_connect_date_edit(GNC_DATE_EDIT(widget_child), name );
1033 DEBUG(
" %s - unsupported %s", name,
1034 G_OBJECT_TYPE_NAME(G_OBJECT(widget)));
1051 gnc_preferences_dialog_create(
void)
1053 GtkBuilder *builder;
1054 GtkWidget *dialog, *notebook, *label, *image;
1055 GtkWidget *box, *date, *period, *currency;
1056 GHashTable *prefs_table;
1057 GDate* gdate = NULL;
1059 GtkListStore *store;
1063 const gchar *currency_name;
1068 gboolean date_is_valid = FALSE;
1071 DEBUG(
"Opening dialog-preferences.glade:");
1072 builder = gtk_builder_new();
1074 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"auto_decimal_places_adj");
1075 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"autosave_interval_minutes_adj");
1076 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"save_on_close_adj");
1077 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"date_backmonth_adj");
1078 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"max_transactions_adj");
1079 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"key_length_adj");
1080 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"new_search_limit_adj");
1081 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"retain_days_adj");
1082 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"tab_width_adj");
1083 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"date_formats");
1084 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"GnuCash Preferences");
1086 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"GnuCash Preferences"));
1088 #ifndef REGISTER2_ENABLED
1090 box = GTK_WIDGET (gtk_builder_get_object (builder,
"label14"));
1091 gtk_widget_hide (box);
1092 box = GTK_WIDGET (gtk_builder_get_object (builder,
"pref/general.register/key-length"));
1093 gtk_widget_hide (box);
1094 box = GTK_WIDGET (gtk_builder_get_object (builder,
"pref/general.register/show-extra-dates"));
1095 gtk_widget_hide (box);
1096 box = GTK_WIDGET (gtk_builder_get_object (builder,
"pref/general.register/show-calendar-buttons"));
1097 gtk_widget_hide (box);
1098 box = GTK_WIDGET (gtk_builder_get_object (builder,
"pref/general.register/selection-to-blank-on-expand"));
1099 gtk_widget_hide (box);
1100 box = GTK_WIDGET (gtk_builder_get_object (builder,
"pref/general.register/show-extra-dates-on-selection"));
1101 gtk_widget_hide (box);
1104 label = GTK_WIDGET(gtk_builder_get_object (builder,
"sample_account"));
1105 g_object_set_data(G_OBJECT(dialog),
"sample_account", label);
1107 image = GTK_WIDGET(gtk_builder_get_object (builder,
"separator_error"));
1108 g_object_set_data(G_OBJECT(dialog),
"separator_error", image);
1110 DEBUG(
"autoconnect");
1111 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, dialog);
1115 notebook = GTK_WIDGET(gtk_builder_get_object (builder,
"notebook1"));
1116 prefs_table = g_hash_table_new(g_str_hash, g_str_equal);
1117 g_object_set_data(G_OBJECT(dialog), NOTEBOOK, notebook);
1118 g_object_set_data_full(G_OBJECT(dialog), PREFS_WIDGET_HASH,
1119 prefs_table, (GDestroyNotify)g_hash_table_destroy);
1122 book = gnc_get_current_book();
1123 g_date_clear (&fy_end, 1);
1127 box = GTK_WIDGET(gtk_builder_get_object (builder,
1128 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_START_PERIOD));
1130 gtk_widget_show (period);
1131 gtk_box_pack_start (GTK_BOX (box), period, TRUE, TRUE, 0);
1135 box = GTK_WIDGET(gtk_builder_get_object (builder,
1136 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_END_PERIOD));
1138 gtk_widget_show (period);
1139 gtk_box_pack_start (GTK_BOX (box), period, TRUE, TRUE, 0);
1143 box = GTK_WIDGET(gtk_builder_get_object (builder,
1144 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_START_DATE));
1145 date = gnc_date_edit_new(
gnc_time (NULL), FALSE, FALSE);
1146 gtk_widget_show (date);
1147 gtk_box_pack_start (GTK_BOX (box), date, TRUE, TRUE, 0);
1149 box = GTK_WIDGET(gtk_builder_get_object (builder,
1150 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_END_DATE));
1151 date = gnc_date_edit_new(
gnc_time (NULL), FALSE, FALSE);
1152 gtk_widget_show (date);
1153 gtk_box_pack_start (GTK_BOX (box), date, TRUE, TRUE, 0);
1155 box = GTK_WIDGET(gtk_builder_get_object (builder,
1156 "pref/" GNC_PREFS_GROUP_GENERAL
"/" GNC_PREF_CURRENCY_OTHER));
1159 gtk_widget_show (currency);
1160 gtk_box_pack_start(GTK_BOX (box), currency, TRUE, TRUE, 0);
1162 box = GTK_WIDGET(gtk_builder_get_object (builder,
1163 "pref/" GNC_PREFS_GROUP_GENERAL_REPORT
"/" GNC_PREF_CURRENCY_OTHER));
1166 gtk_widget_show (currency);
1167 gtk_box_pack_start(GTK_BOX (box), currency, TRUE, TRUE, 0);
1171 gnc_prefs_build_widget_table(builder, dialog);
1173 g_slist_foreach(
add_ins, gnc_preferences_build_page, dialog);
1176 gnc_prefs_sort_pages(GTK_NOTEBOOK(notebook));
1177 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
1179 DEBUG(
"We have the following interesting widgets:");
1180 g_hash_table_foreach(prefs_table, (GHFunc)gnc_prefs_connect_one, dialog);
1181 DEBUG(
"Done with interesting widgets.");
1184 gdate = g_date_new_dmy(31, G_DATE_JULY, 2013);
1185 g_date_strftime(buf,
sizeof(buf),
"%x", gdate);
1186 store = GTK_LIST_STORE(gtk_builder_get_object (builder,
"date_formats"));
1188 if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path))
1189 gtk_list_store_set (store, &iter, 1, buf, -1);
1192 locale_currency = gnc_locale_default_currency ();
1194 label = GTK_WIDGET(gtk_builder_get_object (builder,
"locale_currency"));
1195 gtk_label_set_label(GTK_LABEL(label), currency_name);
1196 label = GTK_WIDGET(gtk_builder_get_object (builder,
"locale_currency2"));
1197 gtk_label_set_label(GTK_LABEL(label), currency_name);
1199 g_object_unref(G_OBJECT(builder));
1201 LEAVE(
"dialog %p", dialog);
1227 show_handler (
const char *class_name, gint component_id,
1228 gpointer user_data, gpointer iter_data)
1233 dialog = GTK_WIDGET(user_data);
1234 gtk_window_present(GTK_WINDOW(dialog));
1247 close_handler (gpointer user_data)
1252 dialog = GTK_WIDGET(user_data);
1253 gnc_unregister_gui_component_by_data(DIALOG_PREFERENCES_CM_CLASS, dialog);
1254 gtk_widget_destroy(dialog);
1269 if (gnc_forall_gui_components(DIALOG_PREFERENCES_CM_CLASS,
1270 show_handler, NULL))
1272 LEAVE(
"existing window");
1276 dialog = gnc_preferences_dialog_create();
1278 gnc_restore_window_size(GNC_PREFS_GROUP, GTK_WINDOW(dialog));
1279 gtk_widget_show(dialog);
1281 gnc_register_gui_component(DIALOG_PREFERENCES_CM_CLASS,
1282 NULL, close_handler, dialog);
void gnc_preferences_add_page(const gchar *filename, const gchar *widgetname, const gchar *tabname)
void qof_instance_get(const QofInstance *inst, const gchar *first_param,...)
Wrapper for g_object_get.
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
utility functions for the GnuCash UI
#define PINFO(format, args...)
#define DEBUG(format, args...)
void gnc_preferences_add_to_page(const gchar *filename, const gchar *widgetname, const gchar *tabname)
GList * gnc_account_list_name_violations(QofBook *book, const gchar *separator)
#define ENTER(format, args...)
gnc_commodity * gnc_default_currency(void)
Currency selection widget.
Account handling public routines.
gchar * gnc_account_name_violations_errmsg(const gchar *separator, GList *invalid_account_names)
void gnc_prefs_bind(const gchar *group, const gchar *pref_name, gpointer object, const gchar *property)
struct addition_t addition
void gnc_period_select_set_fy_end(GncPeriodSelect *period, const GDate *fy_end)
Dialog for handling user preferences.
void gnc_gnome_help(const char *file_name, const char *anchor)
All type declarations for the whole Gnucash engine.
Generic api to store and retrieve preferences.
void gnc_preferences_dialog(void)
void gnc_preferences_response_cb(GtkDialog *dialog, gint response, GtkDialog *unused)
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
GtkWidget * gnc_currency_edit_new(void)
struct KvpFrameImpl KvpFrame
#define LEAVE(format, args...)
time64 gnc_time(time64 *tbuf)
get the current local time
GtkWidget * gnc_period_select_new(gboolean starting_labels)
A custom widget for selecting accounting periods.
const gchar * QofLogModule
void gnc_account_separator_pref_changed_cb(GtkEntry *entry, GtkWidget *dialog)