66 #include <glib/gi18n.h> 68 #include "dialog-utils.h" 70 #include "gnc-date-edit.h" 79 #include <gnc-session.h> 80 #include "gnc-component-manager.h" 82 #include "dialog-doclink-utils.h" 84 #define DIALOG_PREFERENCES_CM_CLASS "dialog-newpreferences" 85 #define GNC_PREFS_GROUP "dialogs.preferences" 86 #define PREF_PREFIX_LEN sizeof("pref/") - 1 87 #define PREFS_WIDGET_HASH "prefs_widget_hash" 88 #define NOTEBOOK "notebook" 91 static QofLogModule log_module = GNC_MOD_PREFS;
96 gboolean gnc_preferences_delete_event_cb (GtkWidget *widget,
102 typedef struct addition_t
124 static gchar *gnc_account_separator_is_valid (
const gchar *separator,
125 gchar **normalized_separator)
128 GList *conflict_accts = NULL;
129 gchar *message = NULL;
131 if (!gnc_current_session_exist())
134 book = gnc_get_current_book ();
135 *normalized_separator = gnc_normalize_account_separator (separator);
141 g_list_free_full (conflict_accts, g_free);
158 GtkWidget *label, *image;
160 gchar *separator = NULL;
162 gchar *conflict_msg = gnc_account_separator_is_valid (gtk_entry_get_text (entry), &separator);
164 label = g_object_get_data (G_OBJECT(dialog),
"sample_account");
165 DEBUG(
"Sample Account pointer is %p", label);
172 sample = g_strdup_printf (_(
"Income%sSalary%sTaxable"),
173 separator, separator);
174 PINFO(
" Label set to '%s'", sample);
175 gtk_label_set_text (GTK_LABEL(label), sample);
179 image = g_object_get_data (G_OBJECT(dialog),
"separator_error");
180 DEBUG(
"Separator Error Image pointer is %p", image);
184 gtk_widget_set_tooltip_text (GTK_WIDGET(image), conflict_msg);
185 gtk_widget_show (GTK_WIDGET(image));
186 g_free (conflict_msg);
189 gtk_widget_hide (GTK_WIDGET(image));
205 gnc_account_separator_validate (GtkWidget *dialog)
207 GtkWidget *entry = g_object_get_data (G_OBJECT(dialog),
"account-separator");
209 gchar *separator = NULL;
210 gchar *conflict_msg = gnc_account_separator_is_valid (gtk_entry_get_text (GTK_ENTRY(entry)), &separator);
215 GtkWidget *msg_dialog, *msg_label;
219 builder = gtk_builder_new ();
220 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"separator_validation_dialog");
222 msg_dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"separator_validation_dialog"));
224 msg_label = GTK_WIDGET(gtk_builder_get_object (builder,
"conflict_message"));
226 gtk_label_set_text (GTK_LABEL(msg_label), conflict_msg);
228 g_object_unref (G_OBJECT(builder));
229 gtk_widget_show_all (msg_dialog);
231 response = gtk_dialog_run (GTK_DIALOG(msg_dialog));
232 if (response == GTK_RESPONSE_ACCEPT)
234 gchar *original_sep = g_object_get_data (G_OBJECT(entry),
"original_text");
236 if (original_sep != NULL)
237 gtk_entry_set_text (GTK_ENTRY(entry), original_sep);
242 g_free (conflict_msg);
243 gtk_widget_destroy (msg_dialog);
259 gnc_preferences_select_account_page (GtkDialog *dialog)
261 GtkWidget *notebook = g_object_get_data (G_OBJECT(dialog), NOTEBOOK);
262 GList *children = gtk_container_get_children (GTK_CONTAINER(notebook));
266 GtkWidget *acc_page = NULL;
269 for (node = children; node; node = node->next)
271 if (g_strcmp0 (gtk_widget_get_name (GTK_WIDGET(node->data)),
"accounts_page") == 0)
272 acc_page = node->data;
276 gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook),
277 gtk_notebook_page_num (GTK_NOTEBOOK(notebook),
280 g_list_free (children);
292 GtkWidget *spinner = g_object_get_data (G_OBJECT(dialog),
293 "save_on_close_wait_time");
294 gtk_widget_set_sensitive (spinner, gtk_toggle_button_get_active (button));
309 gnc_prefs_compare_addins (
addition *a,
312 return g_utf8_collate (a->tabname, b->
tabname);
336 gnc_preferences_add_page_internal (
const gchar *filename,
337 const gchar *widgetname,
338 const gchar *tabname,
342 gboolean error = FALSE;
345 ENTER(
"file %s, widget %s, tab %s full page %d",
346 filename, widgetname, tabname, full_page);
348 add_in = g_malloc (
sizeof(
addition));
351 g_critical (
"Unable to allocate memory.\n");
356 add_in->
filename = g_strdup (filename);
358 add_in->
tabname = g_strdup (tabname);
362 g_critical (
"Unable to allocate memory.\n");
371 ptr = g_slist_find_custom (
add_ins, add_in, (GCompareFunc)gnc_prefs_compare_addins);
375 preexisting = ptr->data;
379 g_warning (
"New tab %s(%s/%s/%s) conflicts with existing tab %s(%s/%s/full)",
387 g_warning (
"New tab %s(%s/%s/%s) conflicts with existing tab %s(%s/%s/partial)",
420 const gchar *widgetname,
421 const gchar *tabname)
423 gnc_preferences_add_page_internal (filename, widgetname, tabname, TRUE);
435 const gchar *widgetname,
436 const gchar *tabname)
438 gnc_preferences_add_page_internal (filename, widgetname, tabname, FALSE);
458 gnc_prefs_build_widget_table (GtkBuilder *builder,
461 GHashTable *prefs_table;
462 GSList *interesting, *runner;
467 prefs_table = g_object_get_data (G_OBJECT(dialog), PREFS_WIDGET_HASH);
469 interesting = gtk_builder_get_objects (builder);
471 for (runner = interesting; runner; runner = g_slist_next(runner))
473 widget = runner->data;
474 if (GTK_IS_WIDGET(widget))
476 wname = gtk_widget_get_name (widget);
477 name = gtk_buildable_get_name (GTK_BUILDABLE(widget));
478 DEBUG(
"Widget type is %s and buildable get name is %s", wname, name);
479 if (g_str_has_prefix (name,
"pref"))
480 g_hash_table_insert (prefs_table, (gchar *)name, widget);
483 g_slist_free (interesting);
505 gnc_prefs_find_page (GtkNotebook *notebook,
const gchar *name)
509 const gchar *child_name;
511 g_return_val_if_fail (GTK_IS_NOTEBOOK(notebook), NULL);
512 g_return_val_if_fail (name, NULL);
516 n_pages = gtk_notebook_get_n_pages (notebook);
518 for (i = 0; i < n_pages; i++)
520 child = gtk_notebook_get_nth_page (notebook, i);
521 g_return_val_if_fail (child, NULL);
523 child_name = gtk_notebook_get_tab_label_text (notebook, child);
524 g_return_val_if_fail (child_name, NULL);
526 if (g_utf8_collate (name, child_name) == 0)
528 LEAVE(
"found at index: %d", i);
550 gnc_prefs_get_grid_size (GtkWidget *child, gpointer data)
553 gint top, left, height, width;
555 gtk_container_child_get (GTK_CONTAINER(copydata->
grid_to), child,
556 "left-attach", &left,
562 if (left + width >= copydata->
cols)
563 copydata->
cols = left + width;
565 if (top + height >= copydata->rows)
566 copydata->rows = top + height;
583 gnc_prefs_move_grid_entry (GtkWidget *child,
587 gint top, left, height, width;
588 gboolean hexpand, vexpand;
589 GtkAlign halign, valign;
590 gint topm, bottomm, leftm, rightm;
592 ENTER(
"child %p, copy data %p", child, data);
593 gtk_container_child_get (GTK_CONTAINER(copydata->
grid_from), child,
594 "left-attach", &left,
599 hexpand = gtk_widget_get_hexpand (child);
600 vexpand = gtk_widget_get_vexpand (child);
601 halign = gtk_widget_get_halign (child);
602 valign = gtk_widget_get_valign (child);
604 g_object_get (child,
"margin-top", &topm,
"margin-bottom", &bottomm, NULL);
605 g_object_get (child,
"margin-left", &leftm,
"margin-right", &rightm, NULL);
607 g_object_ref (child);
608 gtk_container_remove (GTK_CONTAINER(copydata->
grid_from), child);
610 gtk_grid_attach (copydata->
grid_to, child, left, copydata->rows + top , width, height);
612 gtk_widget_set_hexpand (child, hexpand);
613 gtk_widget_set_vexpand (child, vexpand);
614 gtk_widget_set_halign (child, halign);
615 gtk_widget_set_valign (child, valign);
617 g_object_set (child,
"margin-left", leftm,
"margin-right", rightm, NULL);
618 g_object_set (child,
"margin-top", topm,
"margin-bottom", bottomm, NULL);
620 g_object_unref (child);
637 gnc_preferences_build_page (gpointer data,
641 GtkWidget *dialog, *existing_content, *new_content, *label;
642 GtkNotebook *notebook;
644 struct copy_data copydata = {NULL, NULL, 0, 0};
648 ENTER(
"add_in %p, dialog %p", data, user_data);
653 builder = gtk_builder_new ();
656 widgetname = g_strsplit (add_in->
widgetname,
",", -1);
658 for (i = 0; widgetname[i]; i++)
660 DEBUG(
"Opening %s to get content %s", add_in->
filename, widgetname[i]);
661 gnc_builder_add_from_file (builder, add_in->
filename, widgetname[i]);
664 DEBUG(
"Widget Content is %s", widgetname[i - 1]);
665 new_content = GTK_WIDGET(gtk_builder_get_object (builder, widgetname[i - 1]));
667 g_strfreev (widgetname);
671 gnc_prefs_build_widget_table (builder, dialog);
676 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, dialog);
679 notebook = g_object_get_data (G_OBJECT(dialog), NOTEBOOK);
683 label = gtk_label_new (add_in->
tabname);
684 gnc_label_set_alignment (label, 0.0, 0.5);
685 gtk_notebook_append_page (notebook, new_content, label);
686 g_object_unref (G_OBJECT(builder));
687 LEAVE(
"appended page");
692 if (!GTK_IS_GRID(new_content))
694 g_critical (
"The object name %s in file %s is not a GtkGrid. It cannot " 695 "be added to the preferences dialog.",
697 g_object_unref (G_OBJECT(builder));
703 existing_content = gnc_prefs_find_page (notebook, add_in->
tabname);
705 if (!existing_content)
708 existing_content = gtk_grid_new ();
709 gtk_container_set_border_width (GTK_CONTAINER(existing_content), 6);
710 label = gtk_label_new (add_in->
tabname);
711 gnc_label_set_alignment (label, 0.0, 0.5);
712 gtk_notebook_append_page (notebook, existing_content, label);
713 gtk_widget_show_all (existing_content);
714 DEBUG(
"created new page %s, appended it", add_in->
tabname);
719 copydata.
grid_to = GTK_GRID(existing_content);
720 gtk_container_foreach (GTK_CONTAINER(existing_content), gnc_prefs_get_grid_size, ©data);
722 DEBUG(
"found existing page %s, grid size is %d x %d", add_in->
tabname, copydata.rows, copydata.
cols);
726 if (copydata.rows > 0)
728 label = gtk_label_new (
"");
729 gtk_widget_show (label);
730 gtk_grid_attach (GTK_GRID(existing_content), label, 0, copydata.rows, 1, 1);
731 copydata.rows = copydata.rows + 1;
733 DEBUG(
"add spacer row");
737 copydata.
grid_from = GTK_GRID(new_content);
738 copydata.
grid_to = GTK_GRID(existing_content);
739 gtk_container_foreach (GTK_CONTAINER(new_content), gnc_prefs_move_grid_entry, ©data);
741 g_object_ref_sink (new_content);
742 g_object_unref (G_OBJECT(builder));
744 LEAVE(
"added content to page");
749 tab_cmp (GtkWidget *page_a, GtkWidget *page_b, GtkNotebook *notebook)
751 return g_utf8_collate (gtk_notebook_get_tab_label_text (notebook, page_a),
752 gtk_notebook_get_tab_label_text (notebook, page_b));
757 gnc_prefs_sort_pages (GtkNotebook *notebook)
760 GList *tabs = NULL, *iter = NULL;
762 g_return_if_fail (GTK_IS_NOTEBOOK(notebook));
765 n_pages = gtk_notebook_get_n_pages (notebook);
766 for (i = n_pages - 1; i >= 0; i--)
767 tabs = g_list_prepend (tabs, gtk_notebook_get_nth_page (notebook, i));
770 tabs = g_list_sort_with_data (tabs, (GCompareDataFunc) tab_cmp, notebook);
773 for (i = 0, iter = tabs; iter; i++, iter = iter->next)
774 gtk_notebook_reorder_child (notebook, GTK_WIDGET(iter->data), i);
785 gnc_prefs_split_widget_name (
const gchar *name, gchar **group, gchar **pref, gchar **value)
787 const gchar *group_with_pref = name + PREF_PREFIX_LEN;
788 gchar **splits = g_strsplit (group_with_pref,
"/", 0);
789 gchar **value_splits = g_strsplit (splits[1],
"=", 0);
791 *group = g_strdup (splits[0]);
792 *pref = g_strdup (value_splits[0]);
794 *value = g_strdup (value_splits[1]);
796 g_strfreev (value_splits);
808 gnc_prefs_connect_font_button (GtkFontButton *fb)
812 g_return_if_fail (GTK_IS_FONT_BUTTON(fb));
814 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(fb)), &group, &pref, NULL);
820 gtk_widget_show_all (GTK_WIDGET(fb));
832 file_chooser_selected_cb (GtkFileChooser *fc, gpointer user_data)
834 GtkImage *image = g_object_get_data (G_OBJECT(fc),
"path_head_error");
835 const gchar *group = g_object_get_data (G_OBJECT(fc),
"group");
836 const gchar *pref = g_object_get_data (G_OBJECT(fc),
"pref");
837 gchar *folder_uri = gtk_file_chooser_get_uri (fc);
838 gchar *old_path_head_uri = gnc_doclink_get_path_head ();
841 if (!g_str_has_suffix (folder_uri,
"/"))
843 gchar *folder_with_slash = g_strconcat (folder_uri,
"/", NULL);
845 folder_uri = g_strdup (folder_with_slash);
846 g_free (folder_with_slash);
849 gtk_widget_hide (GTK_WIDGET(image));
852 PINFO(
"Failed to save preference at %s, %s with %s", group, pref, folder_uri);
854 gnc_doclink_pref_path_head_changed (
855 GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(fc))),
858 g_free (old_path_head_uri);
871 gnc_prefs_connect_file_chooser_button (GtkFileChooserButton *fcb,
const gchar *boxname)
876 gboolean folder_set = TRUE;
878 g_return_if_fail (GTK_FILE_CHOOSER_BUTTON(fcb));
881 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(fcb)), &group, &pref, NULL);
883 gnc_prefs_split_widget_name (boxname, &group, &pref, NULL);
887 PINFO(
"Uri is %s", uri);
894 if (g_file_test (path_head, G_FILE_TEST_IS_DIR))
895 gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER(fcb), uri);
902 image = g_object_get_data (G_OBJECT(fcb),
"path_head_error");
905 gtk_widget_hide (GTK_WIDGET(image));
908 gchar *path_head = gnc_doclink_get_unescape_uri (NULL, uri,
"file");
909 gchar *ttip = g_strconcat (_(
"Path does not exist, "), path_head, NULL);
911 gtk_widget_set_tooltip_text (GTK_WIDGET(image), ttip);
912 gtk_widget_show (GTK_WIDGET(image));
918 g_signal_connect (GTK_FILE_CHOOSER(fcb),
"selection-changed",
919 G_CALLBACK(file_chooser_selected_cb), NULL);
921 g_object_set_data_full (G_OBJECT(fcb),
"group", g_strdup (group), (GDestroyNotify) g_free);
922 g_object_set_data_full (G_OBJECT(fcb),
"pref", g_strdup (pref), (GDestroyNotify) g_free);
928 gtk_widget_show_all (GTK_WIDGET(fcb));
940 file_chooser_clear_cb (GtkButton *button, gpointer user_data)
942 GtkFileChooserButton *fcb = GTK_FILE_CHOOSER_BUTTON(user_data);
943 const gchar *group = g_object_get_data (G_OBJECT(fcb),
"group");
944 const gchar *pref = g_object_get_data (G_OBJECT(fcb),
"pref");
945 GtkImage *image = g_object_get_data (G_OBJECT(fcb),
"path_head_error");
949 gchar *old_path_head_uri = gnc_doclink_get_path_head ();
953 box = gtk_widget_get_parent (GTK_WIDGET(fcb));
954 g_signal_handlers_disconnect_by_func (button, file_chooser_clear_cb, fcb);
957 PINFO(
"Failed to Clear preference at %s, %s", group, pref);
959 gnc_doclink_pref_path_head_changed (
960 GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(fcb))),
963 gtk_widget_destroy (GTK_WIDGET(fcb));
965 fcb_new = gtk_file_chooser_button_new (_(
"Select a folder"),
966 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
968 g_object_set_data (G_OBJECT(fcb_new),
"path_head_error", image);
969 g_object_set_data_full (G_OBJECT(fcb_new),
"group", g_strdup (group), (GDestroyNotify) g_free);
970 g_object_set_data_full (G_OBJECT(fcb_new),
"pref", g_strdup (pref), (GDestroyNotify) g_free);
972 gtk_box_pack_start (GTK_BOX(box), fcb_new, TRUE, TRUE, 0);
973 gtk_box_reorder_child (GTK_BOX(box), fcb_new, 0);
974 gtk_widget_show (fcb_new);
976 g_signal_connect (GTK_BUTTON(button),
"clicked",
977 G_CALLBACK(file_chooser_clear_cb), fcb_new);
979 boxname = g_strconcat (
"pref/", group,
"/", pref, NULL);
981 gnc_prefs_connect_file_chooser_button (GTK_FILE_CHOOSER_BUTTON(fcb_new), boxname);
983 g_free (old_path_head_uri);
996 gnc_prefs_connect_radio_button (GtkRadioButton *button)
998 gchar *group, *pref, *value;
1000 g_return_if_fail (GTK_IS_RADIO_BUTTON(button));
1002 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(button)), &group, &pref, &value);
1021 gnc_prefs_connect_check_button (GtkCheckButton *button)
1023 gchar *group, *pref, *value;
1025 g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
1027 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(button)), &group, &pref, &value);
1046 gnc_prefs_connect_spin_button (GtkSpinButton *spin)
1048 gchar *group, *pref;
1050 g_return_if_fail (GTK_IS_SPIN_BUTTON(spin));
1052 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(spin)), &group, &pref, NULL);
1069 gnc_prefs_connect_combo_box (GtkComboBox *box)
1071 gchar *group, *pref;
1073 g_return_if_fail (GTK_IS_COMBO_BOX(box));
1075 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(box)), &group, &pref, NULL);
1092 gnc_prefs_connect_currency_edit (GNCCurrencyEdit *gce,
const gchar *boxname )
1094 gchar *group, *pref;
1096 g_return_if_fail (GNC_IS_CURRENCY_EDIT(gce));
1098 gnc_prefs_split_widget_name (boxname, &group, &pref, NULL);
1105 gtk_widget_show_all (GTK_WIDGET(gce));
1117 gnc_prefs_connect_entry (GtkEntry *entry)
1119 gchar *group, *pref;
1121 g_return_if_fail (GTK_IS_ENTRY(entry));
1123 gnc_prefs_split_widget_name (gtk_buildable_get_name (GTK_BUILDABLE(entry)), &group, &pref, NULL);
1140 gnc_prefs_connect_period_select (GncPeriodSelect *period,
const gchar *boxname )
1142 gchar *group, *pref;
1144 g_return_if_fail (GNC_IS_PERIOD_SELECT(period));
1146 gnc_prefs_split_widget_name (boxname, &group, &pref, NULL);
1163 gnc_prefs_connect_date_edit (
GNCDateEdit *gde ,
const gchar *boxname )
1165 gchar *group, *pref;
1167 g_return_if_fail (GNC_IS_DATE_EDIT(gde));
1169 gnc_prefs_split_widget_name (boxname, &group, &pref, NULL);
1185 gnc_preferences_delete_event_cb (GtkWidget *widget,
1211 case GTK_RESPONSE_HELP:
1215 case GTK_RESPONSE_DELETE_EVENT:
1217 if (gnc_account_separator_validate (GTK_WIDGET(dialog)))
1219 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(dialog));
1220 gnc_unregister_gui_component_by_data (DIALOG_PREFERENCES_CM_CLASS,
1222 gtk_widget_destroy (GTK_WIDGET(dialog));
1225 gnc_preferences_select_account_page (dialog);
1247 gnc_prefs_connect_one (
const gchar *name,
1254 if (GTK_IS_FONT_BUTTON(widget))
1256 DEBUG(
" %s - font button", name);
1257 gnc_prefs_connect_font_button (GTK_FONT_BUTTON(widget));
1259 else if (GTK_IS_FILE_CHOOSER_BUTTON(widget))
1261 DEBUG(
" %s - file chooser button", name);
1262 gnc_prefs_connect_file_chooser_button (GTK_FILE_CHOOSER_BUTTON(widget), NULL);
1264 else if (GTK_IS_RADIO_BUTTON(widget))
1266 DEBUG(
" %s - radio button", name);
1267 gnc_prefs_connect_radio_button (GTK_RADIO_BUTTON(widget));
1269 else if (GTK_IS_CHECK_BUTTON(widget))
1271 DEBUG(
" %s - check button", name);
1272 gnc_prefs_connect_check_button (GTK_CHECK_BUTTON(widget));
1274 else if (GTK_IS_SPIN_BUTTON(widget))
1276 DEBUG(
" %s - spin button", name);
1277 gnc_prefs_connect_spin_button (GTK_SPIN_BUTTON(widget));
1279 else if (GTK_IS_COMBO_BOX(widget))
1281 DEBUG(
" %s - combo box", name);
1282 gnc_prefs_connect_combo_box (GTK_COMBO_BOX(widget));
1284 else if (GTK_IS_ENTRY(widget))
1286 DEBUG(
" %s - entry", name);
1287 gnc_prefs_connect_entry (GTK_ENTRY(widget));
1289 else if (GTK_IS_BOX(widget))
1292 GtkWidget *widget_child;
1293 GList* child = gtk_container_get_children (GTK_CONTAINER(widget));
1294 widget_child = child->data;
1295 g_list_free (child);
1296 DEBUG(
" %s - box", name);
1297 DEBUG(
"Box widget type is %s and name is %s", gtk_widget_get_name (GTK_WIDGET(widget_child)), name);
1298 if (GNC_IS_CURRENCY_EDIT(widget_child))
1300 DEBUG(
" %s - currency_edit", name);
1301 gnc_prefs_connect_currency_edit (GNC_CURRENCY_EDIT(widget_child), name );
1303 else if (GNC_IS_PERIOD_SELECT(widget_child))
1305 DEBUG(
" %s - period_select", name);
1306 gnc_prefs_connect_period_select (GNC_PERIOD_SELECT(widget_child), name );
1308 else if (GNC_IS_DATE_EDIT(widget_child))
1310 DEBUG(
" %s - date_edit", name);
1311 gnc_prefs_connect_date_edit (GNC_DATE_EDIT(widget_child), name );
1313 else if (GTK_FILE_CHOOSER_BUTTON(widget_child))
1315 DEBUG(
" %s - file chooser button", name);
1316 gnc_prefs_connect_file_chooser_button (GTK_FILE_CHOOSER_BUTTON(widget_child), name );
1321 DEBUG(
" %s - unsupported %s", name,
1322 G_OBJECT_TYPE_NAME(G_OBJECT(widget)));
1339 gnc_preferences_dialog_create (GtkWindow *parent)
1341 GtkBuilder *builder;
1342 GtkWidget *dialog, *notebook, *label, *image, *spinner, *entry;
1343 GtkWidget *box, *date, *period, *currency, *fcb, *button;
1344 GHashTable *prefs_table;
1345 GDate* gdate = NULL;
1347 GtkListStore *store;
1350 gnc_commodity *locale_currency;
1351 const gchar *currency_name;
1353 gboolean date_is_valid = FALSE;
1356 DEBUG(
"Opening dialog-preferences.glade:");
1357 builder = gtk_builder_new ();
1359 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"auto_decimal_places_adj");
1360 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"autosave_interval_minutes_adj");
1361 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"save_on_close_adj");
1362 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"date_backmonth_adj");
1363 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"default_zoom_adj");
1364 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"max_transactions_adj");
1365 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"key_length_adj");
1366 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"new_search_limit_adj");
1367 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"retain_days_adj");
1368 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"tab_width_adj");
1369 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"date_formats");
1370 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"atm_fee_adj");
1371 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"auto_add_adj");
1372 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"auto_clear_adj");
1373 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"match_adj");
1374 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"likely_day_threshold");
1375 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"unlikely_day_threshold");
1376 gnc_builder_add_from_file (builder,
"dialog-preferences.glade",
"gnucash_preferences_dialog");
1378 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"gnucash_preferences_dialog"));
1381 gtk_widget_set_name (GTK_WIDGET(dialog),
"gnc-id-preferences");
1384 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent));
1386 label = GTK_WIDGET(gtk_builder_get_object (builder,
"sample_account"));
1387 g_object_set_data (G_OBJECT(dialog),
"sample_account", label);
1389 image = GTK_WIDGET(gtk_builder_get_object (builder,
"separator_error"));
1390 g_object_set_data (G_OBJECT(dialog),
"separator_error", image);
1392 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"pref/general/account-separator"));
1393 g_object_set_data (G_OBJECT(dialog),
"account-separator", entry);
1395 spinner = GTK_WIDGET(gtk_builder_get_object (builder,
"pref/general/save-on-close-wait-time"));
1396 g_object_set_data (G_OBJECT(dialog),
"save_on_close_wait_time", spinner);
1398 DEBUG(
"autoconnect");
1399 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, dialog);
1403 notebook = GTK_WIDGET(gtk_builder_get_object (builder,
"notebook1"));
1404 prefs_table = g_hash_table_new (g_str_hash, g_str_equal);
1405 g_object_set_data (G_OBJECT(dialog), NOTEBOOK, notebook);
1406 g_object_set_data_full (G_OBJECT(dialog), PREFS_WIDGET_HASH,
1407 prefs_table, (GDestroyNotify)g_hash_table_destroy);
1410 if (gnc_current_session_exist())
1412 QofBook *book = gnc_get_current_book ();
1413 g_date_clear (&fy_end, 1);
1418 box = GTK_WIDGET(gtk_builder_get_object (builder,
1419 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_START_PERIOD));
1421 gtk_widget_show (period);
1422 gtk_box_pack_start (GTK_BOX(box), period, TRUE, TRUE, 0);
1426 box = GTK_WIDGET(gtk_builder_get_object (builder,
1427 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_END_PERIOD));
1429 gtk_widget_show (period);
1430 gtk_box_pack_start (GTK_BOX(box), period, TRUE, TRUE, 0);
1434 box = GTK_WIDGET(gtk_builder_get_object (builder,
1435 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_START_DATE));
1436 date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
1437 gtk_widget_show (date);
1438 gtk_box_pack_start (GTK_BOX(box), date, TRUE, TRUE, 0);
1440 box = GTK_WIDGET(gtk_builder_get_object (builder,
1441 "pref/" GNC_PREFS_GROUP_ACCT_SUMMARY
"/" GNC_PREF_END_DATE));
1442 date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
1443 gtk_widget_show (date);
1444 gtk_box_pack_start (GTK_BOX(box), date, TRUE, TRUE, 0);
1446 box = GTK_WIDGET(gtk_builder_get_object (builder,
1447 "pref/" GNC_PREFS_GROUP_GENERAL
"/" GNC_PREF_CURRENCY_OTHER));
1450 gtk_widget_show (currency);
1451 gtk_box_pack_start (GTK_BOX(box), currency, TRUE, TRUE, 0);
1453 box = GTK_WIDGET(gtk_builder_get_object (builder,
1454 "pref/" GNC_PREFS_GROUP_GENERAL_REPORT
"/" GNC_PREF_CURRENCY_OTHER));
1457 gtk_widget_show (currency);
1458 gtk_box_pack_start (GTK_BOX(box), currency, TRUE, TRUE, 0);
1460 box = GTK_WIDGET(gtk_builder_get_object (builder,
1461 "pref/" GNC_PREFS_GROUP_GENERAL
"/" GNC_DOC_LINK_PATH_HEAD));
1462 fcb = gtk_file_chooser_button_new (_(
"Select a folder"),
1463 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
1464 gtk_box_pack_start (GTK_BOX(box), fcb, TRUE, TRUE, 0);
1465 button = gtk_button_new_with_label (_(
"Clear"));
1466 gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
1467 gtk_widget_show (button);
1468 g_signal_connect (GTK_BUTTON(button),
"clicked",
1469 G_CALLBACK(file_chooser_clear_cb), fcb);
1471 image = GTK_WIDGET(gtk_builder_get_object (builder,
"path_head_error"));
1472 g_object_set_data (G_OBJECT(fcb),
"path_head_error", image);
1475 gnc_prefs_build_widget_table (builder, dialog);
1477 g_slist_foreach (
add_ins, gnc_preferences_build_page, dialog);
1480 gnc_prefs_sort_pages (GTK_NOTEBOOK(notebook));
1481 gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 0);
1483 DEBUG(
"We have the following interesting widgets:");
1485 g_hash_table_foreach (prefs_table, (GHFunc)gnc_prefs_connect_one, dialog);
1487 DEBUG(
"Done with interesting widgets.");
1490 gdate = g_date_new_dmy (31, G_DATE_JULY, 2013);
1491 g_date_strftime (buf,
sizeof(buf),
"%x", gdate);
1492 store = GTK_LIST_STORE(gtk_builder_get_object (builder,
"date_formats"));
1494 if (gtk_tree_model_get_iter (GTK_TREE_MODEL(store), &iter, path))
1495 gtk_list_store_set (store, &iter, 1, buf, -1);
1496 g_date_free (gdate);
1497 gtk_tree_path_free (path);
1501 label = GTK_WIDGET(gtk_builder_get_object (builder,
"locale_currency"));
1502 gtk_label_set_label (GTK_LABEL(label), currency_name);
1503 label = GTK_WIDGET(gtk_builder_get_object (builder,
"locale_currency2"));
1504 gtk_label_set_label (GTK_LABEL(label), currency_name);
1506 button = GTK_WIDGET(gtk_builder_get_object (builder,
"pref/general/save-on-close-expires"));
1509 g_object_unref (G_OBJECT(builder));
1512 g_object_set_data_full (G_OBJECT(entry),
"original_text",
1513 g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))),
1516 LEAVE(
"dialog %p", dialog);
1542 show_handler (
const char *class_name, gint component_id,
1543 gpointer user_data, gpointer iter_data)
1548 dialog = GTK_WIDGET(user_data);
1549 gtk_window_present (GTK_WINDOW(dialog));
1562 close_handler (gpointer user_data)
1567 dialog = GTK_WIDGET(user_data);
1568 gnc_unregister_gui_component_by_data (DIALOG_PREFERENCES_CM_CLASS, dialog);
1569 gtk_widget_destroy (dialog);
1584 if (gnc_forall_gui_components (DIALOG_PREFERENCES_CM_CLASS,
1585 show_handler, NULL))
1587 LEAVE(
"existing window");
1591 dialog = gnc_preferences_dialog_create(parent);
1593 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(dialog), parent);
1594 gtk_widget_show (dialog);
1596 gnc_register_gui_component (DIALOG_PREFERENCES_CM_CLASS,
1597 NULL, close_handler, dialog);
void gnc_preferences_dialog(GtkWindow *parent)
This function creates the preferences dialog and presents it to the user.
void gnc_save_on_close_expires_cb(GtkToggleButton *button, GtkWidget *dialog)
Called when the save-on-close checkbutton is toggled.
void gnc_preferences_add_page(const gchar *filename, const gchar *widgetname, const gchar *tabname)
This function adds a full page of preferences to the preferences dialog.
void qof_instance_get(const QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_get.
gchar * gnc_prefs_get_string(const gchar *group, const gchar *pref_name)
Get a string value from the preferences backend.
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
Set the widget to display a certain currency name.
GtkGrid * grid_from
The grid being copied from.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
#define DEBUG(format, args...)
Print a debugging message.
gchar * gnc_uri_get_path(const gchar *uri)
Extracts the path part from a uri.
void gnc_preferences_add_to_page(const gchar *filename, const gchar *widgetname, const gchar *tabname)
This function adds a partial page of preferences to the preferences dialog.
GList * gnc_account_list_name_violations(QofBook *book, const gchar *separator)
Runs through all the accounts and returns a list of account names that contain the provided separator...
gboolean full_page
TRUE if this addition represents a full page in the preferences dialog.
GSList * add_ins
A list of all additions that have been made to the preferences dialog.
gboolean gnc_prefs_set_string(const gchar *group, const gchar *pref_name, const gchar *value)
Store a string into the preferences backend.
#define ENTER(format, args...)
Print a function entry debugging message.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
Currency selection widget.
GtkGrid * grid_to
The grid being copied to.
Account handling public routines.
gchar * gnc_account_name_violations_errmsg(const gchar *separator, GList *invalid_account_names)
Composes a translatable error message showing which account names clash with the current account sepa...
This data structure is used while building the preferences dialog to copy a grid from a glade file to...
gint cols
The number of columns and rows in the grid.
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...
gchar * tabname
The name of the tab within the preferences dialog where these widgets should be placed.
void gnc_period_select_set_fy_end(GncPeriodSelect *period, const GDate *fy_end)
Set the fiscal year end on a GncPeriodSelect widget.
Dialog for handling user preferences.
void gnc_prefs_bind(const gchar *group, const gchar *pref_name, const gchar *pref_value, gpointer object, const gchar *property)
Bind a setting to a g_object property.
All type declarations for the whole Gnucash engine.
gchar * widgetname
The name of the widget within the glade data file that should be added to the preferences dialog...
Generic api to store and retrieve preferences.
void gnc_preferences_response_cb(GtkDialog *dialog, gint response, GtkDialog *unused)
Handle a user click on one of the buttons at the bottom of the preference dialog. ...
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
gchar * filename
The relative name of the file where the glade data for this addition can be found.
GtkWidget * gnc_currency_edit_new(void)
Create a new GNCCurrencyEdit widget which can be used to provide an easy way to enter ISO currency co...
This data structure holds the information for a single addition to the preferences dialog...
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current time
Utility functions for convert uri in separate components and back.
GtkWidget * gnc_period_select_new(gboolean starting_labels)
Create a new GncPeriodSelect widget which is used to select a accounting period like "previous month"...
void gnc_prefs_block_all(void)
Block all preference callbacks.
Take from locale information.
void gnc_prefs_unblock_all(void)
Unblock all preferences callbacks.
A custom widget for selecting accounting periods.
gnc_commodity * gnc_locale_default_currency(void)
Returns the default currency of the current locale.
void gnc_account_separator_pref_changed_cb(GtkEntry *entry, GtkWidget *dialog)
This function is called whenever the account separator is changed in the preferences dialog...