26 #include <glib/gi18n.h> 29 #include "swig-runtime.h" 31 #include "business-gnome-utils.h" 33 #include "dialog-utils.h" 35 #include "window-report.h" 36 #include "guile-mappings.h" 37 #include "gnc-guile-utils.h" 38 #include "gnc-gui-query.h" 41 #include "gnc-report.h" 44 #define GNC_PREFS_GROUP_REPORT_SAVED_CONFIGS "dialogs.report-saved-configs" 65 typedef struct _CustomReportDialog
69 GtkWidget *reportview;
70 GncMainWindow *window;
71 GtkTreeViewColumn *namecol;
72 GtkCellRenderer *namerenderer;
73 GtkTreeViewColumn *runcol;
74 GtkTreeViewColumn *editcol;
75 GtkTreeViewColumn *delcol;
76 GtkTreeViewColumn *dummycol;
83 void custom_report_dialog_destroy_cb (GtkWidget* widget, gpointer data);
84 void custom_report_dialog_close_cb(GtkWidget* widget, gpointer data);
85 void custom_report_help_cb(GtkWidget* widget, gpointer data);
86 void close_custom_report_clicked_cb(GtkWidget* widget, gpointer data);
87 void custom_report_list_view_row_activated_cb(GtkTreeView *view, GtkTreePath *path,
88 GtkTreeViewColumn *column, gpointer data);
89 gboolean custom_report_list_view_clicked_cb(GtkTreeView *view, GdkEventButton *event, gpointer data);
90 void custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data);
91 gboolean custom_report_query_tooltip_cb (GtkTreeView *view,
94 gboolean keyboard_mode,
99 tree_model_free (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
103 gtk_tree_model_get (model, iter, COL_NUM, &guid, -1);
109 empty_tree_model (GtkTreeModel *model)
111 gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)tree_model_free, NULL);
112 gtk_list_store_clear (GTK_LIST_STORE (model));
116 custom_report_dialog_destroy_cb (GtkWidget* widget, gpointer data)
119 empty_tree_model (gtk_tree_view_get_model (GTK_TREE_VIEW(crd->reportview)));
124 custom_report_dialog_close_cb(GtkWidget* widget, gpointer data)
127 gnc_save_window_size(GNC_PREFS_GROUP_REPORT_SAVED_CONFIGS, GTK_WINDOW(crd->dialog));
129 gtk_widget_destroy(crd->dialog);
133 custom_report_help_cb (GtkWidget *widget, gpointer data)
136 gnc_gnome_help (GTK_WINDOW(crd->dialog), DF_MANUAL, DL_USAGE_CUSTOMREP);
140 close_custom_report_clicked_cb(GtkWidget* widget, gpointer data)
143 custom_report_dialog_close_cb(NULL, crd);
155 SCM get_rpt_guids = scm_c_eval_string(
"gnc:custom-report-template-guids");
156 SCM template_menu_name = scm_c_eval_string(
"gnc:report-template-menu-name/report-guid");
159 GtkTreeModel *model = GTK_TREE_MODEL (store);
161 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store),
COL_NAME, GTK_SORT_ASCENDING);
163 crd->reportlist = scm_call_0(get_rpt_guids);
164 rpt_guids = crd->reportlist;
166 empty_tree_model (model);
168 if (scm_is_list(rpt_guids))
172 while ( !scm_is_null(rpt_guids) )
175 gchar *guid_str = scm_to_utf8_string (SCM_CAR(rpt_guids));
176 gchar *name = gnc_scm_to_utf8_string (scm_call_2(template_menu_name, SCM_CAR(rpt_guids), SCM_BOOL_F));
180 gtk_list_store_append(store, &iter);
181 gtk_list_store_set(store, &iter,
189 rpt_guids = SCM_CDR(rpt_guids);
194 static GtkTreeModel *
199 store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_POINTER);
201 update_report_list(store, crd);
203 return GTK_TREE_MODEL (store);
209 GtkCellRenderer *renderer;
211 gint number_of_columns;
213 crd->namerenderer = gtk_cell_renderer_text_new();
214 g_signal_connect (G_OBJECT (crd->namerenderer),
"edited",
215 G_CALLBACK (custom_report_name_edited_cb), crd);
216 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
217 "Report Name", crd->namerenderer,
220 crd->namecol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_NAME);
221 gtk_tree_view_column_set_expand (crd->namecol, TRUE);
223 renderer = gtk_cell_renderer_pixbuf_new();
224 g_object_set (G_OBJECT (renderer),
"icon-name",
"system-run", NULL);
225 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
228 crd->runcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_RUN);
230 renderer = gtk_cell_renderer_pixbuf_new();
231 g_object_set (G_OBJECT (renderer),
"icon-name",
"accessories-text-editor", NULL);
232 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
235 crd->editcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_EDIT);
237 renderer = gtk_cell_renderer_pixbuf_new();
238 g_object_set (G_OBJECT (renderer),
"icon-name",
"edit-delete", NULL);
239 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
242 crd->delcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_DELETE);
245 renderer = gtk_cell_renderer_text_new();
246 number_of_columns = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
250 crd->dummycol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), number_of_columns -1);
252 model = create_and_fill_report_list(crd);
254 gtk_tree_view_set_model (GTK_TREE_VIEW (crd->reportview), model);
256 g_object_unref(model);
266 custom_report_run_report(SCM guid,
269 SCM make_report = scm_c_eval_string(
"gnc:make-report");
271 GncMainWindow *window = crd->window;
273 if (scm_is_null(guid))
277 report_id = scm_to_int (scm_call_1(make_report, guid));
281 custom_report_dialog_close_cb(NULL, crd);
284 gnc_main_window_open_report(report_id, window);
295 custom_report_edit_report_name (SCM guid,
299 SCM rename_report = scm_c_eval_string(
"gnc:rename-report");
300 SCM new_name_scm = scm_from_utf8_string(new_name);
302 if (scm_is_null(guid) || !new_name || (*new_name ==
'\0'))
306 scm_call_2(rename_report, guid, new_name_scm);
307 update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview))),
321 SCM template_menu_name = scm_c_eval_string(
"gnc:report-template-menu-name/report-guid");
324 if (scm_is_null (guid))
327 report_name = gnc_scm_to_utf8_string(scm_call_2(template_menu_name, guid, SCM_BOOL_F));
330 if (gnc_verify_dialog( GTK_WINDOW (crd->dialog), FALSE, _(
"Are you sure you want to delete %s?"), report_name))
332 SCM del_report = scm_c_eval_string(
"gnc:delete-report");
333 scm_call_1(del_report, guid);
334 update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview))),
337 g_free (report_name);
352 const gchar* message)
354 GtkTreeSelection *sel;
361 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(crd->reportview));
363 if (!gtk_tree_selection_get_selected(sel, &model, &iter))
366 gnc_error_dialog (GTK_WINDOW (crd->dialog),
"%s", message);
370 gtk_tree_model_get (model, &iter, COL_NUM, &guid, -1);
372 scm_guid = scm_from_utf8_string (guid_str);
385 custom_report_list_view_row_activated_cb(GtkTreeView *view, GtkTreePath *path,
386 GtkTreeViewColumn *column, gpointer data)
392 model = gtk_tree_view_get_model(view);
394 if (gtk_tree_model_get_iter(model, &iter, path))
396 if (column == crd->namecol)
401 gtk_tree_model_get(model, &iter, COL_NUM, &guid, -1);
405 custom_report_run_report(scm_from_utf8_string (guid_str), crd);
420 custom_report_list_view_clicked_cb(GtkTreeView *view, GdkEventButton *event, gpointer data)
423 GtkTreePath *path = NULL;
424 GtkTreeViewColumn *column = NULL;
427 g_return_val_if_fail ( view != NULL, FALSE );
429 if (gtk_tree_view_get_path_at_pos (view, event->x, event->y,
433 if (column == crd->runcol)
435 SCM guid = get_custom_report_selection(crd, _(
"You must select a report configuration to load."));
436 custom_report_run_report (guid, crd);
437 gtk_tree_path_free (path);
440 else if (column == crd->editcol)
442 g_object_set(G_OBJECT(crd->namerenderer),
"editable", TRUE, NULL);
443 gtk_tree_view_set_cursor_on_cell (view, path, crd->namecol,
444 crd->namerenderer, TRUE);
445 gtk_tree_path_free (path);
448 else if (column == crd->delcol)
450 SCM guid = get_custom_report_selection(crd, _(
"You must select a report configuration to delete."));
451 custom_report_delete (guid, crd);
452 gtk_tree_path_free (path);
455 gtk_tree_path_free (path);
461 custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data)
464 SCM guid = get_custom_report_selection(crd, _(
"Unable to change report configuration name."));
465 SCM unique_name_func = scm_c_eval_string(
"gnc:report-template-has-unique-name?");
466 SCM new_name_scm = scm_from_utf8_string(new_text);
468 g_object_set(G_OBJECT(crd->namerenderer),
"editable", FALSE, NULL);
469 if (scm_is_null (guid))
472 if (scm_is_true (scm_call_2 (unique_name_func, guid, new_name_scm)))
474 gchar *default_guid = gnc_get_default_invoice_print_report ();
475 gchar *guid_string = scm_to_utf8_string (guid);
477 custom_report_edit_report_name (guid, crd, new_text);
480 if (g_strcmp0 (default_guid, guid_string) == 0)
482 QofBook *book = gnc_get_current_book ();
485 if (g_strcmp0 (default_name, new_text) != 0)
487 g_free (default_name);
489 g_free (guid_string);
490 g_free (default_guid);
493 gnc_error_dialog (GTK_WINDOW (crd->dialog),
"%s",
494 _(
"A saved report configuration with this name already exists, please choose another name.") );
498 custom_report_query_tooltip_cb (GtkTreeView *view,
501 gboolean keyboard_mode,
506 GtkTreePath *path = NULL;
507 GtkTreeViewColumn *column = NULL;
510 g_return_val_if_fail ( view != NULL, FALSE );
512 if (gtk_tree_view_get_path_at_pos (view, x, y,
516 if (column != crd->namecol)
518 gtk_tree_view_set_tooltip_cell (view, tooltip, path, column, NULL);
519 if (column == crd->runcol)
520 gtk_tooltip_set_text (tooltip, _(
"Load report configuration"));
521 else if (column == crd->editcol)
522 gtk_tooltip_set_text (tooltip, _(
"Edit report configuration name"));
523 else if (column == crd->delcol)
524 gtk_tooltip_set_text (tooltip, _(
"Delete report configuration"));
525 gtk_tree_path_free (path);
529 gtk_tooltip_set_text (tooltip, NULL);
530 gtk_tree_path_free (path);
536 custom_report_event_cb (GtkWidget *widget, GdkEventKey *event,
539 if (event->keyval == GDK_KEY_Escape)
541 custom_report_dialog_close_cb (widget, user_data);
550 gnc_ui_custom_report_internal(GncMainWindow * window)
556 GtkWidget *no_report_notification;
557 GtkWidget *scroll_window;
559 GtkRequisition nat_sb;
563 builder = gtk_builder_new();
564 gnc_builder_add_from_file (builder,
"dialog-custom-report.glade",
"custom_report_dialog");
566 crd->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"custom_report_dialog"));
567 crd->reportview = GTK_WIDGET(gtk_builder_get_object (builder,
"custom_report_list_view"));
568 scroll_window = GTK_WIDGET(gtk_builder_get_object (builder,
"custom_report_sw"));
569 no_report_notification = GTK_WIDGET(gtk_builder_get_object (builder,
"label2"));
570 set_reports_view_and_model(crd);
571 crd->window = window;
574 vscroll = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (scroll_window));
575 gtk_widget_get_preferred_size (vscroll, NULL, &nat_sb);
578 gtk_tree_view_column_set_fixed_width (crd->dummycol, nat_sb.width);
580 gtk_window_set_transient_for (GTK_WINDOW (crd->dialog), GTK_WINDOW(window));
583 gtk_widget_set_name (GTK_WIDGET(crd->dialog),
"gnc-id-custom-report");
585 gnc_restore_window_size (GNC_PREFS_GROUP_REPORT_SAVED_CONFIGS,
586 GTK_WINDOW(crd->dialog), GTK_WINDOW(window));
589 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, crd);
591 gtk_widget_show_all(crd->dialog);
594 g_signal_connect (crd->dialog,
"key_press_event",
595 G_CALLBACK(custom_report_event_cb), crd);
599 model = gtk_tree_view_get_model (GTK_TREE_VIEW (crd->reportview));
600 if (gtk_tree_model_get_iter_first (model, &iter))
604 gtk_widget_hide(no_report_notification);
609 gtk_widget_hide(crd->reportview);
612 g_object_unref(G_OBJECT(builder));
623 gnc_ui_custom_report(GncMainWindow * window)
625 gnc_ui_custom_report_internal (window);
635 gnc_ui_custom_report_edit_name (GncMainWindow * window, SCM scm_guid)
637 SCM is_custom_report;
645 is_custom_report = scm_c_eval_string (
"gnc:report-template-is-custom/template-guid?");
646 if (scm_is_false (scm_call_1 (is_custom_report, scm_guid)))
650 guid_str = scm_to_utf8_string (scm_guid);
655 model = gtk_tree_view_get_model (GTK_TREE_VIEW (crd->reportview));
656 valid_iter = gtk_tree_model_get_iter_first (model, &iter);
661 gtk_tree_model_get (model, &iter, COL_NUM, &row_guid, -1);
670 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (crd->reportview));
671 gtk_tree_selection_select_iter (selection, &iter);
672 path = gtk_tree_model_get_path (model, &iter);
673 g_object_set(G_OBJECT(crd->namerenderer),
"editable", TRUE, NULL);
674 gtk_tree_view_set_cursor_on_cell (GTK_TREE_VIEW (crd->reportview),
676 crd->namerenderer, TRUE);
677 gtk_tree_path_free (path);
681 valid_iter = gtk_tree_model_iter_next (model, &iter);
utility functions for the GnuCash UI
gboolean string_to_guid(const gchar *string, GncGUID *guid)
Given a string, replace the given guid with the parsed one unless the given value is null...
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
Functions for adding content to a window.
This file contains the functions to present a GUI to manage custom reports.
GncGUID * guid_malloc(void)
Allocate memory for a GUID.
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...
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
void qof_book_set_default_invoice_report(QofBook *book, const gchar *guid, const gchar *name)
Save the Invoice Report name / guid to be used as the default for printing Invoices.
gchar * qof_book_get_default_invoice_report_name(const QofBook *book)
Get the name of the Invoice Report to be used as the default for printing Invoices.
gchar * guid_to_string(const GncGUID *guid)
The guid_to_string() routine returns a null-terminated string encoding of the id. ...
The type used to store guids in C.
This column holds a copy of the check format name and is what is displayed to the user in the combobo...