diff options
author | Not Zed <NotZed@Ximian.com> | 2003-09-18 05:19:04 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2003-09-18 05:19:04 +0800 |
commit | 81a0ff5bc44a3bd11399e6b3c985735737606c8c (patch) | |
tree | 54b5ed4342a6843c1db4c7e75f2e1b1fe9b82dff /mail/em-format-html-print.c | |
parent | a36a1bb70b6ebcb51ac39304370c89bda63e11b9 (diff) | |
download | gsoc2013-evolution-81a0ff5bc44a3bd11399e6b3c985735737606c8c.tar.gz gsoc2013-evolution-81a0ff5bc44a3bd11399e6b3c985735737606c8c.tar.zst gsoc2013-evolution-81a0ff5bc44a3bd11399e6b3c985735737606c8c.zip |
cvs removed.
2003-09-17 Not Zed <NotZed@Ximian.com>
* folder-browser.c, folder-browser.h, folder-browser-ui.c
folder-browser-ui.h, mail-callbacks.c, mail-callbacks.h
mail-display.c, mail-display.h, mail-display-stream.c
mail-display-stream.h, mail-format.c, mail-format.h
mail-identify.c, mail-search.c, mail-search.h
message-browser.c, message-browser.h, subscribe-dialog.c
subscribe-dialog.h, mail-font-prefs.c, mail-font-prefs.h: cvs
removed.
* Makefile.am: Removed mail-font-prefs.[ch], hasn't been built for
ages.
* em-*.c: killed a bunch of printfs.
* em-format-html-display.c (efhd_html_button_press_event): update
for html object api chagnes.
** Merge in mail-refactor-2 branch.
svn path=/trunk/; revision=22602
Diffstat (limited to 'mail/em-format-html-print.c')
-rw-r--r-- | mail/em-format-html-print.c | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c new file mode 100644 index 0000000000..d02e72cebd --- /dev/null +++ b/mail/em-format-html-print.c @@ -0,0 +1,186 @@ + +#include <libgnomeprint/gnome-print-job.h> +#include <libgnomeprintui/gnome-print-job-preview.h> + +#include <gtkhtml/gtkhtml.h> +#include <gtk/gtkwindow.h> + +#include <camel/camel-i18n.h> +#include "em-format-html-print.h" + +#include <string.h> + +static void efhp_builtin_init(EMFormatHTMLPrintClass *efhc); + +static EMFormatHTMLClass *efhp_parent; + +static void +efhp_init(GObject *o) +{ + EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o; + GtkWidget *html = (GtkWidget *)efhp->formathtml.html; + + /* ?? */ + gtk_widget_set_name(html, "EvolutionMailPrintHTMLWidget"); + + /* gtk widgets don't like to be realized outside top level widget + so we put new html widget into gtk window */ + efhp->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_add((GtkContainer *)efhp->window, html); + gtk_widget_realize(html); +} + +static void +efhp_finalise(GObject *o) +{ + EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o; + + gtk_widget_destroy(efhp->window); + if (efhp->config) + g_object_unref(efhp->config); + + ((GObjectClass *)efhp_parent)->finalize(o); +} + +static void +efhp_base_init(EMFormatHTMLPrintClass *efhpklass) +{ + efhp_builtin_init(efhpklass); +} + +static void +efhp_class_init(GObjectClass *klass) +{ + klass->finalize = efhp_finalise; +} + +GType +em_format_html_print_get_type(void) +{ + static GType type = 0; + + if (type == 0) { + static const GTypeInfo info = { + sizeof(EMFormatHTMLPrintClass), + (GBaseInitFunc)efhp_base_init, NULL, + (GClassInitFunc)efhp_class_init, + NULL, NULL, + sizeof(EMFormatHTMLPrint), 0, + (GInstanceInitFunc)efhp_init + }; + efhp_parent = g_type_class_ref(em_format_html_get_type()); + type = g_type_register_static(em_format_html_get_type(), "EMFormatHTMLPrint", &info, 0); + } + + return type; +} + +EMFormatHTMLPrint *em_format_html_print_new(void) +{ + EMFormatHTMLPrint *efhp; + + efhp = g_object_new(em_format_html_print_get_type(), 0); + + return efhp; +} + +struct footer_info { + GnomeFont *local_font; + gint page_num, pages; +}; + +static void +efhp_footer_cb(GtkHTML *html, GnomePrintContext *print_context, double x, double y, double width, double height, void *data) +{ + struct footer_info *info = data; + + /* do we want anything nicer here, like who its from, etc? */ + if (info->local_font) { + char *text = g_strdup_printf (_("Page %d of %d"), info->page_num, info->pages); + /*gdouble tw = gnome_font_get_width_string (info->local_font, text);*/ + /* FIXME: work out how to measure this */ + gdouble tw = strlen(text) * 8; + + gnome_print_gsave(print_context); + gnome_print_newpath(print_context); + gnome_print_setrgbcolor(print_context, .0, .0, .0); + gnome_print_moveto(print_context, x + width - tw, y - gnome_font_get_ascender(info->local_font)); + gnome_print_setfont(print_context, info->local_font); + gnome_print_show(print_context, text); + gnome_print_grestore(print_context); + + g_free(text); + info->page_num++; + } +} + +/* perform preview, or print */ +/* returns GNOME_PRINT_OK on success */ +static void +emfhp_complete(EMFormatHTMLPrint *efhp, void *data) +{ + GnomePrintContext *print_context; + GnomePrintJob *print_job; + gdouble line = 0.0; + struct footer_info info; + int res = GNOME_PRINT_OK; + + print_job = gnome_print_job_new(efhp->config); + print_context = gnome_print_job_get_context(print_job); + + gtk_html_print_set_master(efhp->formathtml.html, print_job); + info.local_font = gnome_font_find_closest("Helvetica", 10.0); + if (info.local_font) { + line = gnome_font_get_ascender(info.local_font) - gnome_font_get_descender(info.local_font); + info.page_num = 1; + info.pages = gtk_html_print_get_pages_num(efhp->formathtml.html, print_context, 0.0, line); + gtk_html_print_with_header_footer(efhp->formathtml.html, print_context, 0.0, line, NULL, efhp_footer_cb, &info); + gnome_font_unref(info.local_font); + } else { + gtk_html_print(efhp->formathtml.html, print_context); + } + gtk_html_print_set_master(efhp->formathtml.html, NULL); + + gnome_print_job_close(print_job); + + if (efhp->preview) + gtk_widget_show(gnome_print_job_preview_new(print_job, _("Print Preview"))); + else + res = gnome_print_job_print(print_job); + + g_object_unref(print_job); + g_object_unref(efhp); +} + +int em_format_html_print_print(EMFormatHTMLPrint *efhp, struct _CamelMedium *msg, EMFormatHTML *source, struct _GnomePrintConfig *print_config, int preview) +{ + efhp->config = print_config; + if (print_config) + g_object_ref(print_config); + efhp->preview = preview; + + ((EMFormatHTML *)efhp)->load_http = source->load_http_now; + + g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp); + + g_object_ref(efhp); + em_format_format_clone((EMFormat *)efhp, msg, (EMFormat *)source); + + return 0; /* damn async ... */ +} + +/* ********************************************************************** */ + +/* if only ... but i doubt this is possible with gnome print/gtkhtml */ +static EMFormatHandler type_builtin_table[] = { + /*{ "application/postscript", (EMFormatFunc)efhp_application_postscript },*/ +}; + +static void +efhp_builtin_init(EMFormatHTMLPrintClass *efhc) +{ + int i; + + for (i=0;i<sizeof(type_builtin_table)/sizeof(type_builtin_table[0]);i++) + em_format_class_add_handler((EMFormatClass *)efhc, &type_builtin_table[i]); +} |