Files
gnucash/src/report/report-gnome/window-report.c
T
Geert Janssens e5d01077cf Fix gnc-help protocol and illustrate its use in the hello world report
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@22636 57a11ea4-9604-0410-9ed3-97b8803252fd
2012-12-12 17:42:10 +00:00

343 lines
11 KiB
C

/********************************************************************
* window-report.c *
* Copyright (C) 1997 Robin D. Clark *
* Copyright (C) 1998 Linas Vepstas *
* Copyright (C) 1999 Jeremy Collins ( gtk-xmhtml port ) *
* Copyright (C) 2000 Dave Peticolas *
* Copyright (C) 2000 Bill Gribble *
* *
* 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@gnu.org *
* *
********************************************************************/
#include "config.h"
#include <glib/gi18n.h>
#include <errno.h>
#include <libguile.h>
#include <sys/stat.h>
#include "swig-runtime.h"
#include "dialog-options.h"
#include "file-utils.h"
#include "gnc-gkeyfile-utils.h"
#include "gnc-report.h"
#include "gnc-ui.h"
#include "option-util.h"
#include "gnc-html.h"
#include "window-report.h"
#include "guile-mappings.h"
#include "gnc-plugin-page-report.h"
#include "gnc-report.h"
#define WINDOW_REPORT_CM_CLASS "window-report"
#define MDI_CHILD_CONFIG "mdi_child_config"
/********************************************************************
*
********************************************************************/
void
reportWindow(int report_id)
{
gnc_set_busy_cursor (NULL, TRUE);
gnc_main_window_open_report(report_id, NULL);
gnc_unset_busy_cursor (NULL);
}
/********************************************************************
* default parameters editor handling
********************************************************************/
struct report_default_params_data
{
GNCOptionWin * win;
GNCOptionDB * db;
SCM scm_options;
SCM cur_report;
};
static void
gnc_options_dialog_apply_cb(GNCOptionWin * propertybox,
gpointer user_data)
{
SCM dirty_report = scm_c_eval_string("gnc:report-set-dirty?!");
struct report_default_params_data * win = user_data;
if (!win) return;
gnc_option_db_commit(win->db);
scm_call_2(dirty_report, win->cur_report, SCM_BOOL_T);
}
static void
gnc_options_dialog_help_cb(GNCOptionWin * propertybox,
gpointer user_data)
{
GtkWidget *dialog, *parent;
struct report_default_params_data * prm = user_data;
parent = gnc_options_dialog_widget(prm->win);
dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"%s",
_("Set the report options you want using this dialog."));
g_signal_connect(G_OBJECT(dialog), "response",
(GCallback)gtk_widget_destroy, NULL);
gtk_widget_show(dialog);
}
static void
gnc_options_dialog_close_cb(GNCOptionWin * propertybox,
gpointer user_data)
{
struct report_default_params_data * win = user_data;
SCM set_editor = scm_c_eval_string("gnc:report-set-editor-widget!");
scm_call_2(set_editor, win->cur_report, SCM_BOOL_F);
gnc_options_dialog_destroy(win->win);
gnc_option_db_destroy(win->db);
scm_gc_unprotect_object(win->scm_options);
g_free(win);
}
GtkWidget *
gnc_report_window_default_params_editor(SCM options, SCM report)
{
SCM get_editor = scm_c_eval_string("gnc:report-editor-widget");
SCM get_report_type = scm_c_eval_string("gnc:report-type");
SCM get_template = scm_c_eval_string("gnc:find-report-template");
SCM get_template_name = scm_c_eval_string("gnc:report-template-name");
SCM ptr;
const gchar *title = NULL;
ptr = scm_call_1(get_editor, report);
if (ptr != SCM_BOOL_F)
{
#define FUNC_NAME "gtk_window_present"
GtkWindow * w = SWIG_MustGetPtr(ptr, SWIG_TypeQuery("_p_GtkWidget"), 1, 0);
gtk_window_present(w);
#undef FUNC_NAME
return NULL;
}
else
{
struct report_default_params_data * prm =
g_new0(struct report_default_params_data, 1);
prm->scm_options = options;
prm->cur_report = report;
prm->db = gnc_option_db_new(prm->scm_options);
/* Get the title of the report's template. */
ptr = scm_call_1(get_report_type, report);
if (ptr != SCM_BOOL_F)
{
ptr = scm_call_1(get_template, ptr);
if (ptr != SCM_BOOL_F)
{
ptr = scm_call_1(get_template_name, ptr);
if (scm_is_string(ptr))
{
char * str;
scm_dynwind_begin (0);
str = scm_to_locale_string (ptr);
title = g_strdup (str);
scm_dynwind_free (str);
scm_dynwind_end ();
}
}
}
/* Don't forget to translate the window title */
prm->win = gnc_options_dialog_new((gchar*) (title && *title ? _(title) : ""));
g_free ((gpointer *) title);
scm_gc_protect_object(prm->scm_options);
scm_gc_protect_object(prm->cur_report);
gnc_options_dialog_build_contents(prm->win, prm->db);
gnc_option_db_clean(prm->db);
gnc_options_dialog_set_apply_cb(prm->win,
gnc_options_dialog_apply_cb,
(gpointer)prm);
gnc_options_dialog_set_help_cb(prm->win,
gnc_options_dialog_help_cb,
(gpointer)prm);
gnc_options_dialog_set_close_cb(prm->win,
gnc_options_dialog_close_cb,
(gpointer)prm);
return gnc_options_dialog_widget(prm->win);
}
}
void
gnc_report_raise_editor(SCM report)
{
SCM get_editor = scm_c_eval_string("gnc:report-editor-widget");
SCM editor = scm_call_1(get_editor, report);
#define FUNC_NAME "gtk_window_present"
GtkWidget *w = SWIG_MustGetPtr(editor,
SWIG_TypeQuery("_p_GtkWidget"), 1, 0);
#undef FUNC_NAME
gtk_window_present(GTK_WINDOW(w));
}
static gboolean
gnc_html_file_stream_cb (const char *location, char ** data, int *len)
{
*len = gncReadFile (location, data);
return (*len > 0);
}
static gboolean
gnc_html_report_stream_cb (const char *location, char ** data, int *len)
{
gboolean ok;
ok = gnc_run_report_id_string (location, data);
if (!ok)
{
*data = g_strdup_printf ("<html><body><h3>%s</h3>"
"<p>%s</p></body></html>",
_("Report error"),
_("An error occurred while running the report."));
/* Make sure the progress bar is finished, which will also
make the GUI sensitive again. Easier to do this via guile
because otherwise we would need to link against gnome-utils
and a lot more. */
scm_c_eval_string("(gnc:report-finished)");
}
*len = strlen(*data);
return ok;
}
/* TODO: unroll start_editor */
static gboolean
gnc_html_options_url_cb (const char *location, const char *label,
gboolean new_window, GNCURLResult *result)
{
SCM start_editor = scm_c_eval_string ("gnc:report-edit-options");
SCM report;
int report_id;
g_return_val_if_fail (location != NULL, FALSE);
g_return_val_if_fail (result != NULL, FALSE);
result->load_to_stream = FALSE;
/* href="gnc-options:report-id=2676" */
if (strncmp ("report-id=", location, 10) == 0)
{
if (sscanf (location + 10, "%d", &report_id) != 1)
{
result->error_message =
g_strdup_printf (_("Badly formed options URL: %s"), location);
return FALSE;
}
report = gnc_report_find(report_id);
if (report == SCM_UNDEFINED ||
report == SCM_BOOL_F)
{
result->error_message =
g_strdup_printf (_("Badly-formed report id: %s"), location);
return FALSE;
}
scm_call_1 (start_editor, report);
return TRUE;
}
else
{
result->error_message =
g_strdup_printf (_("Badly formed options URL: %s"), location);
return FALSE;
}
}
static gboolean
gnc_html_report_url_cb (const char *location, const char *label,
gboolean new_window, GNCURLResult *result)
{
g_return_val_if_fail (location != NULL, FALSE);
g_return_val_if_fail (result != NULL, FALSE);
/* make a new window if necessary */
if (new_window)
{
char *url;
url = gnc_build_url (URL_TYPE_REPORT, location, label);
gnc_main_window_open_report_url (url, NULL);
g_free (url);
result->load_to_stream = FALSE;
}
else
{
result->load_to_stream = TRUE;
}
return TRUE;
}
static gboolean
gnc_html_help_url_cb (const char *location, const char *label,
gboolean new_window, GNCURLResult *result)
{
g_return_val_if_fail (location != NULL, FALSE);
if (label && (*label != '\0'))
gnc_gnome_help (location, label);
else
gnc_gnome_help (location, NULL);
return TRUE;
}
void
gnc_report_init (void)
{
/* Reference the report page plugin to ensure it exists in the gtk
* type system. */
GNC_TYPE_PLUGIN_PAGE_REPORT;
gnc_html_register_stream_handler (URL_TYPE_HELP, gnc_html_file_stream_cb);
gnc_html_register_stream_handler (URL_TYPE_FILE, gnc_html_file_stream_cb);
gnc_html_register_stream_handler (URL_TYPE_REPORT, gnc_html_report_stream_cb);
gnc_html_register_url_handler (URL_TYPE_OPTIONS, gnc_html_options_url_cb);
gnc_html_register_url_handler (URL_TYPE_REPORT, gnc_html_report_url_cb);
gnc_html_register_url_handler (URL_TYPE_HELP, gnc_html_help_url_cb);
}