28 #include <glib/gi18n.h>
30 #include "dialog-report-style-sheet.h"
31 #include "dialog-options.h"
32 #include "dialog-utils.h"
34 #include "gnc-guile-utils.h"
35 #include "gnc-report.h"
43 GtkTreeView * list_view;
44 GtkListStore * list_store;
45 GtkWidget * options_frame;
53 GtkTreeRowReference *row_ref;
70 dirty_same_stylesheet(gpointer key, gpointer val, gpointer data)
77 func = scm_c_eval_string(
"gnc:report-stylesheet");
78 if (scm_is_procedure(func))
79 rep_ss = scm_call_1(func, report);
83 if (scm_is_true(scm_eq_p(rep_ss, dirty_ss)))
85 func = scm_c_eval_string(
"gnc:report-set-dirty?!");
87 if (scm_is_procedure(func))
88 scm_call_2(func, report, SCM_BOOL_T);
93 gnc_style_sheet_options_apply_cb(
GNCOptionWin * propertybox,
97 GHashTable *reports = NULL;
100 reports = gnc_reports_get_global();
102 g_hash_table_foreach(reports, dirty_same_stylesheet, ssi->stylesheet);
104 gnc_option_db_commit(ssi->odb);
109 gnc_style_sheet_options_close_cb(
GNCOptionWin * propertybox,
115 if (gtk_tree_row_reference_valid (ssi->row_ref))
118 GtkTreePath *path = gtk_tree_row_reference_get_path (ssi->row_ref);
119 if (gtk_tree_model_get_iter (GTK_TREE_MODEL(ss->list_store), &iter, path))
120 gtk_list_store_set (ss->list_store, &iter,
123 gtk_tree_path_free(path);
125 gtk_tree_row_reference_free (ssi->row_ref);
126 gnc_options_dialog_destroy(ssi->odialog);
127 gnc_option_db_destroy(ssi->odb);
128 scm_gc_unprotect_object(ssi->stylesheet);
137 GtkTreeRowReference *row_ref)
139 SCM get_options = scm_c_eval_string(
"gnc:html-style-sheet-options");
141 SCM scm_options = scm_call_1(get_options, sheet_info);
146 title = g_strdup_printf(_(
"HTML Style Sheet Properties: %s"), name);
147 ssinfo->odialog = gnc_options_dialog_new(title);
148 ssinfo->odb = gnc_option_db_new(scm_options);
149 ssinfo->stylesheet = sheet_info;
150 ssinfo->row_ref = row_ref;
153 scm_gc_protect_object(ssinfo->stylesheet);
154 g_object_ref(gnc_options_dialog_widget(ssinfo->odialog));
156 gnc_options_dialog_build_contents(ssinfo->odialog,
158 gnc_options_dialog_set_apply_cb(ssinfo->odialog,
159 gnc_style_sheet_options_apply_cb,
161 gnc_options_dialog_set_close_cb(ssinfo->odialog,
162 gnc_style_sheet_options_close_cb,
164 window = gnc_options_dialog_widget(ssinfo->odialog);
165 gtk_window_set_transient_for(GTK_WINDOW(window),
166 GTK_WINDOW(gnc_style_sheet_dialog->toplevel));
167 gtk_window_set_destroy_with_parent(GTK_WINDOW(window), TRUE);
168 gtk_window_present(GTK_WINDOW(window));
177 SCM make_ss = scm_c_eval_string(
"gnc:make-html-style-sheet");
178 SCM templates = scm_c_eval_string(
"(gnc:get-html-templates)");
179 SCM t_name = scm_c_eval_string(
"gnc:html-style-sheet-template-name");
180 SCM new_ss = SCM_BOOL_F;
181 GtkWidget * template_combo;
182 GtkTreeModel * template_model;
184 GtkWidget * name_entry;
186 GList *template_names = NULL;
192 builder = gtk_builder_new();
193 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"template_liststore");
194 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"New Style Sheet Dialog");
196 dlg = GTK_WIDGET(gtk_builder_get_object (builder,
"New Style Sheet Dialog"));
197 template_combo = GTK_WIDGET(gtk_builder_get_object (builder,
"template_combobox"));
198 name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
203 template_model = gtk_combo_box_get_model(GTK_COMBO_BOX(template_combo));
204 gtk_list_store_clear(GTK_LIST_STORE(template_model));
207 for (; !scm_is_null(templates); templates = SCM_CDR(templates))
211 SCM t = SCM_CAR(templates);
212 orig_name = gnc_scm_call_1_to_string(t_name, t);
215 template_names = g_list_prepend (template_names, (gpointer)orig_name);
218 gtk_list_store_append(GTK_LIST_STORE(template_model), &iter);
219 gtk_list_store_set (GTK_LIST_STORE(template_model), &iter, 0, _(orig_name), -1);
223 gtk_combo_box_set_active(GTK_COMBO_BOX(template_combo), 0);
226 gtk_window_set_transient_for (GTK_WINDOW(dlg), GTK_WINDOW(ssd->toplevel));
227 dialog_retval = gtk_dialog_run(GTK_DIALOG(dlg));
229 if (dialog_retval == GTK_RESPONSE_OK)
231 gint choice = gtk_combo_box_get_active (GTK_COMBO_BOX(template_combo));
232 const char *template_str = g_list_nth_data (template_names, choice);
233 const char *name_str = gtk_entry_get_text(GTK_ENTRY(name_entry));
234 if (name_str && strlen(name_str) == 0)
238 gnc_error_dialog (ssd->toplevel,
"%s", _(
"You must provide a name for the new style sheet."));
241 if (template_str && name_str)
243 new_ss = scm_call_2(make_ss,
244 scm_from_utf8_string(template_str),
245 scm_from_utf8_string(name_str));
249 g_list_free_full (template_names, g_free);
251 g_object_unref(G_OBJECT(builder));
253 gtk_widget_destroy(dlg);
268 GtkTreeSelection *selection;
271 get_name = scm_c_eval_string (
"gnc:html-style-sheet-name");
272 c_name = gnc_scm_call_1_to_string (get_name, sheet_info);
277 scm_gc_protect_object (sheet_info);
278 gtk_list_store_append (ss->list_store, &iter);
279 gtk_list_store_set (ss->list_store, &iter,
281 COLUMN_NAME, _(c_name),
282 COLUMN_STYLESHEET, sheet_info,
290 selection = gtk_tree_view_get_selection (ss->list_view);
291 gtk_tree_selection_select_iter (selection, &iter);
298 SCM stylesheets = scm_c_eval_string(
"(gnc:get-html-style-sheets)");
302 for (; !scm_is_null(stylesheets); stylesheets = SCM_CDR(stylesheets))
304 sheet_info = SCM_CAR(stylesheets);
305 gnc_style_sheet_select_dialog_add_one(ss, sheet_info, FALSE);
310 gnc_style_sheet_select_dialog_response_cb (GtkDialog *unused,
315 GtkTreeSelection * selection;
316 GtkTreeRowReference * row_ref;
317 GtkTreeModel * model;
328 case GNC_RESPONSE_NEW:
329 sheet_info = gnc_style_sheet_new(ss);
330 if (sheet_info == SCM_BOOL_F)
332 gnc_style_sheet_select_dialog_add_one(ss, sheet_info, TRUE);
335 case GNC_RESPONSE_EDIT:
336 selection = gtk_tree_view_get_selection (ss->list_view);
337 if (gtk_tree_selection_get_selected (selection, &model, &iter))
339 gtk_tree_model_get (model, &iter,
341 COLUMN_STYLESHEET, &sheet_info,
344 path = gtk_tree_model_get_path (GTK_TREE_MODEL(ss->list_store), &iter);
345 row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL(ss->list_store), path);
346 ssinfo = gnc_style_sheet_dialog_create(ss, name, sheet_info, row_ref);
347 gtk_list_store_set (ss->list_store, &iter,
348 COLUMN_DIALOG, ssinfo,
354 case GNC_RESPONSE_DELETE:
355 selection = gtk_tree_view_get_selection (ss->list_view);
356 if (gtk_tree_selection_get_selected (selection, &model, &iter))
358 gtk_tree_model_get (model, &iter,
359 COLUMN_STYLESHEET, &sheet_info,
360 COLUMN_DIALOG, &ssinfo,
362 gtk_list_store_remove (ss->list_store, &iter);
365 gnc_style_sheet_options_close_cb(NULL, ssinfo);
366 remover = scm_c_eval_string(
"gnc:html-style-sheet-remove");
367 scm_call_1(remover, sheet_info);
368 scm_gc_unprotect_object(sheet_info);
372 case GTK_RESPONSE_CLOSE:
374 gnc_style_sheet_dialog = NULL;
375 gtk_widget_destroy(ss->toplevel);
383 gnc_style_sheet_select_dialog_event_cb (GtkWidget *widget,
389 g_return_if_fail(event != NULL);
390 g_return_if_fail(ss != NULL);
392 if (event->type != GDK_2BUTTON_PRESS)
396 gnc_style_sheet_select_dialog_response_cb (NULL, GNC_RESPONSE_EDIT, ss);
401 gnc_style_sheet_select_dialog_create(
void)
404 GtkBuilder * builder;
405 GtkCellRenderer * renderer;
406 GtkTreeSelection * selection;
408 builder = gtk_builder_new();
409 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"Select Style Sheet Dialog");
411 ss->toplevel = GTK_WIDGET(gtk_builder_get_object (builder,
"Select Style Sheet Dialog"));
413 ss->list_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"style_sheet_list_view"));
414 ss->list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
415 gtk_tree_view_set_model(ss->list_view, GTK_TREE_MODEL(ss->list_store));
416 g_object_unref(ss->list_store);
417 renderer = gtk_cell_renderer_text_new ();
418 gtk_tree_view_insert_column_with_attributes(ss->list_view, -1,
419 _(
"Style Sheet Name"), renderer,
423 selection = gtk_tree_view_get_selection (ss->list_view);
424 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
426 g_signal_connect(ss->toplevel,
"response",
427 G_CALLBACK(gnc_style_sheet_select_dialog_response_cb), ss);
428 g_signal_connect(ss->list_view,
"event-after",
429 G_CALLBACK(gnc_style_sheet_select_dialog_event_cb), ss);
431 gnc_style_sheet_select_dialog_fill(ss);
433 gtk_widget_show_all(ss->toplevel);
435 g_object_unref(G_OBJECT(builder));
442 gnc_style_sheet_dialog_open(
void)
444 if (gnc_style_sheet_dialog)
446 gtk_window_present(GTK_WINDOW(gnc_style_sheet_dialog->toplevel));
450 gnc_style_sheet_dialog =
451 gnc_style_sheet_select_dialog_create();