aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2007-04-20 14:57:55 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2007-04-20 14:57:55 +0800
commit4a044a636e418f4c95a85819aa92316e21f58b35 (patch)
treefed737c87045e269aa840b770172fb798682fd10
parentba064da784cd29692e0db6d4560c7e7a8c68aeeb (diff)
downloadgsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.gz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.bz2
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.lz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.xz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.zst
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.zip
Clean up printing in Evolution (bug #426816)
svn path=/trunk/; revision=33440
-rw-r--r--ChangeLog5
-rw-r--r--addressbook/ChangeLog24
-rw-r--r--addressbook/gui/component/addressbook-view.c4
-rw-r--r--addressbook/gui/widgets/e-addressbook-view.c236
-rw-r--r--addressbook/gui/widgets/e-addressbook-view.h4
-rw-r--r--addressbook/printing/Makefile.am2
-rw-r--r--addressbook/printing/e-contact-print-envelope.c91
-rw-r--r--addressbook/printing/e-contact-print-envelope.h7
-rw-r--r--addressbook/printing/e-contact-print-types.h2
-rw-r--r--addressbook/printing/e-contact-print.c1015
-rw-r--r--addressbook/printing/e-contact-print.h11
-rw-r--r--addressbook/printing/test-print.c11
-rw-r--r--calendar/ChangeLog13
-rw-r--r--calendar/gui/calendar-commands.c52
-rw-r--r--calendar/gui/dialogs/comp-editor.c2
-rw-r--r--calendar/gui/e-calendar-table.c2
-rw-r--r--calendar/gui/e-calendar-view.c29
-rw-r--r--calendar/gui/e-memo-table.c2
-rw-r--r--calendar/gui/memos-control.c41
-rw-r--r--calendar/gui/print.c1339
-rw-r--r--calendar/gui/print.h15
-rw-r--r--calendar/gui/tasks-control.c40
-rw-r--r--configure.in12
-rw-r--r--e-util/ChangeLog6
-rw-r--r--e-util/e-print.c98
-rw-r--r--e-util/e-print.h6
-rw-r--r--mail/ChangeLog10
-rw-r--r--mail/em-folder-view.c97
-rw-r--r--mail/em-folder-view.h3
-rw-r--r--mail/em-format-html-print.c314
-rw-r--r--mail/em-format-html-print.h32
-rw-r--r--plugins/print-message/ChangeLog5
-rw-r--r--plugins/print-message/print-message.c77
-rw-r--r--widgets/misc/e-printable.h1
-rw-r--r--widgets/table/ChangeLog9
-rw-r--r--widgets/table/e-cell-pixbuf.c11
-rw-r--r--widgets/table/e-cell-text.c1
-rw-r--r--widgets/table/e-cell-tree.c89
-rw-r--r--widgets/table/e-cell.h2
-rw-r--r--widgets/table/e-table-group-container.c60
40 files changed, 1417 insertions, 2363 deletions
diff --git a/ChangeLog b/ChangeLog
index 81cdda5e04..d044cc7fc2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ * configure.in:
+ Evolution no longer depends on libgnomeprint[ui]. (#426816)
+
2007-04-11 Matthew Barnes <mbarnes@redhat.com>
* configure.in:
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 1dae147ff8..f357e37235 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,27 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ ** Fixes part of bug #426816
+
+ * gui/component/addressbook-view.c:
+ * gui/widgets/e-addressbook-view.c:
+ * gui/widgets/e-addressbook-view.h:
+ * printing/e-contact-print.c:
+ * printing/e-contact-print.h:
+ * printing/e-contact-print-types.h:
+ Refactor the printing infrastructure.
+ Migrate off of libgnomeprint[ui] once and for all.
+
+ * printing/test-print.c:
+ Migrate off of libgnomeprint[ui] once and for all.
+
+ * printing/e-contact-print-envelope.c:
+ * printing/e-contact-print-envelope.h:
+ This module is unused. Disable it, but keep the logic around for
+ future reference.
+
+ * printing/Makefile.am:
+ Remove e-contact-print-envelope.[ch].
+
2007-04-19 Matthew Barnes <mbarnes@redhat.com>
** Fixes part of bug #429422
diff --git a/addressbook/gui/component/addressbook-view.c b/addressbook/gui/component/addressbook-view.c
index 7defe5e42b..53a5453e1c 100644
--- a/addressbook/gui/component/addressbook-view.c
+++ b/addressbook/gui/component/addressbook-view.c
@@ -193,7 +193,7 @@ print_cb (BonoboUIComponent *uih, void *user_data, const char *path)
AddressbookView *view = (AddressbookView *) user_data;
EABView *v = get_current_view (view);
if (v)
- eab_view_print (v, 0);
+ eab_view_print (v, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
}
static void
@@ -202,7 +202,7 @@ print_preview_cb (BonoboUIComponent *uih, void *user_data, const char *path)
AddressbookView *view = (AddressbookView *) user_data;
EABView *v = get_current_view (view);
if (v)
- eab_view_print_preview (v);
+ eab_view_print (v, GTK_PRINT_OPERATION_ACTION_PREVIEW);
}
static void
diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c
index 282f142a77..14019d582b 100644
--- a/addressbook/gui/widgets/e-addressbook-view.c
+++ b/addressbook/gui/widgets/e-addressbook-view.c
@@ -37,11 +37,6 @@
#include <e-util/e-icon-factory.h>
#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-
#include "addressbook/printing/e-contact-print.h"
#include "addressbook/printing/e-contact-print-envelope.h"
#include "addressbook/gui/widgets/eab-popup.h"
@@ -81,7 +76,6 @@
#include <libxml/tree.h>
#include <libxml/parser.h>
-#include <gtk/gtkprintunixdialog.h>
#define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")"
@@ -121,7 +115,6 @@ static void query_changed (ESearchBar *esb, EABView *view);
static void search_activated (ESearchBar *esb, EABView *view);
static void search_menu_activated (ESearchBar *esb, int id, EABView *view);
static GList *get_master_list (void);
-static void contact_print_button_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr,EPrintable *printable);
#define PARENT_TYPE GTK_TYPE_VBOX
static GtkVBoxClass *parent_class = NULL;
@@ -874,17 +867,13 @@ print (EPopup *ep, EPopupItem *pitem, void *data)
{
/*ContactAndBook *contact_and_book = data;*/
EABPopupTargetSelect *t = (EABPopupTargetSelect *)ep->target;
- GtkWidget *dialog;
+ GList *contact_list;
- if (t->cards->len == 1) {
- dialog = e_contact_print_contact_dialog_new(t->cards->pdata[0]);
- e_contact_print_response (dialog, GTK_RESPONSE_OK, NULL);
- } else {
- GList *contacts = get_contact_list(t);
- dialog = e_contact_print_contact_list_dialog_new (contacts);
- e_contact_print_response (dialog, GTK_RESPONSE_OK, NULL);
- g_list_free(contacts);
- }
+ contact_list = get_contact_list (t);
+ e_contact_print (
+ NULL, NULL, contact_list,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+ g_list_free (contact_list);
}
static void
@@ -1703,77 +1692,46 @@ get_master_list (void)
return category_list;
}
-typedef struct {
- GtkWidget *table;
- GObject *printable;
-} EContactPrintDialogWeakData;
-
static void
-e_contact_print_destroy(gpointer data, GObject *where_object_was)
+contact_print_button_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ EPrintable *printable)
{
- EContactPrintDialogWeakData *weak_data = data;
- g_object_unref (weak_data->printable);
- g_object_unref (weak_data->table);
- g_free (weak_data);
+ GtkPageSetup *setup;
+ gdouble top_margin;
+ cairo_t *cr;
+
+ setup = gtk_print_context_get_page_setup (context);
+ top_margin = gtk_page_setup_get_top_margin (setup, GTK_UNIT_POINTS);
+
+ cr = gtk_print_context_get_cairo_context (context);
+
+ e_printable_reset (printable);
+
+ while (e_printable_data_left (printable)) {
+ cairo_save (cr);
+ e_printable_print_page (
+ printable, context, 6.5 * 72, top_margin + 10, TRUE);
+ cairo_restore (cr);
+ }
}
static void
-e_contact_print_button(GtkDialog *dialog, gint response, gpointer data)
-{
-#ifdef G_OS_UNIX /* Just to get it to build on Win32 */
- GtkPrintOperation *print;
- GtkPrintSettings *settings;
- GtkPageSetup *page_setup;
- GtkPaperSize *paper_size;
-
- EPrintable *printable = g_object_get_data(G_OBJECT(dialog), "printable");
- print = gtk_print_operation_new ();
- page_setup = gtk_page_setup_new ();
-
- /*get & set,the settings of the dialog */
- settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dialog));
- paper_size = gtk_paper_size_new ("iso_a4"); /* FIXME paper size hardcoded */
- gtk_page_setup_set_paper_size (page_setup, paper_size);
- gtk_print_operation_set_print_settings (print, settings);
-
- gtk_print_operation_set_n_pages (print, 1);
- gtk_print_operation_set_default_page_setup (print, page_setup);
- /* run the dialog */
- g_signal_connect (print,"draw_page",G_CALLBACK(contact_print_button_draw_page), printable);
-
- if (response == GTK_RESPONSE_APPLY)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- else
- gtk_print_operation_run (print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL,NULL);
-
- gtk_widget_destroy(dialog);
- g_object_unref (print);
-#else
- g_warning ("Not implemented currently on Windows");
-#endif
-}
+e_contact_print_button (EPrintable *printable, GtkPrintOperationAction action)
+{
+ GtkPrintOperation *operation;
-static void
-contact_print_button_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr,EPrintable *printable)
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
-{
- cairo_t *cr;
- GtkPageSetup *page_setup;
- gdouble top_margin;
-
- cr = gtk_print_context_get_cairo_context (context);
- page_setup = gtk_print_operation_get_default_page_setup (print);
- top_margin = gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_POINTS);
- e_printable_reset(printable);
- while (e_printable_data_left(printable)) {
- cairo_save (cr);
- e_printable_print_page (printable,
- context,
- 6.5 * 72,
- top_margin + 10,
- TRUE);
- cairo_restore (cr);
- }
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (contact_print_button_draw_page), printable);
+
+ gtk_print_operation_run (operation, action, NULL, NULL);
+
+ g_object_unref (operation);
}
void
@@ -1838,110 +1796,44 @@ eab_view_discard_menus (EABView *view)
}
void
-eab_view_print(EABView *view, int preview)
+eab_view_print (EABView *view, GtkPrintOperationAction action)
{
if (view->view_type == EAB_VIEW_MINICARD) {
- char *query;
EBook *book;
- GtkWidget *print;
- GList *list;
-
- g_object_get (view->model,
- "query", &query,
- "book", &book,
- NULL);
- list = get_selected_contacts (view);
- print = e_contact_print_dialog_new (book, query, list);
-
- if (!preview)
- e_contact_print_response (print, GTK_RESPONSE_OK, NULL);
- else
- e_contact_print_response (print, GTK_RESPONSE_APPLY, NULL);
-
- g_free (query);
- g_list_foreach (list, (GFunc) g_object_unref, NULL);
- g_list_free (list);
- }
- else if (view->view_type == EAB_VIEW_TABLE) {
- GtkWidget *dialog;
- EPrintable *printable;
- ETable *etable;
- EContactPrintDialogWeakData *weak_data;
-
- /* FIXME: Allow range selection in table views, as in minicard view */
- dialog = e_print_get_dialog (_("Print cards"), 0);
+ EBookQuery *query;
+ gchar *query_string;
+ GList *contact_list;
- g_object_get(view->widget, "table", &etable, NULL);
- printable = e_table_get_printable(etable);
- g_object_ref_sink (printable);
- g_object_unref(etable);
- g_object_ref (view->widget);
+ g_object_get (
+ view->model, "query", &query_string,
+ "book", &book, NULL);
- g_object_set_data (G_OBJECT (dialog), "table", view->widget);
- g_object_set_data (G_OBJECT (dialog), "printable", printable);
-
- weak_data = g_new (EContactPrintDialogWeakData, 1);
- weak_data->table = view->widget;
- weak_data->printable = G_OBJECT (printable);
- g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data);
- if (preview)
- e_contact_print_button (dialog, GTK_RESPONSE_APPLY, NULL);
+ if (query_string != NULL)
+ query = e_book_query_from_string (query_string);
else
- e_contact_print_button (dialog, GTK_RESPONSE_OK, NULL);
- }
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
- else if (view->view_type == EAB_VIEW_TREEVIEW) {
- /* XXX */
- }
-#endif
-}
+ query = NULL;
+ g_free (query_string);
-void
-eab_view_print_preview(EABView *view)
-{
- if (view->view_type == EAB_VIEW_MINICARD) {
- char *query;
- EBook *book;
- GtkWidget *dialog;
- GList *list;
+ contact_list = get_selected_contacts (view);
+ e_contact_print (book, query, contact_list, action);
+ g_list_foreach (contact_list, (GFunc) g_object_unref, NULL);
+ g_list_free (contact_list);
- g_object_get (view->model,
- "query", &query,
- "book", &book,
- NULL);
+ if (query != NULL)
+ e_book_query_unref (query);
- list = get_selected_contacts (view);
- if (list != NULL)
- dialog = e_contact_print_contact_list_dialog_new (list);
- else
- dialog = e_contact_print_dialog_new (book, query, list);
- e_contact_print_response (dialog, GTK_RESPONSE_APPLY, NULL);
- g_list_foreach (list, (GFunc) g_object_unref, NULL);
- g_list_free (list);
- g_free (query);
- }else if (view->view_type == EAB_VIEW_TABLE) {
- GtkWidget *dialog;
+ } else if (view->view_type == EAB_VIEW_TABLE) {
EPrintable *printable;
- ETable *etable;
- EContactPrintDialogWeakData *weak_data;
+ ETable *table;
- /* FIXME: Allow range selection in table views, as in minicard view */
- dialog = e_print_get_dialog (_("Print cards"), 0);
-
- g_object_get(view->widget, "table", &etable, NULL);
- printable = e_table_get_printable(etable);
+ g_object_get (view->widget, "table", &table, NULL);
+ printable = e_table_get_printable (table);
g_object_ref_sink (printable);
- g_object_unref(etable);
- g_object_ref (view->widget);
+ g_object_unref (table);
- g_object_set_data (G_OBJECT (dialog), "table", view->widget);
- g_object_set_data (G_OBJECT (dialog), "printable", printable);
-
- weak_data = g_new (EContactPrintDialogWeakData, 1);
- weak_data->table = view->widget;
- weak_data->printable = G_OBJECT (printable);
- g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data);
- e_contact_print_button (dialog, GTK_RESPONSE_APPLY, NULL);
+ e_contact_print_button (printable, action);
+
+ g_object_unref (printable);
}
}
diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h
index 0f674c9edd..b525e97ed0 100644
--- a/addressbook/gui/widgets/e-addressbook-view.h
+++ b/addressbook/gui/widgets/e-addressbook-view.h
@@ -130,8 +130,8 @@ void eab_view_save_as (EABView *view, gboolean all);
void eab_view_view (EABView *view);
void eab_view_send (EABView *view);
void eab_view_send_to (EABView *view);
-void eab_view_print (EABView *view, int preview);
-void eab_view_print_preview (EABView *view);
+void eab_view_print (EABView *view,
+ GtkPrintOperationAction action);
void eab_view_delete_selection (EABView *view, gboolean is_delete);
void eab_view_cut (EABView *view);
void eab_view_copy (EABView *view);
diff --git a/addressbook/printing/Makefile.am b/addressbook/printing/Makefile.am
index 0f3a3e85f3..6113519b2f 100644
--- a/addressbook/printing/Makefile.am
+++ b/addressbook/printing/Makefile.am
@@ -22,8 +22,6 @@ noinst_LTLIBRARIES = \
libecontactprint.la
libecontactprint_la_SOURCES = \
- e-contact-print-envelope.c \
- e-contact-print-envelope.h \
e-contact-print-style-editor.c \
e-contact-print-style-editor.h \
e-contact-print-types.h \
diff --git a/addressbook/printing/e-contact-print-envelope.c b/addressbook/printing/e-contact-print-envelope.c
index 1c9b210a97..eabe41aa48 100644
--- a/addressbook/printing/e-contact-print-envelope.c
+++ b/addressbook/printing/e-contact-print-envelope.c
@@ -19,16 +19,17 @@
* Boston, MA 02111-1307, USA.
*/
+/* XXX Keeping the rendering code around for future reference,
+ * but it needs a lot of work to make it usable again. */
+
+#if 0
+
#include <config.h>
#include "addressbook/printing/e-contact-print-envelope.h"
#include <glib.h>
#include <glib/gi18n.h>
#include <libgnomeui/gnome-dialog.h>
#include <time.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
#include <e-util/e-print.h>
#define ENVELOPE_HEIGHT (72.0 * 4.0)
@@ -123,12 +124,6 @@ ecpe_linelist_print(GnomePrintContext *pc, GnomeFont *font, char *address, EcpeL
}
}
-static gint
-e_contact_print_envelope_close(GnomeDialog *dialog, gpointer data)
-{
- return FALSE;
-}
-
static void
ecpe_print(GnomePrintContext *pc, EContact *contact, gboolean as_return)
{
@@ -166,78 +161,4 @@ ecpe_print(GnomePrintContext *pc, EContact *contact, gboolean as_return)
gnome_print_context_close(pc);
}
-static void
-e_contact_print_envelope_button(GnomeDialog *dialog, gint button, gpointer data)
-{
- GnomePrintJob *master;
- GnomePrintContext *pc;
- GnomePrintConfig *config;
- EContact *contact = NULL;
- GtkWidget *preview;
-
- contact = g_object_get_data(G_OBJECT(dialog), "contact");
-
- switch( button ) {
- case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context( master );
-
- ecpe_print(pc, contact, FALSE);
-
- gnome_print_job_print(master);
- gnome_dialog_close(dialog);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
- config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
- master = gnome_print_job_new (config);
- pc = gnome_print_job_get_context( master );
-
- ecpe_print(pc, contact, FALSE);
-
- preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview"));
- gtk_widget_show_all(preview);
- break;
- case GNOME_PRINT_DIALOG_RESPONSE_CANCEL:
- g_object_unref(contact);
- gnome_dialog_close(dialog);
- break;
- }
-}
-
-GtkWidget *
-e_contact_print_envelope_dialog_new(EContact *contact)
-{
- GtkWidget *dialog;
-
- dialog = e_print_get_dialog (_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
- contact = e_contact_duplicate(contact);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_signal_connect(dialog,
- "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
- return dialog;
-}
-
-/* FIXME: Print all the contacts selected. */
-GtkWidget *
-e_contact_print_envelope_list_dialog_new(GList *list)
-{
- GtkWidget *dialog;
- EContact *contact;
-
- if (list == NULL)
- return NULL;
-
- dialog = e_print_get_dialog(_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
- contact = e_contact_duplicate(list->data);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_signal_connect(dialog,
- "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
- return dialog;
-}
+#endif
diff --git a/addressbook/printing/e-contact-print-envelope.h b/addressbook/printing/e-contact-print-envelope.h
index a7a8492638..05009b9035 100644
--- a/addressbook/printing/e-contact-print-envelope.h
+++ b/addressbook/printing/e-contact-print-envelope.h
@@ -22,11 +22,6 @@
#ifndef E_CONTACT_PRINT_ENVELOPE_H
#define E_CONTACT_PRINT_ENVELOPE_H
-#include <gtk/gtkwidget.h>
-#include <libebook/e-contact.h>
-#include "e-contact-print-types.h"
-
-GtkWidget *e_contact_print_envelope_dialog_new(EContact *contact);
-GtkWidget *e_contact_print_envelope_list_dialog_new(GList *list);
+/* XXX Currently unused */
#endif /* E_CONTACT_PRINT_ENVELOPE_H */
diff --git a/addressbook/printing/e-contact-print-types.h b/addressbook/printing/e-contact-print-types.h
index 5aafa96d40..d1fe68e745 100644
--- a/addressbook/printing/e-contact-print-types.h
+++ b/addressbook/printing/e-contact-print-types.h
@@ -23,8 +23,6 @@
#define E_CONTACT_PRINT_TYPES_H
#include <glib.h>
-#include <libgnomeprint/gnome-font.h>
-#include <libgnomeprint/gnome-print-pango.h>
typedef struct _EContactPrintStyle EContactPrintStyle;
typedef enum _EContactPrintType EContactPrintType;
diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c
index 32098689d9..002e284366 100644
--- a/addressbook/printing/e-contact-print.c
+++ b/addressbook/printing/e-contact-print.c
@@ -33,19 +33,11 @@
#include <libxml/xmlmemory.h>
#include <libgnome/gnome-util.h>
#include <glib/gi18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-unit.h>
-#include <libgnomeprint/gnome-print-config.h>
-#include <libgnomeprint/gnome-font.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
#include <libebook/e-book.h>
#include <libebook/e-contact.h>
#include <gtk/gtk.h>
-#include <gtk/gtkprintunixdialog.h>
+#include <libedataserver/e-flag.h>
#include <libedataserver/e-xml-utils.h>
#include "e-util/e-print.h"
@@ -53,556 +45,340 @@
#include "e-util/e-util-private.h"
#include "e-contact-print.h"
-
-#define SCALE 5
-#define HYPHEN_PIXELS 20
-#define HYPHEN_PENALTY ( (SCALE) * (SCALE) * (HYPHEN_PIXELS) * (HYPHEN_PIXELS) )
typedef struct _EContactPrintContext EContactPrintContext;
typedef struct _ContactPrintItem ContactPrintItem;
struct _EContactPrintContext
{
- GtkPrintContext *pc;
- GtkPrintOperation *print;
- GnomePrintJob *master;
- PangoLayout *pl;
+ GtkPrintContext *context;
gdouble x;
gdouble y;
gint column;
+ gdouble column_width;
+ gdouble column_spacing;
EContactPrintStyle *style;
gboolean first_section;
PangoFontDescription *letter_heading_font;
- char *character;
+ gchar *section;
gboolean first_contact;
- gboolean uses_book;
- int type;
- gint response_id;
EBook *book;
EBookQuery *query;
- GList *contacts;
-};
-
-struct _ContactPrintItem
-{
- EContactPrintContext *ctxt;
- EContactPrintStyle *style;
- EContact *contact;
GList *contact_list;
- EBook *book;
- GtkPrintSettings *settings;
- gboolean uses_book, uses_list;
};
-static void
-contact_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, ContactPrintItem *cpi);
-
-static void
-print_func (EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt);
-
-static double
-get_font_height (PangoFontDescription *font)
+static gdouble
+get_font_height (PangoFontDescription *desc)
{
- return (double)pango_font_description_get_size (font)/(double)PANGO_SCALE;
+ return pango_units_to_double (
+ pango_font_description_get_size (desc));
}
-static double
-get_font_width (EContactPrintContext *context, PangoFontDescription *font, const char *text)
+static gdouble
+get_font_width (GtkPrintContext *context,
+ PangoFontDescription *desc,
+ const gchar *text)
{
- int width;
- int height;
+ PangoLayout *layout;
+ gint width, height;
- g_return_val_if_fail (font, 0.0);
- g_return_val_if_fail (text, 0.0);
+ g_return_val_if_fail (desc, .0);
+ g_return_val_if_fail (text, .0);
- g_assert (context->pl);
- pango_layout_set_font_description (context->pl, font);
- pango_layout_set_text (context->pl, text, -1);
- pango_layout_set_width (context->pl, -1);
- pango_layout_set_indent (context->pl, 0);
+ layout = gtk_print_context_create_pango_layout (context);
- pango_layout_get_size (context->pl,
- &width,
- &height);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, -1);
+ pango_layout_set_indent (layout, 0);
- return (double)width/(double)PANGO_SCALE;
-}
+ pango_layout_get_size (layout, &width, &height);
-static PangoFontDescription*
-find_font (const char *name, double height)
-{
- PangoFontDescription *desc = pango_font_description_new ();
- pango_font_description_set_family (desc, name);
- pango_font_description_set_size (desc, height * PANGO_SCALE);
+ g_object_unref (layout);
- return desc;
+ return pango_units_to_double (width);
}
-static PangoFontDescription*
-find_closest_font_from_weight_slant (const guchar *family, GnomeFontWeight weight, gboolean italic, gdouble size)
+static void
+e_contact_output (GtkPrintContext *context,
+ PangoFontDescription *font,
+ gdouble x, gdouble y, gdouble width,
+ const gchar *text)
{
- PangoFontDescription *desc = pango_font_description_new ();
- pango_font_description_set_family (desc, family);
-
- /* GnomePrintWeight and PangoWeight values should be interchangeable: */
- pango_font_description_set_weight (desc, (PangoWeight)weight);
+ PangoLayout *layout;
+ gdouble indent;
+ cairo_t *cr;
- if (italic) {
- pango_font_description_set_style (desc, PANGO_STYLE_ITALIC);
- }
- pango_font_description_set_size (desc, size * PANGO_SCALE);
+ layout = gtk_print_context_create_pango_layout (context);
- return desc;
-}
+ if (width == -1 || get_font_width (context, font, text) <= width)
+ indent = .0;
+ else
+ indent = get_font_width (context, font, " ");
-static void
-e_contact_output(EContactPrintContext *ctxt, PangoFontDescription *font, double x, double y, double width, const gchar *text)
-{
- double indent;
- cairo_t *cr = gtk_print_context_get_cairo_context (ctxt->pc);
- cairo_save(cr);
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, pango_units_from_double (width));
+ pango_layout_set_indent (layout, pango_units_from_double (indent));
- if ( width == -1 || get_font_width(ctxt, font, text) <= width ) {
- indent = 0.0;
- } else {
- indent = get_font_width (ctxt, font, " ");
- }
+ cr = gtk_print_context_get_cairo_context (context);
- g_assert (ctxt->pl);
- pango_layout_set_font_description (ctxt->pl, font);
- pango_layout_set_text (ctxt->pl, text, -1);
- pango_layout_set_width (ctxt->pl, width*PANGO_SCALE);
- pango_layout_set_indent (ctxt->pl, indent*PANGO_SCALE);
-
- cairo_move_to(cr, x, y);
- pango_cairo_show_layout (cr, ctxt->pl);
+ cairo_save (cr);
+ cairo_move_to (cr, x, y);
+ pango_cairo_show_layout (cr, layout);
cairo_restore (cr);
+ g_object_unref (layout);
}
static gdouble
-e_contact_text_height(EContactPrintContext *ctxt, PangoFontDescription *font, double width, const gchar *text)
+e_contact_text_height (GtkPrintContext *context,
+ PangoFontDescription *desc,
+ const gchar *text)
{
- gint w, h;
+ PangoLayout *layout;
+ gint width, height;
- g_assert (ctxt->pl);
- pango_layout_set_font_description (ctxt->pl, font);
- pango_layout_set_text (ctxt->pl, text, -1);
- pango_layout_set_width (ctxt->pl, 1); /* fix me width hard coded */
- pango_layout_set_indent (ctxt->pl, 0);
- pango_layout_get_size (ctxt->pl, &w, &h);
+ layout = gtk_print_context_create_pango_layout (context);
- return (double)h/(double)PANGO_SCALE;
-}
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, text, -1);
-#if 0
-static void
-e_contact_output_and_advance(EContactPrintContext *ctxt, PangoFontDescription *font, double x, double width, gchar *text)
-{
- ctxt->y -= .1 * get_font_height (font);
- e_contact_output(ctxt->pc, font, x, ctxt->y, width, text);
- ctxt->y -= e_contact_text_height(ctxt->pc, font, width, text);
- ctxt->y -= .1 * get_font_height (font);
-}
-#endif
+ pango_layout_get_size (layout, &width, &height);
-static void
-e_contact_rectangle(GtkPrintContext *pc,
- gdouble x0,
- gdouble y0,
- gdouble x1,
- gdouble y1,
- gdouble r,
- gdouble g,
- gdouble b)
-{
- cairo_t *cr;
- cr = gtk_print_context_get_cairo_context (pc);
- cairo_save(cr);
- cairo_set_source_rgb(cr, r, g, b);
- cairo_rectangle (cr,x0, y0, x1, y1);
- cairo_fill (cr);
- cairo_restore (cr);
-}
+ g_object_unref (layout);
-static double
-e_contact_get_letter_heading_height (EContactPrintContext *ctxt)
-{
- return get_font_height (ctxt->letter_heading_font);
+ return pango_units_to_double (height);
}
static void
-e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *character)
+e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *letter)
{
- gdouble height;
- gdouble width;
+ PangoLayout *layout;
+ PangoFontDescription *desc;
+ PangoFontMetrics *metrics;
+ gint width, height;
cairo_t *cr;
- width = get_font_width(ctxt, ctxt->letter_heading_font, "m") * 1.7;
- height = get_font_height (ctxt->letter_heading_font);
-
- cr = gtk_print_context_get_cairo_context (ctxt->pc);
- cairo_save(cr);
+ desc = ctxt->letter_heading_font;
- e_contact_rectangle( ctxt->pc, ctxt->x, ctxt->y, width, height + 6, 0, 0, 0);
- cairo_set_source_rgb(cr, 1, 1, 1);
- ctxt->y += 4;
- e_contact_output(ctxt, ctxt->letter_heading_font,
- ctxt->x + (width - get_font_width(ctxt, ctxt->letter_heading_font, character))/ 2 - 5,
- ctxt->y - 5,
- -1,
- character);
- ctxt->y += height;
- ctxt->y += 2;
- ctxt->y += 3;
-
- cairo_restore(cr);
-}
+ layout = gtk_print_context_create_pango_layout (ctxt->context);
-static void
-e_contact_start_new_page(EContactPrintContext *ctxt)
-{
- cairo_t *cr;
- cr = gtk_print_context_get_cairo_context (ctxt->pc);
- ctxt->x = ctxt->style->left_margin;
- ctxt->y = ctxt->style->top_margin;
- cairo_show_page (cr);
- ctxt->column = 0;
-}
+ /* Make the rectangle thrice the average character width.
+ * XXX Works well for English, what about other locales? */
+ metrics = pango_context_get_metrics (
+ pango_layout_get_context (layout),
+ desc, pango_language_get_default ());
+ width = pango_font_metrics_get_approximate_char_width (metrics) * 3;
+ pango_font_metrics_unref (metrics);
-static double
-e_contact_get_contact_size(EContact *contact, EContactPrintContext *ctxt)
-{
- const char *file_as;
- gdouble height = 0;
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
- gint field;
- column_width = (page_width + 18) / ctxt->style->num_columns - 18;
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, letter, -1);
+ pango_layout_set_width (layout, width);
+ pango_layout_get_size (layout, NULL, &height);
- height += get_font_height (ctxt->style->headings_font) * .2;
+ /* Draw white text centered in a black rectangle. */
- height += get_font_height (ctxt->style->headings_font) * .2;
+ cr = gtk_print_context_get_cairo_context (ctxt->context);
- file_as = e_contact_get_const (contact, E_CONTACT_FILE_AS);
+ cairo_save (cr);
+ cairo_set_source_rgb (cr, .0, .0, .0);
+ cairo_rectangle (
+ cr, ctxt->x, ctxt->y,
+ pango_units_to_double (width),
+ pango_units_to_double (height));
+ cairo_fill (cr);
+ cairo_restore (cr);
- height += e_contact_text_height(ctxt, ctxt->style->headings_font, column_width - 4, file_as);
+ cairo_save (cr);
+ cairo_move_to (cr, ctxt->x, ctxt->y);
+ cairo_set_source_rgb (cr, 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout);
+ cairo_restore (cr);
- height += get_font_height (ctxt->style->headings_font) * .2;
+ ctxt->y += pango_units_to_double (height);
+}
- height += get_font_height (ctxt->style->headings_font) * .2;
-
- for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) {
- char *string;
- string = e_contact_get(contact, field);
- if (string && *string) {
- double xoff = 0;
- xoff += get_font_width(ctxt, ctxt->style->body_font, e_contact_pretty_name (field));
- xoff += get_font_width(ctxt, ctxt->style->body_font, ": ");
- height += e_contact_text_height(ctxt, ctxt->style->body_font, column_width - xoff, string);
- height += .2 * get_font_height (ctxt->style->body_font);
- }
- g_free(string);
- }
- height += get_font_height (ctxt->style->headings_font) * .4;
+static void
+e_contact_start_new_page (EContactPrintContext *ctxt)
+{
+ cairo_t *cr;
- /* g_message ("%s %g", e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FILE_AS), height); */
- return height;
-}
+ cr = gtk_print_context_get_cairo_context (ctxt->context);
+ cairo_show_page (cr);
+
+ ctxt->x = ctxt->y = .0;
+ ctxt->column = 0;
+}
static void
e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
{
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_width;
char *file_as;
cairo_t *cr;
int field;
- column_width = (page_width + 18) / ctxt->style->num_columns - 18;
- cr = gtk_print_context_get_cairo_context (ctxt->pc);
+ cr = gtk_print_context_get_cairo_context (ctxt->context);
cairo_save(cr);
ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
- ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
- if (ctxt->style->print_using_grey)
- e_contact_rectangle(ctxt->pc,
- ctxt->x,ctxt->y + get_font_height (ctxt->style->headings_font) * .3,
- column_width,
- e_contact_text_height(ctxt,
- ctxt->style->headings_font,
- column_width - 4, file_as)
- + get_font_height (ctxt->style->headings_font) * .3,
- .85, .85, .85);
-
-
- e_contact_output(ctxt, ctxt->style->headings_font, ctxt->x + 2, ctxt->y + 5, column_width + 4, file_as);
- ctxt->y += e_contact_text_height(ctxt, ctxt->style->headings_font, column_width + 4, file_as);
+ if (ctxt->style->print_using_grey) {
+ cairo_save (cr);
+ cairo_set_source_rgb (cr, .85, .85, .85);
+ cairo_rectangle (cr, ctxt->x, ctxt->y, ctxt->column_width,
+ e_contact_text_height (ctxt->context,
+ ctxt->style->headings_font, file_as));
+ cairo_fill (cr);
+ cairo_restore (cr);
+ }
+
+ e_contact_output (
+ ctxt->context, ctxt->style->headings_font,
+ ctxt->x, ctxt->y, ctxt->column_width + 4, file_as);
+ ctxt->y += e_contact_text_height (
+ ctxt->context, ctxt->style->headings_font, file_as);
+
g_free (file_as);
ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
- ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
-
- for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING;field++)
+
+ for (field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++)
{
- char *string;
- string = e_contact_get(contact, field);
-
- if (string && *string) {
- double xoff = 0;
-
- e_contact_output(ctxt,
- ctxt->style->body_font,
- ctxt->x + xoff,
- ctxt->y + 5,
- -1,
- e_contact_pretty_name (field));
-
- xoff += get_font_width(ctxt, ctxt->style->body_font, e_contact_pretty_name (field));
- e_contact_output(ctxt, ctxt->style->body_font, ctxt->x + xoff, ctxt->y + 5, -1, ": ");
- xoff += get_font_width(ctxt, ctxt->style->body_font, ": ");
-
- e_contact_output(ctxt,
- ctxt->style->body_font,
- ctxt->x + xoff,
- ctxt->y + 5,
- column_width - xoff,
- string);
-
- ctxt->y += e_contact_text_height(ctxt, ctxt->style->body_font, column_width - xoff, string);
- ctxt->y += .2 * get_font_height (ctxt->style->body_font);
+ const gchar *value;
+ gchar *text;
- }
- g_free(string);
- }
- ctxt->y += get_font_height (ctxt->style->headings_font) * .4 + 8;
- cairo_restore(cr);
-}
+ value = e_contact_get_const (contact, field);
+ if (value == NULL || *value == '\0')
+ continue;
-static void
-e_contact_start_new_column (EContactPrintContext *ctxt)
-{
- gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
- gdouble column_offset;
+ text = g_strdup_printf ("%s: %s",
+ e_contact_pretty_name (field), value);
- column_offset = (page_width + 18) / ctxt->style->num_columns;
- ctxt->column ++;
+ e_contact_output (
+ ctxt->context, ctxt->style->body_font,
+ ctxt->x, ctxt->y, -1, text);
- if (ctxt->column >= ctxt->style->num_columns) {
- e_contact_start_new_page(ctxt);
- ctxt->column = 0;
+ ctxt->y += e_contact_text_height (
+ ctxt->context, ctxt->style->body_font, text);
+
+ ctxt->y += .2 * get_font_height (ctxt->style->body_font);
+
+ g_free (text);
}
- ctxt->x = ctxt->style->left_margin + column_offset * ctxt->column;
- ctxt->y = ctxt->style->top_margin + 12;
+
+ ctxt->y += get_font_height (ctxt->style->headings_font) * .4 + 8;
+
+ cairo_restore (cr);
}
static void
-complete_sequence (EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt)
+e_contact_start_new_column (EContactPrintContext *ctxt)
{
- GList *contacts = ctxt->contacts;
-
- ctxt->first_contact = TRUE;
- ctxt->character = NULL;
- ctxt->y = ctxt->style->page_height + ctxt->style->top_margin;
- ctxt->x = (ctxt->style->left_margin);
-
- for(; contacts; contacts = contacts->next) {
- EContact *contact = contacts->data;
- guchar *file_as;
- gchar *letter_str = NULL;
-
- file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
-
- if (file_as != NULL) {
- letter_str = g_strndup (file_as, g_utf8_next_char (file_as) - (gchar *) file_as);
- }
- if ( file_as && (!ctxt->character || g_utf8_collate (ctxt->character, letter_str) != 0) ) {
- g_free (ctxt->character);
- ctxt->character = g_strdup (letter_str);
- if (ctxt->style->sections_start_new_page && ! ctxt->first_contact) {
- e_contact_start_new_page(ctxt);
- }
- else if ((!ctxt->first_contact) && (ctxt->y > ctxt->style->page_height * 60 ))
- e_contact_start_new_column(ctxt);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, ctxt->character);
- ctxt->first_section = FALSE;
- }
-
- else if ( (!ctxt->first_contact) && (ctxt->y > ctxt->style->page_height * 60)) {
- e_contact_start_new_column(ctxt);
- if ( ctxt->style->letter_headings )
- e_contact_print_letter_heading(ctxt, ctxt->character);
- }
-
- g_free (letter_str);
- e_contact_print_contact(contact, ctxt);
- ctxt->first_contact = FALSE;
+ if (++ctxt->column >= ctxt->style->num_columns)
+ e_contact_start_new_page (ctxt);
+ else {
+ ctxt->x = ctxt->column *
+ (ctxt->column_width + ctxt->column_spacing);
+ ctxt->y = .0;
}
-
- if (book_view)
- g_object_unref(book_view);
-
- g_object_unref(ctxt->pc);
- g_object_unref(ctxt->pl);
- if (ctxt->book)
- g_object_unref(ctxt->book);
-
- g_free(ctxt->character);
- if (ctxt->query)
- e_book_query_unref (ctxt->query);
- g_list_foreach(ctxt->contacts, (GFunc) g_object_unref, NULL);
- g_list_free(ctxt->contacts);
- pango_font_description_free(ctxt->style->headings_font);
- pango_font_description_free(ctxt->style->body_font);
- pango_font_description_free(ctxt->style->header_font);
- pango_font_description_free(ctxt->style->footer_font);
- pango_font_description_free(ctxt->letter_heading_font);
- g_free(ctxt->style);
}
static int
contact_compare (EContact *contact1, EContact *contact2)
{
- if (contact1 && contact2) {
- const char *file_as1, *file_as2;
- file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
- file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
-
- if (file_as1 && file_as2)
- return g_utf8_collate(file_as1, file_as2);
- if (file_as1)
- return -1;
- if (file_as2)
- return 1;
- return strcmp(e_contact_get_const(contact1, E_CONTACT_UID), e_contact_get_const(contact2, E_CONTACT_UID));
- } else {
+ const gchar *field1, *field2;
+
+ if (contact1 == NULL || contact2 == NULL)
return 0;
- }
-}
-static void
-create_contact(EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt)
-{
- for(; contacts; contacts = contacts->next) {
- EContact *contact = contacts->data;
- g_object_ref(contact);
- ctxt->contacts = g_list_insert_sorted(ctxt->contacts, contact, (GCompareFunc) contact_compare);
- }
-}
+ field1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
+ field2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContactPrintContext *ctxt)
-{
- g_object_ref(book_view);
-
- g_signal_connect(book_view,
- "contacts_added",
- G_CALLBACK(create_contact),
- ctxt);
- g_signal_connect(book_view,
- "sequence_complete",
- G_CALLBACK(print_func),
- ctxt);
- e_book_view_start (book_view);
-}
+ if (field1 != NULL && field2 != NULL)
+ return g_utf8_collate (field1, field2);
-static void
-print_func (EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt)
-{
- GtkPrintSettings *settings;
- settings = gtk_print_settings_new ();
- /* runs a print dialog, emittings signals */
- if(ctxt->response_id == GTK_RESPONSE_APPLY)
- gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- else
- gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- settings = gtk_print_operation_get_print_settings (ctxt->print);
- e_print_save_settings (settings);
-}
+ if (field1 != NULL || field2 != NULL)
+ return (field1 != NULL) ? -1 : 1;
-static void
-e_contact_do_print_contacts (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
-{
- EBookView *bookview;
- gboolean status;
+ field1 = e_contact_get_const (contact1, E_CONTACT_UID);
+ field2 = e_contact_get_const (contact2, E_CONTACT_UID);
+
+ g_assert (field1 != NULL && field2 != NULL);
- status = e_book_get_book_view (book, query, NULL, -1, &bookview, NULL);
- book_view_loaded (book, 1, bookview, ctxt);
+ return strcmp (field1, field2);
}
-
-static void
-e_contact_do_print (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
-{
- switch ( ctxt->style->type ) {
- case E_CONTACT_PRINT_TYPE_CARDS:
- e_contact_do_print_contacts( book, query, ctxt);
- break;
- default:
- break;
+
+static void
+contacts_added (EBookView *book_view, const GList *contact_list,
+ EContactPrintContext *ctxt)
+{
+ while (contact_list != NULL) {
+ ctxt->contact_list = g_list_insert_sorted(
+ ctxt->contact_list,
+ g_object_ref (contact_list->data),
+ (GCompareFunc) contact_compare);
+ contact_list = contact_list->next;
}
}
-static void lowify( char *data )
+static void
+sequence_complete (EBookView *book_view, const GList *contact_list,
+ EFlag *book_view_started)
{
- for ( ; *data; data++ )
- *data = tolower((unsigned char) *data);
+ e_flag_set (book_view_started);
}
-static gboolean get_bool( char *data )
+static gboolean
+get_bool (gchar *data)
{
- if ( data ) {
- lowify ( data );
- return ! strcmp(data, "true");
- } else
+ if (data)
+ return (g_ascii_strcasecmp (data, "true") == 0);
+ else
return FALSE;
}
-static void get_string( char *data, char **variable )
+static void
+get_string (gchar *data, gchar **variable)
{
- g_free ( *variable );
- if ( data )
- *variable = g_strdup( data );
- else
- *variable = g_strdup( "" );
+ g_free (*variable);
+ *variable = g_strdup ((data != NULL) ? data : "");
}
-static int get_integer( char *data )
+static gint
+get_integer (gchar *data)
{
- if ( data )
- return atoi(data);
- else
- return 0;
+ return (data != NULL) ? atoi (data) : 0;
}
-static double get_float( char *data )
+static gdouble
+get_float (gchar *data)
{
- if ( data )
- return atof(data);
- else
- return 0;
+ return (data != NULL) ? atof (data) : .0;
}
-static void get_font( char *data, PangoFontDescription **variable )
+static void
+get_font (gchar *data, PangoFontDescription **variable)
{
- if ( data ) {
- PangoFontDescription *font = pango_font_description_from_string ( data );
- if ( font ) {
- pango_font_description_free(*variable);
- *variable = font;
- }
+ PangoFontDescription *desc = NULL;
+
+ if (data != NULL)
+ desc = pango_font_description_from_string (data);
+
+ if (desc != NULL) {
+ pango_font_description_free (*variable);
+ *variable = desc;
}
}
-
static void
-e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
+e_contact_build_style (EContactPrintStyle *style)
{
xmlDocPtr styledoc;
gchar *filename;
@@ -614,8 +390,8 @@ e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
style->blank_forms = 2;
style->letter_headings = FALSE;
- style->headings_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOLD, FALSE, 8);
- style->body_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+ style->headings_font = pango_font_description_from_string ("Sans Bold 8");
+ style->body_font = pango_font_description_from_string ("Sans 6");
style->print_using_grey = TRUE;
style->paper_type = 0;
@@ -639,21 +415,23 @@ e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
#endif
style->orientation_portrait = FALSE;
- style->header_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+ style->header_font = pango_font_description_copy (style->body_font);
style->left_header = g_strdup("");
style->center_header = g_strdup("");
style->right_header = g_strdup("");
- style->footer_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+ style->footer_font = pango_font_description_copy (style->body_font);
- style->left_footer = g_strdup("");
- style->center_footer = g_strdup("");
- style->right_footer = g_strdup("");
+ style->left_footer = g_strdup ("");
+ style->center_footer = g_strdup ("");
+ style->right_footer = g_strdup ("");
style->reverse_on_even_pages = FALSE;
- filename = g_build_filename(EVOLUTION_ECPSDIR, "medbook.ecps", NULL);
+
+ filename = g_build_filename (EVOLUTION_ECPSDIR, "medbook.ecps", NULL);
styledoc = e_xml_parse_file (filename);
- g_free(filename);
+ g_free (filename);
+
if (styledoc) {
xmlNodePtr stylenode = xmlDocGetRootElement(styledoc);
xmlNodePtr node;
@@ -662,12 +440,11 @@ e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
if ( !strcmp( node->name, "title" ) ) {
get_string(data, &(style->title));
} else if ( !strcmp( node->name, "type" ) ) {
- lowify( data );
- if ( !strcmp( data, "cards" ) )
+ if (g_ascii_strcasecmp (data, "cards") == 0)
style->type = E_CONTACT_PRINT_TYPE_CARDS;
- else if ( !strcmp( data, "memo_style" ) )
+ else if (g_ascii_strcasecmp (data, "memo_style") == 0)
style->type = E_CONTACT_PRINT_TYPE_MEMO_STYLE;
- else if ( !strcmp( data, "phone_list" ) )
+ else if (g_ascii_strcasecmp (data, "phone_list") == 0)
style->type = E_CONTACT_PRINT_TYPE_PHONE_LIST;
} else if ( !strcmp( node->name, "sections_start_new_page" ) ) {
style->sections_start_new_page = get_bool(data);
@@ -701,8 +478,8 @@ e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
style->page_height = get_float(data);
} else if ( !strcmp( node->name, "orientation" ) ) {
if ( data ) {
- lowify(data);
- style->orientation_portrait = strcmp(data, "landscape");
+ style->orientation_portrait =
+ (g_ascii_strcasecmp (data, "landscape") != 0);
} else {
style->orientation_portrait = TRUE;
}
@@ -733,204 +510,192 @@ e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
}
-static gint
-e_contact_print_close(GnomeDialog *dialog, gpointer data)
+static void
+load_contacts (EContactPrintContext *ctxt)
{
- return FALSE;
+ /* Load contacts from the EBook. This is an asynchronous operation
+ * but we force it to be synchronous here. */
+
+ EBookView *book_view;
+ EFlag *book_view_started;
+
+ book_view_started = e_flag_new ();
+
+ e_book_get_book_view (
+ ctxt->book, ctxt->query, NULL, -1, &book_view, NULL);
+
+ g_signal_connect (
+ book_view, "contacts_added",
+ G_CALLBACK (contacts_added), ctxt);
+ g_signal_connect (
+ book_view, "sequence_complete",
+ G_CALLBACK (sequence_complete), book_view_started);
+
+ e_book_view_start (book_view);
+
+ while (!e_flag_is_set (book_view_started))
+ g_main_context_iteration (NULL, TRUE);
+
+ e_flag_free (book_view_started);
}
-void
-e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data)
+static void
+free_contacts (EContactPrintContext *ctxt)
{
-#ifdef G_OS_UNIX /* Just to get it to build on Win32 */
- GtkPrintSettings *settings;
- GtkPaperSize *paper_size;
- GtkPageSetup *page_setup;
- GList *contact_list = NULL;
- EBook *book = NULL;
- EBookQuery *query = NULL;
- EContact *contact = NULL;
- gdouble font_size;
- gboolean uses_book = FALSE, uses_list = FALSE, uses_range = FALSE;
-
- EContactPrintContext *ctxt = g_new0 (EContactPrintContext, 1);
- EContactPrintStyle *style = g_new0 (EContactPrintStyle, 1);
- ContactPrintItem *cpi = g_new0 (ContactPrintItem, 1);
-
- settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dialog));
- uses_range = GPOINTER_TO_INT (g_object_get_data(G_OBJECT (dialog),"uses_range"));
-
- if (uses_range) {
- if (gtk_print_settings_get_print_pages (settings) == GTK_PRINT_PAGES_ALL) {
- uses_book = TRUE;
- }
- if (gtk_print_settings_get_print_pages (settings) == GTK_PRINT_PAGES_CURRENT)
- uses_list = TRUE;
- }
- else {
- uses_book = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "uses_book"));
- uses_list = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "uses_list"));
- }
- if (uses_book) {
- book = g_object_get_data(G_OBJECT(dialog), "book");
- query = g_object_get_data(G_OBJECT(dialog), "query");
- e_book_query_ref (query);
- }
- else if (uses_list) {
- contact_list = g_object_get_data(G_OBJECT(dialog), "contact_list");
- }
- else {
- contact = g_object_get_data(G_OBJECT(dialog), "contact");
- }
-
- page_setup = gtk_page_setup_new ();
- paper_size = gtk_paper_size_new ("iso_a4"); /* FIXME paper size hardcoded */
- gtk_page_setup_set_paper_size (page_setup, paper_size);
- ctxt->print = gtk_print_operation_new ();
- gtk_print_operation_set_default_page_setup (ctxt->print, page_setup);
- gtk_print_operation_set_n_pages (ctxt->print, 1);
- gtk_print_settings_set_print_pages (settings, GTK_PRINT_PAGES_ALL);
-
- /* style information */
- e_contact_build_style(style, settings);
- style->page_height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_INCH);
- style->page_width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_INCH);
- ctxt->x = 0;
- ctxt->y = 0;
+ g_list_foreach (ctxt->contact_list, (GFunc) g_object_unref, NULL);
+ g_list_free (ctxt->contact_list);
+}
+
+static void
+contact_begin_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ EContactPrintContext *ctxt)
+{
+ GtkPageSetup *setup;
+ gdouble page_width;
+
+ e_contact_build_style (ctxt->style);
+
+ setup = gtk_print_context_get_page_setup (context);
+ page_width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+
+ ctxt->context = context;
+ ctxt->x = ctxt->y = .0;
ctxt->column = 0;
- ctxt->style = style;
+ ctxt->first_contact = TRUE;
ctxt->first_section = TRUE;
- ctxt->type = GTK_RESPONSE_OK;
- font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
- ctxt->letter_heading_font = find_font (pango_font_description_get_family (ctxt->style->headings_font),
- get_font_height (ctxt->style->headings_font)*1.5);
- ctxt->book = book;
- ctxt->query = query;
- ctxt->response_id = response_id;
- cpi->uses_book = uses_book;
- cpi->uses_list = uses_list;
- cpi->settings = settings;
- cpi->ctxt = ctxt;
- cpi->contact= contact;
- cpi->ctxt->contacts = NULL;
- cpi->contact_list= contact_list;
- cpi->book = book;
- gtk_print_operation_set_print_settings (ctxt->print, settings);
- g_signal_connect (ctxt->print, "draw_page",G_CALLBACK (contact_draw_page), cpi);
-
- if (!uses_book) {
- if(ctxt->response_id == GTK_RESPONSE_APPLY)
- gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- else
- gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- settings = gtk_print_operation_get_print_settings (ctxt->print);
- e_print_save_settings (settings);
- }
- else
- e_contact_do_print_contacts (book, query, ctxt);
-
- g_object_unref (cpi);
- if (!uses_book) {
- g_object_unref (ctxt->print);
- g_free (ctxt);
- }
- gtk_widget_destroy (dialog);
-#else
- g_warning ("Not implemented currently on Windows");
-#endif
-}
+ ctxt->section = NULL;
+ ctxt->column_spacing = gtk_print_context_get_dpi_x (context) / 4;
+ ctxt->column_width = (page_width + ctxt->column_spacing) /
+ ctxt->style->num_columns - ctxt->column_spacing;
+
+ ctxt->letter_heading_font = pango_font_description_new ();
+ pango_font_description_set_family (
+ ctxt->letter_heading_font,
+ pango_font_description_get_family (
+ ctxt->style->headings_font));
+ pango_font_description_set_size (
+ ctxt->letter_heading_font,
+ pango_font_description_get_size (
+ ctxt->style->headings_font) * 1.5);
+
+ if (ctxt->book != NULL)
+ load_contacts (ctxt);
+}
-GtkWidget *
-e_contact_print_dialog_new(EBook *book, char *query, GList *list)
+static void
+contact_draw (EContact *contact, EContactPrintContext *ctxt)
{
- GtkWidget *dialog;
- GList *copied_list = NULL;
- GList *l;
-
- dialog = e_print_get_dialog(_("Print contacts"), 0);
-
- if (list != NULL) {
- copied_list = g_list_copy (list);
- for (l = copied_list; l; l = l->next)
- l->data = e_contact_duplicate (E_CONTACT (l->data));
+ GtkPageSetup *setup;
+ gdouble page_height;
+ gchar *file_as;
+ gboolean new_section = FALSE;
+
+ setup = gtk_print_context_get_page_setup (ctxt->context);
+ page_height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+
+ file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
+
+ if (file_as != NULL) {
+ gchar *section;
+ gsize width;
+
+ width = g_utf8_next_char (file_as) - file_as;
+ section = g_utf8_strup (file_as, width);
+
+ new_section = (ctxt->section == NULL ||
+ g_utf8_collate (ctxt->section, section) != 0);
+
+ if (new_section) {
+ g_free (ctxt->section);
+ ctxt->section = section;
+ } else
+ g_free (section);
+ }
+
+ if (new_section) {
+ if (!ctxt->first_contact) {
+ if (ctxt->style->sections_start_new_page)
+ e_contact_start_new_page (ctxt);
+ else if (ctxt->y > page_height)
+ e_contact_start_new_column (ctxt);
+ }
+ if (ctxt->style->letter_headings)
+ e_contact_print_letter_heading (ctxt, ctxt->section);
+ ctxt->first_section = FALSE;
+ }
+
+ else if (!ctxt->first_contact && (ctxt->y > page_height)) {
+ e_contact_start_new_column (ctxt);
+ if (ctxt->style->letter_headings)
+ e_contact_print_letter_heading (ctxt, ctxt->section);
}
- g_object_ref(book);
- g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list);
- g_object_set_data(G_OBJECT(dialog), "book", book);
- g_object_set_data(G_OBJECT(dialog), "query", e_book_query_from_string (query));
- g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (TRUE));
-
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
+ e_contact_print_contact (contact, ctxt);
+
+ ctxt->first_contact = FALSE;
}
-GtkWidget *
-e_contact_print_contact_dialog_new(EContact *contact)
+static void
+contact_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ EContactPrintContext *ctxt)
{
- GtkWidget *dialog;
-
- dialog = e_print_get_dialog(_("Print contact"), 0);
- contact = e_contact_duplicate(contact);
- g_object_set_data(G_OBJECT(dialog), "contact", contact);
- g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE));
- g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
- g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (FALSE));
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
+ g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt);
}
-
-GtkWidget *
-e_contact_print_contact_list_dialog_new(GList *list)
+
+static void
+contact_end_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ EContactPrintContext *ctxt)
{
- GtkWidget *dialog;
- GList *copied_list;
- GList *l;
-
- if (list == NULL)
- return NULL;
-
- copied_list = g_list_copy (list);
- for (l = copied_list; l; l = l->next)
- l->data = e_contact_duplicate (E_CONTACT (l->data));
-
- dialog = e_print_get_dialog(_("Print contact"), 0);
-
- g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list);
- g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (TRUE));
- g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
- g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (FALSE));
- g_signal_connect(dialog,
- "response", G_CALLBACK(e_contact_print_response), NULL);
- g_signal_connect(dialog,
- "close", G_CALLBACK(e_contact_print_close), NULL);
- return dialog;
+ pango_font_description_free (ctxt->style->headings_font);
+ pango_font_description_free (ctxt->style->body_font);
+ pango_font_description_free (ctxt->style->header_font);
+ pango_font_description_free (ctxt->style->footer_font);
+ pango_font_description_free (ctxt->letter_heading_font);
+
+ g_free (ctxt->section);
+
+ if (ctxt->book != NULL)
+ free_contacts (ctxt);
}
-static void
-contact_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, ContactPrintItem *cpi)
+void
+e_contact_print (EBook *book, EBookQuery *query,
+ GList *contact_list, GtkPrintOperationAction action)
{
- cpi->ctxt->pc = context;
- g_object_ref (cpi->ctxt->pc);
- cpi->ctxt->pl =gtk_print_context_create_pango_layout (context);
-
- if (cpi->uses_book) {
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
- }
-
- else if (cpi->uses_list) {
- cpi->ctxt->contacts = cpi->contact_list;
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
- }
- else {
- cpi->ctxt->contacts = g_list_append(NULL,cpi->contact);
- complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
- }
+ GtkPrintOperation *operation;
+ EContactPrintContext ctxt;
+ EContactPrintStyle style;
+
+ if (book != NULL) {
+ ctxt.book = book;
+ ctxt.query = query;
+ ctxt.contact_list = NULL;
+ } else {
+ ctxt.book = NULL;
+ ctxt.query = NULL;
+ ctxt.contact_list = contact_list;
+ }
+ ctxt.style = &style;
+
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
+
+ g_signal_connect (
+ operation, "begin-print",
+ G_CALLBACK (contact_begin_print), &ctxt);
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (contact_draw_page), &ctxt);
+ g_signal_connect (
+ operation, "end-print",
+ G_CALLBACK (contact_end_print), &ctxt);
+
+ gtk_print_operation_run (operation, action, NULL, NULL);
+
+ g_object_unref (operation);
}
diff --git a/addressbook/printing/e-contact-print.h b/addressbook/printing/e-contact-print.h
index bc7b36c0da..a43f8b70eb 100644
--- a/addressbook/printing/e-contact-print.h
+++ b/addressbook/printing/e-contact-print.h
@@ -23,14 +23,13 @@
#define E_CONTACT_PRINT_H
#include <glib.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtkprintoperation.h>
#include <libebook/e-book.h>
-#include <libebook/e-contact.h>
#include "e-contact-print-types.h"
-GtkWidget *e_contact_print_dialog_new (EBook *book, char *query, GList *list);
-GtkWidget *e_contact_print_contact_dialog_new (EContact *card);
-GtkWidget *e_contact_print_contact_list_dialog_new(GList *list);
-void e_contact_print_response (GtkWidget *dialog, gint response_id, gpointer data);
+void e_contact_print (EBook *book,
+ EBookQuery *query,
+ GList *contact_list,
+ GtkPrintOperationAction action);
#endif /* E_CONTACT_PRINT_H */
diff --git a/addressbook/printing/test-print.c b/addressbook/printing/test-print.c
index 708885a861..1ac88dfa0a 100644
--- a/addressbook/printing/test-print.c
+++ b/addressbook/printing/test-print.c
@@ -32,12 +32,6 @@
/* This is a horrible thing to do, but it is just a test. */
GtkWidget *print;
-static gint test_close(GnomeDialog *dialog, gpointer data)
-{
- exit(0);
- return 1;
-}
-
#if 0
static void about_callback( GtkWidget *widget, gpointer data )
{
@@ -77,9 +71,8 @@ int main( int argc, char *argv[] )
shown_fields = g_list_append(shown_fields, "Third field");
shown_fields = g_list_append(shown_fields, "Fourth field");
- print = e_contact_print_dialog_new(NULL, NULL, NULL);
- gtk_widget_show_all(print);
- g_signal_connect(print, "close", G_CALLBACK(test_close), NULL);
+ /* does nothing */
+ e_contact_print (NULL, NULL, NULL, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
bonobo_main();
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index d33eddc09c..f71c901a5b 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,16 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ * gui/calendar-commands.c:
+ * gui/dialogs/comp-editor.c:
+ * gui/e-calendar-table.c:
+ * gui/e-calendar-view.c:
+ * gui/e-memo-table.c:
+ * gui/memos-control.c:
+ * gui/print.c:
+ * gui/print.h:
+ * gui/tasks-control.c:
+ Refactor the printing infrastructure. (#426816)
+
2007-04-19 Matthew Barnes <mbarnes@redhat.com>
** Fixes part of bug #429422
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c
index ef517f7137..bbdee852b8 100644
--- a/calendar/gui/calendar-commands.c
+++ b/calendar/gui/calendar-commands.c
@@ -88,62 +88,38 @@ file_open_event_cb (BonoboUIComponent *uic, gpointer data, const char *path)
/* Prints the calendar at its current view and time range */
static void
-print (GnomeCalendar *gcal, gboolean preview)
+print (GnomeCalendar *gcal, GtkPrintOperationAction action)
{
- time_t start;
- GnomeCalendarViewType view_type;
- PrintView print_view;
- ECalListView *list_view;
- ETable *etable;
-
- gnome_calendar_get_current_time_range (gcal, &start, NULL);
- view_type = gnome_calendar_get_view (gcal);
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW:
- print_view = PRINT_VIEW_DAY;
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- print_view = PRINT_VIEW_WEEK;
- break;
+ if (gnome_calendar_get_view (gcal) == GNOME_CAL_LIST_VIEW) {
+ ECalListView *list_view;
+ ETable *table;
- case GNOME_CAL_MONTH_VIEW:
- print_view = PRINT_VIEW_MONTH;
- break;
-
- case GNOME_CAL_LIST_VIEW:
list_view = E_CAL_LIST_VIEW (gnome_calendar_get_current_view_widget (gcal));
- etable = e_table_scrolled_get_table (list_view->table_scrolled);
- print_table (etable, _("Print"), _("Calendar"), preview);
- return;
+ table = e_table_scrolled_get_table (list_view->table_scrolled);
+ print_table (table, _("Print"), _("Calendar"), action);
+ } else {
+ time_t start;
- default:
- g_assert_not_reached ();
- return;
+ gnome_calendar_get_current_time_range (gcal, &start, NULL);
+ print_calendar (gcal, action, start);
}
-
- print_calendar (gcal, preview, start, print_view);
}
/* File/Print callback */
static void
file_print_cb (BonoboUIComponent *uic, gpointer data, const char *path)
{
- GnomeCalendar *gcal;
+ GnomeCalendar *gcal = GNOME_CALENDAR (data);
- gcal = GNOME_CALENDAR (data);
- print (gcal, FALSE);
+ print (gcal, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
}
static void
file_print_preview_cb (BonoboUIComponent *uic, gpointer data, const char *path)
{
- GnomeCalendar *gcal;
+ GnomeCalendar *gcal = GNOME_CALENDAR (data);
- gcal = GNOME_CALENDAR (data);
- print (gcal, TRUE);
+ print (gcal, GTK_PRINT_OPERATION_ACTION_PREVIEW);
}
/* Sets a clock cursor for the specified calendar window */
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c
index 0cd25deef7..fe27aa1e9d 100644
--- a/calendar/gui/dialogs/comp-editor.c
+++ b/calendar/gui/dialogs/comp-editor.c
@@ -1314,7 +1314,7 @@ menu_file_print_cb (BonoboUIComponent *uic,
for (l = priv->pages; l != NULL; l = l->next)
comp_editor_page_fill_component (l->data, comp);
- print_comp (comp, priv->client, FALSE);
+ print_comp (comp, priv->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
g_object_unref (comp);
}
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
index fd9d014827..88952f9b7a 100644
--- a/calendar/gui/e-calendar-table.c
+++ b/calendar/gui/e-calendar-table.c
@@ -1132,7 +1132,7 @@ e_calendar_table_on_print_task (EPopup *ep, EPopupItem *pitem, void *data)
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- print_comp (comp, comp_data->client, FALSE);
+ print_comp (comp, comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
g_object_unref (comp);
}
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 2ee44b29a6..c97dc3df59 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -1204,32 +1204,13 @@ on_print (EPopup *ep, EPopupItem *pitem, void *data)
{
ECalendarView *cal_view = data;
time_t start, end;
- GnomeCalendarViewType view_type;
- PrintView print_view;
e_calendar_view_get_visible_time_range (cal_view, &start, &end);
- view_type = gnome_calendar_get_view (cal_view->priv->calendar);
-
- switch (view_type) {
- case GNOME_CAL_DAY_VIEW :
- print_view = PRINT_VIEW_DAY;
- break;
-
- case GNOME_CAL_WORK_WEEK_VIEW :
- case GNOME_CAL_WEEK_VIEW:
- print_view = PRINT_VIEW_WEEK;
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- print_view = PRINT_VIEW_MONTH;
- break;
-
- default:
- g_assert_not_reached ();
- return;
- }
- print_calendar (cal_view->priv->calendar, FALSE, start, print_view);
+ print_calendar (
+ cal_view->priv->calendar,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ start);
}
static void
@@ -1278,7 +1259,7 @@ on_print_event (EPopup *ep, EPopupItem *pitem, void *data)
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
- print_comp (comp, event->comp_data->client, FALSE);
+ print_comp (comp, event->comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
g_object_unref (comp);
g_list_free (selected);
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c
index 18353f5563..8430a110f6 100644
--- a/calendar/gui/e-memo-table.c
+++ b/calendar/gui/e-memo-table.c
@@ -823,7 +823,7 @@ e_memo_table_on_print_memo (EPopup *ep, EPopupItem *pitem, void *data)
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
- print_comp (comp, comp_data->client, FALSE);
+ print_comp (comp, comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
g_object_unref (comp);
}
diff --git a/calendar/gui/memos-control.c b/calendar/gui/memos-control.c
index 3d4fc5182c..70a2611469 100644
--- a/calendar/gui/memos-control.c
+++ b/calendar/gui/memos-control.c
@@ -35,13 +35,6 @@
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-dialog-util.h>
#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
#include <bonobo/bonobo-control.h>
#include <bonobo/bonobo-ui-util.h>
#include <e-util/e-dialog-utils.h>
@@ -327,30 +320,21 @@ memos_control_delete_cmd (BonoboUIComponent *uic,
e_memos_delete_selected (memos);
}
-
-static void
-print_memos (EMemos *memos, gboolean preview)
-{
- EMemoTable *cal_table;
- ETable *etable;
-
- cal_table = e_memos_get_calendar_table (memos);
- etable = e_memo_table_get_table (E_MEMO_TABLE (cal_table));
-
- print_table (etable, _("Print Memos"), _("Memos"), preview);
-}
-
/* File/Print callback */
static void
memos_control_print_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path)
{
- EMemos *memos;
+ EMemos *memos = E_MEMOS (data);
+ ETable *table;
- memos = E_MEMOS (data);
+ table = e_memo_table_get_table (
+ E_MEMO_TABLE (e_memos_get_calendar_table (memos)));
- print_memos (memos, FALSE);
+ print_table (
+ table, _("Print Memos"), _("Memos"),
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
}
static void
@@ -358,10 +342,13 @@ memos_control_print_preview_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path)
{
- EMemos *memos;
+ EMemos *memos = E_MEMOS (data);
+ ETable *table;
- memos = E_MEMOS (data);
+ table = e_memo_table_get_table (
+ E_MEMO_TABLE (e_memos_get_calendar_table (memos)));
- print_memos (memos, TRUE);
+ print_table (
+ table, _("Print Memos"), _("Memos"),
+ GTK_PRINT_OPERATION_ACTION_PREVIEW);
}
-
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
index 5dbff11c0a..4e158121cb 100644
--- a/calendar/gui/print.c
+++ b/calendar/gui/print.c
@@ -32,19 +32,11 @@
#include <string.h>
#include <time.h>
#include <glib.h>
-#include <gtk/gtkradiobutton.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-uidefs.h>
#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
#include <libedataserver/e-time-utils.h>
#include <libedataserver/e-data-server-util.h>
#include <e-util/e-util.h>
@@ -62,135 +54,47 @@
#include "gnome-cal.h"
#include "print.h"
-#include <libgnomeprint/gnome-print-pango.h>
#include <glade/glade-xml.h>
-#include <gtk/gtkprintunixdialog.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkpagesetupunixdialog.h>
-#include <gtk/gtkprinter.h>
-
-typedef struct EvoCalendarPrintRenderer EvoCalendarPrintRenderer;
typedef struct PrintCompItem PrintCompItem;
-typedef struct PrintTableItem PrintTableItem;
typedef struct PrintCalItem PrintCalItem;
-struct EvoCalendarPrintRenderer
-{
- GtkPrintContext *pc;
-
- /* keep one of these around: */
- PangoLayout *pl;
-};
-
-struct PrintCompItem
-{
- EvoCalendarPrintRenderer *pr;
- struct ECal *client;
- struct ECalComponent *comp;
- double r,l,b,t;
-};
-
-struct PrintCalItem
-{
- EvoCalendarPrintRenderer *pr;
- struct GnomeCalendar *gcal;
- PrintView default_view;
- double r,l,b,t;
- time_t date;
+struct PrintCompItem {
+ struct ECal *client;
+ struct ECalComponent *comp;
};
-struct PrintTableItem
-{
- struct EPrintable *printable;
- double left_margin,bottom_margin,paper_width,paper_height;
- GtkPrintContext *context;
+struct PrintCalItem {
+ struct GnomeCalendar *gcal;
+ time_t start;
};
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc, PrintCompItem *pci);
-
-static void
-comp_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr,
- PrintCompItem *pci);
-static void
-cal_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr,
- PrintCalItem *pcali);
-static void
-table_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr1,
- PrintTableItem *pti);
-
static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
+evo_calendar_print_renderer_get_width (GtkPrintContext *context,
PangoFontDescription *font,
- const char *text);
-
-GObject* create_custom_widget (GtkPrintOperation *print, GtkWidget *range);
-static void apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi);
-static PrintCalItem *
-evo_calendar_print_cal_data_new (GtkPrintContext *pc, PrintCalItem *pcali)
-{
- g_return_val_if_fail (pc, NULL);
-
- pcali->pr = g_new0 (EvoCalendarPrintRenderer, 1);
- pcali->pr->pc = pc;
- pcali->pr->pl = gtk_print_context_create_pango_layout (pc);
-
- return pcali;
-}
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc,PrintCompItem *pci)
-{
- g_return_val_if_fail (pc, NULL);
-
- pci->pr = g_new0 (EvoCalendarPrintRenderer, 1);
- pci->pr->pc = pc;
- pci->pr->pl = gtk_print_context_create_pango_layout (pc);
-
- return pci;
-}
-
-static void
-evo_calendar_print_data_free (EvoCalendarPrintRenderer *pr)
+ const char *text)
{
- g_return_if_fail (pr);
-
- g_assert (pr->pl);
- g_object_unref (G_OBJECT (pr->pl));
-
- g_free (pr);
-}
+ PangoLayout *layout;
+ gint layout_width, layout_height;
+ layout = gtk_print_context_create_pango_layout (context);
-static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
- PangoFontDescription *font,
- const char *text)
-{
- int w, h;
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_indent (layout, 0);
+ pango_layout_get_size (layout, &layout_width, &layout_height);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_indent (pr->pl, 0);
- pango_layout_get_size (pr->pl, &w, &h);
+ g_object_unref (layout);
- return w/(double)PANGO_SCALE;
+ return pango_units_to_double (layout_width);
}
-
static double
get_font_size (PangoFontDescription *font)
{
g_return_val_if_fail (font, 0.0);
- return ((double)pango_font_description_get_size (font)/(double)PANGO_SCALE);
+ return pango_units_to_double (pango_font_description_get_size (font));
}
@@ -208,8 +112,7 @@ get_font_size (PangoFontDescription *font)
#define TEMP_MARGIN .05
/* The fonts to use */
-#define REGULAR_FONT "Sans Regular"
-#define BOLD_FONT "Sans Bold"
+#define FONT_FAMILY "Sans"
/* The font size to use for normal text. */
#define DAY_NORMAL_FONT_SIZE 12
@@ -298,19 +201,6 @@ struct psinfo
double header_row_height;
};
-struct ptinfo
-{
- GList *todos;
-};
-
-struct einfo
-{
- char *text;
- time_t start;
- time_t end;
- int count;
-};
-
/* Convenience function to help the transition to timezone functions.
It converts a time_t to a struct tm. */
static struct tm*
@@ -386,39 +276,22 @@ build_month (int month, int year, int *days, int *start, int *end)
}
static PangoFontDescription *
-get_font_for_size (EvoCalendarPrintRenderer *pr, double h, GnomeFontWeight weight, gboolean italic)
+get_font_for_size (double height, PangoWeight weight)
{
- PangoFontDescription *font_desc;
- gchar *font_name;
-
- if (weight <= GNOME_FONT_BOOK)
- font_name = REGULAR_FONT;
- else
- font_name = BOLD_FONT;
-
- if (italic)
- font_name = g_strconcat (font_name, " Italic", NULL);
-
- font_desc = pango_font_description_from_string (font_name);
+ PangoFontDescription *desc;
+ gint size;
#define MAGIC_SCALE_FACTOR (0.86)
- pango_font_description_set_size (font_desc,
- h * MAGIC_SCALE_FACTOR * PANGO_SCALE );
+ size = pango_units_from_double (height * MAGIC_SCALE_FACTOR);
- if (italic)
- g_free (font_name);
+ desc = pango_font_description_new ();
+ pango_font_description_set_size (desc, size);
+ pango_font_description_set_weight (desc, weight);
+ pango_font_description_set_family_static (desc, FONT_FAMILY);
- return font_desc;
+ return desc;
}
-enum align_box {
- ALIGN_LEFT=1,
- ALIGN_RIGHT,
- ALIGN_CENTER,
- ALIGN_BORDER= 1<<8
-};
-
-
/* Prints a rectangle, with or without a border, filled or outline, and
possibly with triangular arrows at one or both horizontal edges.
width = width of border, -ve means no border.
@@ -427,32 +300,33 @@ enum align_box {
point of triangle, or -ve for no triangle. */
static void
print_border_with_triangles (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue,
- double left_triangle_width,
- double right_triangle_width)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble red, gdouble green, gdouble blue,
+ gdouble left_triangle_width,
+ gdouble right_triangle_width)
{
- cairo_t *cr;
+ cairo_t *cr = gtk_print_context_get_cairo_context (pc);
- cr = gtk_print_context_get_cairo_context (pc);
cairo_save (cr);
/* Fill in the interior of the rectangle, if desired. */
if (red >= -EPSILON && green >= -EPSILON && blue >= -EPSILON) {
- cairo_move_to (cr, l, t);
+ cairo_move_to (cr, x1, y1);
if (left_triangle_width > 0.0)
- cairo_line_to (cr, l - left_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x1 - left_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
+ cairo_line_to (cr, x1, y2);
+ cairo_line_to (cr, x2, y2);
if (right_triangle_width > 0.0)
- cairo_line_to (cr, r + right_triangle_width, (t + b) / 2);
+ cairo_line_to (cr, x2 + right_triangle_width, (y1 + y2) / 2);
- cairo_line_to (cr, r, t);
+ cairo_line_to (cr, x2, y1);
cairo_close_path (cr);
cairo_set_source_rgb (cr, red, green, blue);
cairo_fill (cr);
@@ -461,28 +335,27 @@ print_border_with_triangles (GtkPrintContext *pc,
}
/* Draw the outline, if desired. */
- if (width >= -EPSILON) {
+ if (line_width >= -EPSILON) {
cr = gtk_print_context_get_cairo_context (pc);
- cairo_move_to (cr, l, t);
+ cairo_move_to (cr, x1, y1);
if (left_triangle_width > 0.0)
- cairo_line_to (cr, l - left_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x1 - left_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
+ cairo_line_to (cr, x1, y2);
+ cairo_line_to (cr, x2, y2);
if (right_triangle_width > 0.0)
- cairo_line_to (cr, r + right_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x2 + right_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, r, t);
+ cairo_line_to (cr, x2, y1);
cairo_close_path (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_set_line_width (cr, width);
+ cairo_set_line_width (cr, line_width);
cairo_stroke (cr);
-
}
cairo_restore (cr);
@@ -494,35 +367,39 @@ print_border_with_triangles (GtkPrintContext *pc,
fillcolor = shade of fill, -ve means no fill. */
static void
print_border_rgb (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble red, gdouble green, gdouble blue)
{
- print_border_with_triangles (pc, l, r, t, b, width, red, green, blue, -1.0, -1.0);
+ print_border_with_triangles (
+ pc, x1, x2, y1, y2, line_width,
+ red, green, blue, -1.0, -1.0);
}
static void
print_border (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double fillcolor)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble fillcolor)
{
- print_border_rgb (pc, l, r, t, b, width, fillcolor, fillcolor, fillcolor);
+ print_border_rgb (
+ pc, x1, x2, y1, y2, line_width,
+ fillcolor, fillcolor, fillcolor);
}
static void
-print_rectangle (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double red, double green, double blue)
+print_rectangle (GtkPrintContext *context,
+ gdouble x, gdouble y,
+ gdouble width, gdouble height,
+ gdouble red, gdouble green, gdouble blue)
{
- cairo_t *cr;
-
- cr = gtk_print_context_get_cairo_context (pc);
+ cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
cairo_save (cr);
- cairo_move_to (cr, l, t);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
- cairo_line_to (cr, r, t);
- cairo_close_path (cr);
+ cairo_rectangle (cr, x, y, width, height);
cairo_set_source_rgb (cr, red, green, blue);
cairo_fill (cr);
@@ -530,74 +407,62 @@ print_rectangle (GtkPrintContext *pc,
}
/* Prints 1 line of aligned text in a box. It is centered vertically, and
- the horizontal alignment can be either ALIGN_LEFT, ALIGN_RIGHT, or
- ALIGN_CENTER. */
+ the horizontal alignment can be either PANGO_ALIGN_LEFT, PANGO_ALIGN_RIGHT,
+ or PANGO_ALIGN_CENTER. */
static double
-print_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text (GtkPrintContext *context, PangoFontDescription *desc,
+ const char *text, PangoAlignment alignment,
+ gdouble x1, gdouble x2, gdouble y1, gdouble y2)
{
- double w, x;
- int pw, ph;
+ PangoLayout *layout;
+ gint layout_width, layout_height;
cairo_t *cr;
- cr = gtk_print_context_get_cairo_context (pr->pc);
- cairo_save (cr);
+ cr = gtk_print_context_get_cairo_context (context);
+ layout = gtk_print_context_create_pango_layout (context);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_width (pr->pl, -1); /* ensure no line-wrapping occurs */
- pango_layout_set_indent (pr->pl, 0);
- pango_layout_get_size (pr->pl, &pw, &ph);
- w = pw/(double)PANGO_SCALE;
-
- switch (align & 3) {
- case ALIGN_LEFT:
- default:
- x = l;
- break;
- case ALIGN_RIGHT:
- x = r - w;
- break;
- case ALIGN_CENTER:
- x = l + ((r - l) - w) / 2;
- break;
- }
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_alignment (layout, alignment);
+ pango_layout_set_text (layout, text, -1);
- /* Make sure we don't go off the left edge. */
- x = MAX (l, x);
+ /* Grab the width before expanding the layout. */
+ pango_layout_get_size (layout, &layout_width, &layout_height);
+
+ pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+
+ cairo_save (cr);
/* Set a clipping rectangle. */
- cairo_move_to (cr, l, t);
- cairo_rectangle (cr, l, t, r, b);
+ cairo_move_to (cr, x1, y1);
+ cairo_rectangle (cr, x1, y1, x2, y2);
cairo_clip (cr);
cairo_new_path (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_move_to (cr, x, t);
- pango_cairo_show_layout (cr, pr->pl);
+ cairo_move_to (cr, x1, y1);
+ pango_cairo_show_layout (cr, layout);
cairo_stroke(cr);
+
cairo_restore (cr);
- return w;
+ g_object_unref (layout);
+
+ return pango_units_to_double (layout_width);
}
-/* gets/frees the font for you, as a book font */
+/* gets/frees the font for you, as a normal font */
static double
-print_text_size(EvoCalendarPrintRenderer *pr, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text_size (GtkPrintContext *context, const char *text,
+ PangoAlignment alignment, gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2)
{
PangoFontDescription *font;
double w;
-
- if(t > b)
- font = get_font_for_size (pr,t - b, GNOME_FONT_BOOK, FALSE);
- else
- {
- font = get_font_for_size (pr, b - t , GNOME_FONT_BOOK, FALSE);
- }
- w = print_text(pr, font, text, align, l, r, t, b);
+
+ font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_NORMAL);
+ w = print_text (context, font, text, alignment, x1, x2, y1, y2);
pango_font_description_free (font);
return w;
@@ -605,42 +470,36 @@ print_text_size(EvoCalendarPrintRenderer *pr, const char *text,
/* gets/frees the font for you, as a bold font */
static double
-print_text_size_bold(EvoCalendarPrintRenderer *pr, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text_size_bold (GtkPrintContext *context, const char *text,
+ PangoAlignment alignment, gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2)
{
PangoFontDescription *font;
double w;
- if (t > b)
- font = get_font_for_size (pr, t - b , GNOME_FONT_BOLD, FALSE);
- else
- font = get_font_for_size (pr, b - t, GNOME_FONT_BOLD, FALSE);
-
- w = print_text(pr, font, text, align, l, r, t, b);
+ font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_BOLD);
+ w = print_text (context, font, text, alignment, x1, x2, y1, y2);
pango_font_description_free (font);
return w;
}
static void
-titled_box (EvoCalendarPrintRenderer *pr, const char *text, PangoFontDescription *font,
- enum align_box align, double *l, double *r, double *t, double *b,
- double linewidth)
+titled_box (GtkPrintContext *context, const char *text,
+ PangoFontDescription *font, PangoAlignment alignment,
+ gdouble *x1, gdouble *y1, gdouble *x2, gdouble *y2,
+ gdouble linewidth)
{
double size;
size = get_font_size (font);
- if (align & ALIGN_BORDER) {
- print_border (pr->pc, *l, *r, *t, *t + size * 1.4,
- linewidth, 0.9);
- print_border (pr->pc, *l, *r, *t + size * 1.4, *b,
- linewidth, -1.0);
- *l += 2;
- *r -= 2;
- *b += 2;
- }
- print_text (pr, font, text, align, *l, *r, *t, *t + size * 1.4);
- *t += size * 1.4;
+ print_border (context, *x1, *x2, *y1, *y1 + size * 1.4, linewidth, 0.9);
+ print_border (context, *x1, *x2, *y1 + size * 1.4, *y2, linewidth, -1.0);
+ *x1 += 2;
+ *x2 -= 2;
+ *y2 += 2;
+ print_text (context, font, text, alignment, *x1, *x2, *y1, *y1 + size * 1.4);
+ *y1 += size * 1.4;
}
enum datefmt {
@@ -714,8 +573,8 @@ instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gp
print out the month small, embolden any days with events.
*/
static void
-print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t month,
- double left, double right, double top, double bottom,
+print_month_small (GtkPrintContext *context, GnomeCalendar *gcal, time_t month,
+ gdouble x1, gdouble y1, gdouble x2, gdouble y2,
int titleflags, time_t greystart, time_t greyend,
int bordertitle)
{
@@ -731,7 +590,7 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
double header_size, col_width, row_height, text_xpad, w;
double cell_top, cell_bottom, cell_left, cell_right, text_right;
- /* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=Thursday */
+ /* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=thursday */
char *daynames[] = { N_("Su"), N_("Mo"), N_("Tu"), N_("We"),
N_("Th"), N_("Fr"), N_("Sa") };
cairo_t *cr;
@@ -739,29 +598,21 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
/* Print the title, e.g. 'June 2001', in the top 16% of the area. */
format_date (month, titleflags, buf, 100);
- if(top < bottom)
- header_size = (bottom - top) * 0.16;
- else
- header_size = (top - bottom) * 0.16;
+ header_size = ABS (y2 - y1) * 0.16;
- font = get_font_for_size (pr, header_size, GNOME_FONT_BOLD, FALSE);
- if (bordertitle) {
- print_border (pr->pc, left, right, top, top + header_size,
- 1.0, 0.9);
- }
- print_text (pr, font, buf, ALIGN_CENTER, left, right,
- top, top + header_size);
+ font = get_font_for_size (header_size, PANGO_WEIGHT_BOLD);
+ if (bordertitle)
+ print_border (context, x1, x2, y1, y1 + header_size, 1.0, 0.9);
+ print_text (context, font, buf, PANGO_ALIGN_CENTER, x1, x2,
+ y1, y1 + header_size);
pango_font_description_free (font);
- top += header_size;
- col_width = (right - left) / 7;
+ y1 += header_size;
+ col_width = (x2 - x1) / 7;
/* The top row with the day abbreviations gets an extra bit of
vertical space around it. */
- if (bottom > top )
- row_height = (bottom - top) / 7.4;
- else
- row_height = (top - bottom ) / 7.4;
+ row_height = ABS (y2 - y1) / 7.4;
/* First we need to calculate a reasonable font size. We start with a
rough guess of just under the height of each row. */
@@ -779,39 +630,41 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
tm = *convert_timet_to_struct_tm (month, zone);
build_month (tm.tm_mon, tm.tm_year + 1900, days, 0, 0);
- font_normal = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
- font_bold = get_font_for_size (pr, font_size, GNOME_FONT_BOLD, FALSE);
+ font_normal = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
+ font_bold = get_font_for_size (font_size, PANGO_WEIGHT_BOLD);
/* Get a reasonable estimate of the largest number we will need,
and use it to calculate the offset from the right edge of the
cell that we should put the numbers. */
- w = evo_calendar_print_renderer_get_width (pr, font_bold, "23");
+ w = evo_calendar_print_renderer_get_width (context, font_bold, "23");
text_xpad = (col_width - w) / 2;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
/* Print the abbreviated day names across the top in bold. */
week_start_day = calendar_config_get_week_start_day ();
weekday = week_start_day;
for (x = 0; x < 7; x++) {
- print_text (pr, font_bold, _(daynames[weekday]), ALIGN_CENTER,
- left + x * col_width, left + (x + 1) * col_width,
- top, top + row_height * 1.4);
+ print_text (
+ context, font_bold,
+ _(daynames[weekday]), PANGO_ALIGN_RIGHT,
+ x1 + x * col_width, x1 + (x + 1) * col_width,
+ y1, y1 + row_height * 1.4);
weekday = (weekday + 1) % 7;
}
- top += row_height * 1.4;
+ y1 += row_height * 1.4;
now = time_month_begin_with_zone (month, zone);
for (y = 0; y < 6; y++) {
- cell_top = top + y * row_height;
+ cell_top = y1 + y * row_height;
cell_bottom = cell_top + row_height;
for (x = 0; x < 7; x++) {
- cell_left = left + x * col_width;
+ cell_left = x1 + x * col_width;
/* We add a 0.05 to make sure the cells meet up with
each other. Otherwise you sometimes get lines
between them which looks bad. Maybe I'm not using
@@ -834,12 +687,12 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
next = time_add_day_with_zone (now, 1, zone);
if ((now >= greystart && now < greyend)
|| (greystart >= now && greystart < next)) {
- print_border (pr->pc,
+ print_border (context,
cell_left, cell_right,
cell_top, cell_bottom,
-1.0, 0.75);
}
- print_text (pr, font, buf, ALIGN_RIGHT,
+ print_text (context, font, buf, PANGO_ALIGN_RIGHT,
cell_left, text_right,
cell_top, cell_bottom);
@@ -851,43 +704,49 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
pango_font_description_free (font_bold);
}
-
/* wraps text into the print context, not taking up more than its allowed space */
static double
-bound_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
- double left, double right, double top, double bottom, double indent)
+bound_text (GtkPrintContext *context,
+ PangoFontDescription *font,
+ const gchar *text,
+ gdouble x1, gdouble y1,
+ gdouble x2, gdouble y2)
{
- /* Let Pango do all the work: */
- int w=0, h=0;
+ PangoLayout *layout;
+ gint layout_width, layout_height;
cairo_t *cr;
-
- cr = gtk_print_context_get_cairo_context (pr->pc);
+
+ cr = gtk_print_context_get_cairo_context (context);
+ layout = gtk_print_context_create_pango_layout (context);
+
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+ pango_layout_get_size (layout, &layout_width, &layout_height);
+
cairo_save (cr);
/* Set a clipping rectangle. */
- cairo_move_to (cr, left, top);
- cairo_rectangle (cr, left, top, right, bottom);
+ cairo_move_to (cr, x1, y1);
+ cairo_rectangle (cr, x1, y1, x2, y2);
cairo_clip (cr);
cairo_new_path (cr);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_indent (pr->pl, indent * PANGO_SCALE);
- pango_layout_set_width (pr->pl, (right-left)*PANGO_SCALE);
-
- cairo_move_to (cr, left, top);
- pango_cairo_show_layout (cr, pr->pl);
+ cairo_move_to (cr, x1, y1);
+ pango_cairo_show_layout (cr, layout);
cairo_stroke (cr);
cairo_restore (cr);
- pango_layout_get_size (pr->pl, &w, &h);
- return top + ((double)h/(double)PANGO_SCALE);
+
+ g_object_unref (layout);
+
+ return y1 + pango_units_to_double (layout_height);
}
/* Draw the borders, lines, and times down the left of the day view. */
static void
-print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_day_background (GtkPrintContext *context, GnomeCalendar *gcal,
time_t whence, struct pdinfo *pdi,
double left, double right, double top, double bottom)
{
@@ -903,16 +762,16 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
cairo_t *cr;
/* Fill the time column in light-gray. */
- print_border (pr->pc, left, left + width, top, bottom, -1.0, 0.9);
+ print_border (context, left, left + width, top, bottom, -1.0, 0.9);
/* Draw the border around the entire view. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
- print_border (pr->pc, left, right, top, bottom, 1.0, -1.0);
+ print_border (context, left, right, top, bottom, 1.0, -1.0);
/* Draw the vertical line on the right of the time column. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_line_width (cr, 0.0);
cairo_move_to (cr, left + width, bottom);
cairo_line_to (cr, left + width, top);
@@ -928,12 +787,12 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
font_size = yinc * 0.6;
max_font_size = width * 0.5;
hour_font_size = MIN (font_size, max_font_size);
- font_hour = get_font_for_size (pr, hour_font_size, GNOME_FONT_BOLD, FALSE);
+ font_hour = get_font_for_size (hour_font_size, PANGO_WEIGHT_BOLD);
font_size = yinc * 0.33;
max_font_size = width * 0.25;
minute_font_size = MIN (font_size, max_font_size);
- font_minute = get_font_for_size (pr, minute_font_size, GNOME_FONT_BOLD, FALSE);
+ font_minute = get_font_for_size (minute_font_size, PANGO_WEIGHT_BOLD);
use_24_hour = calendar_config_get_24_hour_format ();
@@ -941,7 +800,7 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
hour_minute_x = left + width * 0.58;
for (i = pdi->start_hour; i < pdi->end_hour; i++) {
y = top + yinc * (row + 1) ;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
if (use_24_hour) {
@@ -960,16 +819,16 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
/* the hour label/minute */
sprintf (buf, "%d", hour);
- print_text (pr, font_hour, buf, ALIGN_RIGHT,
+ print_text (context, font_hour, buf, PANGO_ALIGN_RIGHT,
left, hour_minute_x,
y - yinc + yinc / 2, y - yinc + yinc / 2 + hour_font_size);
- print_text (pr, font_minute, minute, ALIGN_LEFT,
+ print_text (context, font_minute, minute, PANGO_ALIGN_LEFT,
hour_minute_x, left + width - 3,
y - yinc + yinc / 2, y - yinc + yinc / 2 + minute_font_size);
/* Draw the horizontal line between hours, across the entire
width of the day view. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, left, y);
cairo_line_to (cr, right, y);
cairo_set_line_width (cr, 1);
@@ -1096,7 +955,7 @@ free_event_array (GArray *array)
static void
-print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_long_event (GtkPrintContext *context, PangoFontDescription *font,
double left, double right, double top, double bottom,
double row_height, EDayViewEvent *event,
struct pdinfo *pdi, ECalModel *model)
@@ -1126,7 +985,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
y2 = y1 + row_height-7;
red = green = blue = 0.95;
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_with_triangles (pr->pc, x1, x2, y1, y2, 0.5, red, green, blue,
+ print_border_with_triangles (context, x1, x2, y1, y2, 0.5, red, green, blue,
left_triangle_width,
right_triangle_width);
@@ -1145,7 +1004,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x1 += 4;
- x1 += print_text (pr, font, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+ x1 += print_text (context, font, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
}
/* If the event ends before the end of the last day being printed,
@@ -1163,7 +1022,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x2 -= 4;
- x2 -= print_text (pr, font, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+ x2 -= print_text (context, font, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
}
/* Print the text. */
@@ -1172,12 +1031,12 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
x1 += 4;
x2 -= 4;
- print_text (pr, font, text, ALIGN_CENTER, x1, x2, y1, y2);
+ print_text (context, font, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
}
static void
-print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_event (GtkPrintContext *context, PangoFontDescription *font,
double left, double right, double top, double bottom,
EDayViewEvent *event, struct pdinfo *pdi, ECalModel *model)
{
@@ -1219,7 +1078,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
red = green = blue = 0.95;
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_rgb (pr->pc, x1, x2, y1, y2, 1.0, red, green, blue);
+ print_border_rgb (context, x1, x2, y1, y2, 1.0, red, green, blue);
summary = icalcomponent_get_summary (event->comp_data->icalcomp);
text = summary ? (char*) summary : "";
@@ -1249,7 +1108,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
free_text = TRUE;
}
- bound_text (pr, font, text, x1 + 2, x2 - 2, y1, y2, 0);
+ bound_text (context, font, text, x1 + 2, y1, x2 - 2, y2);
if (free_text)
g_free (text);
@@ -1257,7 +1116,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
static void
-print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_day_details (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom)
{
icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1323,10 +1182,10 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
pdi.day_starts, &rows_in_top_display);
/*Print the long events. */
- font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
for (i = 0; i < pdi.long_events->len; i++) {
event = &g_array_index (pdi.long_events, EDayViewEvent, i);
- print_day_long_event (pr, font, left, right, top, bottom,
+ print_day_long_event (context, font, left, right, top, bottom,
DAY_VIEW_ROW_HEIGHT, event, &pdi, model);
}
@@ -1337,10 +1196,10 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY);
/* Draw the border around the long events. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
- print_border (pr->pc, left, right,
+ print_border (context, left, right,
top, top + rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4,
1.0, -1.0);
@@ -1348,7 +1207,7 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
top += rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 2;
/* Draw the borders, lines, and times down the left. */
- print_day_background (pr, gcal, whence, &pdi,
+ print_day_background (context, gcal, whence, &pdi,
left, right, top, bottom);
/* Now adjust to get rid of the time column. */
left += DAY_VIEW_TIME_COLUMN_WIDTH;
@@ -1364,11 +1223,11 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
else
max_font_size = ((bottom - top ) / pdi.rows) - 4;
font_size = MIN(DAY_NORMAL_FONT_SIZE, max_font_size);
- font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
for (i = 0; i < pdi.events[0]->len; i++) {
event = &g_array_index (pdi.events[0], EDayViewEvent, i);
- print_day_event (pr, font, left, right, top, bottom,
+ print_day_event (context, font, left, right, top, bottom,
event, &pdi, model);
}
@@ -1400,7 +1259,7 @@ print_is_one_day_week_event (EWeekViewEvent *event,
static void
-print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_long_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double x1, double x2, double y1, double y2,
EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1420,7 +1279,7 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
if (event->end > psi->day_starts[span->start_day + span->num_days])
right_triangle_width = 4;
- print_border_with_triangles (pr->pc, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
+ print_border_with_triangles (context, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
left_triangle_width,
right_triangle_width);
@@ -1439,7 +1298,7 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x1 += 4;
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
}
/* If the event ends before the end of the last day being printed,
@@ -1457,17 +1316,17 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x2 -= 4;
- x2 -= print_text_size (pr, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+ x2 -= print_text_size (context, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
}
x1 += 4;
x2 -= 4;
- print_text_size (pr, text, ALIGN_CENTER, x1, x2, y1, y2);
+ print_text_size (context, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
}
static void
-print_week_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_day_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double x1, double x2, double y1, double y2,
EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1486,24 +1345,24 @@ print_week_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
buffer, sizeof (buffer));
- print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue);
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
- print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);
-
+ print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
+ print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);
+
date_tm.tm_hour = event->end_minute / 60;
date_tm.tm_min = event->end_minute % 60;
e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
buffer, sizeof (buffer));
- print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue);
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
- print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);
+ print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
+ print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);
}
static void
-print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double left, double top,
double cell_width, double cell_height,
@@ -1570,11 +1429,11 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
if (print_is_one_day_week_event (event, span,
psi->day_starts)) {
- print_week_day_event (pr, font, psi,
+ print_week_day_event (context, font, psi,
x1, x2, y1, y2,
event, span, text, red, green, blue);
} else {
- print_week_long_event (pr, font, psi,
+ print_week_long_event (context, font, psi,
x1, x2, y1, y2,
event, span, text, red, green, blue);
}
@@ -1584,7 +1443,8 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
static void
-print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_view_background (GtkPrintContext *context,
+ PangoFontDescription *font,
struct psinfo *psi,
double left, double top,
double cell_width, double cell_height)
@@ -1617,7 +1477,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
if (psi->multi_week_view && (tm.tm_mon != psi->month))
fillcolor = 0.9;
- print_border (pr->pc, x1, x2, y1, y2, 1.0, fillcolor);
+ print_border (context, x1, x2, y1, y2, 1.0, fillcolor);
if (psi->multi_week_view) {
if (tm.tm_mday == 1)
@@ -1625,7 +1485,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
else
format_string = "%d";
} else {
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, x1 + 0.1 * cell_width,
y1 + psi->header_row_height - 4);
@@ -1646,7 +1506,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
e_utf8_strftime (buffer, sizeof (buffer), format_string, &tm);
- print_text_size (pr, buffer, ALIGN_RIGHT,
+ print_text_size (context, buffer, PANGO_ALIGN_RIGHT,
x1, x2 - 4, y1 + 2, y1 + 2 + font_size);
}
}
@@ -1698,7 +1558,7 @@ print_week_summary_cb (ECalComponent *comp,
}
static void
-print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_week_summary (GtkPrintContext *context, GnomeCalendar *gcal,
time_t whence, gboolean multi_week_view, int weeks_shown,
int month, double font_size,
double left, double right, double top, double bottom)
@@ -1776,14 +1636,14 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
psi.rows_per_compressed_cell = (cell_height - psi.header_row_height)
/ psi.row_height;
- font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
/* Draw the grid and the day names/numbers. */
- print_week_view_background (pr, font, &psi, left, top,
+ print_week_view_background (context, font, &psi, left, top,
cell_width, cell_height);
/* Print the events. */
for (event_num = 0; event_num < psi.events->len; event_num++) {
event = &g_array_index (psi.events, EWeekViewEvent, event_num);
- print_week_event (pr, font, &psi, left, top,
+ print_week_event (context, font, &psi, left, top,
cell_width, cell_height, model, event, spans);
}
@@ -1799,7 +1659,7 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
static void
-print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_year_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom,
int morerows)
{
@@ -1833,8 +1693,8 @@ print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t wh
for (col = 0; col < cols; col++) {
l = left + col_width * col;
r = l + col_width;
- print_month_small (pr, gcal, now,
- l + 8, r - 8, t - 8, b + 8,
+ print_month_small (context, gcal, now,
+ l + 8, t - 8, r - 8, b + 8,
DATE_MONTH, 0, 0, TRUE);
now = time_add_month_with_zone (now, 1, zone);
}
@@ -1842,7 +1702,7 @@ print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t wh
}
static void
-print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_month_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom)
{
icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1880,7 +1740,7 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
tm = *convert_timet_to_struct_tm (date, zone);
tm.tm_mday = (tm.tm_mday % 7) + 7;
- font = get_font_for_size (pr, MONTH_NORMAL_FONT_SIZE, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (MONTH_NORMAL_FONT_SIZE, PANGO_WEIGHT_BOLD);
font_size = get_font_size (font);
columns = compress_weekend ? 6 : 7;
@@ -1903,8 +1763,8 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
x1 = left + cell_width * col;
x2 = x1 + cell_width;
- print_border (pr->pc, x1, x2, y1, y2, 1.0, -1.0);
- print_text_size (pr, buffer, ALIGN_CENTER, x1, x2, y1, y2);
+ print_border (context, x1, x2, y1, y2, 1.0, -1.0);
+ print_text_size (context, buffer, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
tm.tm_mday++;
tm.tm_wday = (tm.tm_wday + 1) % 7;
@@ -1912,14 +1772,14 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
pango_font_description_free (font);
top = y2;
- print_week_summary (pr, gcal, date, TRUE, 6, month,
+ print_week_summary (context, gcal, date, TRUE, 6, month,
MONTH_NORMAL_FONT_SIZE,
left, right, top, bottom);
}
static void
-print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_todo_details (GtkPrintContext *context, GnomeCalendar *gcal,
time_t start, time_t end,
double left, double right, double top, double bottom)
{
@@ -1938,16 +1798,16 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
table = e_calendar_table_get_table (task_pad);
model = e_calendar_table_get_model (task_pad);
- font_summary = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font_summary = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_set_line_width (cr, 0.0);
top +=2;
- titled_box (pr, _("Tasks"), font_summary, ALIGN_CENTER | ALIGN_BORDER,
- &left, &right, &top, &bottom, 1.0);
+ titled_box (context, _("Tasks"), font_summary, PANGO_ALIGN_CENTER,
+ &left, &top, &right, &bottom, 1.0);
y = top;
yend = bottom - 2;
@@ -1979,14 +1839,14 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
break;
/* Print the box to put the tick in. */
- print_border (pr->pc, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
+ print_border (context, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
/* If the task is complete, print a tick in the box. */
e_cal_component_get_completed (comp, &tt);
if (tt) {
e_cal_component_free_icaltimetype (tt);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_move_to (cr, x + 3, y + 11);
cairo_line_to (cr, x + 5, y + 14);
@@ -1995,12 +1855,12 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
cairo_stroke (cr);
}
- y = bound_text (pr, font_summary, summary.value,
- x + 14, xend, y+4, yend, 0);
+ y = bound_text (context, font_summary, summary.value,
+ x + 14, y + 4, xend, yend);
y += get_font_size (font_summary)-5;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, x, y);
cairo_line_to (cr, xend, y);
cairo_set_line_width (cr, 1);
@@ -2012,146 +1872,53 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
pango_font_description_free (font_summary);
}
-
-/* Value for the PrintView enum */
-static const int print_view_map[] = {
- PRINT_VIEW_DAY,
- PRINT_VIEW_WEEK,
- PRINT_VIEW_MONTH,
- PRINT_VIEW_YEAR,
- -1
-};
-
-/* Creates the range selector widget for printing a calendar */
-static GtkWidget *
-range_selector_new (GtkWidget *dialog, time_t at, int *view)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- GtkWidget *box;
- GtkWidget *radio;
- GSList *group;
- char text[1024];
- char str1[512];
- char str2[512];
- struct tm tm;
- time_t week_begin, week_end;
- struct tm week_begin_tm, week_end_tm;
- gint week_start_day;
-
- box = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
-
- tm = *convert_timet_to_struct_tm (at, zone);
-
- /* Day */
-
- e_utf8_strftime (text, sizeof (text), _("Selected day (%a %b %d %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (NULL, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Week */
-
- week_start_day = calendar_config_get_week_start_day ();
- week_begin = time_week_begin_with_zone (at, week_start_day, zone);
- /* If the week starts on a Sunday, we have to show the Saturday first,
- since the weekend is compressed. If the original date passed in was
- a Saturday, we need to move on to the next Saturday, else we move
- back to the last one. */
- if (week_start_day == 0) {
- if (tm.tm_wday == 6)
- week_begin = time_add_day_with_zone (week_begin, 6, zone);
- else
- week_begin = time_add_day_with_zone (week_begin, -1, zone);
- }
- week_end = time_add_day_with_zone (week_begin, 6, zone);
-
- week_begin_tm = *convert_timet_to_struct_tm (week_begin, zone);
- week_end_tm = *convert_timet_to_struct_tm (week_end, zone);
-
- if (week_begin_tm.tm_mon == week_end_tm.tm_mon) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %d %Y"), &week_end_tm);
- } else {
- if (week_begin_tm.tm_year == week_end_tm.tm_year) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- } else {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d %Y"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- }
- }
-
- g_snprintf (text, sizeof (text), _("Selected week (%s - %s)"), str1, str2);
-
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Month */
-
- e_utf8_strftime (text, sizeof (text), _("Selected month (%b %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Year */
-
- e_utf8_strftime (text, sizeof (text), _("Selected year (%Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Select default */
-
- e_dialog_widget_hook_value (dialog, radio, view, (gpointer) print_view_map);
-
- gtk_widget_show_all (box);
- return box;
-}
-
-
static void
-print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_day_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
int i, days = 1;
- double todo, header, l;
+ double todo, l;
char buf[100];
cairo_t *cr;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
for (i = 0; i < days; i++) {
- todo = (right - left) * 0.75 + left;
- /* header = top - HEADER_HEIGHT;*/
- header = HEADER_HEIGHT + top;
+ todo = width * 0.75;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
/* Print the main view with all the events in. */
- print_day_details (pr, gcal, date,
- left, todo - 2.0, header, bottom);
+ print_day_details (context, gcal, date,
+ 0.0, todo - 2.0, HEADER_HEIGHT,
+ height);
/* Print the TaskPad down the right. */
- print_todo_details (pr, gcal, 0, INT_MAX,
- todo, right, header, bottom);
+ print_todo_details (context, gcal, 0, INT_MAX,
+ todo, width, HEADER_HEIGHT,
+ height);
/* Print the filled border around the header. */
- print_border (pr->pc, left, right, top, header + 2.0, 1.0, 0.9);
+ print_border (context, 0.0, width,
+ 0.0, HEADER_HEIGHT + 2.0, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - SMALL_MONTH_SPACING;
+ l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - SMALL_MONTH_SPACING;
- print_month_small (pr, gcal, date,
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 4,
+ print_month_small (context, gcal, date,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
DATE_MONTH | DATE_YEAR, date, date, FALSE);
l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 4,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
@@ -2159,32 +1926,38 @@ print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
format_date (date, DATE_DAY | DATE_MONTH | DATE_YEAR,
buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 4, todo, top + 4, top + 4 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 4, todo, 4,
+ 4 + 24);
/* Print the day, e.g. 'Tuesday'. */
format_date (date, DATE_DAYNAME, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 4, todo, top + 32, top + 32 + 18);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 4, todo, 32,
+ 32 + 18);
date = time_add_day_with_zone (date, 1, zone);
}
}
-
static void
-print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_week_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header, l;
+ double l;
char buf[100];
time_t when;
gint week_start_day;
struct tm tm;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
- header = HEADER_HEIGHT - top;
tm = *convert_timet_to_struct_tm (date, zone);
week_start_day = calendar_config_get_week_start_day ();
when = time_week_begin_with_zone (date, week_start_day, zone);
@@ -2199,101 +1972,115 @@ print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
}
/* Print the main week view. */
- print_week_summary (pr, gcal, when, FALSE, 1, 0,
+ print_week_summary (context, gcal, when, FALSE, 1, 0,
WEEK_NORMAL_FONT_SIZE,
- left, right, header + 20, bottom);
+ 0.0, width,
+ HEADER_HEIGHT + 20, height);
/* Print the border around the main view. */
- print_border (pr->pc, left, right, header , bottom, 1.0, -1.0);
+ print_border (context, 0.0, width, HEADER_HEIGHT ,
+ height, 1.0, -1.0);
/* Print the border around the header area. */
- print_border (pr->pc, left, right, top, header + 2.0 + 20, 1.0, 0.9);
+ print_border (context, 0.0, width,
+ 0.0, HEADER_HEIGHT + 2.0 + 20, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
+ l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
- SMALL_MONTH_SPACING;
- print_month_small (pr, gcal, when,
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 30,
+ print_month_small (context, gcal, when,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
DATE_MONTH | DATE_YEAR, when,
time_add_week_with_zone (when, 1, zone), FALSE);
l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (when, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 30,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
DATE_MONTH | DATE_YEAR, when,
time_add_week_with_zone (when, 1, zone), FALSE);
/* Print the start day of the week, e.g. '7th May 2001'. */
format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 3, right, top + 4, top + 4 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 3, width,
+ 4, 4 + 24);
/* Print the end day of the week, e.g. '13th May 2001'. */
when = time_add_day_with_zone (when, 6, zone);
format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 3, right, top + 24 + 3, top + 24 + 3 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 3, width,
+ 24 + 3, 24 + 3 + 24);
}
static void
-print_month_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_month_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header;
char buf[100];
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
- header = top + HEADER_HEIGHT;
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
/* Print the main month view. */
- print_month_summary (pr, gcal, date, left, right, header, bottom);
+ print_month_summary (context, gcal, date, 0.0, width, HEADER_HEIGHT, height);
/* Print the border around the header. */
- print_border (pr->pc, left, right, top, header, 1.0, 0.9);
+ print_border (context, 0.0, width, 0.0, HEADER_HEIGHT, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, 1, zone),
- right - (right - left) / 7 + 2, right - 8,
- top + 4, header,
+ width - width / 7 + 2, 4,
+ width - 8, HEADER_HEIGHT,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, -1, zone),
- left + 8, left + (right - left) / 7 - 2,
- top + 4, header,
+ 8, 4, width / 7 - 2, HEADER_HEIGHT,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
/* Print the month, e.g. 'May 2001'. */
format_date (date, DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_CENTER,
- left + 3, right - 3, top + 3, top + 3 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+ 3, width - 3,
+ 3, 3 + 24);
}
-
+/* XXX Evolution doesn't have a "year" view. */
static void
-print_year_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_year_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
char buf[100];
cairo_t *cr;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+
+ cr = gtk_print_context_get_cairo_context (context);
cairo_show_page (cr);
- print_year_summary (pr, gcal, date, left, right, top + 50, bottom,
- TRUE);
+ print_year_summary (context, gcal, date, 0.0,
+ width, 50,
+ height, TRUE);
/* centered title */
format_date (date, DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_CENTER,
- left+3, right, top+3, top + 27);
- cr=gtk_print_context_get_cairo_context (pr->pc);
+ print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+ 3, width,
+ 3, 27);
+ cr=gtk_print_context_get_cairo_context (context);
cairo_show_page (cr);
}
@@ -2337,7 +2124,7 @@ get_zone_from_tzid (ECal *client, const char *tzid)
}
static void
-print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client,
+print_date_label (GtkPrintContext *context, ECalComponent *comp, ECal *client,
double left, double right, double top, double bottom)
{
icaltimezone *start_zone, *end_zone, *due_zone, *completed_zone;
@@ -2405,16 +2192,65 @@ print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *clien
write_label_piece (due, buffer, 1024, _("Due "), NULL);
}
- print_text_size_bold (pr, buffer, ALIGN_LEFT,
+ print_text_size_bold (context, buffer, PANGO_ALIGN_LEFT,
left, right, top, top - 15);
}
static void
-print_comp_item (PrintCompItem *pci)
-
+print_calendar_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PrintCalItem *pcali)
+{
+ switch (gnome_calendar_get_view (pcali->gcal)) {
+ case GNOME_CAL_DAY_VIEW:
+ print_day_view (context, pcali->gcal, pcali->start);
+ break;
+ case GNOME_CAL_WORK_WEEK_VIEW:
+ case GNOME_CAL_WEEK_VIEW:
+ print_week_view (context, pcali->gcal, pcali->start);
+ break;
+ case GNOME_CAL_MONTH_VIEW:
+ print_month_view (context, pcali->gcal, pcali->start);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+void
+print_calendar (GnomeCalendar *gcal, GtkPrintOperationAction action,
+ time_t start)
+{
+ GtkPrintOperation *operation;
+ PrintCalItem pcali;
+
+ g_return_if_fail (gcal != NULL);
+ g_return_if_fail (GNOME_IS_CALENDAR (gcal));
+
+ pcali.gcal = gcal;
+ pcali.start = start;
+
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
+
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (print_calendar_draw_page), &pcali);
+
+ gtk_print_operation_run (operation, action, NULL, NULL);
+
+ g_object_unref (operation);
+}
+
+static void
+print_comp_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PrintCompItem *pci)
{
+ GtkPageSetup *setup;
PangoFontDescription *font;
- EvoCalendarPrintRenderer *pr;
ECal *client;
ECalComponent *comp;
ECalComponentVType vtype;
@@ -2426,20 +2262,19 @@ print_comp_item (PrintCompItem *pci)
char *categories_string, *location_string, *summary_string;
double header_size;
cairo_t *cr;
- double left, right, top, bottom;
+ gdouble width, height;
+ double top;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
/* PrintCompItem structure contains elements to be used
* with the Print Context , obtained in comp_draw_page
*/
- comp = g_new0 (ECalComponent, 1);
- client = g_new0 (ECal, 1);
- pr = pci->pr;
client = pci->client;
comp = pci->comp;
- left = pci->l;
- right = pci->r;
- top = pci->t;
- bottom = pci->b;
vtype = e_cal_component_get_vtype (comp);
@@ -2453,25 +2288,25 @@ print_comp_item (PrintCompItem *pci)
else
return;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
/* Print the title in a box at the top of the page. */
- font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
header_size = 40;
- print_border (pr->pc, left, right, top, top+header_size,
+ print_border (context, 0.0, width, 0.0, header_size,
1.0, 0.9);
- print_text (pr, font, title, ALIGN_CENTER, left, right,
- top + 0.1, top +header_size - 0.1);
+ print_text (context, font, title, PANGO_ALIGN_CENTER, 0.0, width,
+ 0.1, header_size - 0.1);
pango_font_description_free (font);
- top += header_size + 30;
+ top = header_size + 30;
/* Summary */
- font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
e_cal_component_get_summary (comp, &text);
summary_string = g_strdup_printf (_("Summary: %s"), text.value);
- top = bound_text (pr, font, summary_string, left, right,
- top, bottom, 0);
+ top = bound_text (context, font, summary_string, 0.0, top, width,
+ height);
g_free (summary_string);
@@ -2480,16 +2315,16 @@ print_comp_item (PrintCompItem *pci)
if (location && location[0]) {
location_string = g_strdup_printf (_("Location: %s"),
location);
- top = bound_text (pr, font, location_string, left, right,
- top + 3, bottom, 0);
+ top = bound_text (context, font, location_string, 0.0,
+ top + 3, width, height);
g_free (location_string);
}
pango_font_description_free (font);
/* Date information */
- print_date_label (pr, comp, client, left, right, top + 3, top + 15);
+ print_date_label (context, comp, client, 0.0, width, top + 3, top + 15);
top += 20;
- font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
/* For a VTODO we print the Status, Priority, % Complete and URL. */
if (vtype == E_CAL_COMPONENT_TODO) {
@@ -2522,8 +2357,8 @@ print_comp_item (PrintCompItem *pci)
if (status_string) {
char *status_text = g_strdup_printf (_("Status: %s"),
status_string);
- top = bound_text (pr, font, status_text,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, status_text,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (status_text);
}
@@ -2538,8 +2373,8 @@ print_comp_item (PrintCompItem *pci)
e_cal_component_free_priority (priority);
pri_text = g_strdup_printf (_("Priority: %s"), priority_string);
- top = bound_text (pr, font, pri_text,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, pri_text,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (pri_text);
}
@@ -2552,8 +2387,8 @@ print_comp_item (PrintCompItem *pci)
percent_string = g_strdup_printf (_("Percent Complete: %i"), *percent);
e_cal_component_free_percent (percent);
- top = bound_text (pr, font, percent_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, percent_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
}
@@ -2564,8 +2399,8 @@ print_comp_item (PrintCompItem *pci)
char *url_string = g_strdup_printf (_("URL: %s"),
url);
- top = bound_text (pr, font, url_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, url_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (url_string);
}
@@ -2576,8 +2411,8 @@ print_comp_item (PrintCompItem *pci)
if (categories && categories[0]) {
categories_string = g_strdup_printf (_("Categories: %s"),
categories);
- top = bound_text (pr, font, categories_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, categories_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6 ;
g_free (categories_string);
}
@@ -2595,8 +2430,8 @@ print_comp_item (PrintCompItem *pci)
}
e_cal_component_free_text_list (contact_list);
- top = bound_text (pr, font, contacts->str,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, contacts->str,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_string_free (contacts, TRUE);
}
@@ -2606,12 +2441,12 @@ print_comp_item (PrintCompItem *pci)
e_cal_component_get_description_list (comp, &desc);
for (l = desc; l != NULL; l = l->next) {
ECalComponentText *text = l->data;
- if (top > bottom) {
+ if (top > height) {
top = 10; //FIXME
cairo_show_page (cr);
}
if (text->value != NULL)
- top = bound_text (pr, font, text->value, left, right, top + 3, bottom, 0) + 30;
+ top = bound_text (context, font, text->value, 0.0, top + 3, width, height) + 30;
}
@@ -2621,311 +2456,99 @@ print_comp_item (PrintCompItem *pci)
}
void
-print_calendar (GnomeCalendar *gcal, gboolean preview, time_t date,
- PrintView default_view)
+print_comp (ECalComponent *comp, ECal *client, GtkPrintOperationAction action)
{
- GtkPrintSettings *settings;
- GtkPrintOperationResult res;
- GtkPrintOperation *print;
- GtkPaperSize *paper_size;
- GtkPageSetup *page_setup;
- GtkWidget *gpd;
- GtkWidget *range;
- PrintCalItem *pcali;
- int view;
- double r, t, w, h;
+ GtkPrintOperation *operation;
+ PrintCompItem pci;
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- view = (int) default_view;
+ g_return_if_fail (E_IS_CAL_COMPONENT (comp));
- pcali = g_new0 (PrintCalItem, 1);
- pcali->gcal = g_new0 (GnomeCalendar, 1);
+ pci.comp = comp;
+ pci.client = client;
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
+ operation = e_print_operation_new ();
- settings = gtk_print_settings_new ();
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
- range = range_selector_new (gpd, date, &view);
+ g_signal_connect (
+ operation, "draw-page",
+ G_CALLBACK (print_comp_draw_page), &pci);
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
-
- pcali->b = h * (1.0 - TEMP_MARGIN);
- pcali->l = r * TEMP_MARGIN;
- pcali->t = t * (1.0 - TEMP_MARGIN);
- pcali->r = w * (1.0 - TEMP_MARGIN);
- pcali->default_view = default_view;
- pcali->gcal = gcal;
- pcali->date = date;
-
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
-
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
-
- g_signal_connect (print, "create-custom-widget", G_CALLBACK (create_custom_widget), range);
- g_signal_connect (print, "custom-widget-apply", G_CALLBACK (apply_custom_widget), NULL);
- g_signal_connect (print, "draw_page", G_CALLBACK (cal_draw_page), pcali);
-
- /* Runs the print dialog, recursively, emitting signals */
- if (preview)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- else
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-
- /* Save the user configured settings back to the gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
-
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
-
- }
+ gtk_print_operation_run (operation, action, NULL, NULL);
-}
-
-void
-print_comp (ECalComponent *comp, ECal *client, gboolean preview)
-{
- GtkPrintOperation *print;
- GtkPrintSettings *settings;
- GtkPaperSize *paper_size;
- PrintCompItem *pci;
- GtkPrintOperationResult res;
- GtkPageSetup *page_setup;
- gdouble t, r, w,h;
- GtkWidget *gpd;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- pci = g_new0 (PrintCompItem, 1);
-
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
-
- settings = gtk_print_settings_new ();
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
-
- /* Values using the print context , used in comp_draw_page */
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
- pci->b = h * (1.0 - TEMP_MARGIN);
- pci->l = r * TEMP_MARGIN;
- pci->t = t * (1.0 - TEMP_MARGIN);
- pci->r = w * (1.0 - TEMP_MARGIN);
- pci->comp = comp;
- pci->client = client;
-
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
-
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
-
- g_signal_connect (print, "draw_page", G_CALLBACK (comp_draw_page), pci);
-
- gtk_print_operation_set_print_settings (print, settings);
-
- /* Runs a dialog , emitting various signals based on user response */
- if (preview)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- else
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG , NULL, NULL);
-
- /* Saves the user configuration in gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
-
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
- }
+ g_object_unref (operation);
}
static void
-print_title (GtkPrintContext *context, const char *title,
- double page_width, double page_height, double left_margin, double bottom_margin)
+print_title (GtkPrintContext *context, const gchar *text, gdouble page_width)
{
- PangoFontDescription *font;
- PangoLayout *pl;
- double w, x, y;
+ PangoFontDescription *desc;
+ PangoLayout *layout;
cairo_t *cr;
cr = gtk_print_context_get_cairo_context (context);
- cairo_save (cr);
- pl = gtk_print_context_create_pango_layout (context);
- font = pango_font_description_from_string("Sans Bold 18");
- pango_layout_set_font_description (pl, font);
- pango_layout_set_text (pl, title, -1);
-
- w = pango_layout_get_width (pl)/(double)PANGO_SCALE;
- y = page_height ;
- x = (page_width - w) / 2;
-
- cairo_move_to (cr, x, y );
- pango_cairo_show_layout (cr, pl);
+ desc = pango_font_description_from_string (FONT_FAMILY " Bold 18");
- cairo_restore (cr);
- pango_font_description_free (font);
+ layout = gtk_print_context_create_pango_layout (context);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_width (layout, pango_units_from_double (page_width));
-}
+ cairo_save (cr);
-void
-print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview)
-{
- EPrintable *printable;
- GtkPrintOperationResult res;
- GtkPrintSettings *settings;
- GtkPrintOperation *print;
- GtkPageSetup *page_setup;
- GtkPaperSize *paper_size;
- GtkWidget *gpd;
- PrintTableItem *pti;
- double w, h, t, r, l, b;
-
- pti = g_new0 (PrintTableItem, 1);
-
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
-
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
-
- b =h * (1.0 - TEMP_MARGIN);
- l =r * TEMP_MARGIN;
- t =t * (1.0 - TEMP_MARGIN);
- r =w * (1.0 - TEMP_MARGIN);
-
- pti->left_margin = l;
- pti->bottom_margin = b;
- pti->paper_width = r - l;
- pti->paper_height= t + 10;
+ cairo_move_to (cr, 0.0, 0.0);
+ pango_cairo_show_layout (cr, layout);
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (dialog_title, 0, settings);
- printable = e_table_get_printable (etable);
+ cairo_restore (cr);
- g_object_ref_sink (printable);
- e_printable_reset (printable);
- pti->printable = printable;
+ g_object_unref (layout);
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
+ pango_font_description_free (desc);
+}
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
+static void
+print_table_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ EPrintable *printable)
+{
+ GtkPageSetup *setup;
+ gdouble width, height;
- /* runs the dialog emitting the signals based on user response */
- g_signal_connect (print, "draw_page", G_CALLBACK (table_draw_page), pti);
- if (!preview)
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- else
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-
+ setup = gtk_print_context_get_page_setup (context);
- /* Saves the user configuration in gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
- }
-}
+ do {
+ /* TODO Allow the user to customize the title. */
+ print_title (context, _("Upcoming Appointments"), width);
-static void
-comp_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintCompItem *pci)
-{
- pci = evo_calendar_print_data_new (context, pci);
- print_comp_item (pci);
-}
+ if (e_printable_data_left (printable))
+ e_printable_print_page (
+ printable, context, width, 24, TRUE);
-static void
-cal_draw_page(GtkPrintOperation *print1, GtkPrintContext *context, gint page_nr1, PrintCalItem *pcali)
-{
- pcali = evo_calendar_print_cal_data_new (context, pcali);
-
- switch (pcali->default_view) {
- case PRINT_VIEW_DAY:
- print_day_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_WEEK:
- print_week_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_MONTH:
- print_month_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_YEAR:
- print_year_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- default:
- g_assert_not_reached ();
- }
+ } while (e_printable_data_left (printable));
}
-static void
-table_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintTableItem *pti)
+void
+print_table (ETable *table, const gchar *dialog_title,
+ const gchar *print_header, GtkPrintOperationAction action)
{
- pti->context = context;
-
- do {
- print_title (context,"Table", pti->paper_width, pti->paper_height, pti->left_margin, pti->bottom_margin);
-
- if (e_printable_data_left (pti->printable))
- e_printable_print_page (pti->printable, pti->context,
- pti->paper_width, pti->paper_height + 24, TRUE);
+ GtkPrintOperation *operation;
+ EPrintable *printable;
- } while (e_printable_data_left (pti->printable));
-}
+ printable = e_table_get_printable (table);
+ g_object_ref_sink (printable);
+ e_printable_reset (printable);
-/*
- * This callback creates a custom widget that gets inserted into the
- * print operation dialog, the custom widget contains the range,
- * day, view, month, or year
- */
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
-GObject* create_custom_widget (GtkPrintOperation *print,GtkWidget *range)
-{
- return range;
-}
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (print_table_draw_page), printable);
-/*
- * Read the information from the custom widget and print day, view, or
- * month based on user selection
- */
+ gtk_print_operation_run (operation, action, NULL, NULL);
-static void
-apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi)
-{
- gchar str;
- str = e_dialog_editable_get (dialog);
- printf("%sValue of Radio Button \n", str);
+ g_object_unref (operation);
}
-
diff --git a/calendar/gui/print.h b/calendar/gui/print.h
index d706125e6c..b6d2abdd26 100644
--- a/calendar/gui/print.h
+++ b/calendar/gui/print.h
@@ -34,10 +34,15 @@ typedef enum {
PRINT_VIEW_LIST
} PrintView;
-void print_calendar (GnomeCalendar *gcal, gboolean preview, time_t at, PrintView default_view);
-void print_comp (ECalComponent *comp, ECal *client, gboolean preview);
-void print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview);
-
-
+void print_calendar (GnomeCalendar *gcal,
+ GtkPrintOperationAction action,
+ time_t start);
+void print_comp (ECalComponent *comp,
+ ECal *client,
+ GtkPrintOperationAction action);
+void print_table (ETable *table,
+ const gchar *dialog_title,
+ const gchar *print_header,
+ GtkPrintOperationAction action);
#endif
diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c
index 2393c8fd8b..0a8df90370 100644
--- a/calendar/gui/tasks-control.c
+++ b/calendar/gui/tasks-control.c
@@ -34,13 +34,6 @@
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-dialog-util.h>
#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
#include <bonobo/bonobo-control.h>
#include <bonobo/bonobo-ui-util.h>
#include <e-util/e-dialog-utils.h>
@@ -469,30 +462,21 @@ tasks_control_purge_cmd (BonoboUIComponent *uic,
e_tasks_delete_completed (tasks);
}
-
-static void
-print_tasks (ETasks *tasks, gboolean preview)
-{
- ECalendarTable *cal_table;
- ETable *etable;
-
- cal_table = e_tasks_get_calendar_table (tasks);
- etable = e_calendar_table_get_table (E_CALENDAR_TABLE (cal_table));
-
- print_table (etable, _("Print Tasks"), _("Tasks"), preview);
-}
-
/* File/Print callback */
static void
tasks_control_print_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path)
{
- ETasks *tasks;
+ ETasks *tasks = E_TASKS (data);
+ ETable *table;
- tasks = E_TASKS (data);
+ table = e_calendar_table_get_table (
+ E_CALENDAR_TABLE (e_tasks_get_calendar_table (tasks)));
- print_tasks (tasks, FALSE);
+ print_table (
+ table, _("Print Tasks"), _("Tasks"),
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
}
static void
@@ -500,11 +484,15 @@ tasks_control_print_preview_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path)
{
- ETasks *tasks;
+ ETasks *tasks = E_TASKS (data);
+ ETable *table;
- tasks = E_TASKS (data);
+ table = e_calendar_table_get_table (
+ E_CALENDAR_TABLE (e_tasks_get_calendar_table (tasks)));
- print_tasks (tasks, TRUE);
+ print_table (
+ table, _("Print Tasks"), _("Tasks"),
+ GTK_PRINT_OPERATION_ACTION_PREVIEW);
}
static void
diff --git a/configure.in b/configure.in
index 0f5831f65d..a26a0c03f4 100644
--- a/configure.in
+++ b/configure.in
@@ -1204,7 +1204,7 @@ AC_CHECK_HEADERS(libgnomeui/gnome-icon-lookup.h)
AC_CHECK_HEADERS(libgnomeui/gnome-thumbnail.h)
CPPFLAGS="$CPPFLAGS_save"
-PKG_CHECK_MODULES(EXTRA_GNOME, libgnomeprint-2.2 >= 2.7.0 libgnomeprintui-2.2 >= 2.2.1 $FULL_GNOME_DEPS)
+PKG_CHECK_MODULES(EXTRA_GNOME, $FULL_GNOME_DEPS)
AC_SUBST(EXTRA_GNOME_LIBS)
AC_SUBST(EXTRA_GNOME_CFLAGS)
@@ -1247,7 +1247,7 @@ EVO_SET_COMPILE_FLAGS(E_NAME, libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIR
AC_SUBST(E_NAME_CFLAGS)
AC_SUBST(E_NAME_LIBS)
-EVO_SET_COMPILE_FLAGS(E_UTIL, gthread-2.0 gconf-2.0 libxml-2.0 gtk+-unix-print-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 libgnomeprintui-2.2 libedataserver-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $mozilla_nspr $mono_package, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS)
+EVO_SET_COMPILE_FLAGS(E_UTIL, gthread-2.0 gconf-2.0 libxml-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 libedataserver-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $mozilla_nspr $mono_package, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS)
AC_SUBST(E_UTIL_CFLAGS)
AC_SUBST(E_UTIL_LIBS)
@@ -1297,7 +1297,7 @@ AC_SUBST(SHELL_LIBS)
dnl --- evolution-addressbook flags
-EVOLUTION_ADDRESSBOOK_DEPS="gconf-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 gtk+-unix-print-2.0 gnome-vfs-2.0 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED camel-$EDS_PACKAGE"
+EVOLUTION_ADDRESSBOOK_DEPS="gconf-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 gnome-vfs-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED camel-$EDS_PACKAGE"
EVO_SET_COMPILE_FLAGS(EVOLUTION_ADDRESSBOOK, $EVOLUTION_ADDRESSBOOK_DEPS)
AC_SUBST(EVOLUTION_ADDRESSBOOK_CFLAGS)
@@ -1335,7 +1335,7 @@ EVO_SET_COMPILE_FLAGS(LIBSOUP, $LIBSOUP >= $LIBSOUP_REQUIRED)
AC_SUBST(LIBSOUP_CFLAGS)
AC_SUBST(LIBSOUP_LIBS)
-EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 gtk+-unix-print-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $HAL_REQUIREMENT $libnotify)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $HAL_REQUIREMENT $libnotify)
AC_SUBST(EVOLUTION_CALENDAR_CFLAGS)
AC_SUBST(EVOLUTION_CALENDAR_LIBS)
@@ -1347,7 +1347,7 @@ fi
dnl --- evolution-mail flags
-EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gnome-vfs-module-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libxml-2.0 bonobo-activation-2.0 gthread-2.0 gconf-2.0 gtk+-unix-print-2.0 $mozilla_nss libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libxml-2.0 bonobo-activation-2.0 gthread-2.0 gconf-2.0 $mozilla_nss libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
AC_SUBST(EVOLUTION_MAIL_CFLAGS)
AC_SUBST(EVOLUTION_MAIL_LIBS)
@@ -1589,7 +1589,7 @@ if echo ${plugins_enabled} | grep "exchange-operations" > /dev/null ; then
dnl **************************************************
dnl * Exchange Operations plugin
dnl **************************************************
- EVO_SET_COMPILE_FLAGS(CAMEL_EXCHANGE, libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gthread-2.0 gconf-2.0 camel-provider-$EDS_PACKAGE libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE libexchange-storage-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE)
+ EVO_SET_COMPILE_FLAGS(CAMEL_EXCHANGE, libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gthread-2.0 gconf-2.0 camel-provider-$EDS_PACKAGE libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE libexchange-storage-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE)
AC_SUBST(CAMEL_EXCHANGE_CFLAGS)
AC_SUBST(CAMEL_EXCHANGE_LIBS)
else
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index e56b6d878c..49055d64e3 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ * e-print.c:
+ * e-print.h:
+ Refactor the printing infrastructure. (#426816)
+
2007-04-19 Matthew Barnes <mbarnes@redhat.com>
** Fixes part of bug #429422
diff --git a/e-util/e-print.c b/e-util/e-print.c
index 107f0d2597..0a3cf7ee43 100644
--- a/e-util/e-print.c
+++ b/e-util/e-print.c
@@ -24,8 +24,9 @@
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
-#include <gtk/gtkprintunixdialog.h>
+#include <glib/gi18n.h>
#include <gconf/gconf-client.h>
+
#define PRINTING "/apps/evolution/shell/printing"
static void
@@ -35,21 +36,23 @@ pack_settings (const gchar *key, const gchar *value, GSList **p_list)
item = g_strdup_printf ("%s=%s", key, value);
*p_list = g_slist_prepend (*p_list, item);
}
+
static void
unpack_settings (gchar *item, GtkPrintSettings *settings)
{
gchar *cp, *key, *value;
cp = strchr (item, '=');
if (cp == NULL)
- return;
+ return;
*cp ++ = '\0';
key = g_strstrip (item);
value = g_strstrip (cp);
gtk_print_settings_set (settings, key, value);
g_free (item);
}
-GtkPrintSettings *
-e_print_load_settings (void)
+
+static GtkPrintSettings *
+load_settings (void)
{
GConfClient *client;
GtkPrintSettings *settings;
@@ -68,19 +71,22 @@ e_print_load_settings (void)
g_warning ("%s: %s", G_STRFUNC, error->message);
g_error_free (error);
}
+
g_object_unref (client);
+
return settings;
}
-/* Saves the print settings */
-
-void
-e_print_save_settings (GtkPrintSettings *settings)
+static void
+save_settings (GtkPrintOperation *operation)
{
+ GtkPrintSettings *settings;
GConfClient *client;
GSList *list = NULL;
GError *error = NULL;
+ settings = gtk_print_operation_get_print_settings (operation);
+
client = gconf_client_get_default ();
gtk_print_settings_foreach (
@@ -98,38 +104,60 @@ e_print_save_settings (GtkPrintSettings *settings)
}
static void
-print_dialog_response(GtkWidget *widget, int resp, gpointer data)
+handle_error (GtkPrintOperation *operation)
{
-#ifdef G_OS_UNIX /* Just to get it to build on Win32 */
- if (resp == GTK_RESPONSE_OK) {
- e_print_save_settings (gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG (widget)));
- }
-#endif
+ GtkWidget *dialog;
+ GError *error = NULL;
+
+ dialog = gtk_message_dialog_new_with_markup (
+ NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ "<span weight=\"bold\" size=\"larger\">%s</span>",
+ _("An error occurred while printing"));
+
+ gtk_print_operation_get_error (operation, &error);
+
+ if (error != NULL && error->message != NULL)
+ gtk_message_dialog_format_secondary_text (
+ GTK_MESSAGE_DIALOG (dialog), "%s\n\n%s",
+ _("The printing system reported the "
+ "following details about the error:"),
+ error->message);
+ else
+ gtk_message_dialog_format_secondary_text (
+ GTK_MESSAGE_DIALOG (dialog), "%s",
+ _("The printing system did not report "
+ "any additional details about the error."));
+
+ if (error != NULL)
+ g_error_free (error);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+
+ gtk_widget_destroy (dialog);
}
-/* Creates a dialog with the print settings */
-GtkWidget *
-e_print_get_dialog (const char *title, int flags)
+static void
+print_done_cb (GtkPrintOperation *operation, GtkPrintOperationResult result)
{
- GtkPrintSettings *settings;
- GtkWidget *dialog;
-
- settings = gtk_print_settings_new ();
- settings = e_print_load_settings ();
- dialog = e_print_get_dialog_with_config (title, flags, settings);
- g_object_unref (settings);
- return dialog;
+ if (result == GTK_PRINT_OPERATION_RESULT_APPLY)
+ save_settings (operation);
+ if (result == GTK_PRINT_OPERATION_RESULT_ERROR)
+ handle_error (operation);
}
-GtkWidget *
-e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings)
+GtkPrintOperation *
+e_print_operation_new (void)
{
- GtkWidget *dialog = NULL;
-
-#ifdef G_OS_UNIX /* Just to get it to build on Win32 */
- dialog = gtk_print_unix_dialog_new (title, NULL);
- gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG(dialog), settings);
- g_signal_connect(dialog, "response", G_CALLBACK(print_dialog_response), NULL);
-#endif
- return dialog;
+ GtkPrintOperation *operation;
+ GtkPrintSettings *settings;
+
+ operation = gtk_print_operation_new ();
+
+ settings = load_settings ();
+ gtk_print_operation_set_print_settings (operation, settings);
+ g_object_unref (settings);
+
+ g_signal_connect (operation, "done", G_CALLBACK (print_done_cb), NULL);
+
+ return operation;
}
diff --git a/e-util/e-print.h b/e-util/e-print.h
index 8ae99a2900..8044506c0c 100644
--- a/e-util/e-print.h
+++ b/e-util/e-print.h
@@ -26,11 +26,7 @@
G_BEGIN_DECLS
-GtkPrintSettings *e_print_load_settings (void);
-void e_print_save_settings (GtkPrintSettings *settings);
-
-GtkWidget *e_print_get_dialog (const char *title, int flags);
-GtkWidget *e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings);
+GtkPrintOperation * e_print_operation_new (void);
G_END_DECLS
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 4d5e57fc59..833daa6384 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,13 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ ** Fixes part of bug #426812
+
+ * em-format-html-print.c:
+ * em-format-html-print.h:
+ * em-folder-view.c:
+ * em-folder-view.h:
+ Refactor the printing infrastructure.
+
2007-04-20 Srinivasa Ragavan <sragavan@novell.com>
* em-composer-prefs.c: (signature_key_press): Fix for bug #353662
diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c
index 78b5d00790..62568c8282 100644
--- a/mail/em-folder-view.c
+++ b/mail/em-folder-view.c
@@ -110,7 +110,6 @@
#include "mail-vfolder.h"
#include "mail-component.h"
#include "mail-tools.h"
-#include <gtk/gtkprintunixdialog.h>
#include "evolution-shell-component-utils.h" /* Pixmap stuff, sigh */
@@ -781,7 +780,7 @@ static void
emfv_popup_print(EPopup *ep, EPopupItem *pitem, void *data)
{
EMFolderView *emfv = data;
- em_folder_view_print(emfv, FALSE);
+ em_folder_view_print(emfv, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
}
static void
@@ -1549,7 +1548,7 @@ emfv_print_preview_message(BonoboUIComponent *uic, void *data, const char *path)
{
EMFolderView *emfv = data;
- em_folder_view_print(emfv, TRUE);
+ em_folder_view_print(emfv, GTK_PRINT_OPERATION_ACTION_PREVIEW);
}
static void
@@ -2114,86 +2113,30 @@ emfv_activate(EMFolderView *emfv, BonoboUIComponent *uic, int act)
}
}
-struct _print_data {
- EMFolderView *emfv;
-
- GtkPrintSettings *settings;
- int preview;
- CamelFolder *folder;
- char *uid;
-};
-
-static void
-emfv_print_response(GtkWidget *w, int resp, struct _print_data *data)
-{
- EMFormatHTMLPrint *print;
- gboolean preview = FALSE;
-
- switch (resp) {
- case GTK_RESPONSE_APPLY:
- preview = TRUE;
- case GTK_RESPONSE_OK:
- print = em_format_html_print_new ();
- print->preview = preview;
- em_format_set_session ((EMFormat *)print, ((EMFormat *)data->emfv->preview)->session);
- em_format_html_print_message (print,
- (EMFormatHTML *)data->emfv->preview,
- data->settings,
- data->folder,
- data->uid,
- data->preview);
- g_object_unref(print);
- break;
- }
-
- if (w)
- gtk_widget_destroy (w);
-
- g_object_unref (data->emfv);
- g_object_unref (data->settings);
- camel_object_unref (data->folder);
- g_free (data->uid);
- g_free (data);
-}
-
-
-
-int em_folder_view_print(EMFolderView *emfv, int preview)
+int
+em_folder_view_print (EMFolderView *emfv, GtkPrintOperationAction action)
{
- struct _print_data *data;
+ EMFormatHTMLPrint *efhp;
GPtrArray *uids;
if (emfv->folder == NULL)
return 0;
- uids = message_list_get_selected(emfv->list);
- if (uids->len != 1) {
- message_list_free_uids(emfv->list, uids);
- return 0;
- }
-
- data = g_malloc0(sizeof(*data));
- data->emfv = emfv;
- g_object_ref(emfv);
- data->settings = e_print_load_settings ();
- data->preview = preview;
- data->folder = emfv->folder;
- camel_object_ref(data->folder);
- data->uid = g_strdup(uids->pdata[0]);
- message_list_free_uids(emfv->list, uids);
-
- if (preview) {
- GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"),
- 0, data->settings);
- e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) emfv);
- emfv_print_response(dialog, GTK_RESPONSE_APPLY, data);
- } else {
- GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"),
- 0, data->settings);
- gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
- e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) emfv);
- emfv_print_response (dialog, GTK_RESPONSE_OK, data);
- }
+ uids = message_list_get_selected (emfv->list);
+ if (uids->len != 1)
+ goto exit;
+
+ efhp = em_format_html_print_new (
+ (EMFormatHTML *) emfv->preview, action);
+ em_format_set_session (
+ (EMFormat *) efhp,
+ ((EMFormat *) emfv->preview)->session);
+ em_format_html_print_message (
+ efhp, emfv->folder, uids->pdata[0]);
+ g_object_unref (efhp);
+
+exit:
+ message_list_free_uids (emfv->list, uids);
return 0;
}
diff --git a/mail/em-folder-view.h b/mail/em-folder-view.h
index 4c998dcc86..d2afb4d666 100644
--- a/mail/em-folder-view.h
+++ b/mail/em-folder-view.h
@@ -25,6 +25,7 @@
#define _EM_FOLDER_VIEW_H
#include <gtk/gtkvbox.h>
+#include <gtk/gtkprintoperation.h>
#include "mail/em-popup.h"
#ifdef __cplusplus
@@ -132,7 +133,7 @@ EMPopupTargetSelect *em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup
int em_folder_view_mark_selected(EMFolderView *emfv, guint32 mask, guint32 set);
int em_folder_view_open_selected(EMFolderView *emfv);
-int em_folder_view_print(EMFolderView *emfv, int preview);
+int em_folder_view_print(EMFolderView *emfv, GtkPrintOperationAction action);
/* this could be on message-list */
guint32 em_folder_view_disable_mask(EMFolderView *emfv);
diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c
index bc94f8aae5..ebda5aaf2a 100644
--- a/mail/em-format-html-print.c
+++ b/mail/em-format-html-print.c
@@ -26,274 +26,212 @@
#endif
#include <string.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
+#include <gtk/gtk.h>
#include <gtkhtml/gtkhtml.h>
-#include <gtk/gtkwindow.h>
#include <camel/camel-i18n.h>
#include "mail-ops.h"
#include "mail-mt.h"
#include "em-format-html-print.h"
-#include <gtk/gtk.h>
#include <e-util/e-print.h>
-static void efhp_builtin_init(EMFormatHTMLPrintClass *efhc);
-
-static EMFormatHTMLClass *efhp_parent;
+static gpointer parent_class = NULL;
static void
-efhp_init(GObject *o)
+efhp_finalize (GObject *o)
{
EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
- GtkWidget *html = (GtkWidget *)efhp->formathtml.html;
- /* ?? */
- gtk_widget_set_name(html, "EvolutionMailPrintHTMLWidget");
+ gtk_widget_destroy (efhp->window);
+ if (efhp->source != NULL)
+ g_object_unref (efhp->source);
- /* 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);
- efhp->formathtml.show_icon = FALSE;
+ ((GObjectClass *) parent_class)->finalize (o);
}
static void
-efhp_finalise(GObject *o)
+efhp_class_init (GObjectClass *class)
{
- EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
-
- gtk_widget_destroy(efhp->window);
- if (efhp->settings)
- g_object_unref(efhp->settings);
- if (efhp->source)
- g_object_unref(efhp->source);
-
- ((GObjectClass *)efhp_parent)->finalize(o);
+ parent_class = g_type_class_ref(EM_TYPE_FORMAT_HTML_PRINT);
+ class->finalize = efhp_finalize;
}
static void
-efhp_base_init(EMFormatHTMLPrintClass *efhpklass)
+efhp_init (GObject *o)
{
- efhp_builtin_init(efhpklass);
-}
+ EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
+ GtkWidget *html = (GtkWidget *)efhp->parent.html;
-static void
-efhp_class_init(GObjectClass *klass)
-{
- klass->finalize = efhp_finalise;
+ /* ?? */
+ 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 (GTK_CONTAINER (efhp->window), html);
+ gtk_widget_realize (html);
+ efhp->parent.show_icon = FALSE;
}
GType
-em_format_html_print_get_type(void)
+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
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo type_info = {
+ sizeof (EMFormatHTMLPrintClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) efhp_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (EMFormatHTMLPrint),
+ 0, /* n_preallocs */
+ (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);
+
+ type = g_type_register_static (
+ em_format_html_get_type (), "EMFormatHTMLPrint",
+ &type_info, 0);
}
return type;
}
-EMFormatHTMLPrint *em_format_html_print_new(void)
+EMFormatHTMLPrint *
+em_format_html_print_new (EMFormatHTML *source, GtkPrintOperationAction action)
{
EMFormatHTMLPrint *efhp;
- efhp = g_object_new(em_format_html_print_get_type(), 0);
+ efhp = g_object_new (EM_TYPE_FORMAT_HTML_PRINT, NULL);
+ if (source != NULL)
+ efhp->source = g_object_ref (source);
+ efhp->action = action;
return efhp;
}
struct footer_info {
- GnomeFont *local_font;
+ PangoLayout *layout;
gint page_num, pages;
};
-typedef struct MailDraw MailDraw;
-
-struct MailDraw {
- EMFormatHTMLPrint *efhp;
- struct footer_info info;
- void *data;
- gint res;
- gdouble line;
-};
-static void mail_draw_page(GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, MailDraw *mdi);
static void
-efhp_footer_cb(GtkHTML *html, GtkPrintContext *print_context, double x, double y, double width, double height, void *data)
+efhp_footer_cb (GtkHTML *html, GtkPrintContext *context, gdouble x, gdouble y,
+ gdouble width, gdouble height, gpointer data)
{
struct footer_info *info = data;
+ gchar *footer_text;
cairo_t *cr;
-
- /* 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;
- cr = gtk_print_context_get_cairo_context (print_context);
- cairo_save (cr);
- cairo_set_source_rgb (cr, .0, .0, .0);
- cairo_move_to (cr, x + width - tw, y - gnome_font_get_ascender(info->local_font));
- cairo_set_font_face (cr, NULL);
- cairo_set_font_size (cr, 6);
- cairo_show_text (cr, text);
- cairo_restore(cr);
- g_free(text);
- info->page_num++;
- }
-}
-/* perform preview, or print */
-/* returns GNOME_PRINT_OK on success */
-static void
-emfhp_complete(EMFormatHTMLPrint *efhp, void *data)
-{
- GtkPaperSize *paper_size;
- GtkPrintOperation *print;
- GtkPrintSettings *settings;
- GtkPageSetup *page_setup;
- struct MailDraw *mdi;
- struct footer_info info;
+ footer_text = g_strdup_printf (_("Page %d of %d"),
+ info->page_num++, info->pages);
+
+ pango_layout_set_text (info->layout, footer_text, -1);
+ pango_layout_set_width (info->layout, pango_units_from_double (width));
- page_setup = gtk_page_setup_new ();
- paper_size = gtk_paper_size_new ("iso_a4");/*FIXME paper size hardcoded */
- print = gtk_print_operation_new ();
- gtk_page_setup_set_paper_size (page_setup, paper_size);
-
- settings = e_print_load_settings ();
- gtk_print_operation_set_print_settings (print, settings);
- /* running the dialog */
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
-
- /*initialise the struct */
- mdi = g_new0 (MailDraw, 1);
- mdi->efhp = efhp;
- mdi->line = 0.0;
- mdi->res = GNOME_PRINT_OK;
- mdi->info = info;
-
- /* connect */
- g_signal_connect (print,"draw_page", G_CALLBACK (mail_draw_page), mdi);
- if (!efhp->preview)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- else
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
- g_object_unref (print);
+ 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, info->layout);
+ cairo_restore (cr);
+
+ g_free (footer_text);
}
static void
-mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, MailDraw *mdi)
+mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context,
+ gint page_nr, EMFormatHTMLPrint *efhp)
{
- mdi->info.local_font = gnome_font_find_closest("Sans Regular", 10.0);
- if (mdi->info.local_font) {
- mdi->line = gnome_font_get_ascender(mdi->info.local_font) - gnome_font_get_descender(mdi->info.local_font);
- mdi->info.page_num = 1;
- mdi->info.pages = gtk_html_print_page_get_pages_num(mdi->efhp->formathtml.html, context, 0.0, mdi->line );
- gtk_html_print_page_with_header_footer(mdi->efhp->formathtml.html,
- context,
- 0.0,
- mdi->line,
- NULL,
- efhp_footer_cb,
- &(mdi->info));
- } else {
- gtk_html_print_page (mdi->efhp->formathtml.html, context);
- }
-}
+ GtkHTML *html = efhp->parent.html;
+ PangoFontDescription *desc;
+ PangoFontMetrics *metrics;
+ struct footer_info info;
+ gdouble footer_height;
-int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, int preview)
-{
- EMFormat *emfs = (EMFormat *)source;
+ desc = pango_font_description_from_string ("Sans Regular 10");
- efhp->settings = settings;
- if (settings)
- g_object_ref(settings);
+ info.layout = gtk_print_context_create_pango_layout (context);
+ pango_layout_set_alignment (info.layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_font_description (info.layout, desc);
- efhp->preview = preview;
- ((EMFormatHTML *)efhp)->load_http = source->load_http_now;
+ metrics = pango_context_get_metrics (
+ pango_layout_get_context (info.layout),
+ desc, pango_language_get_default ());
+ footer_height = pango_units_to_double (
+ pango_font_metrics_get_ascent (metrics) +
+ pango_font_metrics_get_descent (metrics));
+ pango_font_metrics_unref (metrics);
- g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp);
+ pango_font_description_free (desc);
- g_object_ref(efhp);
- em_format_format_clone((EMFormat *)efhp, emfs->folder, emfs->uid, emfs->message, (EMFormat *)source);
+ info.page_num = 1;
+ info.pages = gtk_html_print_page_get_pages_num (
+ html, context, 0.0, footer_height);
- return 0; /* damn async ... */
+ gtk_html_print_page_with_header_footer (
+ html, context, 0.0, footer_height,
+ NULL, efhp_footer_cb, &info);
}
static void
-emfhp_got_message(struct _CamelFolder *folder, const char *uid, struct _CamelMimeMessage *msg, void *data)
+emfhp_complete (EMFormatHTMLPrint *efhp)
{
- EMFormatHTMLPrint *efhp = data;
-
- if (msg) {
- if (efhp->source)
- ((EMFormatHTML *)efhp)->load_http = efhp->source->load_http_now;
- g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp);
- em_format_format_clone((EMFormat *)efhp, folder, uid, msg, (EMFormat *)efhp->source);
- } else {
- g_object_unref(efhp);
- }
-}
+ GtkPrintOperation *operation;
-int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, struct _CamelFolder *folder, const char *uid, int preview)
-{
- efhp->settings = settings;
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
- if (settings)
- g_object_ref(settings);
- efhp->preview = preview;
- efhp->source = source;
- if (source)
- g_object_ref(source);
- g_object_ref(efhp);
+ g_signal_connect (
+ operation, "draw-page",
+ G_CALLBACK (mail_draw_page), efhp);
- mail_get_message(folder, uid, emfhp_got_message, efhp, mail_thread_new);
+ gtk_print_operation_run (operation, efhp->action, NULL, NULL);
- return 0; /* damn async ... */
+ g_object_unref (operation);
}
-int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, GtkPrintSettings *settings, struct _CamelMimeMessage *msg, int preview)
+static void
+emfhp_got_message (CamelFolder *folder, const char *uid,
+ CamelMimeMessage *msg, gpointer data)
{
- efhp->settings = settings;
+ EMFormatHTMLPrint *efhp = data;
- if (settings)
- g_object_ref(settings);
- efhp->source = NULL;
- efhp->preview = preview;
- g_object_ref(efhp);
+ if (msg == NULL) {
+ g_object_unref (efhp);
+ return;
+ }
- emfhp_got_message(NULL, NULL, msg, efhp);
+ if (efhp->source != NULL)
+ ((EMFormatHTML *)efhp)->load_http =
+ efhp->source->load_http_now;
- return 0;
+ g_signal_connect (
+ efhp, "complete", G_CALLBACK (emfhp_complete), efhp);
+ em_format_format_clone (
+ (EMFormat *) efhp, folder, uid, msg,
+ (EMFormat *) efhp->source);
}
-/* ********************************************************************** */
+void
+em_format_html_print_message (EMFormatHTMLPrint *efhp,
+ CamelFolder *folder,
+ const char *uid)
+{
+ g_object_ref (efhp);
-/* if only ... but i doubt this is possible with gnome print/gtkhtml */
-static EMFormatHandler type_builtin_table[] = {
- /*{ "application/postscript", (EMFormatFunc)efhp_application_postscript },*/
-};
+ mail_get_message (
+ folder, uid, emfhp_got_message, efhp, mail_thread_new);
+}
-static void
-efhp_builtin_init(EMFormatHTMLPrintClass *efhc)
+void
+em_format_html_print_raw_message (EMFormatHTMLPrint *efhp,
+ CamelMimeMessage *msg)
{
- int i;
+ g_object_ref (efhp);
- 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]);
+ emfhp_got_message (NULL, NULL, msg, efhp);
}
diff --git a/mail/em-format-html-print.h b/mail/em-format-html-print.h
index 3cc605ba43..a013d57452 100644
--- a/mail/em-format-html-print.h
+++ b/mail/em-format-html-print.h
@@ -8,32 +8,32 @@
#include "mail/em-format-html.h"
-struct GtkPrintSettings;
+#define EM_TYPE_FORMAT_HTML_PRINT \
+ (em_format_html_print_get_type ())
+
typedef struct _EMFormatHTMLPrint EMFormatHTMLPrint;
typedef struct _EMFormatHTMLPrintClass EMFormatHTMLPrintClass;
-struct _CamelFolder;
-
struct _EMFormatHTMLPrint {
- EMFormatHTML formathtml;
+ EMFormatHTML parent;
- struct _GtkWidget *window; /* used to realise the gtkhtml in a toplevel, i dont know why */
- struct _GtkPrintSettings *settings;
- struct _EMFormatHTML *source; /* used for print_message */
+ GtkWidget *window; /* used to realise the gtkhtml in a toplevel, i dont know why */
+ EMFormatHTML *source; /* used for print_message */
- guint preview:1;
+ GtkPrintOperationAction action;
};
struct _EMFormatHTMLPrintClass {
- EMFormatHTMLClass formathtml_class;
+ EMFormatHTMLClass parent_class;
};
-GType em_format_html_print_get_type(void);
-
-EMFormatHTMLPrint *em_format_html_print_new(void);
-
-int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, int preview);
-int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, struct _CamelFolder *folder, const char *uid, int preview);
-int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GtkPrintSettings *settings, struct _CamelMimeMessage *msg, int preview);
+GType em_format_html_print_get_type (void);
+EMFormatHTMLPrint * em_format_html_print_new (EMFormatHTML *source,
+ GtkPrintOperationAction action);
+void em_format_html_print_message (EMFormatHTMLPrint *efhp,
+ CamelFolder *folder,
+ const char *uid);
+void em_format_html_print_raw_message (EMFormatHTMLPrint *efhp,
+ CamelMimeMessage *msg);
#endif /* ! _EM_FORMAT_HTML_PRINT_H */
diff --git a/plugins/print-message/ChangeLog b/plugins/print-message/ChangeLog
index 22020bc06d..506cffce8b 100644
--- a/plugins/print-message/ChangeLog
+++ b/plugins/print-message/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ * print-message.c:
+ Refactor the printing infrastructure. (#426816)
+
2007-02-12 Srinivasa Ragavan <sragavan@novell.com>
** Print migration updates from Ebby Wiselyn
diff --git a/plugins/print-message/print-message.c b/plugins/print-message/print-message.c
index 087aa82370..14b5e4655f 100644
--- a/plugins/print-message/print-message.c
+++ b/plugins/print-message/print-message.c
@@ -30,7 +30,6 @@
#include "mail/em-format-html-print.h"
#include <glib.h>
#include <glib/gi18n.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
#include "mail/em-menu.h"
#include "mail/em-utils.h"
#include "e-util/e-print.h"
@@ -39,72 +38,34 @@
void org_gnome_compose_print_message (EPlugin *ep, EMMenuTargetWidget *t);
-struct _print_data {
- GtkPrintSettings *config;
- CamelMimeMessage *msg;
- int preview;
-};
-
-static void
-print_response (GtkWidget *w, int resp, struct _print_data *data)
-{
- EMFormatHTMLPrint *print;
-
- switch (resp) {
- case GTK_RESPONSE_APPLY:
- data->preview = TRUE;
- case GTK_RESPONSE_OK:
- print = em_format_html_print_new();
- em_format_html_print_raw_message(print, data->config, data->msg, data->preview);
- g_object_unref(print);
- break;
- }
-
- if (w)
- gtk_widget_destroy(w);
-
- e_print_save_settings (data->config);
- g_object_unref(data->config);
- g_free(data);
-
-}
-
-void org_gnome_print_message (EPlugin *ep, EMMenuTargetWidget *t);
-
void
org_gnome_print_message (EPlugin *ep, EMMenuTargetWidget *t)
{
-
EMsgComposer *composer = (EMsgComposer *)t->target.widget;
- struct _print_data *data;
- GtkDialog *dialog;
-
- data = g_malloc0(sizeof(*data));
- data->config = e_print_load_settings ();
- data->preview = 0;
-
- data->msg = e_msg_composer_get_message (composer, 1);
- dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), 0, data->config);
- gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK);
- e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) composer);
- print_response (dialog, GTK_RESPONSE_OK, data);
-}
+ GtkPrintOperationAction action;
+ CamelMimeMessage *message;
+ EMFormatHTMLPrint *efhp;
-void org_gnome_print_preview (EPlugin *ep, EMMenuTargetWidget *t);
+ action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG;
+ message = e_msg_composer_get_message (composer, 1);
+
+ efhp = em_format_html_print_new (NULL, action);
+ em_format_html_print_raw_message (efhp, message);
+ g_object_unref (efhp);
+}
void
org_gnome_print_preview (EPlugin *ep, EMMenuTargetWidget *t)
{
EMsgComposer *composer = (EMsgComposer *)t->target.widget;
- struct _print_data *data;
-
- data = g_malloc0(sizeof(*data));
- data->config = e_print_load_settings ();
- data->preview = 0;
-
- data->msg = e_msg_composer_get_message (composer, 1);
-
- print_response(NULL, GTK_RESPONSE_APPLY, data);
-}
+ GtkPrintOperationAction action;
+ CamelMimeMessage *message;
+ EMFormatHTMLPrint *efhp;
+ action = GTK_PRINT_OPERATION_ACTION_PREVIEW;
+ message = e_msg_composer_get_message (composer, 1);
+ efhp = em_format_html_print_new (NULL, action);
+ em_format_html_print_raw_message (efhp, message);
+ g_object_unref (efhp);
+}
diff --git a/widgets/misc/e-printable.h b/widgets/misc/e-printable.h
index 2d3140c99f..25e0454a0a 100644
--- a/widgets/misc/e-printable.h
+++ b/widgets/misc/e-printable.h
@@ -25,7 +25,6 @@
#define _E_PRINTABLE_H_
#include <gtk/gtkobject.h>
-#include <libgnomeprint/gnome-print.h>
#include <gtk/gtk.h>
G_BEGIN_DECLS
diff --git a/widgets/table/ChangeLog b/widgets/table/ChangeLog
index 43d102a326..670368435d 100644
--- a/widgets/table/ChangeLog
+++ b/widgets/table/ChangeLog
@@ -1,3 +1,12 @@
+2007-04-20 Matthew Barnes <mbarnes@redhat.com>
+
+ * e-cell.h:
+ * e-cell-pixbuf.c:
+ * e-cell-text.c:
+ * e-printable.h:
+ * e-table-group-container.c:
+ Refactor the printing infrastructure. (#426816)
+
2007-04-19 Matthew Barnes <mbarnes@redhat.com>
** Fixes part of bug #429422
diff --git a/widgets/table/e-cell-pixbuf.c b/widgets/table/e-cell-pixbuf.c
index 22d92bf98a..8b341c48a9 100644
--- a/widgets/table/e-cell-pixbuf.c
+++ b/widgets/table/e-cell-pixbuf.c
@@ -50,17 +50,6 @@ enum {
PROP_UNSELECTED_COLUMN
};
-static int
-gnome_print_pixbuf (GtkPrintContext *pc, GdkPixbuf *pixbuf)
-{
- cairo_t *cr = gtk_print_context_get_cairo_context (pc);
-
- gdk_cairo_set_source_pixbuf (cr, pixbuf,
- (double)gdk_pixbuf_get_width (pixbuf),
- (double)gdk_pixbuf_get_height (pixbuf));
- return TRUE;
-}
-
/*
* ECellPixbuf functions
*/
diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c
index 47088029a6..c6698182e7 100644
--- a/widgets/table/e-cell-text.c
+++ b/widgets/table/e-cell-text.c
@@ -45,7 +45,6 @@
#include <gtk/gtk.h>
#include <libgnomecanvas/gnome-canvas.h>
#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnomeprint/gnome-print-pango.h>
#include "a11y/e-table/gal-a11y-e-cell-registry.h"
#include "a11y/e-table/gal-a11y-e-cell-text.h"
diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c
index 8853a7a132..6bb61e03d8 100644
--- a/widgets/table/e-cell-tree.c
+++ b/widgets/table/e-cell-tree.c
@@ -695,11 +695,14 @@ ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, voi
}
static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context,
+ect_print (ECellView *ecell_view, GtkPrintContext *context,
int model_col, int view_col, int row,
double width, double height)
{
ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
+ cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
+ cairo_save (cr);
if (/* XXX only if we're the active sort */ TRUE) {
ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
@@ -716,24 +719,20 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context,
if (!e_tree_model_node_is_root (tree_model, node)
|| e_tree_model_node_get_children (tree_model, node, NULL) > 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height / 2);
-
- gnome_print_lineto (context,
- offset,
- height / 2);
+ cairo_move_to (cr,
+ offset - INDENT_AMOUNT / 2,
+ height / 2);
+ cairo_line_to (cr, offset, height / 2);
}
if (visible_depth_of_node (ecell_view->e_table_model, row) != 0) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- (e_tree_table_adapter_node_get_next (tree_table_adapter, node)
- ? 0
- : height / 2));
+ cairo_move_to (cr,
+ offset - INDENT_AMOUNT / 2, height);
+ cairo_line_to (cr,
+ offset - INDENT_AMOUNT / 2,
+ e_tree_table_adapter_node_get_next
+ (tree_table_adapter, node) ? 0 :
+ height / 2);
}
/* now traverse back up to the root of the tree, checking at
@@ -744,12 +743,11 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context,
offset -= INDENT_AMOUNT;
while (node && depth != 0) {
if (e_tree_table_adapter_node_get_next(tree_table_adapter, node)) {
- gnome_print_moveto (context,
- offset - INDENT_AMOUNT / 2,
- height);
- gnome_print_lineto (context,
- offset - INDENT_AMOUNT / 2,
- 0);
+ cairo_move_to (cr,
+ offset - INDENT_AMOUNT / 2,
+ height);
+ cairo_line_to (cr,
+ offset - INDENT_AMOUNT / 2, 0);
}
node = e_tree_model_node_get_parent (tree_model, node);
depth --;
@@ -759,41 +757,40 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context,
/* now draw our icon if we're expandable */
if (expandable) {
- double image_matrix [6] = {16, 0, 0, 16, 0, 0};
- GdkPixbuf *image = (expanded
- ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
- : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
- int image_width, image_height, image_rowstride;
- guchar *image_pixels;
-
- image_width = gdk_pixbuf_get_width(image);
- image_height = gdk_pixbuf_get_height(image);
- image_pixels = gdk_pixbuf_get_pixels(image);
- image_rowstride = gdk_pixbuf_get_rowstride(image);
-
- image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
- image_matrix [5] = height / 2 - image_height / 2;
-
- gnome_print_gsave (context);
- gnome_print_concat (context, image_matrix);
-
- gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
- gnome_print_grestore (context);
+ ECellTree *tree;
+ GdkPixbuf *pixbuf;
+ gint image_width;
+ gint image_height;
+
+ tree = E_CELL_TREE (tree_view->cell_view.ecell);
+
+ if (expanded)
+ pixbuf = tree->open_pixbuf;
+ else
+ pixbuf = tree->closed_pixbuf;
+
+ image_width = gdk_pixbuf_get_width (pixbuf);
+ image_height = gdk_pixbuf_get_height (pixbuf);
+
+ gdk_cairo_set_source_pixbuf (
+ cr, pixbuf, subcell_offset -
+ INDENT_AMOUNT / 2 - image_width - 2,
+ height / 2 - image_height / 2);
}
- gnome_print_stroke (context);
+ cairo_stroke (cr);
- if (gnome_print_translate(context, subcell_offset, 0) == -1)
- /* FIXME */;
+ cairo_translate (cr, subcell_offset, 0);
width -= subcell_offset;
}
+ cairo_restore (cr);
e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height);
}
static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
+ect_print_height (ECellView *ecell_view, GtkPrintContext *context,
int model_col, int view_col, int row,
double width)
{
diff --git a/widgets/table/e-cell.h b/widgets/table/e-cell.h
index 378d32d75e..72ae6a6c79 100644
--- a/widgets/table/e-cell.h
+++ b/widgets/table/e-cell.h
@@ -27,8 +27,6 @@
#include <gdk/gdktypes.h>
#include <gtk/gtk.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-font.h>
#include <table/e-table-model.h>
#include <table/e-table-tooltip.h>
diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c
index 3a21171d1c..0cccdd6e38 100644
--- a/widgets/table/e-table-group-container.c
+++ b/widgets/table/e-table-group-container.c
@@ -1152,7 +1152,8 @@ e_table_group_container_print_page (EPrintable *ep,
GList *child;
EPrintable *child_printable;
gchar *string;
- GnomeFont *font = gnome_font_find_closest ("Helvetica", TEXT_HEIGHT);
+ PangoLayout *layout;
+ PangoFontDescription *desc;
child_printable = groupcontext->child_printable;
child = groupcontext->child;
@@ -1177,22 +1178,30 @@ e_table_group_container_print_page (EPrintable *ep,
}
}
+ layout = gtk_print_context_create_pango_layout (context);
+
+ desc = pango_font_description_new ();
+ pango_font_description_set_family_static (desc, "Helvetica");
+ pango_font_description_set_size (desc, TEXT_HEIGHT);
+ pango_layout_set_font_description (layout, desc);
+ pango_font_description_free (desc);
+
while (1) {
- child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize);
- cr = gtk_print_context_get_cairo_context (context);
- cairo_save (cr);
- cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT);
- cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT);
- cairo_set_source_rgb (cr, .7, .7, .7) ;
- cairo_fill(cr) ;
- cairo_restore (cr);
-
- cairo_save (cr);
- cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT);
- cairo_clip (cr);
- cairo_restore (cr);
+ child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize);
+ cr = gtk_print_context_get_cairo_context (context);
+ cairo_save (cr);
+ cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT);
+ cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT);
+ cairo_set_source_rgb (cr, .7, .7, .7) ;
+ cairo_fill(cr) ;
+ cairo_restore (cr);
+
+ cairo_save (cr);
+ cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT);
+ cairo_clip (cr);
+ cairo_restore (cr);
- cairo_move_to(cr, 0, (gnome_font_get_ascender(font) - gnome_font_get_descender(font)) / 2);
+ cairo_move_to(cr, 0, 0);
if (groupcontext->etgc->ecol->text)
string = g_strdup_printf ("%s : %s (%d item%s)",
groupcontext->etgc->ecol->text,
@@ -1204,16 +1213,17 @@ e_table_group_container_print_page (EPrintable *ep,
child_node->string,
(gint) child_node->count,
child_node->count == 1 ? "" : "s");
- cairo_show_text (cr, string);
- g_free(string);
-
- cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ;
- cairo_move_to(cr, 0, 0);
- cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height);
- cairo_clip(cr);
+ pango_layout_set_text (layout, string, -1);
+ pango_cairo_show_layout (cr, layout);
+ g_free(string);
+
+ cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ;
+ cairo_move_to(cr, 0, 0);
+ cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height);
+ cairo_clip(cr);
- e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize);
- yd += child_height + TEXT_AREA_HEIGHT;
+ e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize);
+ yd += child_height + TEXT_AREA_HEIGHT;
if (e_printable_data_left(child_printable))
break;
@@ -1236,6 +1246,8 @@ e_table_group_container_print_page (EPrintable *ep,
g_object_unref (groupcontext->child_printable);
groupcontext->child_printable = child_printable;
groupcontext->child = child;
+
+ g_object_unref (layout);
}
static gboolean