43 #include <glib/gi18n.h> 44 #include <glib/gstdio.h> 52 #include "dialog-utils.h" 53 #include "gnc-component-manager.h" 56 #include "gnc-guile-utils.h" 57 #include "gnc-html-history.h" 59 #include "gnc-html-factory.h" 66 #include "gnc-report.h" 67 #include "gnc-session.h" 71 #include "option-util.h" 72 #include "window-report.h" 73 #include "swig-runtime.h" 74 #include "guile-mappings.h" 75 #include "business-options.h" 76 #include "gnc-icons.h" 83 static QofLogModule log_module = GNC_MOD_GUI;
85 static GObjectClass *parent_class = NULL;
91 static GHashTable *static_report_printnames = NULL;
104 gint component_manager_id;
110 SCM option_change_cb_id;
116 GNCOptionDB * initial_odb;
117 SCM name_change_cb_id;
135 G_DEFINE_TYPE_WITH_PRIVATE(
GncPluginPageReport, gnc_plugin_page_report, GNC_TYPE_PLUGIN_PAGE)
137 #define GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(o) \ 138 ((GncPluginPageReportPrivate*)g_type_instance_get_private((GTypeInstance*)o, GNC_TYPE_PLUGIN_PAGE_REPORT)) 142 static GObject *gnc_plugin_page_report_constructor(GType this_type, guint n_properties, GObjectConstructParam *properties);
143 static void gnc_plugin_page_report_finalize (GObject *
object);
144 static void gnc_plugin_page_report_setup(
GncPluginPage *ppage );
146 static void gnc_plugin_page_report_constr_init(
GncPluginPageReport *plugin_page, gint reportId);
148 static GtkWidget* gnc_plugin_page_report_create_widget(
GncPluginPage *plugin_page );
149 static void gnc_plugin_page_report_destroy_widget(
GncPluginPage *plugin_page );
150 static void gnc_plugin_page_report_save_page (
GncPluginPage *plugin_page, GKeyFile *file,
const gchar *group);
151 static GncPluginPage *gnc_plugin_page_report_recreate_page (GtkWidget *window, GKeyFile *file,
const gchar *group);
152 static void gnc_plugin_page_report_name_changed (
GncPluginPage *page,
const gchar *name);
153 static void gnc_plugin_page_report_update_edit_menu (
GncPluginPage *page, gboolean hide);
154 static gboolean gnc_plugin_page_report_finish_pending (
GncPluginPage *page);
155 static void gnc_plugin_page_report_load_uri (
GncPluginPage *page);
157 static int gnc_plugin_page_report_check_urltype(URLType t);
159 static void gnc_plugin_page_report_load_cb(GncHtml * html, URLType type,
160 const gchar * location,
const gchar * label,
162 static void gnc_plugin_page_report_refresh (gpointer data);
163 static void gnc_plugin_page_report_set_fwd_button(
GncPluginPageReport * page,
int enabled);
164 static void gnc_plugin_page_report_set_back_button(
GncPluginPageReport * page,
int enabled);
165 static void gnc_plugin_page_report_history_destroy_cb(gnc_html_history_node * node, gpointer user_data);
166 static void close_handler(gpointer user_data);
168 static void gnc_plugin_page_report_option_change_cb(gpointer data);
172 void gnc_plugin_page_report_raise_editor(SCM report);
179 static void gnc_plugin_page_report_save_as_cb(GtkAction *action,
GncPluginPageReport *rep);
181 static void gnc_plugin_page_report_options_cb(GtkAction *action,
GncPluginPageReport *rep);
183 static void gnc_plugin_page_report_exportpdf_cb(GtkAction *action,
GncPluginPageReport *rep);
187 gnc_plugin_page_report_get_property( GObject *obj,
195 rep = GNC_PLUGIN_PAGE_REPORT( obj );
196 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(rep);
201 g_value_set_int( value, priv->
reportId );
204 PERR(
"Unknown property id %d", prop_id );
210 gnc_plugin_page_report_set_property( GObject *obj,
218 rep = GNC_PLUGIN_PAGE_REPORT( obj );
219 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(rep);
221 DEBUG(
"setting property with id %d / %p to value %d",
222 prop_id, priv, g_value_get_int( value ) );
227 priv->
reportId = g_value_get_int( value );
230 PERR(
"unknown property id %d", prop_id );
241 gnc_plugin_page_report_focus_widget (
GncPluginPage *report_plugin_page)
243 if (GNC_IS_PLUGIN_PAGE_REPORT(report_plugin_page))
255 GtkWidget *widget = gnc_html_get_webview (priv->
html);
258 gnc_plugin_page_report_load_uri (report_plugin_page);
260 if (GTK_IS_WIDGET(widget))
262 if (!gtk_widget_is_focus (GTK_WIDGET(widget)))
263 gtk_widget_grab_focus (GTK_WIDGET(widget));
273 GObjectClass *object_class = G_OBJECT_CLASS (klass);
276 parent_class = g_type_class_peek_parent (klass);
278 object_class->constructor = gnc_plugin_page_report_constructor;
279 object_class->finalize = gnc_plugin_page_report_finalize;
281 object_class->set_property = gnc_plugin_page_report_set_property;
282 object_class->get_property = gnc_plugin_page_report_get_property;
284 gnc_plugin_page_class->
tab_icon = GNC_ICON_ACCOUNT_REPORT;
285 gnc_plugin_page_class->
plugin_name = GNC_PLUGIN_PAGE_REPORT_NAME;
287 gnc_plugin_page_class->
create_widget = gnc_plugin_page_report_create_widget;
288 gnc_plugin_page_class->
destroy_widget = gnc_plugin_page_report_destroy_widget;
289 gnc_plugin_page_class->
save_page = gnc_plugin_page_report_save_page;
290 gnc_plugin_page_class->
recreate_page = gnc_plugin_page_report_recreate_page;
293 gnc_plugin_page_class->
finish_pending = gnc_plugin_page_report_finish_pending;
297 g_object_class_install_property( object_class,
299 g_param_spec_int(
"report-id",
300 _(
"The numeric ID of the report."),
301 _(
"The numeric ID of the report."),
302 -1, G_MAXINT, -1, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE ) );
317 if (!static_report_printnames)
318 static_report_printnames = g_hash_table_new_full(g_str_hash,
319 g_str_equal, g_free, NULL);
323 gnc_plugin_page_report_finalize (GObject *
object)
325 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REPORT (
object));
327 ENTER(
"object %p",
object);
328 G_OBJECT_CLASS (parent_class)->finalize (
object);
333 gnc_plugin_page_report_set_progressbar (
GncPluginPage *page, gboolean
set)
335 GtkWidget *progressbar;
336 GtkAllocation allocation;
338 progressbar = gnc_window_get_progressbar (GNC_WINDOW(page->
window));
339 gtk_widget_get_allocation (GTK_WIDGET(progressbar), &allocation);
343 gtk_widget_set_size_request (GTK_WIDGET(progressbar), -1, allocation.height);
345 gtk_widget_set_size_request (GTK_WIDGET(progressbar), -1, -1);
356 char * url_location = NULL;
357 char * url_label = NULL;
359 report = GNC_PLUGIN_PAGE_REPORT(page);
360 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
365 id_name = g_strdup_printf(
"id=%d", priv->
reportId );
366 child_name = gnc_build_url( URL_TYPE_REPORT, id_name, NULL );
367 type = gnc_html_parse_url( priv->
html, child_name, &url_location, &url_label);
368 DEBUG(
"passing id_name=[%s] child_name=[%s] type=[%s], location=[%s], label=[%s]",
369 id_name, child_name ? child_name :
"(null)",
370 type ? type :
"(null)", url_location ? url_location :
"(null)",
371 url_label ? url_label :
"(null)" );
376 gtk_widget_show_all( GTK_WIDGET(priv->
container) );
381 gnc_window_set_progressbar_window( GNC_WINDOW(page->
window) );
384 gnc_plugin_page_report_set_progressbar( page, TRUE );
386 gnc_html_show_url(priv->
html, type, url_location, url_label, 0);
387 g_free(url_location);
389 gnc_plugin_page_report_set_progressbar( page, FALSE );
392 gnc_window_set_progressbar_window( NULL );
397 webkit_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
401 GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask ();
407 if ((event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down ||
408 event->keyval == GDK_KEY_KP_Page_Up || event->keyval == GDK_KEY_KP_Page_Down)
409 && (event->state & modifiers) == (GDK_CONTROL_MASK | GDK_MOD1_MASK))
411 GtkNotebook *notebook = GTK_NOTEBOOK(gtk_widget_get_parent (GTK_WIDGET(priv->
container)));
412 gint pages = gtk_notebook_get_n_pages (notebook);
413 gint current_page = gtk_notebook_get_current_page (notebook);
415 if (event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_KP_Page_Up)
417 if (current_page == 0)
418 gtk_notebook_set_current_page (notebook, pages - 1);
420 gtk_notebook_prev_page (notebook);
424 if (pages == current_page + 1)
425 gtk_notebook_set_current_page (notebook, 0);
427 gtk_notebook_next_page (notebook);
446 char * url_location = NULL;
447 char * url_label = NULL;
449 ENTER(
"page %p", page);
454 gtk_action_set_sensitive (action, FALSE);
455 gtk_action_set_visible (action, FALSE);
458 report = GNC_PLUGIN_PAGE_REPORT(page);
459 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
463 priv->
html = gnc_html_factory_create_html();
464 gnc_html_set_parent( priv->
html, topLvl );
465 priv->loaded = FALSE;
467 gnc_html_history_set_node_destroy_cb(gnc_html_get_history(priv->
html),
468 gnc_plugin_page_report_history_destroy_cb,
471 priv->
container = GTK_CONTAINER(gtk_frame_new(NULL));
472 gtk_frame_set_shadow_type(GTK_FRAME(priv->
container), GTK_SHADOW_NONE);
475 gtk_widget_set_name (GTK_WIDGET(priv->
container),
"gnc-id-report-page");
477 gtk_container_add(GTK_CONTAINER(priv->
container),
478 gnc_html_get_widget(priv->
html));
480 priv->component_manager_id =
481 gnc_register_gui_component(WINDOW_REPORT_CM_CLASS, NULL,
482 close_handler, page);
483 gnc_gui_component_set_session(priv->component_manager_id,
484 gnc_get_current_session());
486 gnc_html_set_urltype_cb(priv->
html, gnc_plugin_page_report_check_urltype);
487 gnc_html_set_load_cb(priv->
html, gnc_plugin_page_report_load_cb, report);
491 id_name = g_strdup_printf(
"id=%d", priv->
reportId );
492 child_name = gnc_build_url( URL_TYPE_REPORT, id_name, NULL );
493 type = gnc_html_parse_url( priv->
html, child_name, &url_location, &url_label);
495 gnc_plugin_page_report_load_cb (priv->
html, type, id_name, url_label, report);
499 g_free (url_location);
504 g_signal_connect (G_OBJECT(page),
"inserted",
509 webview = gnc_html_get_webview (priv->
html);
512 gtk_widget_add_events (webview, gtk_widget_get_events (webview) |
515 g_signal_connect (webview,
"key-press-event",
516 G_CALLBACK(webkit_key_press_event_cb),
520 gtk_widget_show_all( GTK_WIDGET(priv->
container) );
530 gnc_plugin_page_report_check_urltype(URLType t)
532 if (!g_strcmp0 (t, URL_TYPE_REPORT))
551 SCM set_needs_save = scm_c_eval_string(
"gnc:report-set-needs-save?!");
555 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
557 priv->initial_report = SCM_BOOL_F;
558 priv->edited_reports = SCM_EOL;
559 priv->name_change_cb_id = SCM_BOOL_F;
561 g_object_get( ppage,
"report-id", &report_id, NULL );
563 PINFO(
"report-id: %d\n", report_id);
567 if ((inst_report = gnc_report_find(report_id)) == SCM_BOOL_F)
572 if (priv->initial_report == SCM_BOOL_F)
574 priv->initial_report = inst_report;
575 scm_gc_protect_object(priv->initial_report);
579 PINFO(
"set needs save");
580 scm_call_2(set_needs_save, inst_report, SCM_BOOL_T);
589 gnc_plugin_page_report_load_cb(GncHtml * html, URLType type,
590 const gchar * location,
const gchar * label,
596 SCM get_options = scm_c_eval_string(
"gnc:report-options");
597 SCM set_needs_save = scm_c_eval_string(
"gnc:report-set-needs-save?!");
600 ENTER(
"load_cb: type=[%s], location=[%s], label=[%s]",
601 type ? type :
"(null)", location ? location :
"(null)",
602 label ? label :
"(null)" );
607 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
608 if (!g_strcmp0 (type, URL_TYPE_REPORT)
610 && (strlen(location) > 3)
611 && !strncmp(
"id=", location, 3))
613 report_id = atoi(location + 3);
614 DEBUG(
"parsed id=%d", report_id );
616 else if (!g_strcmp0( type, URL_TYPE_OPTIONS)
618 && (strlen(location) > 10)
619 && !strncmp(
"report-id=", location, 10))
621 report_id = atoi(location + 10);
622 inst_report = gnc_report_find(report_id);
623 if (inst_report != SCM_BOOL_F)
625 gnc_plugin_page_report_add_edited_report(priv, inst_report);
632 LEAVE(
" unknown URL type [%s] location [%s]", type, location );
638 if ((inst_report = gnc_report_find(report_id)) == SCM_BOOL_F)
640 LEAVE(
"error getting inst_report" );
644 if (priv->initial_report == SCM_BOOL_F)
646 priv->initial_report = inst_report;
647 scm_gc_protect_object(priv->initial_report);
649 DEBUG(
"calling set_needs_save for report with id=%d", report_id);
650 scm_call_2(set_needs_save, inst_report, SCM_BOOL_T);
652 priv->initial_odb = gnc_option_db_new(scm_call_1(get_options, inst_report));
653 priv->name_change_cb_id =
654 gnc_option_db_register_change_callback(priv->initial_odb,
655 gnc_plugin_page_report_refresh,
657 "General",
"Report name");
662 gnc_option_db_unregister_change_callback_id(priv->
cur_odb,
663 priv->option_change_cb_id);
664 gnc_option_db_destroy(priv->
cur_odb);
673 priv->
cur_odb = gnc_option_db_new(scm_call_1(get_options, inst_report));
674 priv->option_change_cb_id =
675 gnc_option_db_register_change_callback(priv->
cur_odb,
676 gnc_plugin_page_report_option_change_cb,
679 if (gnc_html_history_forward_p(gnc_html_get_history(priv->
html)))
681 gnc_plugin_page_report_set_fwd_button(report, TRUE);
685 gnc_plugin_page_report_set_fwd_button(report, FALSE);
688 if (gnc_html_history_back_p(gnc_html_get_history(priv->
html)))
690 gnc_plugin_page_report_set_back_button(report, TRUE);
694 gnc_plugin_page_report_set_back_button(report, FALSE);
713 gnc_plugin_page_report_option_change_cb(gpointer data)
718 SCM dirty_report = scm_c_eval_string(
"gnc:report-set-dirty?!");
719 const gchar *old_name;
722 g_return_if_fail(GNC_IS_PLUGIN_PAGE_REPORT(data));
723 report = GNC_PLUGIN_PAGE_REPORT(data);
724 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
725 page = GNC_PLUGIN_PAGE(report);
727 DEBUG(
"option_change" );
730 DEBUG(
"set-dirty, queue-draw" );
734 new_name = gnc_option_db_lookup_string_option(priv->
cur_odb,
"General",
735 "Report name", NULL);
736 if (strcmp(old_name, new_name) != 0)
741 ENTER(
"Cleaned-up new report name: %s", new_name);
747 scm_call_2(dirty_report, priv->
cur_report, SCM_BOOL_T);
750 priv->reloading = TRUE;
753 gnc_window_set_progressbar_window( GNC_WINDOW(page->
window) );
756 gnc_plugin_page_report_set_progressbar( page, TRUE );
759 gnc_html_reload( priv->
html, TRUE );
761 gnc_plugin_page_report_set_progressbar( page, FALSE );
764 gnc_window_set_progressbar_window( NULL );
766 priv->reloading = FALSE;
771 gnc_plugin_page_report_history_destroy_cb(gnc_html_history_node * node,
775 static SCM remover = SCM_BOOL_F;
778 if (remover == SCM_BOOL_F)
780 remover = scm_c_eval_string(
"gnc:report-remove-by-id");
784 && !g_strcmp0 (node->type, URL_TYPE_REPORT)\
785 && !strncmp(
"id=", node->location, 3))
787 sscanf(node->location + 3,
"%d", &report_id);
800 gnc_plugin_page_report_refresh(gpointer data)
803 DEBUG(
"report-refresh called" );
809 gnc_plugin_page_report_destroy_widget(
GncPluginPage *plugin_page)
815 PINFO(
"destroy widget");
816 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(plugin_page);
822 g_idle_remove_by_data (plugin_page);
824 if (priv->component_manager_id)
826 gnc_unregister_gui_component(priv->component_manager_id);
827 priv->component_manager_id = 0;
830 gnc_plugin_page_report_destroy(priv);
831 gnc_report_remove_by_id(priv->
reportId);
837 #define SCHEME_OPTIONS "SchemeOptions" 838 #define SCHEME_OPTIONS_N "SchemeOptions%d" 851 gnc_plugin_page_report_save_page (
GncPluginPage *plugin_page,
853 const gchar *group_name)
857 SCM gen_save_text, scm_text;
858 SCM get_embedded_list, embedded, item, tmp_report;
861 gchar *text, *key_name;
863 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REPORT(plugin_page));
864 g_return_if_fail (key_file != NULL);
865 g_return_if_fail (group_name != NULL);
867 ENTER(
"page %p, key_file %p, group_name %s", plugin_page, key_file,
870 report = GNC_PLUGIN_PAGE_REPORT(plugin_page);
871 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
876 LEAVE(
"not saving invalid report");
880 gen_save_text = scm_c_eval_string(
"gnc:report-serialize");
881 get_embedded_list = scm_c_eval_string(
"gnc:report-embedded-list");
882 get_options = scm_c_eval_string(
"gnc:report-options");
883 embedded = scm_call_1(get_embedded_list, scm_call_1(get_options, priv->
cur_report));
884 count = scm_ilength(embedded);
887 item = SCM_CAR(embedded);
888 embedded = SCM_CDR(embedded);
889 if (!scm_is_number(item))
891 id = scm_to_int (item);
892 tmp_report = gnc_report_find(
id);
893 scm_text = scm_call_1(gen_save_text, tmp_report);
894 if (!scm_is_string (scm_text))
896 DEBUG(
"child report %d: nothing to save",
id);
900 key_name = g_strdup_printf(SCHEME_OPTIONS_N,
id);
901 text = gnc_scm_strip_comments(scm_text);
902 g_key_file_set_value(key_file, group_name, key_name, text);
907 scm_text = scm_call_1(gen_save_text, priv->
cur_report);
908 if (!scm_is_string (scm_text))
910 LEAVE(
"nothing to save");
914 text = gnc_scm_strip_comments(scm_text);
931 gnc_plugin_page_report_recreate_page (GtkWidget *window,
933 const gchar *group_name)
938 GError *error = NULL;
939 gchar *option_string;
941 SCM scm_id, final_id = SCM_BOOL_F;
944 g_return_val_if_fail(key_file, NULL);
945 g_return_val_if_fail(group_name, NULL);
946 ENTER(
"key_file %p, group_name %s", key_file, group_name);
948 keys = g_key_file_get_keys(key_file, group_name, &num_keys, &error);
951 g_warning(
"error reading group %s key list: %s",
952 group_name, error->message);
958 for (i = 0; i < num_keys; i++)
962 option_string = g_key_file_get_value(key_file, group_name,
966 g_warning(
"error reading group %s key %s: %s",
967 group_name, keys[i], error->message);
973 scm_id = scm_eval_string(scm_from_utf8_string(option_string));
974 g_free(option_string);
976 if (!scm_integer_p(scm_id))
978 DEBUG(
"report id not an integer for key %s", keys[i]);
983 if (final_id == SCM_BOOL_F)
993 if (final_id == SCM_BOOL_F)
995 LEAVE(
"report not specified");
999 report_id = scm_to_int(final_id);
1000 report = gnc_report_find(report_id);
1003 LEAVE(
"report doesn't exist");
1025 gnc_plugin_page_report_name_changed (
GncPluginPage *page,
const gchar *name)
1028 const gchar *old_name;
1030 g_return_if_fail(GNC_IS_PLUGIN_PAGE_REPORT(page));
1031 g_return_if_fail(name != NULL);
1033 ENTER(
"page %p, name %s", page, name);
1034 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(page);
1037 old_name = gnc_option_db_lookup_string_option(priv->
cur_odb,
"General",
1038 "Report name", NULL);
1039 DEBUG(
"Comparing old name '%s' to new name '%s'",
1040 old_name ? old_name :
"(null)", name);
1041 if (old_name && (strcmp(old_name, name) == 0))
1048 gnc_option_db_set_string_option(priv->
cur_odb,
"General",
1049 "Report name", name);
1052 gnc_plugin_page_report_option_change_cb(page);
1057 gnc_plugin_page_report_update_edit_menu (
GncPluginPage *page, gboolean hide)
1062 gtk_action_set_sensitive (action, TRUE);
1063 gtk_action_set_visible (action, TRUE);
1065 gtk_action_set_sensitive (action, FALSE);
1066 gtk_action_set_visible (action, !hide);
1068 gtk_action_set_sensitive (action, FALSE);
1069 gtk_action_set_visible (action, !hide);
1078 report = GNC_PLUGIN_PAGE_REPORT(page);
1079 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1080 return !priv->reloading;
1091 SCM get_editor = scm_c_eval_string(
"gnc:report-editor-widget");
1092 SCM set_editor = scm_c_eval_string(
"gnc:report-set-editor-widget!");
1096 for (edited = scm_list_copy(priv->edited_reports); !scm_is_null(edited);
1097 edited = SCM_CDR(edited))
1099 editor = scm_call_1(get_editor, SCM_CAR(edited));
1100 scm_call_2(set_editor, SCM_CAR(edited), SCM_BOOL_F);
1101 if (editor != SCM_BOOL_F)
1103 GtkWidget *w = NULL;
1104 #define FUNC_NAME "gtk_widget_destroy" 1105 w = SWIG_MustGetPtr(editor,
1106 SWIG_TypeQuery(
"_p_GtkWidget"), 1, 0);
1108 gtk_widget_destroy(GTK_WIDGET(w));
1112 if (priv->initial_odb)
1114 gnc_option_db_unregister_change_callback_id(priv->initial_odb,
1115 priv->name_change_cb_id);
1117 gnc_option_db_destroy(priv->initial_odb);
1118 priv->initial_odb = NULL;
1121 gnc_html_destroy(priv->
html);
1128 if (priv->edited_reports != SCM_EOL)
1129 scm_gc_unprotect_object(priv->edited_reports);
1135 {
"FilePrintAction", N_(
"Print") },
1136 {
"ReportExportAction", N_(
"Export") },
1137 {
"ReportOptionsAction", N_(
"Options") },
1140 {
"ReportSaveAction", N_(
"Save Config") },
1143 {
"ReportSaveAsAction", N_(
"Save Config As...") },
1144 {
"FilePrintPDFAction", N_(
"Make Pdf") },
1148 static const gchar *initially_insensitive_actions[] =
1159 gnc_plugin_page_report_constructor(GType this_type, guint n_properties, GObjectConstructParam *properties)
1163 GObjectClass *parent_class;
1164 gint reportId = -42;
1167 our_class = GNC_PLUGIN_PAGE_REPORT_CLASS (
1168 g_type_class_peek (GNC_TYPE_PLUGIN_PAGE_REPORT));
1169 parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (our_class));
1170 obj = parent_class->constructor(this_type, n_properties, properties);
1172 for (i = 0; i < n_properties; i++)
1174 GObjectConstructParam prop = properties[i];
1175 if (strcmp(prop.pspec->name,
"report-id") == 0)
1177 reportId = g_value_get_int(prop.value);
1181 gnc_plugin_page_report_constr_init(GNC_PLUGIN_PAGE_REPORT(obj), reportId);
1190 GtkActionGroup *action_group;
1195 gchar *report_save_str = g_strdup_printf (
1196 _(
"Update the current report's saved configuration. " 1197 "The report configuration will be saved in the file %s."), saved_reports_path);
1198 gchar *report_saveas_str = g_strdup_printf (
1199 _(
"Add the current report's configuration to the 'Reports->Saved Report Configurations' menu. " 1200 "The report configuration will be saved in the file %s."), saved_reports_path);
1202 GtkActionEntry report_actions[] =
1205 "FilePrintAction",
"document-print", N_(
"_Print Report..."),
"<primary>p",
1206 N_(
"Print the current report"),
1207 G_CALLBACK(gnc_plugin_page_report_print_cb)
1210 "FilePrintPDFAction", GNC_ICON_PDF_EXPORT, N_(
"Export as P_DF..."), NULL,
1211 N_(
"Export the current report as a PDF document"),
1212 G_CALLBACK(gnc_plugin_page_report_exportpdf_cb)
1216 "EditCutAction",
"edit-cut", N_(
"Cu_t"),
"<primary>X",
1217 N_(
"Cut the current selection and copy it to clipboard"),
1221 "EditCopyAction",
"edit-copy", N_(
"_Copy"),
"<primary>C",
1222 N_(
"Copy the current selection to clipboard"),
1223 G_CALLBACK(gnc_plugin_page_report_copy_cb)
1226 "EditPasteAction",
"edit-paste", N_(
"_Paste"),
"<primary>V",
1227 N_(
"Paste the clipboard content at the cursor position"),
1231 "ViewRefreshAction",
"view-refresh", N_(
"_Refresh"),
"<primary>r",
1232 N_(
"Refresh this window"),
1233 G_CALLBACK (gnc_plugin_page_report_reload_cb)
1236 "ReportSaveAction",
"document-save", N_(
"Save _Report Configuration"),
"<primary><alt>s",
1237 report_save_str, G_CALLBACK(gnc_plugin_page_report_save_cb)
1240 "ReportSaveAsAction",
"document-save-as", N_(
"Save Report Configuration As..."),
"<primary><alt><shift>s",
1241 report_saveas_str, G_CALLBACK(gnc_plugin_page_report_save_as_cb)
1244 "ReportExportAction",
"go-next", N_(
"Export _Report"), NULL,
1245 N_(
"Export HTML-formatted report to file"),
1246 G_CALLBACK(gnc_plugin_page_report_export_cb)
1249 "ReportOptionsAction",
"document-properties", N_(
"_Report Options"), NULL,
1250 N_(
"Edit report options"),
1251 G_CALLBACK(gnc_plugin_page_report_options_cb)
1255 "ReportBackAction",
"go-previous", N_(
"Back"), NULL,
1256 N_(
"Move back one step in the history"),
1257 G_CALLBACK(gnc_plugin_page_report_back_cb)
1260 "ReportForwAction",
"go-next", N_(
"Forward"), NULL,
1261 N_(
"Move forward one step in the history"),
1262 G_CALLBACK(gnc_plugin_page_report_forw_cb)
1265 "ReportReloadAction",
"view-refresh", N_(
"Reload"), NULL,
1266 N_(
"Reload the current page"),
1267 G_CALLBACK(gnc_plugin_page_report_reload_cb)
1270 "ReportStopAction",
"process-stop", N_(
"Stop"), NULL,
1271 N_(
"Cancel outstanding HTML requests"),
1272 G_CALLBACK(gnc_plugin_page_report_stop_cb)
1275 guint num_report_actions = G_N_ELEMENTS( report_actions );
1277 DEBUG(
"property reportId=%d", reportId );
1278 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(plugin_page);
1281 gnc_plugin_page_report_setup( GNC_PLUGIN_PAGE(plugin_page) );
1284 parent = GNC_PLUGIN_PAGE(plugin_page);
1286 name = gnc_report_name( priv->initial_report );
1287 g_object_set(G_OBJECT(plugin_page),
1289 "page-uri",
"default:",
1290 "ui-description",
"gnc-plugin-page-report-ui.xml",
1291 "use-new-window", use_new,
1301 "GncPluginPageReportActions");
1302 gtk_action_group_add_actions( action_group,
1307 initially_insensitive_actions,
1308 "sensitive", FALSE);
1311 g_free (saved_reports_path);
1312 g_free (report_save_str);
1313 g_free (report_saveas_str);
1321 DEBUG(
"report id = %d", reportId );
1322 plugin_page = g_object_new( GNC_TYPE_PLUGIN_PAGE_REPORT,
1323 "report-id", reportId, NULL );
1324 DEBUG(
"plugin_page: %p", plugin_page );
1325 DEBUG(
"set %d on page %p", reportId, plugin_page );
1326 return GNC_PLUGIN_PAGE( plugin_page );
1333 SCM new_edited = scm_delete(priv->edited_reports, report);
1334 if (priv->edited_reports != SCM_EOL)
1335 scm_gc_unprotect_object(priv->edited_reports);
1336 priv->edited_reports = new_edited;
1337 if (new_edited != SCM_EOL)
1338 scm_gc_protect_object(priv->edited_reports);
1345 SCM new_edited = scm_cons(report, priv->edited_reports);
1346 if (priv->edited_reports != SCM_EOL)
1347 scm_gc_unprotect_object(priv->edited_reports);
1348 priv->edited_reports = new_edited;
1349 if (new_edited != SCM_EOL)
1350 scm_gc_protect_object(priv->edited_reports);
1354 gnc_plugin_page_report_raise_editor(SCM report)
1356 SCM get_editor = scm_c_eval_string(
"gnc:report-editor-widget");
1357 SCM editor = scm_call_1(get_editor, report);
1358 #define FUNC_NAME "gtk_window_present" 1359 GtkWidget *w = SWIG_MustGetPtr(editor,
1360 SWIG_TypeQuery(
"_p_GtkWidget"), 1, 0);
1362 gtk_window_present(GTK_WINDOW(w));
1366 close_handler (gpointer user_data)
1369 DEBUG(
"in close handler\n");
1379 "ReportForwAction" );
1380 gtk_action_set_sensitive(act, enabled);
1389 "ReportBackAction" );
1390 gtk_action_set_sensitive(act, enabled);
1400 gnc_html_history_node * node = NULL;
1403 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1404 gnc_html_history_forward(gnc_html_get_history(priv->
html));
1405 node = gnc_html_history_get_current(gnc_html_get_history(priv->
html));
1408 gnc_html_show_url(priv->
html, node->type, node->location,
1417 gnc_html_history_node * node;
1420 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1421 gnc_html_history_back(gnc_html_get_history(priv->
html));
1422 node = gnc_html_history_get_current(gnc_html_get_history(priv->
html));
1425 gnc_html_show_url(priv->
html, node->type, node->location,
1433 gnc_plugin_page_report_reload_cb (NULL, report);
1444 page = GNC_PLUGIN_PAGE(report);
1445 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1449 DEBUG(
"reload-redraw" );
1450 dirty_report = scm_c_eval_string(
"gnc:report-set-dirty?!");
1451 scm_call_2(dirty_report, priv->
cur_report, SCM_BOOL_T);
1456 priv->reloading = TRUE;
1458 gnc_window_set_progressbar_window( GNC_WINDOW(page->
window) );
1461 gnc_plugin_page_report_set_progressbar( page, TRUE );
1463 gnc_html_reload( priv->
html, TRUE );
1465 gnc_plugin_page_report_set_progressbar( page, FALSE );
1468 gnc_window_set_progressbar_window( NULL );
1469 priv->reloading = FALSE;
1477 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1478 gnc_html_cancel(priv->
html);
1484 gnc_get_export_type_choice (SCM export_types, GtkWindow *parent)
1486 GList * choices = NULL;
1487 gboolean bad = FALSE;
1492 if (!scm_is_list (export_types))
1495 for (tail = export_types; !scm_is_null (tail); tail = SCM_CDR (tail))
1497 SCM pair = SCM_CAR (tail);
1501 if (!scm_is_pair (pair))
1503 g_warning (
"unexpected list element");
1508 scm = SCM_CAR (pair);
1509 if (!scm_is_string (scm))
1511 g_warning (
"unexpected pair element");
1516 name = gnc_scm_to_utf8_string (scm);
1517 choices = g_list_prepend (choices, name);
1522 choices = g_list_reverse (choices);
1524 choices = g_list_prepend (choices, g_strdup (_(
"HTML")));
1526 choice = gnc_choose_radio_option_dialog
1527 (GTK_WIDGET (parent), _(
"Choose export format"),
1528 _(
"Choose the export format for this report:"),
1534 for (node = choices; node; node = node->next)
1535 g_free (node->data);
1536 g_list_free (choices);
1545 if (choice >= scm_ilength (export_types))
1548 return scm_list_ref (export_types, scm_from_int (choice));
1552 gnc_get_export_filename (SCM choice, GtkWindow *parent)
1557 const gchar * html_type = _(
"HTML");
1562 if (choice == SCM_BOOL_T)
1563 type = g_strdup (html_type);
1565 type = gnc_scm_to_utf8_string(SCM_CAR (choice));
1568 title = g_strdup_printf (_(
"Save %s To File"), type);
1569 default_dir = gnc_get_default_directory(GNC_PREFS_GROUP_REPORT);
1571 filepath = gnc_file_dialog (parent, title, NULL, default_dir,
1572 GNC_FILE_DIALOG_EXPORT);
1574 if (filepath != NULL)
1577 if (g_strrstr(filepath,
".") == NULL)
1578 filepath = g_strconcat(filepath,
".", g_ascii_strdown(type, strlen(type)), NULL);
1582 g_free (default_dir);
1587 default_dir = g_path_get_dirname(filepath);
1588 gnc_set_default_directory (GNC_PREFS_GROUP_REPORT, default_dir);
1589 g_free(default_dir);
1591 rc = g_stat (filepath, &statbuf);
1594 if (rc != 0 && errno != ENOENT)
1597 const char *format = _(
"You cannot save to that filename.\n\n%s");
1599 gnc_error_dialog (parent, format, strerror(errno));
1605 if (rc == 0 && !S_ISREG (statbuf.st_mode))
1607 const char *message = _(
"You cannot save to that file.");
1609 gnc_error_dialog (parent,
"%s", message);
1616 const char *format = _(
"The file %s already exists. " 1617 "Are you sure you want to overwrite it?");
1619 if (!gnc_verify_dialog (parent, FALSE, format, filepath))
1636 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1643 save_func = scm_c_eval_string(
"gnc:report-to-template-new");
1644 rpt_id = scm_call_1(save_func, priv->
cur_report);
1647 if (!scm_is_null (rpt_id))
1650 GtkWidget *window = reportPage->
window;
1653 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
1655 gnc_ui_custom_report_edit_name (GNC_MAIN_WINDOW (window), rpt_id);
1664 SCM check_func, save_func;
1667 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1671 check_func = scm_c_eval_string(
"gnc:is-custom-report-type");
1672 if (scm_is_true (scm_call_1 (check_func, priv->
cur_report)))
1677 save_func = scm_c_eval_string(
"gnc:report-to-template-update");
1678 rpt_id = scm_call_1(save_func, priv->
cur_report);
1687 gnc_plugin_page_report_save_as_cb (action, report);
1701 (GNC_PLUGIN_PAGE (report)));
1703 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1704 export_types = scm_call_1 (scm_c_eval_string (
"gnc:report-export-types"),
1707 export_thunk = scm_call_1 (scm_c_eval_string (
"gnc:report-export-thunk"),
1710 if (scm_is_list (export_types) && scm_is_procedure (export_thunk))
1711 choice = gnc_get_export_type_choice (export_types, parent);
1713 choice = SCM_BOOL_T;
1715 if (choice == SCM_BOOL_F)
1718 filepath = gnc_get_export_filename (choice, parent);
1722 if (scm_is_pair (choice))
1724 SCM type = scm_cdr (choice);
1725 SCM document = scm_call_2 (export_thunk, priv->
cur_report, type);
1726 SCM query_result = scm_c_eval_string (
"gnc:html-document?");
1727 SCM get_export_string = scm_c_eval_string (
"gnc:html-document-export-string");
1728 SCM get_export_error = scm_c_eval_string (
"gnc:html-document-export-error");
1730 if (scm_is_false (scm_call_1 (query_result, document)))
1731 gnc_error_dialog (parent, _(
"This report must be upgraded to \ 1732 return a document object with export-string or export-error."));
1735 SCM export_string = scm_call_1 (get_export_string, document);
1736 SCM export_error = scm_call_1 (get_export_error, document);
1738 if (scm_is_string (export_string))
1741 gchar *exported = scm_to_utf8_string (export_string);
1742 if (!g_file_set_contents (filepath, exported, -1, &err))
1743 gnc_error_dialog (parent,
"Error during export: %s", err->message);
1748 else if (scm_is_string (export_error))
1750 gchar *str = scm_to_utf8_string (export_error);
1751 gnc_error_dialog (parent,
"error during export: %s", str);
1755 gnc_error_dialog (parent, _(
"This report must be upgraded to \ 1756 return a document object with export-string or export-error."));
1761 result = gnc_html_export_to_file (priv->
html, filepath);
1765 const char *fmt = _(
"Could not open the file %s. " 1766 "The error is: %s");
1767 gnc_error_dialog (parent, fmt, filepath ? filepath :
"(null)",
1768 strerror (errno) ? strerror (errno) :
"" );
1780 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
1784 if (gnc_report_edit_options (priv->
cur_report, parent))
1785 gnc_plugin_page_report_add_edited_report(priv, priv->
cur_report);
1791 return gnc_option_db_lookup_invoice_option(priv->
cur_odb,
"General",
1792 "Invoice Number", NULL);
1795 #define GNC_PREFS_GROUP_REPORT_PDFEXPORT GNC_PREFS_GROUP_GENERAL_REPORT ".pdf-export" 1796 #define GNC_PREF_FILENAME_DATE_FMT "filename-date-format" 1797 #define GNC_PREF_FILENAME_FMT "filename-format" 1801 gchar *job_name = NULL;
1802 gchar *report_name = NULL;
1803 const gchar *report_number =
"";
1805 const gchar *default_jobname = N_(
"GnuCash-Report");
1813 GNC_PREF_FILENAME_DATE_FMT);
1814 const gchar *date_format_string;
1815 if (!(format_code && *format_code))
1817 g_free(format_code);
1818 format_code = g_strdup(
"locale");
1822 PERR(
"Incorrect date format code, using ISO-8601.");
1827 g_free (format_code);
1832 report_name = g_strdup (_(default_jobname));
1846 GncInvoice *invoice;
1847 report_name = gnc_option_db_lookup_string_option(priv->
cur_odb,
"General",
1848 "Report name", NULL);
1850 report_name = g_strdup (_(default_jobname));
1851 if (g_strcmp0(report_name, _(
"Printable Invoice")) == 0
1852 || g_strcmp0(report_name, _(
"Tax Invoice")) == 0
1853 || g_strcmp0(report_name, _(
"Easy Invoice")) == 0
1854 || g_strcmp0(report_name, _(
"Fancy Invoice")) == 0)
1858 g_free(report_name);
1859 report_name = g_strdup(_(
"Invoice"));
1862 invoice = lookup_invoice(priv);
1866 report_number = gncInvoiceGetID(invoice);
1870 if (report_name && job_date)
1875 if (format && *format)
1877 job_name = g_strdup_printf(format, report_name,
1878 report_number, job_date);
1882 PWARN(
"No GNC_PREF_FILENAME_FMT!");
1883 job_name = g_strdup_printf (
"%s %s %s", report_name,
1884 report_number, job_date);
1888 g_free (report_name);
1892 char forbidden_char =
'/';
1895 while (strchr(job_name, forbidden_char))
1897 *strchr(job_name, forbidden_char) =
'_';
1908 gboolean already_found;
1909 g_assert(static_report_printnames);
1912 value = g_hash_table_lookup(static_report_printnames, job_name);
1913 already_found = (value != NULL);
1916 value = GINT_TO_POINTER(0);
1920 value = GINT_TO_POINTER(1 + GPOINTER_TO_INT(value));
1922 g_hash_table_insert(static_report_printnames, g_strdup(job_name), value);
1929 gchar *tmp = g_strdup_printf(
"%s_%d", job_name, (
int) GPOINTER_TO_INT(value));
1942 gchar *job_name = report_create_jobname(priv);
1947 gnc_html_print (priv->
html, job_name, FALSE);
1949 gnc_html_print (priv->
html, job_name);
1959 gchar *job_name = report_create_jobname(priv);
1960 GncInvoice *invoice;
1964 invoice = lookup_invoice(priv);
1968 owner = (
GncOwner*) gncInvoiceGetOwner(invoice);
1972 gchar *dirname = NULL;
1979 if (g_file_test (dirname, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
1981 gchar *tmp = g_build_filename (dirname, job_name, NULL);
1993 gnc_html_print (priv->
html, job_name, TRUE);
1995 gnc_html_print (priv->
html, job_name);
2005 if (print_settings &&
2006 gtk_print_settings_has_key(print_settings,
2009 const char* dirname = gtk_print_settings_get(print_settings,
2012 if (g_file_test(dirname, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
2017 gncOwnerCommitEdit(owner);
2030 priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
2031 gnc_html_copy_to_clipboard(priv->
html);
2040 gnc_main_window_open_report(
int report_id,
GncMainWindow *window)
2045 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
2052 gnc_main_window_open_report_url(
const char * url,
GncMainWindow *window)
2056 DEBUG(
"report url: [%s]\n", url );
2059 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
GtkWidget * gnc_plugin_page_get_window(GncPluginPage *page)
Retrieve a pointer to the GncMainWindow (GtkWindow) containing this page.
const gchar * tab_icon
The relative name of the icon that should be shown on the tab for this page.
gboolean(* focus_page_function)(GncPluginPage *plugin_page)
This function performs specific actions to set the focus on a specific widget.
void qof_instance_get(const QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_get.
The instance data structure for a content plugin.
gchar * gnc_prefs_get_string(const gchar *group, const gchar *pref_name)
Get a string value from the preferences backend.
gchar * gnc_build_userdata_path(const gchar *filename)
Make a path to filename in the user's gnucash data directory.
#define GNC_GTK_PRINT_SETTINGS_EXPORT_DIR
Key for saving the PDF-export directory in the print settings.
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.
GncPluginPage *(* recreate_page)(GtkWidget *window, GKeyFile *file, const gchar *group)
Create a new page based on the information saved during a previous instantiation of gnucash...
#define DEBUG(format, args...)
Print a debugging message.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
Functions that are supported by all types of windows.
void qof_instance_set(QofInstance *inst, const gchar *first_prop,...)
Wrapper for g_object_set Group setting multiple parameters in a single begin/commit/rollback.
void gnc_utf8_strip_invalid_and_controls(gchar *str)
Strip any non-utf8 characters and any control characters (everything < 0x20, , , ...
GtkWidget * window
The window that contains the display widget for this plugin.
gboolean gnc_main_window_is_restoring_pages(GncMainWindow *window)
Check if the main window is restoring the plugin pages.
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
void gncOwnerBeginEdit(GncOwner *owner)
These are convenience wrappers around gnc{Vendor,Customer,Job,Employee}* functions.
GncPluginPage * gnc_main_window_get_current_page(GncMainWindow *window)
Retrieve a pointer to the page that is currently at the front of the specified window.
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Display a data plugin page in a window.
QofInstance * qofOwnerGetOwner(const GncOwner *owner)
return the owner itself as an entity.
void(* update_edit_menu_actions)(GncPluginPage *plugin_page, gboolean hide)
This function vector allows page specific actions to override the generic code for setting the sensit...
void(* destroy_widget)(GncPluginPage *plugin_page)
Function called to destroy the display widget for a particular type of plugin.
#define PWARN(format, args...)
Log a warning.
This file contains the functions to present a GUI to manage custom reports.
The class data structure for a content plugin.
Functions providing the file history menu.
void gnc_plugin_page_disconnect_page_changed(GncPluginPage *page)
Disconnect the page_changed_id signal callback.
char * gnc_print_time64(time64 time, const char *format)
print a time64 as a date string per format
const gchar * plugin_name
The textual name of this plugin.
GtkWidget *(* create_widget)(GncPluginPage *plugin_page)
Function called to create the display widget for a particular type of plugin.
void(* page_name_changed)(GncPluginPage *plugin_page, const gchar *name)
This function vector allows page specific actions to occur when the page name is changed.
Gnome specific utility functions.
gboolean(* finish_pending)(GncPluginPage *plugin_page)
This function vector is called to finish any outstanding activities.
All type declarations for the whole Gnucash engine.
void(* save_page)(GncPluginPage *page, GKeyFile *file, const gchar *group)
Save enough information about this page so that it can be recreated next time the user starts gnucash...
GncPluginPage * gnc_plugin_page_report_new(int reportId)
GtkPrintSettings * gnc_print_get_settings()
Returns the pointer to our static GtkPrintSettings object.
Generic api to store and retrieve preferences.
GtkAction * gnc_plugin_page_get_action(GncPluginPage *page, const gchar *name)
Retrieve a GtkAction object associated with this page.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void gnc_plugin_page_inserted_cb(GncPluginPage *page, gpointer user_data)
Set up the page_changed callback for when the current page is changed.
void gnc_main_window_close_page(GncPluginPage *page)
Remove a data plugin page from a window and display the previous page.
Functions for adding plugins to a GnuCash window.
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current local time
void gnc_plugin_page_add_book(GncPluginPage *page, QofBook *book)
Add a book reference to the specified page.
GtkActionGroup * gnc_plugin_page_create_action_group(GncPluginPage *page, const gchar *group_name)
Create the GtkActionGroup object associated with this page.
The instance data structure for a main window object.
File path resolution utility functions.
gboolean gnc_date_string_to_dateformat(const gchar *format_string, QofDateFormat *format)
Converts the date format to a printable string.
const gchar * qof_date_format_get_string(QofDateFormat df)
This function returns a strftime formatting string for printing an all numeric date (e...
void main_window_update_page_name(GncPluginPage *page, const gchar *name_in)
Update the name of the page in the main window.
QofDateFormat
Enum for determining a date format.
#define SCHEME_OPTIONS
The key name used it the state file for storing the report options.