26 #include <glib/gi18n.h> 27 #include <dialog-options.hpp> 33 #include "dialog-report-style-sheet.h" 34 #include "dialog-utils.h" 35 #include "gnc-component-manager.h" 36 #include "gnc-session.h" 39 #include "gnc-guile-utils.h" 41 #include <guile-mappings.h> 42 #include "gnc-report.h" 44 #define DIALOG_STYLE_SHEETS_CM_CLASS "style-sheets-dialog" 45 #define GNC_PREFS_GROUP "dialogs.style-sheet" 47 StyleSheetDialog * gnc_style_sheet_dialog = NULL;
52 GtkTreeView * list_view;
53 GtkListStore * list_store;
54 GtkWidget * options_frame;
64 GtkTreeRowReference *row_ref;
76 void gnc_style_sheet_select_dialog_new_cb (GtkWidget *widget, gpointer user_data);
77 void gnc_style_sheet_select_dialog_edit_cb (GtkWidget *widget, gpointer user_data);
78 void gnc_style_sheet_select_dialog_delete_cb (GtkWidget *widget, gpointer user_data);
79 void gnc_style_sheet_select_dialog_close_cb (GtkWidget *widget, gpointer user_data);
80 void gnc_style_sheet_select_dialog_destroy_cb (GtkWidget *widget, gpointer user_data);
87 dirty_same_stylesheet (gpointer key, gpointer val, gpointer data)
89 auto dirty_ss{
static_cast<SCM
>(data)};
90 auto report{
static_cast<SCM
>(val)};
93 func = scm_c_eval_string (
"gnc:report-stylesheet");
94 if (scm_is_procedure (func))
95 rep_ss = scm_call_1 (func, report);
99 if (scm_is_true (scm_eq_p (rep_ss, dirty_ss)))
101 func = scm_c_eval_string (
"gnc:report-set-dirty?!");
103 if (scm_is_procedure (func))
104 scm_call_2 (func, report, SCM_BOOL_T);
113 GList *results = NULL, *iter;
115 gnc_reports_foreach (dirty_same_stylesheet, ssi->stylesheet);
118 for (iter = results; iter; iter = iter->next)
120 GtkWidget *dialog = gtk_message_dialog_new(
nullptr,
126 gtk_dialog_run(GTK_DIALOG(dialog));
127 gtk_widget_destroy(dialog);
130 g_list_free (results);
137 auto ssi{
static_cast<ss_info*
>(user_data)};
139 if (gnc_style_sheet_dialog && gtk_tree_row_reference_valid (ssi->row_ref))
141 auto ss = gnc_style_sheet_dialog;
142 auto path = gtk_tree_row_reference_get_path (ssi->row_ref);
144 if (gtk_tree_model_get_iter (GTK_TREE_MODEL(ss->list_store), &iter, path))
145 gtk_list_store_set (ss->list_store, &iter,
148 gtk_tree_path_free (path);
150 gtk_tree_row_reference_free (ssi->row_ref);
153 scm_gc_unprotect_object (ssi->stylesheet);
158 gnc_style_sheet_dialog_create (StyleSheetDialog * ss,
161 GtkTreeRowReference *row_ref)
163 SCM get_options = scm_c_eval_string (
"gnc:html-style-sheet-options");
165 SCM scm_dispatch = scm_call_1 (get_options, sheet_info);
168 GtkWindow * parent = GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(ss->list_view)));
170 title = g_strdup_printf(_(
"HTML Style Sheet Properties: %s"), name);
172 ssinfo->odb = gnc_get_optiondb_from_dispatcher(scm_dispatch);
173 ssinfo->stylesheet = sheet_info;
174 ssinfo->row_ref = row_ref;
177 scm_gc_protect_object (ssinfo->stylesheet);
178 g_object_ref (ssinfo->odialog->get_widget());
180 ssinfo->odialog->build_contents(ssinfo->odb);
182 ssinfo->odialog->set_apply_cb(gnc_style_sheet_options_apply_cb, ssinfo);
183 ssinfo->odialog->set_close_cb(gnc_style_sheet_options_close_cb, ssinfo);
184 ssinfo->odialog->set_style_sheet_help_cb();
185 auto window = ssinfo->odialog->get_widget();
186 gtk_window_set_transient_for (GTK_WINDOW(window),
187 GTK_WINDOW(gnc_style_sheet_dialog->toplevel));
188 gtk_window_set_destroy_with_parent (GTK_WINDOW(window), TRUE);
189 gtk_window_present (GTK_WINDOW(window));
194 gnc_style_sheet_new (StyleSheetDialog * ssd)
196 SCM make_ss = scm_c_eval_string (
"gnc:make-html-style-sheet");
197 SCM templates = scm_c_eval_string (
"(gnc:get-html-templates)");
198 SCM t_name = scm_c_eval_string (
"gnc:html-style-sheet-template-name");
199 SCM new_ss = SCM_BOOL_F;
200 GtkWidget * template_combo;
201 GtkTreeModel * template_model;
203 GtkWidget * name_entry;
205 GList * template_names = NULL;
208 GtkBuilder * builder;
211 builder = gtk_builder_new ();
212 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"template_liststore");
213 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"new_style_sheet_dialog");
215 dlg = GTK_WIDGET(gtk_builder_get_object (builder,
"new_style_sheet_dialog"));
216 template_combo = GTK_WIDGET(gtk_builder_get_object (builder,
"template_combobox"));
217 name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
220 gtk_widget_set_name (GTK_WIDGET(dlg),
"gnc-id-style-sheet-new");
221 gnc_widget_style_context_add_class (GTK_WIDGET(dlg),
"gnc-class-style-sheets");
225 template_model = gtk_combo_box_get_model (GTK_COMBO_BOX(template_combo));
228 for (; !scm_is_null (templates); templates = SCM_CDR(templates))
232 SCM t = SCM_CAR(templates);
233 orig_name = gnc_scm_call_1_to_string (t_name, t);
236 template_names = g_list_prepend (template_names, (gpointer)orig_name);
239 gtk_list_store_append (GTK_LIST_STORE(template_model), &iter);
240 gtk_list_store_set (GTK_LIST_STORE(template_model), &iter, 0, _(orig_name), -1);
244 gtk_combo_box_set_active (GTK_COMBO_BOX(template_combo), 0);
247 gtk_window_set_transient_for (GTK_WINDOW(dlg), GTK_WINDOW(ssd->toplevel));
248 dialog_retval = gtk_dialog_run (GTK_DIALOG(dlg));
250 if (dialog_retval == GTK_RESPONSE_OK)
252 gint choice = gtk_combo_box_get_active (GTK_COMBO_BOX(template_combo));
253 auto template_str{
static_cast<const char *
>(g_list_nth_data (template_names, choice))};
254 const char *name_str = gtk_entry_get_text(GTK_ENTRY(name_entry));
255 if (name_str && strlen(name_str) == 0)
259 gnc_error_dialog (GTK_WINDOW(ssd->toplevel),
"%s", _(
"You must provide a name for the new style sheet."));
262 if (template_str && name_str)
264 new_ss = scm_call_2 (make_ss,
265 scm_from_utf8_string (template_str),
266 scm_from_utf8_string (name_str));
270 g_list_free_full (template_names, g_free);
272 g_object_unref (G_OBJECT(builder));
274 gtk_widget_destroy (dlg);
282 gnc_style_sheet_select_dialog_add_one (StyleSheetDialog * ss,
290 get_name = scm_c_eval_string (
"gnc:html-style-sheet-name");
291 c_name = gnc_scm_call_1_to_string (get_name, sheet_info);
296 scm_gc_protect_object (sheet_info);
297 gtk_list_store_append (ss->list_store, &iter);
298 gtk_list_store_set (ss->list_store, &iter,
300 COLUMN_NAME, _(c_name),
301 COLUMN_STYLESHEET, sheet_info,
309 GtkTreeSelection * selection = gtk_tree_view_get_selection (ss->list_view);
310 gtk_tree_selection_select_iter (selection, &iter);
315 gnc_style_sheet_select_dialog_fill (StyleSheetDialog * ss)
317 SCM stylesheets = scm_c_eval_string (
"(gnc:get-html-style-sheets)");
321 for (; !scm_is_null (stylesheets); stylesheets = SCM_CDR(stylesheets))
323 sheet_info = SCM_CAR(stylesheets);
324 gnc_style_sheet_select_dialog_add_one (ss, sheet_info, FALSE);
329 gnc_style_sheet_select_dialog_event_cb (GtkWidget *widget,
333 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
335 g_return_if_fail (event != NULL);
336 g_return_if_fail (ss != NULL);
338 if (event->type != GDK_2BUTTON_PRESS)
342 gnc_style_sheet_select_dialog_edit_cb (NULL, ss);
346 gnc_style_sheet_select_dialog_new_cb (GtkWidget *widget, gpointer user_data)
348 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
351 sheet_info = gnc_style_sheet_new (ss);
352 if (sheet_info == SCM_BOOL_F)
355 gnc_style_sheet_select_dialog_add_one (ss, sheet_info, TRUE);
358 gnc_style_sheet_select_dialog_edit_cb (NULL, ss);
362 gnc_style_sheet_select_dialog_edit_cb (GtkWidget *widget, gpointer user_data)
364 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
365 GtkTreeSelection * selection = gtk_tree_view_get_selection (ss->list_view);
366 GtkTreeModel * model;
369 if (gtk_tree_selection_get_selected (selection, &model, &iter))
371 GtkTreeRowReference * row_ref;
378 gtk_tree_model_get (model, &iter,
380 COLUMN_STYLESHEET, &sheet_info,
383 path = gtk_tree_model_get_path (GTK_TREE_MODEL(ss->list_store), &iter);
384 row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL(ss->list_store), path);
385 ssinfo = gnc_style_sheet_dialog_create (ss, name, sheet_info, row_ref);
386 gtk_list_store_set (ss->list_store, &iter,
387 COLUMN_DIALOG, ssinfo,
389 gtk_tree_path_free (path);
395 gnc_style_sheet_select_dialog_delete_cb (GtkWidget *widget, gpointer user_data)
397 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
398 GtkTreeSelection * selection = gtk_tree_view_get_selection (ss->list_view);
399 GtkTreeModel * model;
402 if (gtk_tree_selection_get_selected (selection, &model, &iter))
409 gtk_tree_model_get (model, &iter,
410 COLUMN_STYLESHEET, &sheet_info,
411 COLUMN_DIALOG, &ssinfo,
413 gtk_list_store_remove (ss->list_store, &iter);
416 gnc_style_sheet_options_close_cb (NULL, ssinfo);
417 remover = scm_c_eval_string (
"gnc:html-style-sheet-remove");
418 scm_call_1 (remover, sheet_info);
419 scm_gc_unprotect_object (sheet_info);
424 gnc_style_sheet_select_dialog_close_cb (GtkWidget *widget, gpointer user_data)
426 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
427 gnc_close_gui_component (ss->component_id);
431 gnc_style_sheet_select_dialog_delete_event_cb (GtkWidget *widget,
435 auto ss{
static_cast<StyleSheetDialog*
>(user_data)};
436 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ss->toplevel));
441 gnc_style_sheet_select_dialog_destroy_cb (GtkWidget *widget, gpointer user_data)
443 StyleSheetDialog *ss = (StyleSheetDialog *)user_data;
448 gnc_unregister_gui_component (ss->component_id);
450 g_object_unref (ss->list_store);
453 gtk_widget_destroy (ss->toplevel);
456 gnc_style_sheet_dialog = NULL;
461 gnc_style_sheet_window_close_handler (gpointer user_data)
463 StyleSheetDialog *ss = (StyleSheetDialog *)user_data;
464 g_return_if_fail (ss);
466 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ss->toplevel));
467 gtk_widget_destroy (ss->toplevel);
471 gnc_style_sheet_select_dialog_check_escape_cb (GtkWidget *widget,
475 if (event->keyval == GDK_KEY_Escape)
477 StyleSheetDialog * ss = (StyleSheetDialog *)user_data;
478 gnc_close_gui_component (ss->component_id);
484 static StyleSheetDialog *
485 gnc_style_sheet_select_dialog_create (GtkWindow *parent)
487 StyleSheetDialog * ss = g_new0 (StyleSheetDialog, 1);
488 GtkBuilder * builder;
489 GtkCellRenderer * renderer;
490 GtkTreeSelection * selection;
492 builder = gtk_builder_new ();
493 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"select_style_sheet_window");
495 ss->toplevel = GTK_WIDGET(gtk_builder_get_object (builder,
"select_style_sheet_window"));
497 ss->session = gnc_get_current_session ();
500 gtk_widget_set_name (GTK_WIDGET(ss->toplevel),
"gnc-id-style-sheet-select");
501 gnc_widget_style_context_add_class (GTK_WIDGET(ss->toplevel),
"gnc-class-style-sheets");
503 ss->list_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"style_sheet_list_view"));
504 ss->list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
505 gtk_tree_view_set_model (ss->list_view, GTK_TREE_MODEL(ss->list_store));
507 renderer = gtk_cell_renderer_text_new ();
508 gtk_tree_view_insert_column_with_attributes (ss->list_view, -1,
509 _(
"Style Sheet Name"), renderer,
513 selection = gtk_tree_view_get_selection (ss->list_view);
514 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
516 g_signal_connect (ss->list_view,
"event-after",
517 G_CALLBACK(gnc_style_sheet_select_dialog_event_cb), ss);
519 g_signal_connect (ss->toplevel,
"destroy",
520 G_CALLBACK(gnc_style_sheet_select_dialog_destroy_cb), ss);
522 g_signal_connect (ss->toplevel,
"delete-event",
523 G_CALLBACK(gnc_style_sheet_select_dialog_delete_event_cb), ss);
525 g_signal_connect (ss->toplevel,
"key-press-event",
526 G_CALLBACK(gnc_style_sheet_select_dialog_check_escape_cb), ss);
528 gnc_style_sheet_select_dialog_fill (ss);
530 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ss);
531 g_object_unref (G_OBJECT(builder));
536 gnc_style_sheet_dialog_open (GtkWindow *parent)
538 if (gnc_style_sheet_dialog)
539 gtk_window_present (GTK_WINDOW(gnc_style_sheet_dialog->toplevel));
542 gnc_style_sheet_dialog =
543 gnc_style_sheet_select_dialog_create (parent);
546 gnc_style_sheet_dialog->component_id =
547 gnc_register_gui_component (DIALOG_STYLE_SHEETS_CM_CLASS,
549 gnc_style_sheet_window_close_handler,
550 gnc_style_sheet_dialog);
552 gnc_gui_component_set_session (gnc_style_sheet_dialog->component_id,
553 gnc_style_sheet_dialog->session);
555 gnc_restore_window_size (GNC_PREFS_GROUP,
556 GTK_WINDOW(gnc_style_sheet_dialog->toplevel),
558 gtk_widget_show_all (gnc_style_sheet_dialog->toplevel);
Holds all of the options for a book, report, or stylesheet, organized by GncOptionSections.
C public interface for the Options Database.
void gnc_option_db_destroy(GncOptionDB *odb)
Destruct and release a GncOptionDB.
Gnome specific utility functions.
GList * gnc_option_db_commit(GncOptionDB *odb)
Write all changed ui_item values to their options.