diff options
author | Srinivasa Ragavan <sragavan@novell.com> | 2007-01-23 00:41:31 +0800 |
---|---|---|
committer | Srinivasa Ragavan <sragavan@src.gnome.org> | 2007-01-23 00:41:31 +0800 |
commit | 2a1d77a838cd309647088f13b81afce46d5ae90e (patch) | |
tree | 9f26bb2f33a3b9fa5f24578515939692abe2171f | |
parent | 0b9195cb2c24add072671f82d1d1498b78a8b217 (diff) | |
download | gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar.gz gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar.bz2 gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar.lz gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar.xz gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.tar.zst gsoc2013-evolution-2a1d77a838cd309647088f13b81afce46d5ae90e.zip |
** Committing Ebby Wiselyn's patch for GtkPrint API migration. 2006-01-22
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
2006-01-22 Srinivasa Ragavan <sragavan@novell.com>
** Committing Ebby Wiselyn's patch for GtkPrint API migration.
svn path=/trunk/; revision=33134
27 files changed, 1874 insertions, 1401 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 77837de923..bf4ceb6a3a 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,22 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + ** GtkPrint api migration from Ebby Wiselyn. + + * gui/component/addressbook-view.c: (print_cb): + * gui/widgets/e-addressbook-view.c: (print), + (e_contact_print_button), (contact_print_button_draw_page), + (eab_view_print), (eab_view_print_preview): + * gui/widgets/e-addressbook-view.h: + * printing/e-contact-print.c: (e_contact_output), + (e_contact_text_height), (e_contact_rectangle), + (e_contact_print_letter_heading), (e_contact_start_new_page), + (e_contact_get_contact_size), (e_contact_print_contact), + (e_contact_start_new_column), (complete_sequence), + (book_view_loaded), (e_contact_do_print_contacts), + (e_contact_build_style), (e_contact_print_response), + (e_contact_print_dialog_new), (e_contact_print_contact_dialog_new), + (contact_draw_page): + 2007-01-08 Veerapuram Varadhan <vvaradhan@novell.com> Patch submitted by Nathan Owens <pianocomp81@yahoo.com> and diff --git a/addressbook/gui/component/addressbook-view.c b/addressbook/gui/component/addressbook-view.c index d6da6a09cc..21b7cbd2f7 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); + eab_view_print(v, 1); } static void diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 6b0788b9d5..e210dd71d5 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -81,6 +81,7 @@ #include <libxml/tree.h> #include <libxml/parser.h> +#include <gtk/gtkprintunixdialog.h> #define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")" @@ -120,6 +121,7 @@ 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; @@ -872,9 +874,11 @@ print (EPopup *ep, EPopupItem *pitem, void *data) { /*ContactAndBook *contact_and_book = data;*/ EABPopupTargetSelect *t = (EABPopupTargetSelect *)ep->target; + GtkWidget *dialog; if (t->cards->len == 1) { - gtk_widget_show(e_contact_print_contact_dialog_new(t->cards->pdata[0])); + 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); @@ -1699,8 +1703,6 @@ get_master_list (void) return category_list; } - - typedef struct { GtkWidget *table; GObject *printable; @@ -1717,67 +1719,61 @@ e_contact_print_destroy(gpointer data, GObject *where_object_was) static void e_contact_print_button(GtkDialog *dialog, gint response, gpointer data) -{ - GnomePrintJob *master; - GnomePrintContext *pc; - EPrintable *printable = g_object_get_data(G_OBJECT(dialog), "printable"); +{ GtkWidget *preview; - switch( response ) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - master = gnome_print_job_new(gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) )); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); - while (e_printable_data_left(printable)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 5 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; - } - gnome_print_job_close(master); - gnome_print_job_print(master); - g_object_unref (master); - gtk_widget_destroy((GtkWidget *)dialog); - break; - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - master = gnome_print_job_new (gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) )); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); + 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); + g_object_unref (settings); + g_object_unref (page_setup); + g_object_unref (paper_size); +} + +static void +contact_print_button_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr,EPrintable *printable) + +{ + 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)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 9 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; + cairo_save (cr); + e_printable_print_page (printable, + context, + 6.5 * 72, + top_margin + 10, + TRUE); + cairo_restore (cr); } - gnome_print_job_close(master); - preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview")); - gtk_widget_show_all(preview); - g_object_unref (master); - break; - case GNOME_PRINT_DIALOG_RESPONSE_CANCEL: - default: - gtk_widget_destroy((GtkWidget *)dialog); - break; - } } void @@ -1842,7 +1838,7 @@ eab_view_discard_menus (EABView *view) } void -eab_view_print(EABView *view) +eab_view_print(EABView *view, int preview) { if (view->view_type == EAB_VIEW_MINICARD) { char *query; @@ -1855,9 +1851,14 @@ eab_view_print(EABView *view) NULL); GList *list = get_selected_contacts (view); print = e_contact_print_dialog_new (book, query, list); - g_free(query); - e_free_object_list(list); - gtk_widget_show(print); + + if (!preview) + e_contact_print_response (print, GTK_RESPONSE_OK, NULL); + else + e_contact_print_response (print, GTK_RESPONSE_APPLY, NULL); + + g_free (query); + e_free_object_list (list); } else if (view->view_type == EAB_VIEW_TABLE) { GtkWidget *dialog; @@ -1878,17 +1879,14 @@ eab_view_print(EABView *view) g_object_set_data (G_OBJECT (dialog), "table", view->widget); g_object_set_data (G_OBJECT (dialog), "printable", printable); - g_signal_connect(dialog, - "response", G_CALLBACK(e_contact_print_button), NULL); - 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); - - gtk_widget_show(dialog); + if (preview) + e_contact_print_button (dialog, GTK_RESPONSE_APPLY, NULL); + else + e_contact_print_button (dialog, GTK_RESPONSE_OK, NULL); } #ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW else if (view->view_type == EAB_VIEW_TREEVIEW) { @@ -1903,60 +1901,40 @@ eab_view_print_preview(EABView *view) if (view->view_type == EAB_VIEW_MINICARD) { char *query; EBook *book; + GtkWidget *print; g_object_get (view->model, "query", &query, "book", &book, NULL); - GList *list = get_selected_contacts (view); + GList *list = get_selected_contacts (view); e_contact_print_preview (book, query, list); e_free_object_list (list); - g_free (query); - } else if (view->view_type == EAB_VIEW_TABLE) { + }else if (view->view_type == EAB_VIEW_TABLE) { + GtkWidget *dialog; EPrintable *printable; ETable *etable; - GnomePrintJob *master; - GnomePrintContext *pc; - GnomePrintConfig *config; - GtkWidget *preview; + EContactPrintDialogWeakData *weak_data; + + /* FIXME: Allow range selection in table views, as in minicard view */ + dialog = e_print_get_dialog (_("Print cards"), GNOME_PRINT_DIALOG_COPIES); g_object_get(view->widget, "table", &etable, NULL); printable = e_table_get_printable(etable); - g_object_unref(etable); g_object_ref (printable); gtk_object_sink (GTK_OBJECT (printable)); + g_object_unref(etable); + g_object_ref (view->widget); - config = e_print_load_config (); - master = gnome_print_job_new (config); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); - while (e_printable_data_left(printable)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 9 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; - } - gnome_print_job_close(master); - preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview")); - gtk_widget_show_all(preview); - g_object_unref (master); - g_object_unref (printable); - } -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == EAB_VIEW_TREEVIEW) { - /* XXX */ + 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_OK, NULL); } -#endif } /* callback function to handle removal of contacts for diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h index 3327bb6868..0f674c9edd 100644 --- a/addressbook/gui/widgets/e-addressbook-view.h +++ b/addressbook/gui/widgets/e-addressbook-view.h @@ -130,7 +130,7 @@ 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); +void eab_view_print (EABView *view, int preview); void eab_view_print_preview (EABView *view); void eab_view_delete_selection (EABView *view, gboolean is_delete); void eab_view_cut (EABView *view); diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c index 950d30338b..16c219fe1e 100644 --- a/addressbook/printing/e-contact-print.c +++ b/addressbook/printing/e-contact-print.c @@ -44,6 +44,8 @@ #include <libebook/e-book.h> #include <libebook/e-contact.h> +#include <gtk/gtk.h> +#include <gtk/gtkprintunixdialog.h> #include <libedataserver/e-xml-utils.h> #include "e-util/e-print.h" @@ -51,16 +53,17 @@ #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 { - GnomePrintContext *pc; + GtkPrintContext *pc; GnomePrintJob *master; PangoLayout *pl; gdouble x; @@ -81,6 +84,20 @@ struct _EContactPrintContext 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 double get_font_height (PangoFontDescription *font) { @@ -139,14 +156,14 @@ find_closest_font_from_weight_slant (const guchar *family, GnomeFontWeight weigh static void e_contact_output(EContactPrintContext *ctxt, PangoFontDescription *font, double x, double y, double width, const gchar *text) { - gnome_print_gsave(ctxt->pc); - - /* Preserve the indentation behaviour of the old e_contact_divide_text function: */ double indent; + cairo_t *cr = gtk_print_context_get_cairo_context (ctxt->pc); + cairo_save(cr); + if ( width == -1 || get_font_width(ctxt, font, text) <= width ) { indent = 0.0; } else { - indent = get_font_width (ctxt, font, " "); + indent = get_font_width (ctxt, font, " "); } g_assert (ctxt->pl); @@ -155,9 +172,10 @@ e_contact_output(EContactPrintContext *ctxt, PangoFontDescription *font, double pango_layout_set_width (ctxt->pl, width*PANGO_SCALE); pango_layout_set_indent (ctxt->pl, indent*PANGO_SCALE); - gnome_print_moveto(ctxt->pc, x, y); - gnome_print_pango_layout (ctxt->pc, ctxt->pl); - gnome_print_grestore(ctxt->pc); + cairo_move_to(cr, x, y); + pango_cairo_show_layout (cr, ctxt->pl); + cairo_restore (cr); + } static gdouble @@ -168,12 +186,9 @@ e_contact_text_height(EContactPrintContext *ctxt, PangoFontDescription *font, do 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_width (ctxt->pl, 1); /* fix me width hard coded */ pango_layout_set_indent (ctxt->pl, 0); - - pango_layout_get_size (ctxt->pl, - &w, - &h); + pango_layout_get_size (ctxt->pl, &w, &h); return (double)h/(double)PANGO_SCALE; } @@ -190,7 +205,7 @@ e_contact_output_and_advance(EContactPrintContext *ctxt, PangoFontDescription *f #endif static void -e_contact_rectangle(GnomePrintContext *pc, +e_contact_rectangle(GtkPrintContext *pc, gdouble x0, gdouble y0, gdouble x1, @@ -199,15 +214,13 @@ e_contact_rectangle(GnomePrintContext *pc, gdouble g, gdouble b) { - gnome_print_gsave(pc); - gnome_print_setrgbcolor(pc, r, g, b); - gnome_print_moveto(pc, x0, y0); - gnome_print_lineto(pc, x1, y0); - gnome_print_lineto(pc, x1, y1); - gnome_print_lineto(pc, x0, y1); - gnome_print_lineto(pc, x0, y0); - gnome_print_fill(pc); - gnome_print_grestore(pc); + 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); } static double @@ -221,38 +234,47 @@ e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *character) { gdouble height; gdouble width; + cairo_t *cr; width = get_font_width(ctxt, ctxt->letter_heading_font, "m") * 1.7; height = get_font_height (ctxt->letter_heading_font); - gnome_print_gsave( ctxt->pc ); - e_contact_rectangle( ctxt->pc, ctxt->x, ctxt->y, ctxt->x + width, ctxt->y - (height + 6), 0, 0, 0); - gnome_print_setrgbcolor(ctxt->pc, 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, ctxt->y, -1, character); - ctxt->y -= height; - ctxt->y -= 2; - ctxt->y -= 3; - gnome_print_grestore( ctxt->pc ); + + cr = gtk_print_context_get_cairo_context (ctxt->pc); + cairo_save(cr); + + 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); } static void e_contact_start_new_page(EContactPrintContext *ctxt) { - ctxt->x = ctxt->style->left_margin * 72; - ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72; + 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; - gnome_print_showpage(ctxt->pc); - - gnome_print_beginpage (ctxt->pc, NULL); } 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; - const char *file_as; gint field; column_width = (page_width + 18) / ctxt->style->num_columns - 18; @@ -293,74 +315,99 @@ 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; - - gnome_print_gsave(ctxt->pc); - - ctxt->y -= get_font_height (ctxt->style->headings_font) * .2; - ctxt->y -= get_font_height (ctxt->style->headings_font) * .2; + cr = gtk_print_context_get_cairo_context (ctxt->pc); + 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, ctxt->x + column_width, ctxt->y - 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, column_width - 4, file_as); - ctxt->y -= e_contact_text_height(ctxt, ctxt->style->headings_font, column_width - 4, file_as); + 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); g_free (file_as); - ctxt->y -= get_font_height (ctxt->style->headings_font) * .2; - ctxt->y -= get_font_height (ctxt->style->headings_font) * .2; + 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, -1, e_contact_pretty_name (field)); + + 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, -1, ": "); xoff += get_font_width(ctxt, ctxt->style->body_font, ": "); - e_contact_output(ctxt, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, 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); + + 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); + } g_free(string); - } - - ctxt->y -= get_font_height (ctxt->style->headings_font) * .4; - gnome_print_grestore(ctxt->pc); + } + ctxt->y += get_font_height (ctxt->style->headings_font) * .4 + 8; + cairo_restore(cr); } 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 page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); gdouble column_offset; + column_offset = (page_width + 18) / ctxt->style->num_columns; ctxt->column ++; + if (ctxt->column >= ctxt->style->num_columns) { e_contact_start_new_page(ctxt); ctxt->column = 0; } - ctxt->x = (72 * ctxt->style->left_margin) + column_offset * ctxt->column; - ctxt->y = 72 * (ctxt->style->page_height - ctxt->style->top_margin); + ctxt->x = ctxt->style->left_margin + column_offset * ctxt->column; + ctxt->y = ctxt->style->top_margin + 12; } static void -complete_sequence(EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt) +complete_sequence (EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt) { GList *contacts = ctxt->contacts; - + cairo_t *cr; gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); ctxt->first_contact = TRUE; ctxt->character = NULL; - ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72; - ctxt->x = (ctxt->style->left_margin) * 72; - - gnome_print_beginpage (ctxt->pc, 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; @@ -368,49 +415,43 @@ complete_sequence(EBookView *book_view, EBookViewStatus status, EContactPrintCon 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) ) { + + 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 - e_contact_get_letter_heading_height(ctxt) - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72)) - e_contact_start_new_column(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 - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72)) { + + 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; } - gnome_print_showpage(ctxt->pc); - gnome_print_context_close(ctxt->pc); - gnome_print_job_close(ctxt->master); - g_free(ctxt->character); + if (book_view) g_object_unref(book_view); - if (ctxt->type == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW) { - GtkWidget *preview; - preview = GTK_WIDGET(gnome_print_job_preview_new(ctxt->master, "Print Preview")); - gtk_widget_show_all(preview); - } else { - gnome_print_job_print(ctxt->master); - } - g_object_unref(ctxt->pc); + + g_object_unref(ctxt->pc); g_object_unref(ctxt->pl); - g_object_unref(ctxt->master); 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); @@ -464,21 +505,20 @@ book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContac G_CALLBACK(create_contact), ctxt); - g_signal_connect(book_view, - "sequence_complete", - G_CALLBACK(complete_sequence), - ctxt); - e_book_view_start (book_view); } static void e_contact_do_print_contacts (EBook *book, EBookQuery *query, EContactPrintContext *ctxt) { - e_book_async_get_book_view(book, query, NULL, -1, (EBookBookViewCallback) book_view_loaded, ctxt); -} + EBookView *bookview; + gboolean status; -static void + status = e_book_get_book_view (book, query, NULL, -1, &bookview, NULL); + book_view_loaded (book, 1, bookview, ctxt); +} + +static void e_contact_do_print (EBook *book, EBookQuery *query, EContactPrintContext *ctxt) { switch ( ctxt->style->type ) { @@ -543,7 +583,7 @@ static void get_font( char *data, PangoFontDescription **variable ) static void -e_contact_build_style(EContactPrintStyle *style, GnomePrintConfig *config) +e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config) { xmlDocPtr styledoc; gchar *filename; @@ -673,14 +713,6 @@ e_contact_build_style(EContactPrintStyle *style, GnomePrintConfig *config) xmlFreeDoc(styledoc); } - /* - * get paper size and set it to the print style - */ - gnome_print_config_get_page_size(config, &page_width, &page_height); - gnome_print_convert_distance(&page_width, gnome_print_unit_get_default(), gnome_print_unit_get_by_name("Inches")); - gnome_print_convert_distance(&page_height, gnome_print_unit_get_default(), gnome_print_unit_get_by_name("Inches")); - style->page_height = page_height; - style->page_width = page_width; } static gint @@ -689,33 +721,40 @@ e_contact_print_close(GnomeDialog *dialog, gpointer data) return FALSE; } -static void +void e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data) { - EContactPrintContext *ctxt = g_new(EContactPrintContext, 1); - EContactPrintStyle *style = g_new(EContactPrintStyle, 1); - GnomePrintJob *master; - GnomePrintConfig *config; - GnomePrintContext *pc; + GtkPrintSettings *settings; + GtkPrintOperation *print; + GtkPrintOperationResult res; + GtkPaperSize *paper_size; + GtkPageSetup *page_setup; + GtkPrintPages print_pages; + 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; - uses_range = GPOINTER_TO_INT (g_object_get_data(G_OBJECT (dialog), "uses_range")); + 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 (gnome_print_dialog_get_range (GNOME_PRINT_DIALOG (dialog)) & GNOME_PRINT_RANGE_ALL) + if (gtk_print_settings_get_print_pages (settings) == GTK_PRINT_PAGES_ALL) { uses_book = TRUE; - if (gnome_print_dialog_get_range (GNOME_PRINT_DIALOG (dialog)) & GNOME_PRINT_RANGE_SELECTION) + } + 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")); - } - EBook *book = NULL; - EBookQuery *query = NULL; - EContact *contact = NULL; - GList *contact_list = NULL; - gdouble font_size; - + } if (uses_book) { book = g_object_get_data(G_OBJECT(dialog), "book"); query = g_object_get_data(G_OBJECT(dialog), "query"); @@ -726,118 +765,57 @@ e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data) } 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); + print = gtk_print_operation_new (); + gtk_print_operation_set_default_page_setup (print, page_setup); + gtk_print_operation_set_n_pages (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; + ctxt->column = 0; + ctxt->style = style; + 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; + 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; + e_contact_do_print_contacts (book, query, ctxt); + + /* runs the print dialog , emitting signals */ + g_signal_connect (print, "draw_page",G_CALLBACK (contact_draw_page), cpi); + if (response_id == GTK_RESPONSE_APPLY) { + res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL); } - switch( response_id ) { - 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 ); - e_contact_build_style(style, config); - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PRINT; - - 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->pc = pc; - ctxt->pl = gnome_print_pango_create_layout (pc); -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - - ctxt->book = book; - ctxt->query = query; - if (uses_book) { - ctxt->contacts = NULL; - e_contact_do_print(book, ctxt->query, ctxt); - } - else if (uses_list) { - ctxt->contacts = contact_list; - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - else { - ctxt->contacts = g_list_append(NULL, contact); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - gtk_widget_destroy (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 ); - e_contact_build_style(style, config); - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW; - - 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->pc = pc; - ctxt->pl = gnome_print_pango_create_layout (pc); -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - ctxt->book = book; - ctxt->query = query; - - if (uses_book) { - ctxt->contacts = NULL; - g_object_ref(book); - e_contact_do_print(book, ctxt->query, ctxt); - } - else if (uses_list) { - ctxt->contacts = g_list_copy (contact_list); - g_list_foreach (ctxt->contacts, (GFunc)g_object_ref, NULL); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - else { - ctxt->contacts = g_list_append(NULL, contact); - g_object_ref(contact); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - gtk_widget_destroy (dialog); - break; - case GNOME_PRINT_DIALOG_RESPONSE_CANCEL: - if (uses_book) - g_object_unref(book); - else if (uses_list) - e_free_object_list (contact_list); - else - g_object_unref(contact); - - if (query) - e_book_query_unref (query); - - gtk_widget_destroy (dialog); - g_free(style); - g_free(ctxt); - break; - } + else + res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL); + g_object_unref (settings); + g_object_unref (print); + g_object_unref (paper_size); + g_object_unref (page_setup); + g_object_unref (cpi); + gtk_widget_destroy (dialog); } + GtkWidget * e_contact_print_dialog_new(EBook *book, char *query, GList *list) { @@ -845,10 +823,7 @@ e_contact_print_dialog_new(EBook *book, char *query, GList *list) GList *copied_list = NULL; GList *l; - - dialog = e_print_get_dialog(_("Print contacts"), GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES); - gnome_print_dialog_construct_range_any(GNOME_PRINT_DIALOG(dialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_SELECTION, - NULL, NULL, NULL); + dialog = e_print_get_dialog(_("Print contacts"), GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES); if (list != NULL) { copied_list = g_list_copy (list); @@ -859,86 +834,23 @@ e_contact_print_dialog_new(EBook *book, char *query, GList *list) 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_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; -} - -void -e_contact_print_preview(EBook *book, char *query, GList *list) -{ - EContactPrintContext *ctxt = g_new(EContactPrintContext, 1); - EContactPrintStyle *style = g_new(EContactPrintStyle, 1); - GnomePrintJob *master; - GnomePrintContext *pc; - GnomePrintConfig *config; - gdouble font_size; - GList *copied_list = NULL; - GList *l; - gboolean uses_book = FALSE, uses_list = FALSE; - - config = e_print_load_config (); - master = gnome_print_job_new (config); - pc = gnome_print_job_get_context (master); - e_contact_build_style (style, config); - - if (list == NULL) { - uses_book = TRUE; - } - else { - uses_list = TRUE; - copied_list = g_list_copy (list); - for (l = copied_list; l; l = l->next) - l->data = e_contact_duplicate (E_CONTACT (l->data)); - } - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW; - 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->pc = pc; - ctxt->pl = gnome_print_pango_create_layout (pc); -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - ctxt->book = book; - ctxt->query = e_book_query_from_string (query); - - if (uses_book) { - ctxt->contacts = NULL; - g_object_ref (book); - e_contact_do_print (book, ctxt->query, ctxt); - } - else if(uses_list) { - ctxt->contacts = g_list_copy (copied_list); - g_list_foreach (ctxt->contacts, (GFunc)g_object_ref, NULL); - complete_sequence (NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } } GtkWidget * e_contact_print_contact_dialog_new(EContact *contact) { GtkWidget *dialog; - - dialog = e_print_get_dialog(_("Print contact"), GNOME_PRINT_DIALOG_COPIES); - contact = e_contact_duplicate(contact); + dialog = e_print_get_dialog(_("Print contact"), GNOME_PRINT_DIALOG_COPIES); + 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)); @@ -976,3 +888,27 @@ e_contact_print_contact_list_dialog_new(GList *list) "close", G_CALLBACK(e_contact_print_close), NULL); return dialog; } + +static void +contact_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, ContactPrintItem *cpi) +{ + cairo_t *cr; + EBookView *view; + EBookViewStatus status; + + 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) { + 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); + } +} diff --git a/calendar/ChangeLog b/calendar/ChangeLog index b2cbdcd91d..ea05f7c425 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,23 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + Committing GtkPrint migration from Ebby Wiselyn. + + * gui/print.c: (evo_calendar_print_cal_data_new), + (evo_calendar_print_data_new), + (evo_calendar_print_renderer_get_width), + (print_border_with_triangles), (print_border_rgb), (print_border), + (print_rectangle), (print_text), (print_text_size), + (print_text_size_bold), (titled_box), (print_month_small), + (bound_text), (print_day_background), (print_day_add_event), + (print_day_long_event), (print_day_event), (print_day_details), + (print_week_long_event), (print_week_day_event), + (print_week_event), (print_week_view_background), + (print_week_summary), (print_month_summary), (print_todo_details), + (print_day_view), (print_week_view), (print_month_view), + (print_year_view), (print_comp_item), (print_calendar), + (print_comp), (print_title), (print_table), (comp_draw_page), + (cal_draw_page), (table_draw_page): + 2007-01-08 Veerapuram Varadhan <vvaradhan@novell.com> Patch submitted by Nathan Owens <pianocomp81@yahoo.com> and diff --git a/calendar/gui/print.c b/calendar/gui/print.c index cc83f1aa0d..b1f23d7cc2 100644 --- a/calendar/gui/print.c +++ b/calendar/gui/print.c @@ -33,11 +33,12 @@ #include <time.h> #include <glib.h> #include <gtk/gtkradiobutton.h> +#include <gtk/gtk.h> #include <libgnome/gnome-i18n.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.h> #include <libgnomeprint/gnome-print-paper.h> #include <libgnomeprint/gnome-print-job.h> #include <libgnomeprintui/gnome-print-job-preview.h> @@ -50,6 +51,7 @@ #include <e-util/e-dialog-widgets.h> #include <e-util/e-print.h> #include <libecal/e-cal-time-util.h> +#include <libecal/e-cal-component.h> #include "calendar-commands.h" #include "calendar-config.h" #include "e-cal-model.h" @@ -61,43 +63,99 @@ #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 { - GnomePrintContext *pc; + GtkPrintContext *pc; /* keep one of these around: */ PangoLayout *pl; }; -static EvoCalendarPrintRenderer * -evo_calendar_print_data_new (GnomePrintContext *pc); +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 PrintTableItem +{ + struct EPrintable *printable; + double left_margin,bottom_margin,paper_width,paper_height; + GtkPrintContext *context; +}; + +static PrintCompItem * +evo_calendar_print_data_new (GtkPrintContext *pc, PrintCompItem *pci); static void evo_calendar_print_data_free (EvoCalendarPrintRenderer *pr); +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, PangoFontDescription *font, const char *text); - -static EvoCalendarPrintRenderer * -evo_calendar_print_data_new (GnomePrintContext *pc) +static PrintCalItem * +evo_calendar_print_cal_data_new (GtkPrintContext *pc, PrintCalItem *pcali) { - EvoCalendarPrintRenderer *pr; - 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); - pr = g_new0 (EvoCalendarPrintRenderer, 1); - - pr->pc = pc; /* ref/unref this? the old code doesn't */ - - pr->pl = gnome_print_pango_create_layout (pc); - - return pr; + return pci; } static void @@ -122,7 +180,6 @@ evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr, 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); return w/(double)PANGO_SCALE; @@ -370,50 +427,66 @@ enum align_box { left_triangle_width, right_triangle_width = width from edge of rectangle to point of triangle, or -ve for no triangle. */ static void -print_border_with_triangles (GnomePrintContext *pc, +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) { - gnome_print_gsave (pc); + cairo_t *cr; + + 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) { - gnome_print_moveto (pc, l, t); + + cairo_move_to (cr, l, t); + if (left_triangle_width > 0.0) - gnome_print_lineto (pc, l - left_triangle_width, - (t + b) / 2); - gnome_print_lineto (pc, l, b); - gnome_print_lineto (pc, r, b); + cairo_line_to (cr, l - left_triangle_width, + (t + b) / 2); + + cairo_line_to (cr, l, b); + cairo_line_to (cr, r, b); + if (right_triangle_width > 0.0) - gnome_print_lineto (pc, r + right_triangle_width, - (t + b) / 2); - gnome_print_lineto (pc, r, t); - gnome_print_closepath (pc); - gnome_print_setrgbcolor (pc, red, green, blue); - gnome_print_fill (pc); + cairo_line_to (cr, r + right_triangle_width, (t + b) / 2); + + cairo_line_to (cr, r, t); + cairo_close_path (cr); + cairo_set_source_rgb (cr, red, green, blue); + cairo_fill (cr); + cairo_restore (cr); + cairo_save (cr); } /* Draw the outline, if desired. */ if (width >= -EPSILON) { - gnome_print_moveto (pc, l, t); + + cr = gtk_print_context_get_cairo_context (pc); + cairo_move_to (cr, l, t); + if (left_triangle_width > 0.0) - gnome_print_lineto (pc, l - left_triangle_width, + cairo_line_to (cr, l - left_triangle_width, (t + b) / 2); - gnome_print_lineto (pc, l, b); - gnome_print_lineto (pc, r, b); + + cairo_line_to (cr, l, b); + cairo_line_to (cr, r, b); + if (right_triangle_width > 0.0) - gnome_print_lineto (pc, r + right_triangle_width, + cairo_line_to (cr, r + right_triangle_width, (t + b) / 2); - gnome_print_lineto (pc, r, t); - gnome_print_closepath (pc); - gnome_print_setrgbcolor (pc, 0, 0, 0); - gnome_print_setlinewidth (pc, width); - gnome_print_stroke (pc); + + cairo_line_to (cr, r, t); + cairo_close_path (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, width); + cairo_stroke (cr); + } - gnome_print_grestore (pc); + cairo_restore (cr); } @@ -421,7 +494,7 @@ print_border_with_triangles (GnomePrintContext *pc, width = width of border, -ve means no border. fillcolor = shade of fill, -ve means no fill. */ static void -print_border_rgb (GnomePrintContext *pc, +print_border_rgb (GtkPrintContext *pc, double l, double r, double t, double b, double width, double red, double green, double blue) { @@ -429,7 +502,7 @@ print_border_rgb (GnomePrintContext *pc, } static void -print_border (GnomePrintContext *pc, +print_border (GtkPrintContext *pc, double l, double r, double t, double b, double width, double fillcolor) { @@ -437,25 +510,26 @@ print_border (GnomePrintContext *pc, } static void -print_rectangle (GnomePrintContext *pc, +print_rectangle (GtkPrintContext *pc, double l, double r, double t, double b, double red, double green, double blue) { - gnome_print_gsave (pc); - - gnome_print_moveto (pc, l, t); - gnome_print_lineto (pc, l, b); - gnome_print_lineto (pc, r, b); - gnome_print_lineto (pc, r, t); - gnome_print_closepath (pc); - gnome_print_setrgbcolor (pc, red, green, blue); - gnome_print_fill (pc); - - gnome_print_grestore (pc); + cairo_t *cr; + + cr = gtk_print_context_get_cairo_context (pc); + 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_set_source_rgb (cr, red, green, blue); + cairo_fill (cr); + + cairo_restore (cr); } - - /* 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. */ @@ -465,7 +539,10 @@ print_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char { double w, x; int pw, ph; - gnome_print_gsave (pr->pc); + cairo_t *cr; + + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_save (cr); pango_layout_set_font_description (pr->pl, font); pango_layout_set_text (pr->pl, text, -1); @@ -491,20 +568,18 @@ print_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char x = MAX (l, x); /* Set a clipping rectangle. */ - gnome_print_moveto (pr->pc, l, t); - gnome_print_lineto (pr->pc, r, t); - gnome_print_lineto (pr->pc, r, b); - gnome_print_lineto (pr->pc, l, b); - gnome_print_closepath (pr->pc); - gnome_print_clip (pr->pc); + cairo_move_to (cr, l, t); + cairo_rectangle (cr, l, t, r, b); + cairo_clip (cr); - gnome_print_newpath (pr->pc); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); + cairo_new_path (cr); + cairo_set_source_rgb (cr, 0, 0, 0); - gnome_print_moveto (pr->pc, x, t); - gnome_print_pango_layout (pr->pc, pr->pl); + cairo_move_to (cr, x, t); + pango_cairo_show_layout (cr, pr->pl); - gnome_print_grestore (pr->pc); + cairo_stroke(cr); + cairo_restore (cr); return w; } @@ -516,8 +591,13 @@ print_text_size(EvoCalendarPrintRenderer *pr, const char *text, { PangoFontDescription *font; double w; - - font = get_font_for_size (pr, t - b, GNOME_FONT_BOOK, FALSE); + + 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); pango_font_description_free (font); @@ -532,7 +612,11 @@ print_text_size_bold(EvoCalendarPrintRenderer *pr, const char *text, PangoFontDescription *font; double w; - font = get_font_for_size (pr, t - b, GNOME_FONT_BOLD, FALSE); + 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); pango_font_description_free (font); @@ -547,20 +631,17 @@ titled_box (EvoCalendarPrintRenderer *pr, const char *text, PangoFontDescription double size; size = get_font_size (font); - if (align & ALIGN_BORDER) { - print_border (pr->pc, *l, *r, *t, *t - size * 1.4, + 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, + 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_text (pr, font, text, align, *l, *r, *t, *t + size * 1.4); + *t += size * 1.4; } enum datefmt { @@ -630,7 +711,6 @@ instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gp return FALSE; } - /* print out the month small, embolden any days with events. */ @@ -651,29 +731,38 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon double font_size, max_font_size; 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 */ char *daynames[] = { N_("Su"), N_("Mo"), N_("Tu"), N_("We"), N_("Th"), N_("Fr"), N_("Sa") }; + cairo_t *cr; /* Print the title, e.g. 'June 2001', in the top 16% of the area. */ format_date (month, titleflags, buf, 100); - header_size = (top - bottom) * 0.16; + + if(top < bottom) + header_size = (bottom - top) * 0.16; + else + header_size = (top - bottom) * 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, + 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); + top, top + header_size); pango_font_description_free (font); - top -= header_size; - + top += header_size; col_width = (right - left) / 7; /* The top row with the day abbreviations gets an extra bit of vertical space around it. */ - row_height = (top - bottom) / 7.4; + if (bottom > top ) + row_height = (bottom - top) / 7.4; + else + row_height = (top - bottom ) / 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. */ @@ -683,8 +772,8 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon twice as high as they are wide, but we need to fit two characters into each cell, so we don't want to go over col_width. */ max_font_size = col_width * 0.65; - /* Why calculate this if we're not using it? */ + /* Why calculate this if we're not using it? */ font_size = row_height; /* get month days */ @@ -700,7 +789,8 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon w = evo_calendar_print_renderer_get_width (pr, font_bold, "23"); text_xpad = (col_width - w) / 2; - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); + cr = gtk_print_context_get_cairo_context (pr->pc); + 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 (); @@ -708,17 +798,17 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon 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); + top, top + row_height * 1.4); weekday = (weekday + 1) % 7; } - top -= row_height * 1.4; + top += 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_bottom = cell_top - row_height; + cell_top = top + y * row_height; + cell_bottom = cell_top + row_height; for (x = 0; x < 7; x++) { @@ -733,7 +823,6 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon day = days[y * 7 + x]; if (day != 0) { gboolean found = FALSE; - sprintf (buf, "%d", day); /* this is a slow messy way to do this ... but easy ... */ @@ -744,12 +833,12 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon font = found ? font_bold : font_normal; next = time_add_day_with_zone (now, 1, zone); - if ((now >= greystart && now < greyend) + if ((now >= greystart && now < greyend) || (greystart >= now && greystart < next)) { print_border (pr->pc, cell_left, cell_right, cell_top, cell_bottom, - -1.0, 0.75); + -1.0, 0.75); } print_text (pr, font, buf, ALIGN_RIGHT, cell_left, text_right, @@ -766,36 +855,34 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon /* 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, +bound_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text, double left, double right, double top, double bottom, double indent) { /* Let Pango do all the work: */ - int w, h; - - gnome_print_gsave (pr->pc); + int w=0, h=0; + cairo_t *cr; + + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_save (cr); /* Set a clipping rectangle. */ - gnome_print_moveto (pr->pc, left, top); - gnome_print_lineto (pr->pc, right, top); - gnome_print_lineto (pr->pc, right, bottom); - gnome_print_lineto (pr->pc, left, bottom); - gnome_print_closepath (pr->pc); - gnome_print_clip (pr->pc); - - gnome_print_newpath (pr->pc); + cairo_move_to (cr, left, top); + cairo_rectangle (cr, left, top, right, bottom); + 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); - gnome_print_moveto (pr->pc, left, top); - gnome_print_pango_layout (pr->pc, pr->pl); - - gnome_print_grestore (pr->pc); - - pango_layout_get_size (pr->pl, &w, &h); - return top - (double)h/(double)PANGO_SCALE; + cairo_move_to (cr, left, top); + pango_cairo_show_layout (cr, pr->pl); + cairo_stroke (cr); + + cairo_restore (cr); + pango_layout_get_size (pr->pl, &w, &h); + return top + ((double)h/(double)PANGO_SCALE); } @@ -814,22 +901,29 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, gboolean use_24_hour; int i, hour, row; double hour_minute_x; - + cairo_t *cr; + /* Fill the time column in light-gray. */ print_border (pr->pc, left, left + width, top, bottom, -1.0, 0.9); /* Draw the border around the entire view. */ - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); - print_border (pr->pc, left, right, top, bottom, 1.0, -1.0); + cr = gtk_print_context_get_cairo_context (pr->pc); - /* Draw the vertical line on the right of the time column. */ - gnome_print_setlinewidth (pr->pc, 0.0); - gnome_print_moveto (pr->pc, left + width, bottom); - gnome_print_lineto (pr->pc, left + width, top); - gnome_print_stroke (pr->pc); + cairo_set_source_rgb (cr, 0, 0, 0); + print_border (pr->pc, 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); + cairo_set_line_width (cr, 0.0); + cairo_move_to (cr, left + width, bottom); + cairo_line_to (cr, left + width, top); + cairo_stroke (cr); + /* Calculate the row height. */ - yinc = (top - bottom) / (pdi->end_hour - pdi->start_hour); + if (top > bottom) + yinc = (top - bottom) / (pdi->end_hour - pdi->start_hour); + else + yinc = (bottom - top) / (pdi->end_hour - pdi->start_hour); /* Get the 2 fonts we need. */ font_size = yinc * 0.6; @@ -847,8 +941,9 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, row = 0; hour_minute_x = left + width * 0.58; for (i = pdi->start_hour; i < pdi->end_hour; i++) { - y = top - yinc * (row + 1); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); + y = top + yinc * (row + 1) ; + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_set_source_rgb (cr, 0, 0, 0); if (use_24_hour) { hour = i; @@ -868,24 +963,26 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, sprintf (buf, "%d", hour); print_text (pr, font_hour, buf, ALIGN_RIGHT, left, hour_minute_x, - y + yinc - 4, y + yinc - 4 - hour_font_size); + y - yinc + yinc / 2, y - yinc + yinc / 2 + hour_font_size); print_text (pr, font_minute, minute, ALIGN_LEFT, hour_minute_x, left + width - 3, - y + yinc - 3, y + yinc - 3 - minute_font_size); - - /* Draw the horizontal line between hours, across the entire + 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. */ - gnome_print_moveto (pr->pc, left, y); - gnome_print_lineto (pr->pc, right, y); - gnome_print_stroke (pr->pc); - + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_move_to (cr, left, y); + cairo_line_to (cr, right, y); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); + /* Draw the horizontal line for the 1/2-hours, across the entire width except for part of the time column. */ - gnome_print_moveto (pr->pc, left + width * 0.6, y + yinc / 2); - gnome_print_lineto (pr->pc, right, y + yinc / 2); - gnome_print_stroke (pr->pc); - - row++; + cairo_move_to (cr, left + width * 0.6, y - yinc / 2); + cairo_line_to (cr, right, y - yinc / 2); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); + row ++; } pango_font_description_free (font_hour); @@ -956,7 +1053,6 @@ print_day_add_event (ECalModelComponent *comp_data, event.end_minute = 24 * 60; } - g_array_append_val (events[day], event); return day; } @@ -1027,8 +1123,8 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, x1 = left + 10; x2 = right - 10; - y1 = top - event->start_row_or_col * row_height - 4; - y2 = y1 - row_height + 4; + y1 = top + event->start_row_or_col * row_height + 4; + 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, @@ -1114,11 +1210,10 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, x1 = left + event->start_row_or_col * col_width; x2 = x1 + event->num_columns * col_width - DAY_VIEW_EVENT_X_PAD; - row_height = (top - bottom) / pdi->rows; - y1 = top - start_row * row_height; - y2 = top - (end_row + 1) * row_height; - -#if 0 + row_height = (bottom - top) / pdi->rows; + y1 = top + start_row * row_height; + y2 = top + (end_row + 1) * row_height; +#if 0 g_print ("Event: %g,%g %g,%g\n row_height: %g start_row: %i top: %g rows: %i\n", x1, y1, x2, y2, row_height, start_row, top, pdi->rows); #endif @@ -1129,7 +1224,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, summary = icalcomponent_get_summary (event->comp_data->icalcomp); text = summary ? (char*) summary : ""; - + if (display_times) { date_tm.tm_year = 2001; @@ -1173,6 +1268,8 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe struct pdinfo pdi; gint rows_in_top_display, i; double font_size, max_font_size; + cairo_t *cr; + ECalModel *model = gnome_calendar_get_calendar_model (gcal); start = time_day_begin_with_zone (whence, zone); @@ -1226,15 +1323,14 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe e_day_view_layout_long_events (pdi.long_events, pdi.days_shown, pdi.day_starts, &rows_in_top_display); - /* Print the long events. */ + /*Print the long events. */ font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE); 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, DAY_VIEW_ROW_HEIGHT, event, &pdi, model); } - pango_font_description_free (font); - + /* We always leave space for DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY in the top display, but we may have more rows than that, in which case the main display area will be compressed. */ @@ -1242,38 +1338,44 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY); /* Draw the border around the long events. */ - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); - print_border (pr->pc, left, right, - top, top - rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4, - 1.0, -1.0); + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_set_source_rgb (cr, 0, 0, 0); + print_border (pr->pc, left, right, + top, top + rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4, + 1.0, -1.0); + /* Adjust the area containing the main display. */ - top -= rows_in_top_display * DAY_VIEW_ROW_HEIGHT + 4; - + 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, left, right, top, bottom); - /* Now adjust to get rid of the time column. */ left += DAY_VIEW_TIME_COLUMN_WIDTH; - - /* Lay out the short events, within the day. */ + + + /* lay out the short events, within the day. */ e_day_view_layout_day_events (pdi.events[0], DAY_VIEW_ROWS, DAY_VIEW_MINS_PER_ROW, pdi.cols_per_row); - /* Print the short events. */ - max_font_size = ((top - bottom) / pdi.rows) - 4; - font_size = MIN (DAY_NORMAL_FONT_SIZE, max_font_size); + /* print the short events. */ + if (top > bottom ) + max_font_size = ((top - bottom) / pdi.rows) - 4; + 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); + 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, event, &pdi, model); } - pango_font_description_free (font); - + /* Free everything. */ free_event_array (pdi.long_events); + pango_font_description_free (font); g_array_free (pdi.long_events, TRUE); free_event_array (pdi.events[0]); g_array_free (pdi.events[0], TRUE); @@ -1319,7 +1421,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, 0.5, red, green, blue, + print_border_with_triangles (pr->pc, x1, x2, y1, y2 + 4, 0.5, red, green, blue, left_triangle_width, right_triangle_width); @@ -1385,20 +1487,19 @@ 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, y1, y2, red, green, blue); - x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2) + 4; - print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2); - + 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); + 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, y1, y2, red, green, blue); - x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2) + 4; - print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2); + 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); } @@ -1457,11 +1558,12 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, } x1 = left + start_x * cell_width + 6; - x2 = left + (end_x + 1) * cell_width - 6; - y1 = top - start_y * cell_height - - psi->header_row_height - - span->row * psi->row_height; - y2 = y1 - psi->row_height * 0.9; + x2 = left + (end_x + 1) * cell_width - 16; + y1 = top + start_y * cell_height + + psi->header_row_height + + span->row * psi->row_height; + y2 = y1 + psi->row_height * 0.5; + red = .9; green = .9; @@ -1471,12 +1573,12 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, psi->day_starts)) { print_week_day_event (pr, font, psi, x1, x2, y1, y2, - event, span, text, red, green, blue); + event, span, text, red, green, blue); } else { print_week_long_event (pr, font, psi, x1, x2, y1, y2, event, span, text, red, green, blue); - } + } } } } @@ -1489,10 +1591,11 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription * double cell_width, double cell_height) { icaltimezone *zone = calendar_config_get_icaltimezone (); + struct tm tm; int day, day_x, day_y, day_h; double x1, x2, y1, y2, font_size, fillcolor; - struct tm tm; char *format_string, buffer[128]; + cairo_t *cr; font_size = get_font_size (font); @@ -1504,8 +1607,8 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription * x1 = left + day_x * cell_width; x2 = left + (day_x + 1) * cell_width; - y1 = top - day_y * cell_height; - y2 = y1 - day_h * cell_height; + y1 = top + day_y * cell_height; + y2 = y1 + day_h * cell_height; tm = *convert_timet_to_struct_tm (psi->day_starts[day], zone); @@ -1523,13 +1626,16 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription * else format_string = "%d"; } else { - gnome_print_moveto (pr->pc, x1 + 0.1 * cell_width, - y1 - psi->header_row_height + 3); - gnome_print_lineto (pr->pc, x2, - y1 - psi->header_row_height + 3); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); - gnome_print_setlinewidth (pr->pc, 0.5); - gnome_print_stroke (pr->pc); + cr = gtk_print_context_get_cairo_context (pr->pc); + + cairo_move_to (cr, x1 + 0.1 * cell_width, + y1 + psi->header_row_height - 4); + cairo_line_to (cr, x2, + y1 + psi->header_row_height - 4); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); /* strftime format %A = full weekday name, %d = day of month, %B = full month name. You can change the @@ -1540,8 +1646,9 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription * } e_utf8_strftime (buffer, sizeof (buffer), format_string, &tm); - print_text_size (pr, buffer, ALIGN_RIGHT, - x1, x2 - 4, y1 - 2, y1 - 2 - font_size); + + print_text_size (pr, buffer, ALIGN_RIGHT, + x1, x2 - 4, y1 + 2, y1 + 2 + font_size); } } @@ -1652,11 +1759,12 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, /* Calculate the size of the cells. */ if (multi_week_view) { cell_width = (right - left) / (psi.compress_weekend ? 6 : 7); - cell_height = (top - bottom) / (weeks_shown * 2); + cell_height = (bottom - top) / (weeks_shown * 2); } else { cell_width = (right - left) / 2; - cell_height = (top - bottom) / 6; + cell_height = (bottom - top) / 6; } + /* Calculate the row height, using the normal font and with room for space or a rectangle around it. */ @@ -1670,11 +1778,9 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, / psi.row_height; font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE); - /* Draw the grid and the day names/numbers. */ print_week_view_background (pr, 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); @@ -1781,7 +1887,7 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w columns = compress_weekend ? 6 : 7; cell_width = (right - left) / columns; y1 = top; - y2 = top - font_size * 1.5; + y2 = top + font_size * 1.5; for (col = 0; col < columns; col++) { if (tm.tm_wday == 6 && compress_weekend) { @@ -1825,6 +1931,7 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, ETable *table; ECalModel *model; gint rows, row; + cairo_t *cr; /* We get the tasks directly from the TaskPad ETable. This means we get them filtered & sorted for free. */ @@ -1832,15 +1939,18 @@ 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, 10, GNOME_FONT_BOOK, FALSE); + font_summary = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); - gnome_print_setlinewidth (pr->pc, 0.0); + cr = gtk_print_context_get_cairo_context (pr->pc); + + 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); - y = top - 3; + y = top; yend = bottom - 2; rows = e_table_model_row_count (E_TABLE_MODEL (model)); @@ -1866,34 +1976,36 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, x = left; xend = right - 2; - - if (y < bottom) + if (y > bottom) break; /* Print the box to put the tick in. */ - print_border (pr->pc, x + 2, x + 8, y - 3, y - 11, 0.1, -1.0); + print_border (pr->pc, 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); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); - gnome_print_setlinewidth (pr->pc, 1.0); - gnome_print_moveto (pr->pc, x + 3, y - 8); - gnome_print_lineto (pr->pc, x + 5, y - 10); - gnome_print_lineto (pr->pc, x + 7, y - 3.5); - gnome_print_stroke (pr->pc); + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, x + 3, y + 11); + cairo_line_to (cr, x + 5, y + 14); + cairo_line_to (cr, x + 7, y + 5.5); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); } y = bound_text (pr, font_summary, summary.value, - x + 10, xend, y, yend, 0); + x + 14, xend, y+4, yend, 0); + - y += get_font_size (font_summary) - 12; - gnome_print_moveto (pr->pc, x, y); - gnome_print_lineto (pr->pc, xend, y); - gnome_print_stroke (pr->pc); - y -= 3; + y += get_font_size (font_summary)-5; + cr = gtk_print_context_get_cairo_context (pr->pc); + cairo_move_to (cr, x, y); + cairo_line_to (cr, xend, y); + cairo_set_line_width (cr, 1); + cairo_stroke (cr); g_object_unref (comp); } @@ -2007,53 +2119,60 @@ print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date, int i, days = 1; double todo, header, l; char buf[100]; + cairo_t *cr; for (i = 0; i < days; i++) { todo = (right - left) * 0.75 + left; - header = top - HEADER_HEIGHT; + /* header = top - HEADER_HEIGHT;*/ + header = HEADER_HEIGHT + top; - gnome_print_beginpage (pr->pc, NULL); + cr = gtk_print_context_get_cairo_context (pr->pc); /* Print the main view with all the events in. */ print_day_details (pr, gcal, date, left, todo - 2.0, header, bottom); - - /* Print the TaskPad down the right. */ + + /* Print the TaskPad down the right. */ print_todo_details (pr, gcal, 0, INT_MAX, todo, right, header, bottom); - + /* Print the filled border around the header. */ print_border (pr->pc, left, right, top, header + 2.0, 1.0, 0.9); - + /* Print the 2 mini calendar-months. */ - l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - - SMALL_MONTH_SPACING; - print_month_small (pr, gcal, date, + l = right - 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, + top + 4, header + 4, DATE_MONTH | DATE_YEAR, date, date, FALSE); + l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH; print_month_small (pr, gcal, time_add_month_with_zone (date, 1, zone), l, l + SMALL_MONTH_WIDTH, - top - 4, header + 4, + top + 4, header + 4, DATE_MONTH | DATE_YEAR, 0, 0, FALSE); - + + /* Print the date, e.g. '8th May, 2001'. */ 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); + left + 4, todo, top + 4, top + 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); + left + 4, todo, top + 32, top + 32 + 18); - gnome_print_showpage (pr->pc); + cr = gtk_print_context_get_cairo_context (pr->pc); + date = time_add_day_with_zone (date, 1, zone); - } + } } @@ -2068,13 +2187,11 @@ print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date, gint week_start_day; struct tm tm; - header = top - HEADER_HEIGHT; - - gnome_print_beginpage (pr->pc, NULL); - + 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); + /* If the week starts on a Sunday, we have to show the Saturday first, since the weekend is compressed. */ if (week_start_day == 0) { @@ -2087,20 +2204,21 @@ print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date, /* Print the main week view. */ print_week_summary (pr, gcal, when, FALSE, 1, 0, WEEK_NORMAL_FONT_SIZE, - left, right, header, bottom); - + left, right, header + 20, bottom); + + /* Print the border around the main view. */ - print_border (pr->pc, left, right, header, bottom, 1.0, -1.0); + print_border (pr->pc, left, right, header , bottom, 1.0, -1.0); /* Print the border around the header area. */ - print_border (pr->pc, left, right, top, header + 2.0, 1.0, 0.9); + print_border (pr->pc, left, right, top, header + 2.0 + 20, 1.0, 0.9); /* Print the 2 mini calendar-months. */ l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - SMALL_MONTH_SPACING; print_month_small (pr, gcal, when, l, l + SMALL_MONTH_WIDTH, - top - 4, header + 4, + top + 4, header + 30, DATE_MONTH | DATE_YEAR, when, time_add_week_with_zone (when, 1, zone), FALSE); @@ -2108,22 +2226,20 @@ print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date, print_month_small (pr, gcal, time_add_month_with_zone (when, 1, zone), l, l + SMALL_MONTH_WIDTH, - top - 4, header + 4, + top + 4, header + 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); - + left + 3, right, top + 4, top + 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); - - gnome_print_showpage (pr->pc); + left + 3, right, top + 24 + 3, top + 24 + 3 + 24); } @@ -2135,9 +2251,7 @@ print_month_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date double header; char buf[100]; - header = top - HEADER_HEIGHT; - - gnome_print_beginpage (pr->pc, NULL); + header = top + HEADER_HEIGHT; /* Print the main month view. */ print_month_summary (pr, gcal, date, left, right, header, bottom); @@ -2149,20 +2263,19 @@ print_month_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date print_month_small (pr, gcal, time_add_month_with_zone (date, 1, zone), right - (right - left) / 7 + 2, right - 8, - top - 4, header, + top + 4, header, DATE_MONTH | DATE_YEAR, 0, 0, FALSE); print_month_small (pr, gcal, time_add_month_with_zone (date, -1, zone), left + 8, left + (right - left) / 7 - 2, - top - 4, header, + top + 4, header, 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); + left + 3, right - 3, top + 3, top + 3 + 24); - gnome_print_showpage (pr->pc); } @@ -2171,18 +2284,20 @@ print_year_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date, double left, double right, double top, double bottom) { char buf[100]; + cairo_t *cr; - gnome_print_beginpage (pr->pc, NULL); + cr = gtk_print_context_get_cairo_context (pr->pc); - print_year_summary (pr, gcal, date, left, right, top - 50, bottom, + cairo_show_page (cr); + print_year_summary (pr, gcal, date, left, right, top + 50, bottom, 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); - - gnome_print_showpage (pr->pc); + left+3, right, top+3, top + 27); + cr=gtk_print_context_get_cairo_context (pr->pc); + cairo_show_page (cr); } static void @@ -2298,17 +2413,36 @@ print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *clien } static void -print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client, - double left, double right, double top, double bottom) +print_comp_item (PrintCompItem *pci) + { PangoFontDescription *font; + EvoCalendarPrintRenderer *pr; + ECal *client; + ECalComponent *comp; ECalComponentVType vtype; ECalComponentText text; GSList *desc, *l; + GSList *contact_list, *elem; + const char *title, *categories, *location; char *categories_string, *location_string, *summary_string; - GSList *contact_list, *elem; - gint header_size; + double header_size; + cairo_t *cr; + double left, right, top, bottom; + + /* 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); @@ -2322,25 +2456,26 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client else return; - gnome_print_beginpage (pr->pc, NULL); - + cr = gtk_print_context_get_cairo_context (pr->pc); + /* Print the title in a box at the top of the page. */ font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE); - header_size = 50; - print_border (pr->pc, left, right, top, top - header_size, + header_size = 40; + print_border (pr->pc, left, right, top, top+header_size, 1.0, 0.9); print_text (pr, font, title, ALIGN_CENTER, left, right, - top - header_size * 0.1, top - header_size); + top + 0.1, top +header_size - 0.1); pango_font_description_free (font); - top -= header_size + 10; - + top += header_size + 30; + /* Summary */ font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE); 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 - 3, bottom, 0); + top, bottom, 0); + g_free (summary_string); /* Location */ @@ -2349,17 +2484,16 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client location_string = g_strdup_printf (_("Location: %s"), location); top = bound_text (pr, font, location_string, left, right, - top - 3, bottom, 0); + top + 3, bottom, 0); g_free (location_string); } pango_font_description_free (font); - + /* Date information */ - print_date_label (pr, comp, client, left, right, top-3, top - 15); - top -= 20; - + print_date_label (pr, comp, client, left, right, top + 3, top + 15); + top += 20; font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE); - + /* For a VTODO we print the Status, Priority, % Complete and URL. */ if (vtype == E_CAL_COMPONENT_TODO) { icalproperty_status status; @@ -2367,7 +2501,7 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client int *percent; int *priority; const char *url; - + /* Status */ e_cal_component_get_status (comp, &status); if (status != ICAL_STATUS_NONE) { @@ -2436,11 +2570,10 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client top = bound_text (pr, font, url_string, left, right, top, bottom, 0); top += get_font_size (font) - 6; - g_free (url_string); } } - + /* Categories */ e_cal_component_get_categories (comp, &categories); if (categories && categories[0]) { @@ -2448,10 +2581,10 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client categories); top = bound_text (pr, font, categories_string, left, right, top, bottom, 0); - top += get_font_size (font) - 6; + top += get_font_size (font) - 6 ; g_free (categories_string); } - + /* Contacts */ e_cal_component_get_contact_list (comp, &contact_list); if (contact_list) { @@ -2468,362 +2601,326 @@ print_comp_item (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client top = bound_text (pr, font, contacts->str, left, right, top, bottom, 0); top += get_font_size (font) - 6; - g_string_free (contacts, TRUE); } - - top -= 16; + top += 16; /* Description */ e_cal_component_get_description_list (comp, &desc); for (l = desc; l != NULL; l = l->next) { ECalComponentText *text = l->data; + if (top > bottom) { + 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; - if (text->value != NULL) - top = bound_text (pr, font, text->value, left, right, top-3, bottom, 0); } + e_cal_component_free_text_list (desc); pango_font_description_free (font); - gnome_print_showpage (pr->pc); } void print_calendar (GnomeCalendar *gcal, gboolean preview, time_t date, PrintView default_view) { - GnomePrintConfig *print_config; - GnomePrintJob *gpm; - EvoCalendarPrintRenderer *pr; - double l, r, t, b; - guchar *old_orientation; - + 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; + g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - - print_config = e_print_load_config (); - - /* Don't save the orientation if we guessed it to be nice to the user */ - old_orientation = gnome_print_config_get (print_config, (const guchar *) GNOME_PRINT_KEY_PAGE_ORIENTATION); - if (default_view == PRINT_VIEW_MONTH) { - if (old_orientation && !strcmp ((char *) old_orientation, "R90")) { - g_free (old_orientation); - old_orientation = NULL; - } - - gnome_print_config_set (print_config, (const guchar *) GNOME_PRINT_KEY_PAGE_ORIENTATION, (const guchar *) "R90"); - } - - if (!preview) { - GtkWidget *gpd; - GtkWidget *range; - int view; - - gpd = e_print_get_dialog_with_config (_("Print"), GNOME_PRINT_DIALOG_COPIES | GNOME_PRINT_DIALOG_RANGE, print_config); - - view = (int) default_view; - range = range_selector_new (gpd, date, &view); - gnome_print_dialog_construct_range_custom (GNOME_PRINT_DIALOG (gpd), range); - - gtk_dialog_set_default_response (GTK_DIALOG (gpd), - GNOME_PRINT_DIALOG_RESPONSE_PRINT); - - /* Run dialog */ - - switch (gtk_dialog_run (GTK_DIALOG (gpd))) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - break; - - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - preview = TRUE; - break; - - case -1: - return; - - default: - gtk_widget_destroy (gpd); - return; - } - - e_dialog_get_values (gpd); - default_view = (PrintView) view; - - gtk_widget_destroy (gpd); - } - - gpm = gnome_print_job_new (print_config); - - pr = evo_calendar_print_data_new (gnome_print_job_get_context (gpm)); - - gnome_print_config_get_page_size (print_config, &r, &t); - - /* See top of source for an explanation of this */ - - /* gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d); - * t -= temp_d; - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d); - * r -= temp_d; - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b); - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l); - * b = l = TEMP_MARGIN; */ - b = t * TEMP_MARGIN; - l = r * TEMP_MARGIN; - t *= (1.0 - TEMP_MARGIN); - r *= (1.0 - TEMP_MARGIN); - - /* depending on the view, do a different output */ - switch (default_view) { - case PRINT_VIEW_DAY: - print_day_view (pr, gcal, date, l, r, t, b); - break; - case PRINT_VIEW_WEEK: - print_week_view (pr, gcal, date, l, r, t, b); - break; - case PRINT_VIEW_MONTH: - print_month_view (pr, gcal, date, l, r, t, b); - break; - case PRINT_VIEW_YEAR: - print_year_view (pr, gcal, date, l, r, t, b); - break; - default: - g_assert_not_reached (); - } - - evo_calendar_print_data_free (pr); - - gnome_print_job_close (gpm); - - if (preview) { - GtkWidget *gpmp; + view = (int) default_view; + range = range_selector_new (gpd, date, &view); + + pcali = g_new0 (PrintCalItem, 1); + pcali->gcal = g_new0 (GnomeCalendar, 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_config (); + gpd = e_print_get_dialog_with_config (_("ebby"),GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES, settings ); + gtk_print_unix_dialog_add_custom_tab (GTK_PRINT_UNIX_DIALOG (gpd), range,gtk_label_new (_("range"))); + + 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; + + settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (gpd)); + 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); */ - gpmp = gnome_print_job_preview_new (gpm, (const guchar *) _("Print Preview")); - gtk_widget_show (gpmp); - } else { - gnome_print_job_print (gpm); + /* Runs the print dialog, recursively, emitting signals */ + g_signal_connect (print, "draw_page", G_CALLBACK (cal_draw_page), pcali); + 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_config (settings); + + if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { + g_object_unref (settings); + g_object_unref (page_setup); + g_object_unref (paper_size); + g_object_unref (print); + g_object_unref (paper_size); + g_object_unref (page_setup); } - - /* Don't save the orientation if we guessed it to be nice to the user */ - if (old_orientation) { - gnome_print_config_set (print_config, (const guchar *) GNOME_PRINT_KEY_PAGE_ORIENTATION, old_orientation); - - e_print_save_config (print_config); - g_free (old_orientation); + else if (res == GTK_PRINT_OPERATION_RESULT_ERROR) { + /* FIX ME */ + } - g_object_unref (print_config); - g_object_unref (gpm); } - void print_comp (ECalComponent *comp, ECal *client, gboolean preview) { - GnomePrintConfig *print_config; - GnomePrintJob *gpm; - EvoCalendarPrintRenderer *pr; - double l, r, t, b; - - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_CAL_COMPONENT (comp)); - - print_config = e_print_load_config (); - - if (!preview) { - GtkWidget *gpd; - - gpd = e_print_get_dialog_with_config (_("Print Item"), GNOME_PRINT_DIALOG_COPIES, print_config); - - gtk_dialog_set_default_response (GTK_DIALOG (gpd), - GNOME_PRINT_DIALOG_RESPONSE_PRINT); - - /* Run dialog */ - - switch (gtk_dialog_run (GTK_DIALOG (gpd))) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - break; - - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - preview = TRUE; - break; - - case -1: - return; - - default: - gtk_widget_destroy (gpd); - return; - } - - e_dialog_get_values (gpd); - gtk_widget_destroy (gpd); - } - - gpm = gnome_print_job_new (print_config); - - pr = evo_calendar_print_data_new (gnome_print_job_get_context (gpm)); - gnome_print_config_get_page_size (print_config, &r, &t); - - /* See top of source for an explanation of this */ - - /* gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d); - * t -= temp_d; - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d); - * r -= temp_d; - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b); - * gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l); - * b = l = TEMP_MARGIN; */ - - b = t * TEMP_MARGIN; - l = r * TEMP_MARGIN; - t *= (1.0 - TEMP_MARGIN); - r *= (1.0 - TEMP_MARGIN); - - print_comp_item (pr, comp, client, l, r, t, b); - gnome_print_job_close (gpm); - - evo_calendar_print_data_free (pr); - - if (preview) { - GtkWidget *gpmp; - - gpmp = gnome_print_job_preview_new (gpm, (const guchar *) _("Print Preview")); - gtk_widget_show (gpmp); - } else { - gnome_print_job_print (gpm); - } + 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_config (); + gpd = e_print_get_dialog_with_config (_("Print Item"), GNOME_PRINT_DIALOG_COPIES, 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_object_unref (print_config); - g_object_unref (gpm); + 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_config (settings); + + if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { + g_object_unref (settings); + g_object_unref (print); + g_object_unref (page_setup); + g_object_unref (paper_size); + } + else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) { + /* FIX ME */ + } } static void -print_title (EvoCalendarPrintRenderer *pr, const char *title, - double page_width, double page_height) +print_title (GtkPrintContext *context, const char *title, + double page_width, double page_height, double left_margin, double bottom_margin) { PangoFontDescription *font; + PangoLayout *pl; double w, x, y; + cairo_t *cr; - font = pango_font_description_from_string("Sans Bold 18"); - pango_layout_set_font_description (pr->pl, font); - pango_layout_set_text (pr->pl, title, -1); - w = pango_layout_get_width (pr->pl)/(double)PANGO_SCALE; - y = page_height; + 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; - gnome_print_moveto (pr->pc, x, y); - gnome_print_setrgbcolor (pr->pc, 0, 0, 0); + cairo_move_to (cr, x, y ); + pango_cairo_show_layout (cr, pl); - gnome_print_pango_layout (pr->pc, pr->pl); + cairo_restore (cr); + pango_font_description_free (font); - pango_font_description_free (font); } void print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview) { EPrintable *printable; - GnomePrintConfig *print_config; - EvoCalendarPrintRenderer *pr; - GnomePrintJob *gpm; - double l, r, t, b, page_width, page_height, left_margin, bottom_margin; - - print_config = e_print_load_config (); - + 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; + + settings = e_print_load_config (); + gpd = e_print_get_dialog_with_config (dialog_title, GNOME_PRINT_DIALOG_COPIES, settings); + settings = gtk_print_settings_new (); printable = e_table_get_printable (etable); + g_object_ref (printable); gtk_object_sink (GTK_OBJECT (printable)); e_printable_reset (printable); + pti->printable = printable; - if (!preview) { - GtkWidget *gpd; - - gpd = e_print_get_dialog_with_config (dialog_title, GNOME_PRINT_DIALOG_COPIES, print_config); - - gtk_dialog_set_default_response (GTK_DIALOG (gpd), - GNOME_PRINT_DIALOG_RESPONSE_PRINT); - - /* Run dialog */ + gtk_print_operation_set_default_page_setup (print, page_setup); + gtk_print_operation_set_n_pages (print, 1); - switch (gtk_dialog_run (GTK_DIALOG (gpd))) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - break; + /* FIX ME ,Allow it to use the default settings for the first time */ + /* gtk_print_operation_set_print_settings (print, settings); */ - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - preview = TRUE; - break; + /* 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); + - case -1: - return; + /* Saves the user configuration in gconf */ + settings = gtk_print_operation_get_print_settings (print); + e_print_save_config (settings); + + if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { + g_object_unref (settings); + g_object_unref (print); + g_object_unref (page_setup); + g_object_unref (paper_size); + } + else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) { + /* FIX ME */ + } +} - default: - gtk_widget_destroy (gpd); - return; - } - e_dialog_get_values (gpd); +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); +} - gtk_widget_destroy (gpd); +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 (); } + - gpm = gnome_print_job_new (print_config); - - pr = evo_calendar_print_data_new (gnome_print_job_get_context (gpm)); - - gnome_print_config_get_page_size (print_config, &r, &t); - - /* See top of source for an explanation of this */ - -#if 0 - gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &temp_d); - t -= temp_d; - gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &temp_d); - r -= temp_d; - gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &b); - gnome_print_config_get_double (print_config, GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &l); -#endif - - b = t * TEMP_MARGIN; - l = r * TEMP_MARGIN; - t *= (1.0 - TEMP_MARGIN); - r *= (1.0 - TEMP_MARGIN); - - page_width = r - l; - page_height = t - b; - left_margin = l; - bottom_margin = b; +} +void table_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintTableItem *pti) +{ + pti->context = context; + do { - gnome_print_beginpage (pr->pc, (const guchar *) "Tasks"); - gnome_print_gsave (pr->pc); - - gnome_print_translate (pr->pc, left_margin, bottom_margin); - - print_title (pr, print_header, page_width, page_height); + 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); - if (e_printable_data_left (printable)) - e_printable_print_page (printable, pr->pc, - page_width, page_height - 24, TRUE); + } while (e_printable_data_left (pti->printable)); +} - gnome_print_grestore (pr->pc); - gnome_print_showpage (pr->pc); - } while (e_printable_data_left (printable)); - evo_calendar_print_data_free (pr); - gnome_print_job_close (gpm); - if (preview) { - GtkWidget *gpmp; - gpmp = gnome_print_job_preview_new (gpm, (const guchar *) _("Print Preview")); - gtk_widget_show (gpmp); - } else { - gnome_print_job_print (gpm); - } - g_object_unref (print_config); - g_object_unref (gpm); - g_object_unref (printable); -} diff --git a/configure.in b/configure.in index 9fe545dd2b..4c82c05171 100644 --- a/configure.in +++ b/configure.in @@ -1240,7 +1240,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 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 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) AC_SUBST(E_UTIL_CFLAGS) AC_SUBST(E_UTIL_LIBS) @@ -1290,7 +1290,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 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 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" EVO_SET_COMPILE_FLAGS(EVOLUTION_ADDRESSBOOK, $EVOLUTION_ADDRESSBOOK_DEPS) AC_SUBST(EVOLUTION_ADDRESSBOOK_CFLAGS) @@ -1328,7 +1328,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 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 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) AC_SUBST(EVOLUTION_CALENDAR_CFLAGS) AC_SUBST(EVOLUTION_CALENDAR_LIBS) @@ -1340,7 +1340,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 $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 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) AC_SUBST(EVOLUTION_MAIL_CFLAGS) AC_SUBST(EVOLUTION_MAIL_LIBS) diff --git a/e-util/ChangeLog b/e-util/ChangeLog index 57bf7fd461..0485d7d500 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,3 +1,12 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + ** GtkPrint API migration from Ebby Wiselyn. + + * e-print.c: (e_print_load_config), (e_print_save_config), + (print_dialog_response), (e_print_get_dialog), + (e_print_get_dialog_with_config): + * e-print.h: + 2006-11-28 Daniel Gryniewicz <dang@gentoo.org> ** Fix for bug #349966 diff --git a/e-util/e-print.c b/e-util/e-print.c index 63d7bf3e1e..33eecca14b 100644 --- a/e-util/e-print.c +++ b/e-util/e-print.c @@ -23,75 +23,174 @@ #include <string.h> #include <gconf/gconf-client.h> #include "e-print.h" - -#define PRINT_CONFIG_KEY "/apps/evolution/shell/print_config" - -GnomePrintConfig * +#include <gtk/gtk.h> +#include <gtk/gtkprintunixdialog.h> +#define PRINTER "/apps/evolution/shell/printer" +#define SCALE "/apps/evolution/shell/scale" +#define PRINT_PAGES "/apps/evolution/shell/print_pages" +#define PAGE_RANGES "/apps/evolution/shell/page_ranges" +#define PAGE_SET "/apps/evolution/shell/page_set" +#define COLLATE "/apps/evolution/shell/collate" +#define REVERSE "/apps/evolution/shell/reverse" +#define N_COPIES "/apps/evolution/shell/n_copies" +#define LPR_COMMANDLINE "/apps/evolution/shell/lpr_commandline" +#define OUTPUT_URI "/apps/evolution/shell/output_uri" +#define OUTPUT_FILE_FORMAT "/apps/evolution/shell/output_file_format" + +/* Loads the print settings that were saved previously */ + +GtkPrintSettings * e_print_load_config (void) { GConfClient *gconf; - GnomePrintConfig *config; - char *str; + GtkPrintSettings *settings; + gchar *printer_name; + gchar *collate; + gchar *n_copies; + gchar *print_pages; + gchar *page_set; + gchar *scale; + gchar *output_uri; + gchar *output_file_format; + gchar *reverse; + gchar *page_ranges; + gchar *lpr_commandline; + + settings = gtk_print_settings_new (); gconf = gconf_client_get_default (); - str = gconf_client_get_string (gconf, PRINT_CONFIG_KEY, NULL); - g_object_unref (gconf); + + printer_name = gconf_client_get_string (gconf, PRINTER, NULL); + gtk_print_settings_set (settings, "printer", printer_name); - if (!str) - return gnome_print_config_default (); + n_copies = gconf_client_get_string (gconf, N_COPIES, NULL); + gtk_print_settings_set (settings, "n-copies",n_copies); + + collate = gconf_client_get_string (gconf, COLLATE, NULL); + gtk_print_settings_set (settings, "collate", collate); - config = gnome_print_config_from_string (str, 0); + lpr_commandline = gconf_client_get_string (gconf, LPR_COMMANDLINE, NULL); + gtk_print_settings_set (settings, "lpr-commandline", lpr_commandline); - /* Its unlikely people will want to preserve this too often */ - gnome_print_config_set_int (config, GNOME_PRINT_KEY_NUM_COPIES, 1); - gnome_print_config_set_boolean (config, GNOME_PRINT_KEY_COLLATE, FALSE); + print_pages = gconf_client_get_string (gconf, PRINT_PAGES, NULL); + gtk_print_settings_set (settings, "print-pages", print_pages); + + page_set = gconf_client_get_string (gconf, PAGE_SET, NULL); + gtk_print_settings_set (settings, "page-set", page_set); - return config; + output_uri = gconf_client_get_string (gconf, OUTPUT_URI, NULL); + gtk_print_settings_set (settings, "output-uri", output_uri); + + output_file_format = gconf_client_get_string (gconf, OUTPUT_FILE_FORMAT, NULL); + gtk_print_settings_set (settings, "output-file-format",output_file_format); + + reverse = gconf_client_get_string (gconf, REVERSE, NULL); + gtk_print_settings_set (settings, "reverse", reverse); + + scale = gconf_client_get_string (gconf, SCALE, NULL); + gtk_print_settings_set (settings, "scale", scale); + + page_ranges = gconf_client_get_string (gconf, PAGE_RANGES, NULL); + gtk_print_settings_set (settings, "page-ranges", page_ranges); + + g_free (printer_name); + g_free (collate); + g_free (n_copies); + g_free (print_pages); + g_free (page_set); + g_free (scale); + g_free (output_uri); + g_free (output_file_format); + g_free (reverse); + g_free (page_ranges); + g_free (lpr_commandline); + g_object_unref (gconf); + return settings; } - +/* Saves the print settings */ + void -e_print_save_config (GnomePrintConfig *config) +e_print_save_config (GtkPrintSettings *settings) { GConfClient *gconf; - char *str; - - str = gnome_print_config_to_string (config, 0); + const gchar *printer_name; + const gchar *collate; + const gchar *n_copies; + const gchar *print_pages; + const gchar *page_set; + const gchar *scale; + const gchar *output_uri; + const gchar *output_file_format; + const gchar *reverse; + const gchar *page_ranges; + const gchar *lpr_commandline; gconf = gconf_client_get_default (); - gconf_client_set_string (gconf, PRINT_CONFIG_KEY, str, NULL); + printer_name = gtk_print_settings_get (settings, "printer"); + gconf_client_set_string (gconf, PRINTER, printer_name, NULL); + + scale = gtk_print_settings_get (settings, "scale"); + gconf_client_set_string (gconf, SCALE, scale, NULL); + + page_set = gtk_print_settings_get (settings, "page-set"); + gconf_client_set_string (gconf, PAGE_SET, page_set, NULL); + + print_pages = gtk_print_settings_get (settings, "print-pages"); + gconf_client_set_string (gconf, PRINT_PAGES, print_pages, NULL); + + lpr_commandline = gtk_print_settings_get (settings, "lpr-commandline"); + gconf_client_set_string (gconf, LPR_COMMANDLINE, lpr_commandline, NULL); + + collate = gtk_print_settings_get (settings, "collate"); + gconf_client_set_string (gconf, COLLATE, collate, NULL); + + output_uri = gtk_print_settings_get (settings, "output-uri"); + gconf_client_set_string (gconf, OUTPUT_URI, output_uri, NULL); + + output_file_format = gtk_print_settings_get (settings, "output-file-format"); + gconf_client_set_string (gconf, OUTPUT_FILE_FORMAT, output_file_format, NULL); + + reverse = gtk_print_settings_get (settings, "reverse"); + gconf_client_set_string (gconf, REVERSE, reverse, NULL); + + n_copies = gtk_print_settings_get (settings, "n_copies"); + gconf_client_set_string (gconf, N_COPIES, n_copies, NULL); + + page_ranges = gtk_print_settings_get (settings, "page-ranges"); + gconf_client_set_string (gconf, PAGE_RANGES, "page-ranges",NULL); + g_object_unref (gconf); } static void print_dialog_response(GtkWidget *widget, int resp, gpointer data) { - if (resp == GNOME_PRINT_DIALOG_RESPONSE_PRINT) - e_print_save_config (gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (widget))); + if (resp == GTK_RESPONSE_OK) { + e_print_save_config (gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG (widget))); + } } +/* Creates a dialog with the print settings */ GtkWidget * e_print_get_dialog (const char *title, int flags) { - GnomePrintConfig *config; + GtkPrintSettings *settings; GtkWidget *dialog; - config = e_print_load_config (); - dialog = e_print_get_dialog_with_config (title, flags, config); - g_object_unref (config); - + settings = e_print_load_config (); + dialog = e_print_get_dialog_with_config (title, flags, settings); + g_object_unref (settings); return dialog; } GtkWidget * -e_print_get_dialog_with_config (const char *title, int flags, GnomePrintConfig *config) +e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings) { GtkWidget *dialog; - - dialog = g_object_new (GNOME_TYPE_PRINT_DIALOG, "print_config", config, NULL); - gnome_print_dialog_construct (GNOME_PRINT_DIALOG (dialog), title, flags); - - g_signal_connect(dialog, "response", G_CALLBACK(print_dialog_response), NULL); - + + 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); return dialog; } diff --git a/e-util/e-print.h b/e-util/e-print.h index 738da0f418..c8ca551203 100644 --- a/e-util/e-print.h +++ b/e-util/e-print.h @@ -28,11 +28,11 @@ G_BEGIN_DECLS -GnomePrintConfig *e_print_load_config (void); -void e_print_save_config (GnomePrintConfig *config); +GtkPrintSettings *e_print_load_config (void); +void e_print_save_config (GtkPrintSettings *settings); GtkWidget *e_print_get_dialog (const char *title, int flags); -GtkWidget *e_print_get_dialog_with_config (const char *title, int flags, GnomePrintConfig *config); +GtkWidget *e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings); G_END_DECLS diff --git a/mail/ChangeLog b/mail/ChangeLog index 0e0d6ce4a1..0a0ca074e2 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,13 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + ** GtkPrint migration patch from Ebby Wiselyn. + + * em-folder-view.c: (emfv_print_response), (em_folder_view_print): + * em-format-html-print.c: (efhp_finalise), (efhp_footer_cb), + (emfhp_complete), (mail_draw_page), (em_format_html_print_print), + (em_format_html_print_message), (em_format_html_print_raw_message): + * em-format-html-print.h: + 2007-01-17 Srinivasa Ragavan <sragavan@novell.com> ** Downstream fix from OpenSUSE diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index f7467b409c..a1f24b1c8c 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -83,7 +83,7 @@ #include "e-util/e-dialog-utils.h" #include "e-util/e-icon-factory.h" #include "e-util/e-print.h" -#include "e-util/e-profile-event.h" +#include "e-util/e-profile-event.h" #include "e-util/e-util-private.h" #include "filter/filter-rule.h" @@ -110,6 +110,7 @@ #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 */ @@ -2115,7 +2116,7 @@ emfv_activate(EMFolderView *emfv, BonoboUIComponent *uic, int act) struct _print_data { EMFolderView *emfv; - GnomePrintConfig *config; + GtkPrintSettings *settings; int preview; CamelFolder *folder; char *uid; @@ -2125,28 +2126,32 @@ static void emfv_print_response(GtkWidget *w, int resp, struct _print_data *data) { EMFormatHTMLPrint *print; - + gboolean preview = FALSE; + switch (resp) { - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - data->preview = TRUE; - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - print = em_format_html_print_new(); - em_format_set_session((EMFormat *)print, ((EMFormat *)data->emfv->preview)->session); - em_format_html_print_message(print, (EMFormatHTML *)data->emfv->preview, data->config, data->folder, data->uid, data->preview); - g_object_unref(print); - break; + 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; } + g_object_unref (data->emfv); + g_object_unref (data->settings); + camel_object_unref (data->folder); + g_free (data->uid); + g_free (data); +} - if (w) - gtk_widget_destroy(w); - g_object_unref(data->emfv); - e_print_save_config (data->config); - g_object_unref(data->config); - camel_object_unref(data->folder); - g_free(data->uid); - g_free(data); -} int em_folder_view_print(EMFolderView *emfv, int preview) { @@ -2165,7 +2170,7 @@ int em_folder_view_print(EMFolderView *emfv, int preview) data = g_malloc0(sizeof(*data)); data->emfv = emfv; g_object_ref(emfv); - data->config = e_print_load_config (); + data->settings = e_print_load_config (); data->preview = preview; data->folder = emfv->folder; camel_object_ref(data->folder); @@ -2173,14 +2178,17 @@ int em_folder_view_print(EMFolderView *emfv, int preview) message_list_free_uids(emfv->list, uids); if (preview) { - emfv_print_response(NULL, GNOME_PRINT_DIALOG_RESPONSE_PREVIEW, data); + GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), + GNOME_PRINT_DIALOG_COPIES, data->settings); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_APPLY); + 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"), GNOME_PRINT_DIALOG_COPIES, data->config); - - gtk_dialog_set_default_response(dialog, GNOME_PRINT_DIALOG_RESPONSE_PRINT); + GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), + GNOME_PRINT_DIALOG_COPIES, data->settings); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) emfv); - g_signal_connect(dialog, "response", G_CALLBACK(emfv_print_response), data); - gtk_widget_show((GtkWidget *)dialog); + emfv_print_response (dialog, GTK_RESPONSE_OK, data); } return 0; diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c index df12ddf856..ce352c4739 100644 --- a/mail/em-format-html-print.c +++ b/mail/em-format-html-print.c @@ -37,6 +37,7 @@ #include "mail-ops.h" #include "mail-mt.h" #include "em-format-html-print.h" +#include <gtk/gtk.h> static void efhp_builtin_init(EMFormatHTMLPrintClass *efhc); @@ -65,8 +66,8 @@ efhp_finalise(GObject *o) EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o; gtk_widget_destroy(efhp->window); - if (efhp->config) - g_object_unref(efhp->config); + if (efhp->settings) + g_object_unref(efhp->settings); if (efhp->source) g_object_unref(efhp->source); @@ -119,28 +120,39 @@ struct footer_info { GnomeFont *local_font; 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, GnomePrintContext *print_context, double x, double y, double width, double height, void *data) +efhp_footer_cb(GtkHTML *html, GtkPrintContext *print_context, double x, double y, double width, double height, void *data) { struct footer_info *info = data; - + 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; - - gnome_print_gsave(print_context); - gnome_print_newpath(print_context); - gnome_print_setrgbcolor(print_context, .0, .0, .0); - gnome_print_moveto(print_context, x + width - tw, y - gnome_font_get_ascender(info->local_font)); - gnome_print_setfont(print_context, info->local_font); - gnome_print_show(print_context, text); - gnome_print_grestore(print_context); - - g_free(text); + 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); + cairo_show_page (cr); + g_free(text); info->page_num++; } } @@ -150,48 +162,73 @@ efhp_footer_cb(GtkHTML *html, GnomePrintContext *print_context, double x, double static void emfhp_complete(EMFormatHTMLPrint *efhp, void *data) { - GnomePrintContext *print_context; - GnomePrintJob *print_job; - gdouble line = 0.0; + GtkPaperSize *paper_size; + GtkPrintOperation *print; + GtkPrintSettings *settings; + GtkPageSetup *page_setup; + struct MailDraw *mdi; struct footer_info info; - int res = GNOME_PRINT_OK; - - print_job = gnome_print_job_new(efhp->config); - print_context = gnome_print_job_get_context(print_job); - - gtk_html_print_set_master(efhp->formathtml.html, print_job); - info.local_font = gnome_font_find_closest("Sans Regular", 10.0); - if (info.local_font) { - line = gnome_font_get_ascender(info.local_font) - gnome_font_get_descender(info.local_font); - info.page_num = 1; - info.pages = gtk_html_print_get_pages_num(efhp->formathtml.html, print_context, 0.0, line); - gtk_html_print_with_header_footer(efhp->formathtml.html, print_context, 0.0, line, NULL, efhp_footer_cb, &info); - gnome_font_unref(info.local_font); - } else { - gtk_html_print(efhp->formathtml.html, print_context); - } - gtk_html_print_set_master(efhp->formathtml.html, NULL); - - gnome_print_job_close(print_job); - if (efhp->preview) - gtk_widget_show(gnome_print_job_preview_new(print_job, _("Print Preview"))); + page_setup = gtk_page_setup_new (); + paper_size = gtk_paper_size_new ("iso_a4");/*FIXME paper size hard coded */ + print = gtk_print_operation_new (); + gtk_page_setup_set_paper_size (page_setup, paper_size); + + settings = e_print_load_config (); + /* 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 - res = gnome_print_job_print(print_job); + gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL); + g_object_unref (print); + g_object_unref (settings); + g_object_unref (paper_size); + g_object_unref (page_setup); + g_object_unref (efhp); +} - g_object_unref(print_job); - g_object_unref(efhp); +static void +mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, MailDraw *mdi) +{ + 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); + } + g_object_unref(mdi->efhp); } -int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, int preview) +int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, int preview) { EMFormat *emfs = (EMFormat *)source; - efhp->config = print_config; - if (print_config) - g_object_ref(print_config); - efhp->preview = preview; + efhp->settings = settings; + if (settings) + g_object_ref(settings); + efhp->preview = preview; ((EMFormatHTML *)efhp)->load_http = source->load_http_now; g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp); @@ -217,11 +254,12 @@ emfhp_got_message(struct _CamelFolder *folder, const char *uid, struct _CamelMim } } -int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, struct _CamelFolder *folder, const char *uid, int preview) +int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, struct _CamelFolder *folder, const char *uid, int preview) { - efhp->config = print_config; - if (print_config) - g_object_ref(print_config); + efhp->settings = settings; + + if (settings) + g_object_ref(settings); efhp->preview = preview; efhp->source = source; if (source) @@ -233,11 +271,12 @@ int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, return 0; /* damn async ... */ } -int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GnomePrintConfig *print_config, struct _CamelMimeMessage *msg, int preview) +int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, GtkPrintSettings *settings, struct _CamelMimeMessage *msg, int preview) { - efhp->config = print_config; - if (print_config) - g_object_ref(print_config); + efhp->settings = settings; + + if (settings) + g_object_ref(settings); efhp->source = NULL; efhp->preview = preview; g_object_ref(efhp); diff --git a/mail/em-format-html-print.h b/mail/em-format-html-print.h index b995780563..3cc605ba43 100644 --- a/mail/em-format-html-print.h +++ b/mail/em-format-html-print.h @@ -8,8 +8,7 @@ #include "mail/em-format-html.h" -struct _GnomePrintConfig; - +struct GtkPrintSettings; typedef struct _EMFormatHTMLPrint EMFormatHTMLPrint; typedef struct _EMFormatHTMLPrintClass EMFormatHTMLPrintClass; @@ -19,7 +18,7 @@ struct _EMFormatHTMLPrint { EMFormatHTML formathtml; struct _GtkWidget *window; /* used to realise the gtkhtml in a toplevel, i dont know why */ - struct _GnomePrintConfig *config; + struct _GtkPrintSettings *settings; struct _EMFormatHTML *source; /* used for print_message */ guint preview:1; @@ -33,8 +32,8 @@ 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 _GnomePrintConfig *print_config, int preview); -int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, struct _CamelFolder *folder, const char *uid, int preview); -int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GnomePrintConfig *print_config, struct _CamelMimeMessage *msg, int preview); +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); #endif /* ! _EM_FORMAT_HTML_PRINT_H */ diff --git a/shell/ChangeLog b/shell/ChangeLog index a3a715ebec..5f747cbf04 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,9 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + ** Added schemas from GtkPrint API by Ebby Wiselyn. + + * apps_evolution_shell.schemas.in.in: + 2006-12-03 Harish Krishnaswamy <kharish@novell.com> * e-shell.c: (impl_dispose): Fix memory leak of iid. diff --git a/shell/apps_evolution_shell.schemas.in.in b/shell/apps_evolution_shell.schemas.in.in index 1a0ea854f3..96467f5de0 100644 --- a/shell/apps_evolution_shell.schemas.in.in +++ b/shell/apps_evolution_shell.schemas.in.in @@ -217,5 +217,289 @@ </locale> </schema> + + <schema> + <key>/schemas/apps/evolution/shell/printer</key> + <applyto>/apps/evolution/shell/printer</applyto> + <owner>evolution</owner> + <type>string</type> + <default>printer</default> + <locale name="C"> + <short></short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/evolution/shell/orientation</key> + <applyto>/apps/evolution/shell/orientation</applyto> + <owner>evolution</owner> + <type>int</type> + <default>2</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/paper_size</key> + <applyto>/apps/evolution/shell/paper_size</applyto> + <owner>evolution</owner> + <type>int</type> + <default>GTK_PAPER_NAME_A3</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/paper_width</key> + <applyto>/apps/evolution/shell/paper_width</applyto> + <owner>evolution</owner> + <type>double</type> + <default>5</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/paper_height</key> + <applyto>/apps/evolution/shell/paper_height</applyto> + <owner>evolution</owner> + <type>double</type> + <default>5</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/duplex</key> + <applyto>/apps/evolution/shell/duplex</applyto> + <owner>evolution</owner> + <type>int</type> + <default>1</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/quality</key> + <applyto>/apps/evolution/shell/quality</applyto> + <owner>evolution</owner> + <type>int</type> + <default>1</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/n_copies</key> + <applyto>/apps/evolution/shell/n_copies</applyto> + <owner>evolution</owner> + <type>int</type> + <default>10</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/number_up</key>_ + <applyto>/apps/evolution/shell/number_up</applyto> + <owner>evolution</owner> + <type>int</type> + <default>10</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/resolution</key> + <applyto>/apps/evolution/shell/resolution</applyto> + <owner>evolution</owner> + <type>int</type> + <default>50</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/scale</key> + <applyto>/apps/evolution/shell/scale</applyto> + <owner>evolution</owner> + <type>double</type> + <default>50.0</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/print_pages</key> + <applyto>/apps/evolution/shell/print_pages</applyto> + <owner>evolution</owner> + <type>int</type> + <default>3</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/page_ranges</key> + <applyto>/apps/evolution/shell/page_ranges</applyto> + <owner>evolution</owner> + <type>int</type> + <default>5</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/page_set</key> + <applyto>/apps/evolution/shell/page_set</applyto> + <owner>evolution</owner> + <type>int</type> + <default>5</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/default_source</key> + <applyto>/apps/evolution/shell/default_source</applyto> + <owner>evolution</owner> + <type>string</type> + <default>"/home/ebby/Desktop/"</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/media_type</key> + <applyto>/apps/evolution/shell/media_type</applyto> + <owner>evolution</owner> + <type>string</type> + <default>"iso_a3"</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/dither</key> + <applyto>/apps/evolution/shell/dither</applyto> + <owner>evolution</owner> + <type>string</type> + <default>"dither"</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/finishings</key> + <applyto>/apps/evolution/shell/finishings</applyto> + <owner>evolution</owner> + <type>string</type> + <default>"finish"</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + +
<schema> + <key>/schemas/apps/evolution/shell/output_bin</key> + <applyto>/apps/evolution/shell/output_bin</applyto> + <owner>evolution</owner> + <type>string</type> + <default>"/home/ebby/Desktop"</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/reverse</key> + <applyto>/apps/evolution/shell/reverse</applyto> + <owner>evolution</owner> + <type>bool</type> + <default>TRUE</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/collate</key> + <applyto>/apps/evolution/shell/collate</applyto> + <owner>evolution</owner> + <type>bool</type> + <default>TRUE</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + + + <schema> + <key>/schemas/apps/evolution/shell/use_color</key> + <applyto>/apps/evolution/shell/use_color</applyto> + <owner>evolution</owner> + <type>bool</type> + <default>TRUE</default> + <locale name="C"> + <short>Printer settings</short> + <long>A GNOME Print description of the current printer settings</long> + </locale> + </schema> + </schemalist> </gconfschemafile> diff --git a/widgets/table/ChangeLog b/widgets/table/ChangeLog index 16e42bb724..3a9d49da40 100644 --- a/widgets/table/ChangeLog +++ b/widgets/table/ChangeLog @@ -1,3 +1,24 @@ +2007-01-22 Srinivasa Ragavan <sragavan@novell.com> + + ** GtkPrint api migration from Ebby Wiselyn. + + * e-cell-checkbox.c: (ecc_print), (e_cell_checkbox_class_init): + * e-cell-pixbuf.c: (gnome_print_pixbuf), (pixbuf_print), + (pixbuf_print_height): + * e-cell-popup.c: (ecp_print), (ecp_print_height): + * e-cell-text.c: (ect_print), (ect_print_height): + * e-cell-toggle.c: (etog_print), (etog_print_height): + * e-cell.c: (e_cell_print), (e_cell_print_height): + * e-cell.h: + * e-table-group-container.c: (gp_draw_rect), + (e_table_group_container_print_page), + (e_table_group_container_height), + (e_table_group_container_will_fit): + * e-table-item.c: (eti_realize_cell_views), (eti_draw), + (eti_event), (eti_printed_row_height), (gp_draw_rect), + (e_table_item_print_page), (e_table_item_height), + (e_table_item_will_fit): + 2006-12-04 Matthew Barnes <mbarnes@redhat.com> Fixes bug #357970 diff --git a/widgets/table/e-cell-checkbox.c b/widgets/table/e-cell-checkbox.c index cdeb1814de..33135b5b71 100644 --- a/widgets/table/e-cell-checkbox.c +++ b/widgets/table/e-cell-checkbox.c @@ -39,8 +39,32 @@ static GdkPixbuf *checks [2]; static void +ecc_print (ECellView *ecell_view, GtkPrintContext *context, + int model_col, int view_col, int row, + double width, double height) +{ + cairo_t *cr; + cr = gtk_print_context_get_cairo_context (context); + const int value = GPOINTER_TO_INT ( + e_table_model_value_at (ecell_view->e_table_model, model_col, row)); + cairo_save (cr); + + if ( value == 1) { + + cairo_set_line_width (cr, 2); + cairo_move_to (cr, 3, 11); + cairo_line_to (cr, 7, 14); + cairo_line_to (cr, 11, 5); + cairo_stroke (cr); + } + cairo_restore (cr); +} + +static void e_cell_checkbox_class_init (GtkObjectClass *object_class) { + ECellClass *ecc = (ECellClass *) object_class; + ecc->print = ecc_print; checks [0] = gdk_pixbuf_new_from_xpm_data (check_empty_xpm); checks [1] = gdk_pixbuf_new_from_xpm_data (check_filled_xpm); } diff --git a/widgets/table/e-cell-pixbuf.c b/widgets/table/e-cell-pixbuf.c index a87ba5887d..38fb1ae59d 100644 --- a/widgets/table/e-cell-pixbuf.c +++ b/widgets/table/e-cell-pixbuf.c @@ -28,7 +28,7 @@ #include <libgnomecanvas/gnome-canvas.h> #include "e-util/e-i18n.h" - +#include <gtk/gtk.h> #include "e-cell-pixbuf.h" #define PARENT_TYPE E_CELL_TYPE @@ -51,20 +51,14 @@ enum { }; static int -gnome_print_pixbuf (GnomePrintContext *pc, GdkPixbuf *pixbuf) +gnome_print_pixbuf (GtkPrintContext *pc, GdkPixbuf *pixbuf) { - if (gdk_pixbuf_get_has_alpha (pixbuf)) - return gnome_print_rgbaimage (pc, - gdk_pixbuf_get_pixels (pixbuf), - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - gdk_pixbuf_get_rowstride (pixbuf)); - else - return gnome_print_rgbimage (pc, - gdk_pixbuf_get_pixels (pixbuf), - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - gdk_pixbuf_get_rowstride (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; } /* @@ -224,29 +218,28 @@ pixbuf_height (ECellView *ecell_view, int model_col, int view_col, int row) * ECell::print method */ static void -pixbuf_print (ECellView *ecell_view, GnomePrintContext *context, +pixbuf_print (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, double width, double height) { GdkPixbuf *pixbuf; int scale; - + cairo_t *cr = gtk_print_context_get_cairo_context (context); + pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, model_col, row); if (pixbuf == NULL) return; - scale = gdk_pixbuf_get_height (pixbuf); - - gnome_print_gsave(context); - gnome_print_translate (context, 0, (height - scale) / 2); - gnome_print_scale (context, scale, scale); - gnome_print_pixbuf (context, pixbuf); - - gnome_print_grestore(context); + scale = gdk_pixbuf_get_height (pixbuf); + cairo_save (cr); + cairo_translate (cr, 0, (double)(height - scale) / (double)2); + gdk_cairo_set_source_pixbuf (cr, pixbuf, (double)scale, (double)scale); + cairo_paint (cr); + cairo_restore (cr); } static gdouble -pixbuf_print_height (ECellView *ecell_view, GnomePrintContext *context, +pixbuf_print_height (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, double width) { diff --git a/widgets/table/e-cell-popup.c b/widgets/table/e-cell-popup.c index 613b11dae2..49a4c1e728 100644 --- a/widgets/table/e-cell-popup.c +++ b/widgets/table/e-cell-popup.c @@ -38,6 +38,7 @@ #include "e-cell-popup.h" #include "e-table-item.h" +#include <gtk/gtk.h> #define E_CELL_POPUP_ARROW_WIDTH 16 #define E_CELL_POPUP_ARROW_XPAD 3 @@ -86,14 +87,14 @@ static void ecp_leave_edit (ECellView *ecv, int row, void *edit_context); static void ecp_print (ECellView *ecv, - GnomePrintContext *context, + GtkPrintContext *context, int model_col, int view_col, int row, double width, double height); static gdouble ecp_print_height (ECellView *ecv, - GnomePrintContext *context, + GtkPrintContext *context, int model_col, int view_col, int row, @@ -402,7 +403,7 @@ ecp_leave_edit (ECellView *ecv, int model_col, int view_col, int row, static void -ecp_print (ECellView *ecv, GnomePrintContext *context, +ecp_print (ECellView *ecv, GtkPrintContext *context, int model_col, int view_col, int row, double width, double height) { ECellPopupView *ecp_view = (ECellPopupView *) ecv; @@ -413,7 +414,7 @@ ecp_print (ECellView *ecv, GnomePrintContext *context, static gdouble -ecp_print_height (ECellView *ecv, GnomePrintContext *context, +ecp_print_height (ECellView *ecv, GtkPrintContext *context, int model_col, int view_col, int row, double width) { diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c index dfa0f4da19..88dd215636 100644 --- a/widgets/table/e-cell-text.c +++ b/widgets/table/e-cell-text.c @@ -60,7 +60,6 @@ #include "e-cell-text.h" #include "e-table-item.h" #include "e-table-tooltip.h" - #define d(x) #define DO_SELECTION 1 #define VIEW_TO_CELL(view) E_CELL_TEXT (((ECellView *)view)->ecell) @@ -1322,45 +1321,45 @@ get_font_size (PangoLayout *layout, PangoFontDescription *font, const char *text } 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) { - PangoFontDescription *font_des = get_font_description_for_size (16); + PangoFontDescription *font_des = get_font_description_for_size (12); PangoLayout *layout; PangoContext *pango_context; PangoFontMetrics *font_metrics; - char *string; ECellText *ect = E_CELL_TEXT(ecell_view->ecell); - double ty, ly, text_width, text_height; ECellTextView *ectView = (ECellTextView *)ecell_view; GtkWidget *canvas = GTK_WIDGET(ectView->canvas); PangoDirection dir; gboolean strikeout, underline; + cairo_t *cr; + char *string; + double ty, ly, text_width, text_height; + + cr = gtk_print_context_get_cairo_context (context); string = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row); - layout = gnome_print_pango_create_layout (context); + + cairo_save (cr); + layout = gtk_print_context_create_pango_layout (context); + font_des = pango_font_description_from_string ("sans 12"); /* fix me font hardcoded */ pango_layout_set_font_description (layout, font_des); + pango_layout_set_text (layout, string, -1); get_font_size (layout, font_des, string, &text_width, &text_height); - gnome_print_gsave(context); - if (gnome_print_moveto(context, 2, 2) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width - 2, 2) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width - 2, height - 2) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 2, height - 2) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 2, 2) == -1) - /* FIXME */; - if (gnome_print_clip(context) == -1) - /* FIXME */; + + cairo_move_to(cr, 2, 2); + cairo_rectangle (cr, 2, 2, width + 2, height + 2); + cairo_clip(cr); pango_context = gtk_widget_get_pango_context (canvas); font_metrics = pango_context_get_metrics (pango_context, - canvas->style->font_desc, pango_context_get_language(pango_context)); - ty = (double)(text_height - pango_font_metrics_get_ascent (font_metrics) - pango_font_metrics_get_descent (font_metrics)) / 2.0 /(double)PANGO_SCALE; + canvas->style->font_desc, pango_context_get_language(pango_context)); + ty = (double)(text_height + - pango_font_metrics_get_ascent (font_metrics) + - pango_font_metrics_get_descent (font_metrics)) / 2.0 /(double)PANGO_SCALE; strikeout = ect->strikeout_column >= 0 && row >= 0 && e_table_model_value_at (ecell_view->e_table_model, ect->strikeout_column, row); @@ -1368,47 +1367,50 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context, e_table_model_value_at(ecell_view->e_table_model, ect->underline_column, row); dir = pango_find_base_dir (string, strlen(string)); + if (underline) { ly = ty + (double)pango_font_metrics_get_underline_position (font_metrics)/(double)PANGO_SCALE; - gnome_print_newpath (context); + cairo_new_path (cr); if (dir == PANGO_DIRECTION_RTL) { - gnome_print_moveto (context, width - 2, ly + text_height - 4); - gnome_print_lineto (context, MAX (width - 2 - text_width, 2), ly + text_height - 4); + cairo_move_to (cr, width - 2, ly + text_height + 6); + cairo_line_to (cr, MAX (width - 2 - text_width, 2), ly + text_height + 6); } else { - gnome_print_moveto (context, 2, ly + text_height - 4); - gnome_print_lineto (context, MIN (2 + text_width, width - 2), ly + text_height - 4); + cairo_move_to (cr, 2, ly + text_height + 6); + cairo_line_to (cr, MIN (2 + text_width, width - 2), ly + text_height + 6); } - gnome_print_setlinewidth (context, (double)pango_font_metrics_get_underline_thickness (font_metrics)/(double)PANGO_SCALE); - gnome_print_stroke (context); + cairo_set_line_width (cr, (double)pango_font_metrics_get_underline_thickness (font_metrics)/(double)PANGO_SCALE); + cairo_stroke (cr); } if (strikeout) { ly = ty + (double)pango_font_metrics_get_strikethrough_position (font_metrics)/(double)PANGO_SCALE; - gnome_print_newpath (context); + cairo_new_path (cr); if (dir == PANGO_DIRECTION_RTL) { - gnome_print_moveto (context, width - 2, ly + text_height - 4); - gnome_print_lineto (context, MAX (width - 2 - text_width, 2), ly + text_height - 4); + cairo_move_to (cr, width - 2, ly + text_height + 6); + cairo_line_to (cr, MAX (width - 2 - text_width, 2), ly + text_height + 6); } else { - gnome_print_moveto (context, 2, ly + text_height - 4); - gnome_print_lineto (context, MIN (2 + text_width, width - 2), ly + text_height - 4); + cairo_move_to (cr, 2, ly + text_height + 6); + cairo_line_to (cr, MIN (2 + text_width, width - 2), ly + text_height + 6); } - gnome_print_setlinewidth (context, (double)pango_font_metrics_get_strikethrough_thickness (font_metrics)/(double)PANGO_SCALE); - gnome_print_stroke (context); - } + cairo_set_line_width (cr,(double)pango_font_metrics_get_strikethrough_thickness (font_metrics)/(double)PANGO_SCALE); + + cairo_stroke (cr); + } + + cairo_move_to(cr, 2, text_height- 5); + pango_layout_set_width (layout, (width - 4)*PANGO_SCALE); + pango_cairo_show_layout(cr, layout); + cairo_restore (cr); - gnome_print_moveto(context, 2, text_height + 2); - pango_layout_set_width (layout, (width - 4)*PANGO_SCALE); - gnome_print_pango_layout(context, layout); pango_font_description_free (font_des); g_object_unref (layout); - gnome_print_grestore(context); e_cell_text_free_text(ect, string); } 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-toggle.c b/widgets/table/e-cell-toggle.c index 971ca1f98e..dda87efcae 100644 --- a/widgets/table/e-cell-toggle.c +++ b/widgets/table/e-cell-toggle.c @@ -48,23 +48,6 @@ static ECellClass *parent_class; #define CACHE_SEQ_COUNT 6 -static int -gnome_print_pixbuf (GnomePrintContext *pc, GdkPixbuf *pixbuf) -{ - if (gdk_pixbuf_get_has_alpha (pixbuf)) - return gnome_print_rgbaimage (pc, - gdk_pixbuf_get_pixels (pixbuf), - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - gdk_pixbuf_get_rowstride (pixbuf)); - else - return gnome_print_rgbimage (pc, - gdk_pixbuf_get_pixels (pixbuf), - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - gdk_pixbuf_get_rowstride (pixbuf)); -} - /* * ECell::realize method */ @@ -145,7 +128,7 @@ check_cache (ECellToggleView *toggle_view, int image_seq, int cache_seq) gdk_pixmap_new (toggle_view->canvas->layout.bin_window, width, height, gtk_widget_get_visual (GTK_WIDGET (toggle_view->canvas))->depth); - + switch (cache_seq % 3) { case 0: color = GTK_WIDGET (toggle_view->canvas)->style->bg [GTK_STATE_SELECTED]; @@ -195,7 +178,7 @@ etog_draw (ECellView *ecell_view, GdkDrawable *drawable, GdkPixbuf *image; int x, y, width, height; int cache_seq; - + const int value = GPOINTER_TO_INT ( e_table_model_value_at (ecell_view->e_table_model, model_col, row)); @@ -272,7 +255,7 @@ etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, return FALSE; #endif - switch (event->type){ + switch (event->type){ case GDK_KEY_PRESS: if (event->key.keyval != GDK_space) return FALSE; @@ -280,7 +263,7 @@ etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, case GDK_BUTTON_PRESS: if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row)) return FALSE; - + etog_set_value (toggle_view, model_col, view_col, row, value + 1); return TRUE; @@ -304,34 +287,41 @@ etog_height (ECellView *ecell_view, int model_col, int view_col, int row) * ECell::print method */ static void -etog_print (ECellView *ecell_view, GnomePrintContext *context, +etog_print (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, double width, double height) { ECellToggle *toggle = E_CELL_TOGGLE(ecell_view->ecell); GdkPixbuf *image; + double image_width, image_height; const int value = GPOINTER_TO_INT ( e_table_model_value_at (ecell_view->e_table_model, model_col, row)); - if (value >= toggle->n_states){ + cairo_t *cr; + if (value >= toggle->n_states){ g_warning ("Value from the table model is %d, the states we support are [0..%d)\n", value, toggle->n_states); return; } - gnome_print_gsave(context); - - image = toggle->images[value]; - - gnome_print_translate (context, 0, (height - toggle->height) / 2); - gnome_print_scale (context, toggle->height, toggle->height); - gnome_print_pixbuf (context, image); - - gnome_print_grestore(context); + cr = gtk_print_context_get_cairo_context (context); + cairo_save(cr); + image = toggle->images[value]; + cairo_translate (cr, 0 , 0); + image = gdk_pixbuf_add_alpha (image, TRUE, 255, 255, 255); + image_width = (double)gdk_pixbuf_get_width (image); + image_height = (double)gdk_pixbuf_get_height (image); + cairo_rectangle (cr, image_width / 7, image_height / 3, + image_width - image_width / 4, + image_width - image_height / 7); + cairo_clip (cr); + gdk_cairo_set_source_pixbuf (cr, image, 0, image_height / 4); + cairo_paint (cr); + cairo_restore(cr); } static gdouble -etog_print_height (ECellView *ecell_view, GnomePrintContext *context, +etog_print_height (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, double width) { @@ -414,7 +404,7 @@ e_cell_toggle_class_init (GtkObjectClass *object_class) parent_class = g_type_class_ref (PARENT_TYPE); gal_a11y_e_cell_registry_add_cell_type (NULL, - E_CELL_TOGGLE_TYPE, + E_CELL_TOGGLE_TYPE, gal_a11y_e_cell_toggle_new); } diff --git a/widgets/table/e-cell.c b/widgets/table/e-cell.c index b27badc348..0679cffd53 100644 --- a/widgets/table/e-cell.c +++ b/widgets/table/e-cell.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + /*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * e-cell.c - base class for cell renderers in e-table * Copyright 1999, 2000, 2001, Ximian, Inc. @@ -23,7 +23,7 @@ */ #include <config.h> - +#include <gtk/gtk.h> #include "e-util/e-util.h" #include "e-cell.h" @@ -280,7 +280,7 @@ e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable, /** * e_cell_print: * @ecell_view: the ECellView to redraw - * @context: The GnomePrintContext where we output our printed data. + * @context: The GtkPrintContext where we output our printed data. * @model_col: the column in the model being drawn. * @view_col: the column in the view being drawn (what the model maps to). * @row: the row being drawn @@ -290,7 +290,7 @@ e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable, * FIXME: */ void -e_cell_print (ECellView *ecell_view, GnomePrintContext *context, +e_cell_print (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, double width, double height) { @@ -304,7 +304,7 @@ e_cell_print (ECellView *ecell_view, GnomePrintContext *context, * FIXME: */ gdouble -e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context, +e_cell_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 fabe7bf372..526d8995e7 100644 --- a/widgets/table/e-cell.h +++ b/widgets/table/e-cell.h @@ -26,6 +26,7 @@ #define _E_CELL_H_ #include <gdk/gdktypes.h> +#include <gtk/gtk.h> #include <libgnomeprint/gnome-print.h> #include <libgnomeprint/gnome-font.h> #include <table/e-table-model.h> @@ -107,10 +108,10 @@ typedef struct { void *(*save_state) (ECellView *ecell_view, int model_col, int view_col, int row, void *context); void (*load_state) (ECellView *ecell_view, int model_col, int view_col, int row, void *context, void *save_state); void (*free_state) (ECellView *ecell_view, int model_col, int view_col, int row, void *save_state); - void (*print) (ECellView *ecell_view, GnomePrintContext *context, + void (*print) (ECellView *ecell_view, GtkPrintContext *context, int model_col, int view_col, int row, gdouble width, gdouble height); - gdouble (*print_height) (ECellView *ecell_view, GnomePrintContext *context, + gdouble (*print_height) (ECellView *ecell_view,GtkPrintContext *context, int model_col, int view_col, int row, gdouble width); int (*max_width) (ECellView *ecell_view, int model_col, int view_col); int (*max_width_by_row) (ECellView *ecell_view, int model_col, int view_col, int row); @@ -149,14 +150,14 @@ void e_cell_draw (ECellView *ecell_view, int x2, int y2); void e_cell_print (ECellView *ecell_view, - GnomePrintContext *context, + GtkPrintContext *context, int model_col, int view_col, int row, double width, double height); gdouble e_cell_print_height (ECellView *ecell_view, - GnomePrintContext *context, + GtkPrintContext *context, int model_col, int view_col, int row, diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c index 86a8036450..f2060db1ad 100644 --- a/widgets/table/e-table-group-container.c +++ b/widgets/table/e-table-group-container.c @@ -1063,7 +1063,7 @@ etgc_init (GtkObject *object) { ETableGroupContainer *container = E_TABLE_GROUP_CONTAINER(object); container->children = FALSE; - + e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgc_reflow); container->alternating_row_colors = 1; @@ -1110,32 +1110,18 @@ typedef struct { EPrintable *child_printable; } ETGCPrintContext; -#if 0 -#define CHECK(x) if((x) == -1) return -1; -static gint -gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height, gdouble r, gdouble g, gdouble b) -{ - CHECK(gnome_print_moveto(context, x, y)); - CHECK(gnome_print_lineto(context, x + width, y)); - CHECK(gnome_print_lineto(context, x + width, y - height)); - CHECK(gnome_print_lineto(context, x, y - height)); - CHECK(gnome_print_lineto(context, x, y)); - return gnome_print_fill(context); -} -#endif #define CHECK(x) if((x) == -1) return -1; static gint -gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height) +gp_draw_rect (GtkPrintContext *context, double x, double y, double width, double height) { - CHECK(gnome_print_moveto(context, x, y)); - CHECK(gnome_print_lineto(context, x + width, y)); - CHECK(gnome_print_lineto(context, x + width, y - height)); - CHECK(gnome_print_lineto(context, x, y - height)); - CHECK(gnome_print_lineto(context, x, y)); - return gnome_print_fill(context); + cairo_t *cr; + cr = gtk_print_context_get_cairo_context (context); + cairo_move_to (cr, x, y); + cairo_rectangle (cr, x, y, x + width, y + height); + cairo_fill (cr); } #define TEXT_HEIGHT (12) @@ -1143,12 +1129,13 @@ gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, g static void e_table_group_container_print_page (EPrintable *ep, - GnomePrintContext *context, + GtkPrintContext *context, gdouble width, gdouble height, gboolean quantize, ETGCPrintContext *groupcontext) -{ +{ + cairo_t *cr; gdouble yd = height; gdouble child_height; ETableGroupContainerChildNode *child_node; @@ -1159,6 +1146,8 @@ e_table_group_container_print_page (EPrintable *ep, child_printable = groupcontext->child_printable; child = groupcontext->child; + yd = 6.5 * 72; + height = 5 * 72; if (child_printable) { if (child) @@ -1179,50 +1168,21 @@ e_table_group_container_print_page (EPrintable *ep, } while (1) { - child_height = e_printable_height(child_printable, context, width - 36, yd - TEXT_AREA_HEIGHT, quantize); - - if (gnome_print_gsave(context) == -1) - /* FIXME */; - if (gnome_print_moveto(context, 0, yd - child_height - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 36, yd - child_height - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 36, yd - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width, yd - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width, yd) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, yd) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, yd - child_height - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_setrgbcolor(context, .7, .7, .7) == -1) - /* FIXME */; - if (gnome_print_fill(context) == -1) - /* FIXME */; - if (gnome_print_grestore(context) == -1) - /* FIXME */; - - if (gnome_print_gsave(context) == -1) - /* FIXME */; - if (gnome_print_moveto(context, 0, yd - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width, yd - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width, yd) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, yd) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, yd - TEXT_AREA_HEIGHT) == -1) - /* FIXME */; - if (gnome_print_clip(context) == -1) - /* FIXME */; - - if (gnome_print_moveto(context, 2, yd - (TEXT_AREA_HEIGHT + gnome_font_get_ascender(font) - gnome_font_get_descender(font)) / 2) == -1) - /* FIXME */; - if (gnome_print_setfont(context, font)) - /* FIXME */; + 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); if (groupcontext->etgc->ecol->text) string = g_strdup_printf ("%s : %s (%d item%s)", groupcontext->etgc->ecol->text, @@ -1234,63 +1194,38 @@ e_table_group_container_print_page (EPrintable *ep, child_node->string, (gint) child_node->count, child_node->count == 1 ? "" : "s"); - if (gnome_print_show(context, string)) - /* FIXME */; - g_free(string); - if (gnome_print_grestore(context) == -1) - /* FIXME */; - - if (gnome_print_gsave(context) == -1) - /* FIXME */; - if (gnome_print_translate(context, 36, yd - TEXT_AREA_HEIGHT - child_height) == -1) - /* FIXME */; - if (gnome_print_moveto(context, 0, 0) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width - 36, 0) == -1) - /* FIXME */; - if (gnome_print_lineto(context, width - 36, child_height) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, child_height) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, 0) == -1) - /* FIXME */; - if (gnome_print_clip(context) == -1) - /* FIXME */; - e_printable_print_page(child_printable, context, width - 36, child_height, quantize); - if (gnome_print_grestore(context) == -1) - /* FIXME */; - - gp_draw_rect(context, 0, yd - child_height - TEXT_AREA_HEIGHT + 1, width, 1); - gp_draw_rect(context, width - 1, yd, 1, yd - child_height - TEXT_AREA_HEIGHT); - gp_draw_rect(context, 0, yd, 1, yd - child_height - TEXT_AREA_HEIGHT); - - yd -= child_height + TEXT_AREA_HEIGHT; + 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); + + 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; - child = child->next; + child = child->next; if (!child) { child_printable = NULL; break; } - child_node = child->data; + child_node = child->data; if (child_printable) g_object_unref (child_printable); - child_printable = e_table_group_get_printable(child_node->child); + child_printable = e_table_group_get_printable(child_node->child); if (child_printable) g_object_ref (child_printable); - e_printable_reset(child_printable); + e_printable_reset(child_printable); } - - gp_draw_rect(context, 0, height, width, 1); - if (groupcontext->child_printable) g_object_unref (groupcontext->child_printable); groupcontext->child_printable = child_printable; groupcontext->child = child; - } static gboolean @@ -1313,7 +1248,7 @@ e_table_group_container_reset (EPrintable *ep, static gdouble e_table_group_container_height (EPrintable *ep, - GnomePrintContext *context, + GtkPrintContext *context, gdouble width, gdouble max_height, gboolean quantize, @@ -1350,14 +1285,14 @@ e_table_group_container_height (EPrintable *ep, while (1) { child_height = e_printable_height(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize); - height += child_height + TEXT_AREA_HEIGHT; + height -= child_height + TEXT_AREA_HEIGHT; if (yd != -1) { if (!e_printable_will_fit(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize)) { break; } - yd -= child_height + TEXT_AREA_HEIGHT; + yd += child_height + TEXT_AREA_HEIGHT; } child = child->next; @@ -1381,7 +1316,7 @@ e_table_group_container_height (EPrintable *ep, static gboolean e_table_group_container_will_fit (EPrintable *ep, - GnomePrintContext *context, + GtkPrintContext *context, gdouble width, gdouble max_height, gboolean quantize, @@ -1424,7 +1359,7 @@ e_table_group_container_will_fit (EPrintable *ep, break; } - yd -= child_height + TEXT_AREA_HEIGHT; + yd += child_height + TEXT_AREA_HEIGHT; } child = child->next; diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index c095b84c05..0936c03f31 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -98,7 +98,7 @@ enum { PROP_LENGTH_THRESHOLD, PROP_CURSOR_ROW, PROP_UNIFORM_ROW_HEIGHT, - + PROP_MINIMUM_WIDTH, PROP_WIDTH, PROP_HEIGHT @@ -334,7 +334,7 @@ eti_free_save_state (ETableItem *eti) * we might want to avoid realizing each e-cell. */ static void -eti_realize_cell_views (ETableItem *eti) +eti_realize_cell_views ( ETableItem *eti) { int i; @@ -1939,7 +1939,6 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, height = ETI_ROW_HEIGHT (eti, row); xd = x_offset; -/* printf ("paint: %d %d\n", yd, yd + height); */ selected = e_selection_model_is_row_selected(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti,row)); @@ -2084,7 +2083,7 @@ find_cell (ETableItem *eti, double x, double y, int *view_col_res, int *view_row int col, row; int height_extra = eti->horizontal_draw_grid ? 1 : 0; - + /* FIXME: this routine is inneficient, fix later */ if (eti->grabbed_col >= 0 && eti->grabbed_row >= 0) { @@ -2447,6 +2446,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) } #endif + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; @@ -2654,6 +2654,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) break; } + g_signal_emit (eti, eti_signals [KEY_PRESS], 0, model_to_view_row(eti, cursor_row), cursor_col, e, &return_val); if ((!return_val) && @@ -2686,6 +2687,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) if ((e->key.state & GDK_MOD1_MASK) && ((e->key.keyval == GDK_Down ) || (e->key.keyval == GDK_KP_Down))) { gint view_col = model_to_view_col(eti, cursor_col); + if ((view_col >= 0) && (view_col < eti->cols)) if (eti_e_cell_event (eti, eti->cell_views [view_col], e, ((GdkEventKey *)e)->time, cursor_col, view_col, model_to_view_row(eti, cursor_row), E_CELL_CURSOR)) return TRUE; @@ -3450,7 +3452,7 @@ e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width) } static gdouble -eti_printed_row_height (ETableItem *eti, gdouble *widths, GnomePrintContext *context, gint row) +eti_printed_row_height (ETableItem *eti, gdouble *widths, GtkPrintContext *context, gint row) { int col; int cols = eti->cols; @@ -3468,106 +3470,106 @@ eti_printed_row_height (ETableItem *eti, gdouble *widths, GnomePrintContext *con #define CHECK(x) if((x) == -1) return -1; static gint -gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height) +gp_draw_rect (GtkPrintContext *context, double x, double y, double width, double height) { - CHECK(gnome_print_moveto(context, x, y)); - CHECK(gnome_print_lineto(context, x + width, y)); - CHECK(gnome_print_lineto(context, x + width, y - height)); - CHECK(gnome_print_lineto(context, x, y - height)); - CHECK(gnome_print_lineto(context, x, y)); - return gnome_print_fill(context); + cairo_t *cr; + cr = gtk_print_context_get_cairo_context (context); + cairo_save (cr); + cairo_rectangle (cr, x, y, width, height); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); + cairo_restore (cr); + return 0; } static void e_table_item_print_page (EPrintable *ep, - GnomePrintContext *context, - gdouble width, - gdouble height, + GtkPrintContext *context, + double width, + double height, gboolean quantize, ETableItemPrintContext *itemcontext) { ETableItem *eti = itemcontext->item; const int rows = eti->rows; const int cols = eti->cols; + gdouble max_height; int rows_printed = itemcontext->rows_printed; + int row, col, next_page = 0; + double yd = height; + cairo_t *cr; gdouble *widths; - int row, col; - gdouble yd = height; - + + cr = gtk_print_context_get_cairo_context (context); + max_height = gtk_print_context_get_height (context); widths = e_table_item_calculate_print_widths (itemcontext->item->header, width); /* * Draw cells */ + if (eti->horizontal_draw_grid){ gp_draw_rect(context, 0, yd, width, 1); } - yd--; - - for (row = rows_printed; row < rows; row++){ + yd++; + + for (row = rows_printed; row < rows ; row++){ gdouble xd = 1, row_height; - row_height = eti_printed_row_height(eti, widths, context, row); + if (quantize) { - if (yd - row_height - 1 < 0 && row != rows_printed) { + if (yd + row_height + 1 > max_height && row != rows_printed) { + next_page = 1; break; } } else { - if (yd < 0) { + if (yd > max_height) { + next_page = 1; break; - } - } - + } + } + for (col = 0; col < cols; col++){ ECellView *ecell_view = eti->cell_views [col]; - - if (gnome_print_gsave(context) == -1) - /* FIXME */; - if (gnome_print_translate(context, xd, yd - row_height) == -1) - /* FIXME */; - - if (gnome_print_moveto(context, 0, 0) == -1) - /* FIXME */; - if (gnome_print_lineto(context, widths[col] - 1, 0) == -1) - /* FIXME */; - if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, row_height) == -1) - /* FIXME */; - if (gnome_print_lineto(context, 0, 0) == -1) - /* FIXME */; - if (gnome_print_clip(context) == -1) - /* FIXME */; - - e_cell_print (ecell_view, context, view_to_model_col(eti, col), col, row, - widths[col] - 1, row_height); - - if (gnome_print_grestore(context) == -1) - /* FIXME */; + cairo_save(cr); + cairo_translate(cr, xd, yd); + cairo_rectangle (cr, 0, 0, widths[col] - 1, row_height); + cairo_clip(cr); + + e_cell_print (ecell_view, context, + view_to_model_col(eti, col), + col, + row, + widths[col] - 1, + row_height + 2 ); + + cairo_restore (cr); xd += widths[col]; } - yd -= row_height; - + + yd += row_height; if (eti->horizontal_draw_grid){ gp_draw_rect(context, 0, yd, width, 1); } - yd--; - } + yd ++; + } itemcontext->rows_printed = row; - if (eti->vertical_draw_grid){ gdouble xd = 0; - for (col = 0; col < cols; col++){ - gp_draw_rect(context, xd, height, 1, height - yd); - + gp_draw_rect(context, xd, height, 1, yd - height); xd += widths[col]; } - gp_draw_rect(context, xd, height, 1, height - yd); + gp_draw_rect(context, xd, height, 1, yd - height); } + if (next_page) { + cairo_show_page (cr); + next_page = 0; + } + g_free (widths); } @@ -3591,7 +3593,7 @@ e_table_item_reset (EPrintable *ep, static gdouble e_table_item_height (EPrintable *ep, - GnomePrintContext *context, + GtkPrintContext *context, gdouble width, gdouble max_height, gboolean quantize, @@ -3641,7 +3643,7 @@ e_table_item_height (EPrintable *ep, static gboolean e_table_item_will_fit (EPrintable *ep, - GnomePrintContext *context, + GtkPrintContext *context, gdouble width, gdouble max_height, gboolean quantize, |