r18001 - gnucash/trunk/src/report - Implement new custom report dialog.
Andrew Sackville-West
andrewsw at cvs.gnucash.org
Thu Mar 26 15:38:38 EDT 2009
Author: andrewsw
Date: 2009-03-26 15:38:38 -0400 (Thu, 26 Mar 2009)
New Revision: 18001
Trac: http://svn.gnucash.org/trac/changeset/18001
Added:
gnucash/trunk/src/report/report-gnome/custom-report-dialog.glade
gnucash/trunk/src/report/report-gnome/dialog-custom-report.c
gnucash/trunk/src/report/report-gnome/dialog-custom-report.h
Modified:
gnucash/trunk/src/report/report-gnome/Makefile.am
gnucash/trunk/src/report/report-gnome/report-gnome.i
gnucash/trunk/src/report/report-gnome/report-gnome.scm
gnucash/trunk/src/report/report-system/report-system.scm
gnucash/trunk/src/report/report-system/report.scm
Log:
Implement new custom report dialog.
Implements a new interface for accessing "saved" or "custom" reports.
Specifically, the current sub-menu is replaced with a dialog holding a
GtkTreeView of the saved reports. From here the user can either run or
delete an existing saved report.
* allows deletion of existing saved reports
* allows immediate access to new saved reports from this session (no
need to restart gnucash to get access to new saved reports!)
* keeps a single rolling backup of saved reports in case of errors
Modified: gnucash/trunk/src/report/report-gnome/Makefile.am
===================================================================
--- gnucash/trunk/src/report/report-gnome/Makefile.am 2009-03-25 00:52:32 UTC (rev 18000)
+++ gnucash/trunk/src/report/report-gnome/Makefile.am 2009-03-26 19:38:38 UTC (rev 18001)
@@ -22,6 +22,7 @@
libgncmod_report_gnome_la_SOURCES = \
swig-report-gnome.c \
dialog-column-view.c \
+ dialog-custom-report.c \
dialog-style-sheet.c \
gnc-plugin-page-report.c \
gncmod-report-gnome.c \
@@ -30,6 +31,7 @@
gncincludedir = ${GNC_INCLUDE_DIR}
gncinclude_HEADERS = \
dialog-column-view.h \
+ dialog-custom-report.h \
dialog-style-sheet.h \
gnc-plugin-page-report.h \
window-report.h
@@ -61,7 +63,9 @@
noinst_DATA = .scm-links
gladedir = $(GNC_GLADE_DIR)
-glade_DATA = report.glade
+glade_DATA = \
+ report.glade \
+ custom-report-dialog.glade
uidir = $(GNC_UI_DIR)
Added: gnucash/trunk/src/report/report-gnome/custom-report-dialog.glade
===================================================================
--- gnucash/trunk/src/report/report-gnome/custom-report-dialog.glade (rev 0)
+++ gnucash/trunk/src/report/report-gnome/custom-report-dialog.glade 2009-03-26 19:38:38 UTC (rev 18001)
@@ -0,0 +1,183 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkDialog" id="custom_report_dialog">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes"></property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">False</property>
+ <signal name="close" handler="custom_report_dialog_close_cb"/>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="delete_custom_report">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Delete the currently selected report</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-delete</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="on_delete_custom_report_clicked"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="cancel_custom_report">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Exit the custom report dialog</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="cancel_custom_report_clicked_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="run_custom_report">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Run the currently selected report</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="run_custom_report_clicked_cb"/>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Run</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="height_request">150</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="custom_report_list_view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ <signal name="row_activated" handler="on_custom_report_list_view_row_activated"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
Added: gnucash/trunk/src/report/report-gnome/dialog-custom-report.c
===================================================================
--- gnucash/trunk/src/report/report-gnome/dialog-custom-report.c (rev 0)
+++ gnucash/trunk/src/report/report-gnome/dialog-custom-report.c 2009-03-26 19:38:38 UTC (rev 18001)
@@ -0,0 +1,359 @@
+/********************************************************************\
+ * dialog-custom-report.h -- dialog for managing custom reports *
+ * *
+ * *
+ * Copyright (C) 2009 *
+ * *
+ * Andrew Sackville-West *
+ * (andrew at swclan.homelinux.org) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License as *
+ * published by the Free Software Foundation; either version 2 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact: *
+ * *
+ * Free Software Foundation Voice: +1-617-542-5942 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+\********************************************************************/
+
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <libguile.h>
+#include "swig-runtime.h"
+
+#include "dialog-custom-report.h"
+#include "dialog-options.h"
+#include "dialog-utils.h"
+#include "gnc-main-window.h"
+#include "option-util.h"
+#include "window-report.h"
+#include "guile-mappings.h"
+#include "gnc-gui-query.h"
+#include "gnc-ui.h"
+#include "gnc-report.h"
+#include "gnc-plugin-page-report.h"
+
+
+/* convenience for accessing columns in the GtkListStore that holds
+ the reports */
+enum
+ {
+ COL_NAME = 0,
+ COL_NUM,
+ NUM_COLS
+ };
+
+/* all the pertinent stuff needed to pass around */
+typedef struct _CustomReportDialog
+{
+ /* dialog */
+ GtkWidget *dialog;
+ GtkWidget *reportview;
+ GncMainWindow *window;
+
+ /* data */
+ SCM reportlist;
+
+} CustomReportDialog;
+
+static void
+custom_report_dialog_close_cb(GtkWidget* widget,
+ CustomReportDialog *crd)
+{
+ gtk_widget_destroy(crd->dialog);
+ g_free(crd);
+
+}
+
+
+static void
+cancel_custom_report_clicked_cb(GtkWidget* widget,
+ CustomReportDialog *crd)
+{
+ custom_report_dialog_close_cb(NULL, crd);
+}
+
+
+/**
+ * update_report_list
+ *
+ * this procedure does the real work of displaying a sorted list of
+ * available custom reports
+ *
+ */
+static void
+update_report_list(GtkListStore *store, CustomReportDialog *crd)
+{
+
+ SCM get_names = scm_c_eval_string("gnc:custom-report-template-names");
+ SCM template_menu_name = scm_c_eval_string("gnc:report-template-menu-name/report-guid");
+ SCM names;
+ const gchar *name;
+ int i;
+ GtkTreeIter iter;
+
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), COL_NAME, GTK_SORT_ASCENDING);
+
+ crd->reportlist = scm_call_0(get_names);
+ names = crd->reportlist;
+
+ gtk_list_store_clear(store);
+
+ if(SCM_LISTP(names)) {
+
+ /* for all the names in the list, store them, with a reference,
+ in the gtkliststore */
+ for (i=0; !SCM_NULLP(names); i++) {
+
+ name = SCM_STRING_CHARS(scm_call_2(template_menu_name, SCM_CAR(names), SCM_BOOL_F));
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ COL_NAME, name,
+ COL_NUM, i,
+ -1);
+ names = SCM_CDR(names);
+
+ }
+
+ }
+
+}
+
+
+static GtkTreeModel *
+create_and_fill_report_list(CustomReportDialog *crd)
+{
+ GtkListStore *store;
+ GtkTreeIter iter;
+
+ store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_INT);
+
+ update_report_list(store, crd);
+
+ return GTK_TREE_MODEL (store);
+
+}
+
+static void
+set_reports_model(CustomReportDialog *crd)
+{
+ GtkCellRenderer *renderer;
+ GtkTreeModel *model;
+
+ renderer = gtk_cell_renderer_text_new();
+
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1, "Report Name", renderer, "text", COL_NAME, NULL);
+
+ model = create_and_fill_report_list(crd);
+
+ gtk_tree_view_set_model (GTK_TREE_VIEW (crd->reportview), model);
+
+ g_object_unref(model);
+
+
+}
+
+
+/**
+ *
+ * custom_report_run_report
+ *
+ * this procedure sets up and calls the report on the scheme
+ * side. This is what makes the report actually run.
+ */
+static void
+custom_report_run_report(SCM guid,
+ CustomReportDialog *crd)
+{
+
+ SCM make_report = scm_c_eval_string("gnc:make-report");
+ int report_id;
+ GncMainWindow *window = crd->window;
+
+ if(!SCM_NULLP(guid))
+ {
+
+ /* this runs the report */
+ report_id = SCM_INUM(scm_call_1(make_report, guid));
+
+ /* do this *before* the report because sometimes the report
+ takes a while... */
+ custom_report_dialog_close_cb(NULL, crd);
+
+ /* display the report */
+ gnc_main_window_open_report(report_id, window);
+
+ }
+
+}
+
+/**
+ * get_custom_report_selection
+ *
+ * this helper function is called to get the selection when the user
+ * clicks on "Run" or "Delete". Includes calling a dialog when there
+ * is no selection.
+ *
+ * const gchar* message -- the message to provide user if there is no
+ * actual selection found.
+ *
+ */
+static SCM
+get_custom_report_selection(CustomReportDialog *crd,
+ const gchar* message)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ SCM guid;
+
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(crd->reportview));
+
+ if (gtk_tree_selection_get_selected(sel, &model, &iter))
+ {
+ int num;
+
+ gtk_tree_model_get(model, &iter, COL_NUM, &num, -1);
+ guid = scm_list_ref(crd->reportlist, scm_int2num(num));
+ }
+
+ else
+ {
+ /* no selection, notify user */
+ gnc_error_dialog(GTK_WIDGET(crd->window), "%s", message);
+ return SCM_EOL;
+
+ }
+
+ return guid;
+
+}
+
+/**
+ * on_custom_report_list_view_row_activated
+ *
+ * this is the double-click signal. No need to call
+ * get_custom_report_selection as the double-click implies the
+ * selection.
+ *
+ */
+static void
+on_custom_report_list_view_row_activated(GtkTreeView *view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ CustomReportDialog *crd)
+{
+
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ model = gtk_tree_view_get_model(view);
+
+ if(gtk_tree_model_get_iter(model, &iter, path))
+ {
+ int num;
+ SCM guid;
+
+ gtk_tree_model_get(model, &iter, COL_NUM, &num, -1);
+
+ guid = scm_list_ref(crd->reportlist, scm_int2num(num));
+
+ custom_report_run_report(guid, crd);
+
+ }
+
+}
+
+/**
+ * on_delete_custom_report_clicked
+ *
+ * this will delete the report, update the reports list and leave the
+ * dialog active for additional usage.
+ *
+ */
+static void
+on_delete_custom_report_clicked(GtkWidget *button,
+ CustomReportDialog *crd)
+{
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ SCM template_menu_name = scm_c_eval_string("gnc:report-template-menu-name/report-guid");
+ SCM guid;
+ gchar* report_name;
+
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(crd->reportview));
+
+ guid = get_custom_report_selection(crd, _("You must select a report to delete."));
+ report_name = SCM_STRING_CHARS(scm_call_2(template_menu_name, guid, SCM_BOOL_F));
+
+ /* we must confirm the user wants to delete their precious custom report! */
+ if (!SCM_NULLP(guid)
+ && gnc_verify_dialog(crd->dialog, FALSE, "Are you sure you want to delete %s?", report_name))
+ {
+ SCM del_report = scm_c_eval_string("gnc:delete-report");
+ scm_call_1(del_report, guid);
+ update_report_list(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(crd->reportview)))
+ , crd);
+ }
+
+}
+
+static void
+run_custom_report_clicked_cb (GtkWidget* button,
+ CustomReportDialog *crd)
+{
+
+ SCM guid = get_custom_report_selection(crd, _("You must select a report to run."));
+ custom_report_run_report(guid, crd);
+
+}
+
+
+
+/**
+ * gnc_ui_custom_report
+ *
+ * this is the primary driver for the custom report dialog.
+ *
+ */
+void gnc_ui_custom_report(GncMainWindow * window)
+{
+
+ GladeXML* xml;
+ CustomReportDialog *crd;
+
+ crd = g_new0(CustomReportDialog, 1);
+
+ xml = gnc_glade_xml_new("custom-report-dialog.glade", "custom_report_dialog");
+
+ crd->dialog = glade_xml_get_widget(xml, "custom_report_dialog");
+ crd->reportview = glade_xml_get_widget(xml, "custom_report_list_view");
+ set_reports_model(crd);
+ crd->window = window;
+
+ /* connect the signals */
+ glade_xml_signal_connect_data(xml, "cancel_custom_report_clicked_cb", G_CALLBACK(cancel_custom_report_clicked_cb), crd);
+ glade_xml_signal_connect_data(xml, "custom_report_dialog_close_cb", G_CALLBACK(custom_report_dialog_close_cb), crd);
+ glade_xml_signal_connect_data(xml, "on_custom_report_list_view_row_activated", G_CALLBACK(on_custom_report_list_view_row_activated), crd);
+ glade_xml_signal_connect_data(xml, "on_delete_custom_report_clicked", G_CALLBACK(on_delete_custom_report_clicked), crd);
+ glade_xml_signal_connect_data(xml, "run_custom_report_clicked_cb", G_CALLBACK(run_custom_report_clicked_cb), crd);
+
+ gtk_widget_show_all(crd->dialog);
+
+}
Added: gnucash/trunk/src/report/report-gnome/dialog-custom-report.h
===================================================================
--- gnucash/trunk/src/report/report-gnome/dialog-custom-report.h (rev 0)
+++ gnucash/trunk/src/report/report-gnome/dialog-custom-report.h 2009-03-26 19:38:38 UTC (rev 18001)
@@ -0,0 +1,50 @@
+/********************************************************************\
+ * dialog-custom-report.h -- dialog for managing custom reports *
+ * *
+ * *
+ * Copyright (C) 2009 *
+ * *
+ * Andrew Sackville-West *
+ * (andrew at swclan.homelinux.org) *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License as *
+ * published by the Free Software Foundation; either version 2 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact: *
+ * *
+ * Free Software Foundation Voice: +1-617-542-5942 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+\********************************************************************/
+
+#ifndef DIALOG_CUSTOM_REPORT_H
+#define DIALOG_CUSTOM_REPORT_H
+
+#include "gnc-main-window.h"
+
+/** @addtogroup Reports
+ @{ */
+/** @file dialog-custom-report.h
+ *
+ * This file contains the functions to present a GUI to manage custom
+ * reports
+ */
+
+void
+gnc_ui_custom_report(GncMainWindow * window);
+
+/** @} */
+
+#endif /* DIALOG_CUSTOM_REPORT_H */
+
+
+
+
Modified: gnucash/trunk/src/report/report-gnome/report-gnome.i
===================================================================
--- gnucash/trunk/src/report/report-gnome/report-gnome.i 2009-03-25 00:52:32 UTC (rev 18000)
+++ gnucash/trunk/src/report/report-gnome/report-gnome.i 2009-03-26 19:38:38 UTC (rev 18001)
@@ -6,6 +6,7 @@
#include <dialog-column-view.h>
#include <gnc-plugin-page-report.h>
#include <window-report.h>
+#include <dialog-custom-report.h>
SCM scm_init_sw_report_gnome_module (void);
%}
@@ -17,3 +18,5 @@
GtkWidget * gnc_report_window_default_params_editor(SCM options, SCM report);
GtkWidget * gnc_column_view_edit_options(SCM options, SCM view);
+void gnc_ui_custom_report(GncMainWindow * window);
+
Modified: gnucash/trunk/src/report/report-gnome/report-gnome.scm
===================================================================
--- gnucash/trunk/src/report/report-gnome/report-gnome.scm 2009-03-25 00:52:32 UTC (rev 18000)
+++ gnucash/trunk/src/report/report-gnome/report-gnome.scm 2009-03-26 19:38:38 UTC (rev 18001)
@@ -96,6 +96,7 @@
(add-template-menu-item (car item) (cdr item)))
(sort *template-items* sort-templates)))
+
(define (gnc:report-menu-setup)
(define asset-liability-menu
(gnc:make-menu gnc:menuname-asset-liability (list gnc:menuname-reports)))
@@ -105,17 +106,22 @@
(gnc:make-menu gnc:menuname-budget (list gnc:menuname-reports)))
(define utility-menu
(gnc:make-menu gnc:menuname-utility (list gnc:menuname-reports)))
- (define custom-menu
- (gnc:make-menu gnc:menuname-custom (list gnc:menuname-reports)))
(define tax-menu
(gnc:make-menu gnc:menuname-taxes (list gnc:menuname-reports)))
+ (gnc-add-scm-extension
+ (gnc:make-menu-item
+ (N_ "Custom Reports")
+ (N_ "Manage and run custom reports")
+ (list gnc:menuname-reports)
+ (lambda (window)
+ (gnc:spawn-custom-report-dialog window))))
+
;; (gnc-add-scm-extension tax-menu)
(gnc-add-scm-extension income-expense-menu)
(gnc-add-scm-extension asset-liability-menu)
(gnc-add-scm-extension budget-menu)
(gnc-add-scm-extension utility-menu)
- (gnc-add-scm-extension custom-menu)
;; run report-hook danglers
(gnc:hook-run-danglers HOOK-REPORT)
@@ -131,4 +137,9 @@
(list gnc:menuname-reports gnc:menuname-utility "")
(lambda (window)
(gnc-main-window-open-report (gnc:make-welcome-report) window))))
+
)
+
+(define (gnc:spawn-custom-report-dialog window)
+ (gnc:debug "called into custom report dialog, window is " window)
+ (gnc-ui-custom-report window))
Modified: gnucash/trunk/src/report/report-system/report-system.scm
===================================================================
--- gnucash/trunk/src/report/report-system/report-system.scm 2009-03-25 00:52:32 UTC (rev 18000)
+++ gnucash/trunk/src/report/report-system/report-system.scm 2009-03-26 19:38:38 UTC (rev 18001)
@@ -155,6 +155,8 @@
(export gnc:report-stylesheet)
(export gnc:report-set-stylesheet!)
(export gnc:all-report-template-names)
+(export gnc:custom-report-template-names)
+(export gnc:delete-report)
(export gnc:find-report-template)
(export gnc:report-generate-restore-forms)
(export gnc:report-generate-saved-forms)
Modified: gnucash/trunk/src/report/report-system/report.scm
===================================================================
--- gnucash/trunk/src/report/report-system/report.scm 2009-03-25 00:52:32 UTC (rev 18000)
+++ gnucash/trunk/src/report/report-system/report.scm 2009-03-26 19:38:38 UTC (rev 18001)
@@ -455,6 +455,20 @@
'() *gnc:_report-templates_*)
string<?))
+;; return a list of the custom report template "names" (really a list
+;; of report-guids).
+(define (gnc:custom-report-template-names)
+ (sort
+ (hash-fold
+ (lambda (k v p)
+ (if (gnc:report-template-parent-type v)
+ (begin
+ (gnc:debug "template " v)
+ (cons k p))
+ p))
+ '() *gnc:_report-templates_*)
+ string<?))
+
(define (gnc:find-report-template report-type)
(hash-ref *gnc:_report-templates_* report-type))
@@ -570,7 +584,7 @@
(gnc-info-dialog
'()
(sprintf
- #f (_ "Your report \"%s\" has been saved into the configuration file \"%s\". The report will be available in the menu Reports -> Custom at the next startup of GnuCash.")
+ #f (_ "Your report \"%s\" has been saved into the configuration file \"%s\".")
(if (and report-name (not (string-null? report-name)))
(gnc:gettext report-name)
(gnc:gettext "Untitled"))
@@ -578,17 +592,26 @@
))))
(define (gnc:report-template-save-to-savefile report-template)
- (let* ((conf-file-name gnc:current-saved-reports)
- (saved-form (gnc:report-template-generate-saved-forms report-template))
- (save-result (eval-string saved-form)))
- (if (record? save-result)
- (begin
- (display saved-form
- (open-file conf-file-name "a"))
- (force-output)
- ))))
+ (let ((conf-file-name gnc:current-saved-reports)
+ (saved-form (gnc:report-template-generate-saved-forms report-template)))
+ (display saved-form
+ (open-file conf-file-name "a"))
+ (force-output)))
+;; save all custom reports, moving the old version of the
+;; saved-reports file aside as a backup
+(define (gnc:save-all-reports)
+ (let ((temp-path (gnc-build-dotgnucash-path "saved-reports-2.4-backup")))
+ (gnc:debug "saving all reports...")
+ (rename-file gnc:current-saved-reports temp-path)
+ (hash-for-each (lambda (k v)
+ (if (gnc:report-template-parent-type v)
+ (begin
+ (gnc:debug "saving report " k)
+ (gnc:report-template-save-to-savefile v))))
+ *gnc:_report-templates_*)))
+
;; gets the renderer from the report template;
;; gets the stylesheet from the report;
;; renders the html doc and caches the resulting string;
@@ -646,3 +669,12 @@
(let ((opt-value (gnc:option-value option)))
(map (lambda (x) (car x)) opt-value))
#f)))
+
+;; delete an existing report from the hash table and then call to
+;; resave the saved-reports file... report is gone
+(define (gnc:delete-report report)
+ (if (hash-ref *gnc:_report-templates_* report)
+ (begin
+ (gnc:debug "Deleting report " report)
+ (hash-remove! *gnc:_report-templates_* report)
+ (gnc:save-all-reports))))
\ No newline at end of file
More information about the gnucash-changes
mailing list