[evolution/webkit: 46/146] Continue porting of printing
- From: Dan VrÃtil <dvratil src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/webkit: 46/146] Continue porting of printing
- Date: Thu, 9 Feb 2012 14:22:19 +0000 (UTC)
commit cc9d91532710268f097b12dc562612183f51fe4e
Author: Dan VrÃtil <dvratil redhat com>
Date: Wed Nov 16 15:59:12 2011 +0100
Continue porting of printing
- added EMailPrinter class to handle printing via webkit
- added custom dialog to Print dialog to choose which email headers should be printed
- ported footer with page numbers
e-util/e-marshal.list | 1 +
mail/Makefile.am | 2 +
mail/e-mail-printer.c | 417 +++++++++++++++++++++++++++++++++++++++++++
mail/e-mail-printer.h | 78 ++++++++
mail/e-mail-reader-utils.c | 97 ++++++----
mail/em-format-html-print.c | 125 ++------------
mail/em-format-html.c | 2 +-
mail/mail.error.xml | 5 +
8 files changed, 572 insertions(+), 155 deletions(-)
---
diff --git a/e-util/e-marshal.list b/e-util/e-marshal.list
index bf15633..62be8aa 100644
--- a/e-util/e-marshal.list
+++ b/e-util/e-marshal.list
@@ -39,6 +39,7 @@ NONE:INT,POINTER,INT,OBJECT,INT,INT,BOXED,UINT,UINT
NONE:INT,POINTER,INT,OBJECT,UINT
NONE:LONG,LONG
NONE:OBJECT,BOOLEAN
+NONE:OBJECT,INT
NONE:OBJECT,DOUBLE,DOUBLE,BOOLEAN
NONE:OBJECT,OBJECT
NONE:OBJECT,STRING
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 3fc0325..5b46ae2 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -58,6 +58,7 @@ mailinclude_HEADERS = \
e-mail-migrate.h \
e-mail-notebook-view.h \
e-mail-paned-view.h \
+ e-mail-printer.h \
e-mail-reader-utils.h \
e-mail-reader.h \
e-mail-request.h \
@@ -122,6 +123,7 @@ libevolution_mail_la_SOURCES = \
e-mail-migrate.c \
e-mail-notebook-view.c \
e-mail-paned-view.c \
+ e-mail-printer.c \
e-mail-reader-utils.c \
e-mail-reader.c \
e-mail-request.c \
diff --git a/mail/e-mail-printer.c b/mail/e-mail-printer.c
new file mode 100644
index 0000000..daac905
--- /dev/null
+++ b/mail/e-mail-printer.c
@@ -0,0 +1,417 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ * Copyright (C) 2011 Dan Vratil <dvratil redhat com>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include <e-util/e-marshal.h>
+
+#include "e-mail-printer.h"
+#include "em-format-html-print.h"
+
+static gpointer parent_class = NULL;
+
+struct _EMailPrinterPrivate {
+ EMFormatHTMLPrint *efhp;
+
+ GtkListStore *headers;
+
+ WebKitWebView *webview; /* WebView to print from */
+};
+
+G_DEFINE_TYPE (
+ EMailPrinter,
+ e_mail_printer,
+ G_TYPE_OBJECT);
+
+enum {
+ PROP_0,
+ PROP_PRINT_FORMATTER
+};
+
+enum {
+ SIGNAL_DONE,
+ LAST_SIGNAL
+};
+
+enum {
+ COLUMN_ACTIVE,
+ COLUMN_HEADER_NAME,
+ COLUMN_HEADER_VALUE,
+ LAST_COLUMN
+};
+
+static guint signals[LAST_SIGNAL];
+
+static void
+emp_draw_footer (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr)
+{
+ PangoFontDescription *desc;
+ PangoLayout *layout;
+ gint n_pages;
+ gdouble width, height;
+ gchar *text;
+ cairo_t *cr;
+
+ cr = gtk_print_context_get_cairo_context (context);
+ width = gtk_print_context_get_width (context);
+ height = gtk_print_context_get_height (context);
+
+ g_object_get (operation, "n-pages", &n_pages, NULL);
+ text = g_strdup_printf (_("Page %d of %d"), page_nr + 1, n_pages);
+
+ cairo_set_source_rgb (cr, 0.1, 0.1, 0.1);
+ cairo_fill (cr);
+
+ desc = pango_font_description_from_string ("Sans Regular 10");
+ layout = gtk_print_context_create_pango_layout (context);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, width * PANGO_SCALE);
+ pango_font_description_free (desc);
+
+ cairo_move_to (cr, 0, height + 5);
+ pango_cairo_show_layout (cr, layout);
+
+ g_object_unref (layout);
+ g_free (text);
+}
+
+static void
+emp_printing_done (GtkPrintOperation *operation,
+ GtkPrintOperationResult result,
+ gpointer user_data)
+{
+ EMailPrinter *emp = user_data;
+
+ g_signal_emit (emp, signals[SIGNAL_DONE], 0, operation, result);
+}
+
+static void
+emp_run_print_operation (EMailPrinter *emp,
+ GtkPrintOperation *operation)
+{
+ EMFormat *emf;
+ SoupSession *session;
+ GHashTable *formatters;
+ gchar *mail_uri, *tmp;
+ WebKitWebFrame *frame;
+
+ emf = EM_FORMAT (emp->priv->efhp);
+ mail_uri = em_format_build_mail_uri (emf->folder, emf->message_uid, NULL, NULL);
+
+ /* It's safe to assume that session exists and contains formatters table,
+ * because at least the message we are about to print now must be already
+ * there */
+ session = webkit_get_default_session ();
+ formatters = g_object_get_data (G_OBJECT (session), "formatters");
+ g_hash_table_insert (formatters, g_strdup (mail_uri), emp->priv->efhp);
+
+ /* FIXME: We want an EActivity, but how?
+ activity = e_mail_reader_new_activity (reader);
+ g_object_set_data (G_OBJECT (activity), "efhp", efhp);
+ */
+
+ /* Print_layout is a special PURI created by EMFormatHTMLPrint */
+ tmp = g_strconcat (mail_uri, "?part_id=print_layout", NULL);
+ if (emp->priv->webview == NULL) {
+ emp->priv->webview = WEBKIT_WEB_VIEW (webkit_web_view_new ());
+ g_object_ref_sink (emp->priv->webview);
+ }
+
+ webkit_web_view_load_uri (emp->priv->webview, tmp);
+
+ frame = webkit_web_view_get_main_frame (emp->priv->webview);
+ webkit_web_frame_print_full (frame, operation, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL);
+
+ g_free (tmp);
+ g_free (mail_uri);
+}
+
+
+static void
+header_active_renderer_toggled_cb (GtkCellRendererToggle *renderer,
+ gchar *path,
+ EMailPrinter *emp)
+{
+ GtkTreeIter iter;
+ gboolean active;
+
+ gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (emp->priv->headers),
+ &iter, path);
+ gtk_tree_model_get (GTK_TREE_MODEL (emp->priv->headers), &iter,
+ COLUMN_ACTIVE, &active, -1);
+ gtk_list_store_set (GTK_LIST_STORE (emp->priv->headers),
+ &iter, COLUMN_ACTIVE, !active, -1);
+}
+
+static GtkWidget*
+emp_get_headers_tab (GtkPrintOperation *operation,
+ EMailPrinter *emp)
+{
+ GtkWidget *box, *label, *scw;
+ GtkTreeView *view;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
+
+ label = gtk_label_new (_("Select headers you want to print"));
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 5);
+
+ view = GTK_TREE_VIEW (gtk_tree_view_new_with_model (
+ GTK_TREE_MODEL (emp->priv->headers)));
+
+ renderer = gtk_cell_renderer_toggle_new ();
+ g_signal_connect (renderer, "toggled",
+ G_CALLBACK (header_active_renderer_toggled_cb), emp);
+ column = gtk_tree_view_column_new_with_attributes (
+ _("Print"), renderer,
+ "active", COLUMN_ACTIVE, NULL);
+ gtk_tree_view_append_column (view, column);
+
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (
+ _("Header Name"), renderer,
+ "text", COLUMN_HEADER_NAME, NULL);
+ gtk_tree_view_append_column (view, column);
+
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (
+ _("Header Value"), renderer,
+ "text", COLUMN_HEADER_VALUE, NULL);
+ gtk_tree_view_append_column (view, column);
+
+ scw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (scw), GTK_WIDGET (view));
+ gtk_box_pack_start (GTK_BOX (box), scw, TRUE, TRUE, 5);
+ gtk_widget_show_all (box);
+
+ gtk_print_operation_set_custom_tab_label (operation, _("Headers"));
+ return box;
+}
+
+static gint
+emf_header_name_equal (const EMFormatHeader *header,
+ const gchar *name)
+{
+ return g_strcmp0 (name, header->name);
+}
+
+static void
+emp_set_formatter (EMailPrinter *emp,
+ EMFormatHTMLPrint *formatter)
+{
+ CamelMedium *msg;
+ GArray *headers;
+ gint i;
+
+ g_return_if_fail (EM_IS_FORMAT_HTML_PRINT (formatter));
+
+ g_object_ref (formatter);
+
+ if (emp->priv->efhp)
+ g_object_unref (emp->priv->efhp);
+
+ emp->priv->efhp = formatter;
+
+ if (emp->priv->headers)
+ g_object_unref (emp->priv->headers);
+ emp->priv->headers = gtk_list_store_new (3,
+ G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
+
+ msg = CAMEL_MEDIUM (EM_FORMAT (formatter)->message);
+ headers = camel_medium_get_headers (msg);
+ for (i = 0; i < headers->len; i++) {
+ CamelMediumHeader *header;
+ GtkTreeIter iter;
+ gboolean active = false;
+
+ header = &g_array_index (headers, CamelMediumHeader, i);
+
+ active = (g_queue_find_custom (&EM_FORMAT (formatter)->header_list,
+ header->name, (GCompareFunc) emf_header_name_equal) != NULL);
+
+ gtk_list_store_append (emp->priv->headers, &iter);
+ gtk_list_store_set (emp->priv->headers, &iter,
+ COLUMN_ACTIVE, active,
+ COLUMN_HEADER_NAME, header->name,
+ COLUMN_HEADER_VALUE, header->value, -1);
+ }
+}
+
+static void
+emp_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EMailPrinter *emp = E_MAIL_PRINTER (object);
+
+ switch (property_id) {
+
+ case PROP_PRINT_FORMATTER:
+ emp_set_formatter (emp, g_value_get_object (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+emp_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EMailPrinter *emp = E_MAIL_PRINTER (object);
+
+ switch (property_id) {
+
+ case PROP_PRINT_FORMATTER:
+ g_value_set_object (value,
+ e_mail_printer_get_print_formatter (emp));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+emp_finalize (GObject *object)
+{
+ EMailPrinterPrivate *priv = E_MAIL_PRINTER (object)->priv;
+
+ if (priv->efhp) {
+ g_object_unref (priv->efhp);
+ priv->efhp = NULL;
+ }
+
+ if (priv->headers) {
+ g_object_unref (priv->headers);
+ priv->headers = NULL;
+ }
+
+ if (priv->webview) {
+ g_object_unref (priv->webview);
+ priv->webview = NULL;
+ }
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+e_mail_printer_class_init (EMailPrinterClass *class)
+{
+ GObjectClass *object_class;
+
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (EMailPrinterPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = emp_set_property;
+ object_class->get_property = emp_get_property;
+ object_class->finalize = emp_finalize;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_PRINT_FORMATTER,
+ g_param_spec_object (
+ "print-formatter",
+ NULL,
+ NULL,
+ EM_TYPE_FORMAT_HTML_PRINT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ signals[SIGNAL_DONE] = g_signal_new ("done",
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (EMailPrinterClass, done),
+ NULL, NULL,
+ e_marshal_VOID__OBJECT_INT,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_PRINT_OPERATION, G_TYPE_INT);
+}
+
+static void
+e_mail_printer_init (EMailPrinter *emp)
+{
+ emp->priv = G_TYPE_INSTANCE_GET_PRIVATE (
+ emp, E_TYPE_MAIL_PRINTER, EMailPrinterPrivate);
+
+ emp->priv->efhp = NULL;
+ emp->priv->headers = NULL;
+ emp->priv->webview = NULL;
+}
+
+EMailPrinter*
+e_mail_printer_new (EMFormatHTML* source,
+ GtkPrintOperationAction action)
+{
+ EMailPrinter *emp;
+ EMFormatHTMLPrint *efhp;
+
+ efhp = em_format_html_print_new (source, action);
+
+ emp = g_object_new (E_TYPE_MAIL_PRINTER,
+ "print-formatter", efhp, NULL);
+
+ g_object_unref (efhp);
+
+ return emp;
+}
+
+void
+e_mail_printer_print (EMailPrinter *emp,
+ GCancellable *cancellable)
+{
+ GtkPrintOperation *operation;
+
+ g_return_if_fail (E_IS_MAIL_PRINTER (emp));
+
+ operation = gtk_print_operation_new ();
+ gtk_print_operation_set_show_progress (operation, TRUE);
+ g_signal_connect (operation, "create-custom-widget",
+ G_CALLBACK (emp_get_headers_tab), emp);
+ g_signal_connect (operation, "done",
+ G_CALLBACK (emp_printing_done), emp);
+ g_signal_connect_swapped (cancellable, "cancelled",
+ G_CALLBACK (gtk_print_operation_cancel), operation);
+ g_signal_connect (operation, "draw-page",
+ G_CALLBACK (emp_draw_footer), NULL);
+
+ emp_run_print_operation (emp, operation);
+}
+
+EMFormatHTMLPrint*
+e_mail_printer_get_print_formatter (EMailPrinter *emp)
+{
+ g_return_val_if_fail (E_IS_MAIL_PRINTER (emp), NULL);
+
+ return emp->priv->efhp;
+}
+
diff --git a/mail/e-mail-printer.h b/mail/e-mail-printer.h
new file mode 100644
index 0000000..e8eea75
--- /dev/null
+++ b/mail/e-mail-printer.h
@@ -0,0 +1,78 @@
+/*
+ * Class for printing emails
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ * Copyright (C) 2011 Dan Vratil <dvratil redhat com>
+ */
+
+#ifndef E_MAIL_PRINTER_H
+#define E_MAIL_PRINTER_H
+
+#include "mail/em-format-html-print.h"
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_PRINTER \
+ (e_mail_printer_get_type ())
+#define E_MAIL_PRINTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_MAIL_PRINTER, EMailPrinter))
+#define E_MAIL_PRINTER_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_MAIL_PRINTER, EMailPrinterClass))
+#define E_IS_MAIL_PRINTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_MAIL_PRINTER))
+#define E_IS_MAIL_PRINTER_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_MAIL_PRINTER_CLASS))
+#define E_MAIL_PRINTER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_MAIL_PRINTER, EMailPrinterClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EMailPrinter EMailPrinter;
+typedef struct _EMailPrinterClass EMailPrinterClass;
+typedef struct _EMailPrinterPrivate EMailPrinterPrivate;
+
+struct _EMailPrinter {
+ GObject parent;
+ EMailPrinterPrivate *priv;
+};
+
+struct _EMailPrinterClass {
+ GObjectClass parent_class;
+
+ void (*done) (EMailPrinter *printer,
+ GtkPrintOperation *operation,
+ GtkPrintOperationResult *result,
+ gpointer user_data);
+};
+
+GType e_mail_printer_get_type (void);
+
+EMailPrinter * e_mail_printer_new (EMFormatHTML *source,
+ GtkPrintOperationAction action);
+
+void e_mail_printer_print (EMailPrinter *printer,
+ GCancellable *cancellable);
+
+EMFormatHTMLPrint *
+ e_mail_printer_get_print_formatter
+ (EMailPrinter *printer);
+
+G_END_DECLS
+
+#endif /* E_MAIL_PRINTER_H */
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index f734c6e..897a655 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -44,6 +44,7 @@
#include "mail/e-mail-backend.h"
#include "mail/e-mail-browser.h"
+#include "mail/e-mail-printer.h"
#include "mail/em-composer-utils.h"
#include "mail/em-format-html-print.h"
#include "mail/em-utils.h"
@@ -432,9 +433,9 @@ e_mail_reader_open_selected (EMailReader *reader)
}
static void
-mail_reader_print_finished (GtkPrintOperation *operation,
- GtkPrintOperationResult result,
- EActivity *activity)
+mail_reader_printing_finished (GtkPrintOperation *operation,
+ GtkPrintOperationResult result,
+ EActivity *activity)
{
WebKitWebView *webview;
@@ -461,14 +462,17 @@ webview_document_load_finished_cb (WebKitWebView *webview,
if (status != WEBKIT_LOAD_FINISHED)
return;
-
+
frame = webkit_web_view_get_main_frame (webview);
efhp = g_object_get_data (G_OBJECT (activity), "efhp");
action = em_format_html_print_get_action (efhp);
+
operation = gtk_print_operation_new ();
+ gtk_print_operation_set_show_progress (operation, TRUE);
+
g_object_set_data (G_OBJECT (operation), "webview", webview);
g_signal_connect (operation, "done",
- G_CALLBACK (mail_reader_print_finished), activity);
+ G_CALLBACK (mail_reader_printing_finished), activity);
action = em_format_html_print_get_action (efhp);
webkit_web_frame_print_full (frame,
@@ -477,53 +481,66 @@ webview_document_load_finished_cb (WebKitWebView *webview,
g_object_unref (efhp);
}
+static void
+printing_done_cb (EMailPrinter *printer,
+ GtkPrintOperation *operation,
+ GtkPrintOperationResult result,
+ gpointer user_data)
+{
+ EActivity *activity = user_data;
+
+ if (result == GTK_PRINT_OPERATION_RESULT_ERROR) {
+
+ EAlertSink *alert_sink;
+ GError *error = NULL;
+
+ alert_sink = e_activity_get_alert_sink (activity);
+ gtk_print_operation_get_error (operation, &error);
+
+ if (error != NULL) {
+ e_alert_submit (alert_sink, "mail:printing-failed",
+ error->message, NULL);
+ g_error_free (error);
+ }
+
+ g_object_unref (activity);
+ g_object_unref (printer);
+ return;
+ }
+
+ /* Set activity as completed, and keep it displayed for a few seconds
+ so that user can actually see the the printing was sucesfully finished. */
+ e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
+ g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, 3,
+ (GSourceFunc) g_object_unref, activity, NULL);
+
+ g_object_unref (printer);
+}
+
void
e_mail_reader_print (EMailReader *reader,
GtkPrintOperationAction action)
{
- EActivity *activity;
EMailDisplay *display;
+ EMailPrinter *printer;
EMFormatHTML *formatter;
- EMFormatHTMLPrint *efhp;
- gchar *mail_uri, *tmp;
- SoupSession *session;
- GHashTable *formatters;
- GtkWidget *webview;
- WebKitWebSettings *settings;
- GtkPrintOperation *operation;
+ EActivity *activity;
+ GCancellable *cancellable;
g_return_if_fail (E_IS_MAIL_READER (reader));
display = e_mail_reader_get_mail_display (reader);
formatter = e_mail_display_get_formatter (display);
-
- mail_uri = em_format_build_mail_uri(EM_FORMAT (formatter)->folder,
- EM_FORMAT (formatter)->message_uid, NULL, NULL);
-
- /* Clone EMFormatHTMLDisplay */
- efhp = em_format_html_print_new (formatter, action);
-
- /* It's safe to assume that session exists and contains formatters table,
- * because at least the message we are about to print now must be already
- * there */
- session = webkit_get_default_session ();
- formatters = g_object_get_data (G_OBJECT (session), "formatters");
- g_hash_table_insert (formatters, g_strdup (mail_uri), efhp);
-
+
activity = e_mail_reader_new_activity (reader);
- g_object_set_data (G_OBJECT (activity), "efhp", efhp);
-
- /* Print_layout is a special PURI created by EMFormatHTMLPrint */
- tmp = g_strconcat (mail_uri, "?part_id=print_layout", NULL);
- webview = webkit_web_view_new ();
- settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW (webview));
- g_object_set (G_OBJECT (settings), "enable-frame-flattening", TRUE, NULL);
- webkit_web_view_set_settings (WEBKIT_WEB_VIEW (webview), settings);
-
- g_signal_connect (webview, "notify::load-status",
- G_CALLBACK (webview_document_load_finished_cb), activity);
- webkit_web_view_load_uri (WEBKIT_WEB_VIEW (webview), tmp);
- g_free (tmp);
+ e_activity_set_text (activity, _("Printing"));
+ e_activity_set_state (activity, E_ACTIVITY_RUNNING);
+ cancellable = e_activity_get_cancellable (activity);
+
+ printer = e_mail_printer_new (formatter, action);
+ g_signal_connect (printer, "done",
+ G_CALLBACK (printing_done_cb), activity);
+ e_mail_printer_print (printer, cancellable);
}
static void
diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c
index 7017560..f8e3f4e 100644
--- a/mail/em-format-html-print.c
+++ b/mail/em-format-html-print.c
@@ -52,7 +52,7 @@ struct _EMFormatHTMLPrintPrivate {
G_DEFINE_TYPE (
EMFormatHTMLPrint,
em_format_html_print,
- EM_TYPE_FORMAT_HTML)
+ EM_TYPE_FORMAT_HTML);
enum {
PROP_0,
@@ -121,34 +121,29 @@ efhp_write_print_layout (EMFormat *emf,
GCancellable *cancellable)
{
GList *iter;
- GString *str = g_string_new ("");
GString *mail_uri;
- gint len;
+ EMFormatWriterInfo print_info = {
+ EM_FORMAT_WRITE_MODE_PRINTING, FALSE, FALSE, FALSE };
- g_string_append (str,
+ camel_stream_write_string (stream,
"<!DOCTYPE HTML>\n<html>\n" \
"<head>\n<meta name=\"generator\" content=\"Evolution Mail Component\" />\n" \
"<title>Evolution Mail Display</title>\n" \
"<link type=\"text/css\" rel=\"stylesheet\" href=\"evo-file://" EVOLUTION_PRIVDATADIR "/theme/webview.css\" />\n" \
"</head>\n" \
- "<body style=\"background: #FFF; color: #000;\">");
+ "<body style=\"background: #FFF; color: #000;\">", cancellable, NULL);
- mail_uri = g_string_new ("");
- g_string_assign (mail_uri, em_format_build_mail_uri (emf->folder,
- emf->message_uid, NULL, NULL));
- len = mail_uri->len;
-
- int height;
- int i = 0;
for (iter = emf->mail_part_list; iter != NULL; iter = iter->next) {
EMFormatPURI *puri = iter->data;
/* Convert attachment bar to fancy HTML */
+ /* FIXME WEBKIT
if (g_str_has_suffix (puri->uri, ".attachment-bar")) {
attachment_bar_html (puri, str, cancellable);
continue;
}
+ */
/* Skip widget-parts. We either don't want them displayed
* or we will handle them manually */
@@ -171,6 +166,7 @@ efhp_write_print_layout (EMFormat *emf,
if (!em_format_is_inline (puri->emf, puri->uri, puri->part, handler))
continue;
+ /* FIXME WEBKIT
attachment = ((EMFormatAttachmentPURI *) puri)->attachment;
fi = e_attachment_get_file_info (attachment);
g_string_append_printf (str, "<table border=\"0\" width=\"100%%\"><tr>" \
@@ -180,40 +176,13 @@ efhp_write_print_layout (EMFormat *emf,
e_attachment_get_description (attachment),
e_attachment_get_mime_type (attachment),
g_file_info_get_size (fi));
+ */
}
- if (i == 0)
- height = 120;
- else if (i == 1)
- height = 360;
- else if (i == 2)
- height = 250;
- else if (i == 3)
- height = 150;
- else if (i == 4)
- height = 600;
- else
- height = 600;
-
- i++;
-
-
- g_string_append_printf (mail_uri, "?part_id=%s&mode=%d", puri->uri,
- EM_FORMAT_WRITE_MODE_PRINTING);
- g_message ("%s", mail_uri->str);
-
- g_string_append_printf (str,
- "<iframe frameborder=\"0\" width=\"100%%\" "
- "src=\"%s\" height=\"%d\"></iframe>\n", mail_uri->str, height);
-
- g_string_truncate (mail_uri, len);
+ puri->write_func(puri->emf, puri, stream, &print_info, cancellable);
}
- g_string_append (str, "</body></html>");
- camel_stream_write_string (stream, str->str, cancellable, NULL);
-
- g_string_free (mail_uri, TRUE);
- g_string_free (str, TRUE);
+ camel_stream_write_string (stream, "</body></html>", cancellable, NULL);
}
@@ -404,78 +373,6 @@ em_format_html_print_new (EMFormatHTML *source,
return efhp;
}
-
-static gint
-efhp_calc_footer_height (//GtkHTML *html,
- GtkPrintOperation *operation,
- GtkPrintContext *context)
-{
-/* FIXME WEBKIT
- PangoContext *pango_context;
- PangoFontDescription *desc;
- PangoFontMetrics *metrics;
- gint footer_height;
-
- pango_context = gtk_print_context_create_pango_context (context);
- desc = pango_font_description_from_string ("Sans Regular 10");
-
- metrics = pango_context_get_metrics (
- pango_context, desc, pango_language_get_default ());
- footer_height =
- pango_font_metrics_get_ascent (metrics) +
- pango_font_metrics_get_descent (metrics);
- pango_font_metrics_unref (metrics);
-
- pango_font_description_free (desc);
- g_object_unref (pango_context);
-
- return footer_height;
-*/
-}
-
-static void
-efhp_draw_footer (//GtkHTML *html,
- GtkPrintOperation *operation,
- GtkPrintContext *context,
- gint page_nr,
- PangoRectangle *rec)
-{
-/* FIXME WEBKIT
- PangoFontDescription *desc;
- PangoLayout *layout;
- gdouble x, y;
- gint n_pages;
- gchar *text;
- cairo_t *cr;
-
- g_object_get (operation, "n-pages", &n_pages, NULL);
- text = g_strdup_printf (_("Page %d of %d"), page_nr + 1, n_pages);
-
- desc = pango_font_description_from_string ("Sans Regular 10");
- layout = gtk_print_context_create_pango_layout (context);
- pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
- pango_layout_set_font_description (layout, desc);
- pango_layout_set_text (layout, text, -1);
- pango_layout_set_width (layout, rec->width);
-
- x = pango_units_to_double (rec->x);
- y = pango_units_to_double (rec->y);
-
- cr = gtk_print_context_get_cairo_context (context);
-
- cairo_save (cr);
- cairo_set_source_rgb (cr, .0, .0, .0);
- cairo_move_to (cr, x, y);
- pango_cairo_show_layout (cr, layout);
- cairo_restore (cr);
-
- g_object_unref (layout);
- pango_font_description_free (desc);
-
- g_free (text);
-*/
-}
-
static void
emfhp_complete (EMFormatHTMLPrint *efhp)
{
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index bab1914..c8d631c 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -895,7 +895,7 @@ efh_write_headers (EMFormat *emf,
"}\n" \
"</script>\n" \
"<table border=\"0\" width=\"100%\" height=\"100%\" style=\"background: #%06x; color: #%06x;\">\n" \
- "<tr><td valign=\"top\" width=\"16\">\n");
+ "<tr><td valign=\"top\" width=\"16\">\n",
bg_color,
e_color_to_value (&efh->priv->colors[EM_FORMAT_HTML_COLOR_HEADER]));
diff --git a/mail/mail.error.xml b/mail/mail.error.xml
index 118acc1..cd85deb 100644
--- a/mail/mail.error.xml
+++ b/mail/mail.error.xml
@@ -520,5 +520,10 @@ An mbox account will be created to preserve the old mbox folders. You can delete
<_secondary xml:space="preserve">The attachment named {0} is a hidden file and may contain sensitive data. Please review it before sending.</_secondary>
</error>
+ <error id="printing-failed" type="error">
+ <_primary>Printing failed.</_primary>
+ <_secondary>The printer replied "{0}".</_secondary>
+ </error>
+
</error-list>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]