aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog10
-rw-r--r--addressbook/printing/e-contact-print.c137
-rw-r--r--calendar/ChangeLog10
-rw-r--r--calendar/gui/print.c171
4 files changed, 221 insertions, 107 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 55fca53e1d..323d755f34 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,13 @@
+2008-07-30 Milan Crha <mcrha@redhat.com>
+
+ ** Part of fix for bug #211267
+
+ * printing/e-contact-print.c: (struct _EContactPrintContext),
+ (e_contact_print_letter_heading), (e_contact_start_new_page),
+ (e_contact_print_contact), (contact_draw_page),
+ (e_contact_print): Report correct number of pages to print
+ and print them as requested.
+
2008-07-30 Takao Fujiwara <takao.fujiwara@sun.com>
Reviewed by Andre Klapper <a9016009@gmx.de>
diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c
index a707235944..f82335335a 100644
--- a/addressbook/printing/e-contact-print.c
+++ b/addressbook/printing/e-contact-print.c
@@ -57,6 +57,8 @@ struct _EContactPrintContext
EContactPrintStyle *style;
gboolean first_section;
+ gint page_nr, pages;
+
PangoFontDescription *letter_heading_font;
gchar *section;
gboolean first_contact;
@@ -178,8 +180,15 @@ e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *letter)
pango_layout_set_width (layout, width);
pango_layout_get_size (layout, NULL, &height);
- /* Draw white text centered in a black rectangle. */
+ if (ctxt->page_nr == -1 || ctxt->pages != ctxt->page_nr) {
+ /* only calculating number of pages
+ or on page we do not want to print */
+ ctxt->y += pango_units_to_double (height);
+
+ return;
+ }
+ /* Draw white text centered in a black rectangle. */
cr = gtk_print_context_get_cairo_context (ctxt->context);
cairo_save (cr);
@@ -207,10 +216,11 @@ e_contact_start_new_page (EContactPrintContext *ctxt)
cr = gtk_print_context_get_cairo_context (ctxt->context);
- cairo_show_page (cr);
+ /*cairo_show_page (cr);*/
ctxt->x = ctxt->y = .0;
ctxt->column = 0;
+ ctxt->pages++;
}
static void
@@ -226,7 +236,7 @@ e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
- if (ctxt->style->print_using_grey) {
+ if (ctxt->style->print_using_grey && ctxt->pages == ctxt->page_nr) {
cairo_save (cr);
cairo_set_source_rgb (cr, .85, .85, .85);
cairo_rectangle (cr, ctxt->x, ctxt->y, ctxt->column_width,
@@ -236,9 +246,10 @@ e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
cairo_restore (cr);
}
- e_contact_output (
- ctxt->context, ctxt->style->headings_font,
- ctxt->x, ctxt->y, ctxt->column_width + 4, file_as);
+ if (ctxt->pages == ctxt->page_nr)
+ e_contact_output (
+ ctxt->context, ctxt->style->headings_font,
+ ctxt->x, ctxt->y, ctxt->column_width + 4, file_as);
ctxt->y += e_contact_text_height (
ctxt->context, ctxt->style->headings_font, file_as);
@@ -258,9 +269,10 @@ e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
text = g_strdup_printf ("%s: %s",
e_contact_pretty_name (field), value);
- e_contact_output (
- ctxt->context, ctxt->style->body_font,
- ctxt->x, ctxt->y, -1, text);
+ if (ctxt->pages == ctxt->page_nr)
+ e_contact_output (
+ ctxt->context, ctxt->style->body_font,
+ ctxt->x, ctxt->y, -1, text);
ctxt->y += e_contact_text_height (
ctxt->context, ctxt->style->body_font, text);
@@ -540,51 +552,6 @@ load_contacts (EContactPrintContext *ctxt)
}
static void
-free_contacts (EContactPrintContext *ctxt)
-{
- g_list_foreach (ctxt->contact_list, (GFunc) g_object_unref, NULL);
- g_list_free (ctxt->contact_list);
-}
-
-static void
-contact_begin_print (GtkPrintOperation *operation,
- GtkPrintContext *context,
- EContactPrintContext *ctxt)
-{
- GtkPageSetup *setup;
- gdouble page_width;
-
- e_contact_build_style (ctxt->style);
-
- setup = gtk_print_context_get_page_setup (context);
- page_width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
-
- ctxt->context = context;
- ctxt->x = ctxt->y = .0;
- ctxt->column = 0;
- ctxt->first_contact = TRUE;
- ctxt->first_section = TRUE;
- ctxt->section = NULL;
-
- ctxt->column_spacing = gtk_print_context_get_dpi_x (context) / 4;
- ctxt->column_width = (page_width + ctxt->column_spacing) /
- ctxt->style->num_columns - ctxt->column_spacing;
-
- ctxt->letter_heading_font = pango_font_description_new ();
- pango_font_description_set_family (
- ctxt->letter_heading_font,
- pango_font_description_get_family (
- ctxt->style->headings_font));
- pango_font_description_set_size (
- ctxt->letter_heading_font,
- pango_font_description_get_size (
- ctxt->style->headings_font) * 1.5);
-
- if (ctxt->book != NULL)
- load_contacts (ctxt);
-}
-
-static void
contact_draw (EContact *contact, EContactPrintContext *ctxt)
{
GtkPageSetup *setup;
@@ -638,11 +605,71 @@ contact_draw (EContact *contact, EContactPrintContext *ctxt)
}
static void
+free_contacts (EContactPrintContext *ctxt)
+{
+ g_list_foreach (ctxt->contact_list, (GFunc) g_object_unref, NULL);
+ g_list_free (ctxt->contact_list);
+}
+
+static void
+contact_begin_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ EContactPrintContext *ctxt)
+{
+ GtkPageSetup *setup;
+ gdouble page_width;
+
+ e_contact_build_style (ctxt->style);
+
+ setup = gtk_print_context_get_page_setup (context);
+ page_width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+
+ ctxt->context = context;
+ ctxt->x = ctxt->y = .0;
+ ctxt->column = 0;
+ ctxt->first_contact = TRUE;
+ ctxt->first_section = TRUE;
+ ctxt->section = NULL;
+
+ ctxt->column_spacing = gtk_print_context_get_dpi_x (context) / 4;
+ ctxt->column_width = (page_width + ctxt->column_spacing) /
+ ctxt->style->num_columns - ctxt->column_spacing;
+
+ ctxt->letter_heading_font = pango_font_description_new ();
+ pango_font_description_set_family (
+ ctxt->letter_heading_font,
+ pango_font_description_get_family (
+ ctxt->style->headings_font));
+ pango_font_description_set_size (
+ ctxt->letter_heading_font,
+ pango_font_description_get_size (
+ ctxt->style->headings_font) * 1.5);
+
+ if (ctxt->book != NULL) {
+ load_contacts (ctxt);
+ ctxt->page_nr = -1;
+ ctxt->pages = 1;
+ g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt);
+ gtk_print_operation_set_n_pages (operation, ctxt->pages);
+ }
+}
+
+static void
contact_draw_page (GtkPrintOperation *operation,
GtkPrintContext *context,
gint page_nr,
EContactPrintContext *ctxt)
{
+ /* only text on page_nr == pages will be drawn, the pages is recalculated */
+ ctxt->page_nr = page_nr;
+ ctxt->pages = 0;
+
+ ctxt->x = ctxt->y = .0;
+ ctxt->column = 0;
+ ctxt->first_contact = TRUE;
+ ctxt->first_section = TRUE;
+ ctxt->section = NULL;
+
g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt);
}
@@ -681,6 +708,8 @@ e_contact_print (EBook *book, EBookQuery *query,
ctxt.contact_list = contact_list;
}
ctxt.style = &style;
+ ctxt.page_nr = 0;
+ ctxt.pages = 0;
operation = e_print_operation_new ();
gtk_print_operation_set_n_pages (operation, 1);
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 34f3667662..60b5e5f62e 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,13 @@
+2008-07-30 Milan Crha <mcrha@redhat.com>
+
+ ** Fix for bug #211267
+
+ * gui/print.c: (bound_text), (print_attendees), (print_day_event),
+ (print_todo_details), (print_comp_draw_real), (print_comp_draw_page),
+ (print_comp_begin_print), (print_comp): When printing only one event,
+ then divide it to more pages if required, also word-wrap description
+ text if necessary to fit the page.
+
2008-07-29 Milan Crha <mcrha@redhat.com>
** Fix for bug #329821
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
index f208d62bde..9caf4fbdf9 100644
--- a/calendar/gui/print.c
+++ b/calendar/gui/print.c
@@ -710,9 +710,10 @@ print_month_small (GtkPrintContext *context, GnomeCalendar *gcal, time_t month,
static double
bound_text (GtkPrintContext *context,
PangoFontDescription *font,
- const gchar *text,
+ const gchar *text, gint len,
gdouble x1, gdouble y1,
- gdouble x2, gdouble y2)
+ gdouble x2, gdouble y2,
+ gboolean can_wrap, gdouble *last_page_start, gint *pages)
{
PangoLayout *layout;
gint layout_width, layout_height;
@@ -722,23 +723,38 @@ bound_text (GtkPrintContext *context,
layout = gtk_print_context_create_pango_layout (context);
pango_layout_set_font_description (layout, font);
- pango_layout_set_text (layout, text, -1);
+ pango_layout_set_text (layout, text, len);
pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+
+ if (can_wrap)
+ pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR);
+
pango_layout_get_size (layout, &layout_width, &layout_height);
- cairo_save (cr);
+ if (last_page_start && y1 + pango_units_to_double (layout_height) > y2 + (*last_page_start)) {
+ /* draw this on new page */
+ if (pages)
+ *pages = *pages + 1;
- /* Set a clipping rectangle. */
- cairo_move_to (cr, x1, y1);
- cairo_rectangle (cr, x1, y1, x2, y2);
- cairo_clip (cr);
- cairo_new_path (cr);
+ *last_page_start = *last_page_start + y2;
+ y1 = *last_page_start + 10.0;
+ }
- cairo_move_to (cr, x1, y1);
- pango_cairo_show_layout (cr, layout);
- cairo_stroke (cr);
+ if (!last_page_start || (y1 >= 0.0 && y1 < y2)) {
+ cairo_save (cr);
- cairo_restore (cr);
+ /* Set a clipping rectangle. */
+ cairo_move_to (cr, x1, y1);
+ cairo_rectangle (cr, x1, y1, x2, y2);
+ cairo_clip (cr);
+ cairo_new_path (cr);
+
+ cairo_move_to (cr, x1, y1);
+ pango_cairo_show_layout (cr, layout);
+ cairo_stroke (cr);
+
+ cairo_restore (cr);
+ }
g_object_unref (layout);
@@ -992,7 +1008,7 @@ get_role_as_string (icalparameter_role role)
static double
print_attendees (GtkPrintContext *context, PangoFontDescription *font, cairo_t *cr,
double left, double right, double top, double bottom,
- ECalComponent *comp)
+ ECalComponent *comp, gint page_nr, gint *pages)
{
GSList *attendees = NULL, *l;
@@ -1035,7 +1051,7 @@ print_attendees (GtkPrintContext *context, PangoFontDescription *font, cairo_t *
cairo_show_page (cr);
}
- top = bound_text (context, font, text->str, left + 40.0, top, right, bottom);
+ top = bound_text (context, font, text->str, -1, left + 40.0, top, right, bottom, FALSE, NULL, pages);
g_string_free (text, TRUE);
}
@@ -1213,7 +1229,7 @@ print_day_event (GtkPrintContext *context, PangoFontDescription *font,
g_free (t);
}
- bound_text (context, font, text, x1 + 2, y1, x2 - 2, y2);
+ bound_text (context, font, text, -1, x1 + 2, y1, x2 - 2, y2, FALSE, NULL, NULL);
if (free_text)
g_free (text);
@@ -2014,8 +2030,8 @@ print_todo_details (GtkPrintContext *context, GnomeCalendar *gcal,
cairo_stroke (cr);
}
- y = bound_text (context, font_summary, summary.value,
- x + 14, y + 4, xend, yend);
+ y = bound_text (context, font_summary, summary.value, -1,
+ x + 14, y + 4, xend, yend, FALSE, NULL, NULL);
y += get_font_size (font_summary)-5;
@@ -2404,8 +2420,9 @@ print_calendar (GnomeCalendar *gcal, GtkPrintOperationAction action,
g_object_unref (operation);
}
-static void
-print_comp_draw_page (GtkPrintOperation *operation,
+/* returns number of required pages, when page_nr is -1 */
+static gint
+print_comp_draw_real (GtkPrintOperation *operation,
GtkPrintContext *context,
gint page_nr,
PrintCompItem *pci)
@@ -2423,14 +2440,25 @@ print_comp_draw_page (GtkPrintOperation *operation,
char *categories_string, *location_string, *summary_string;
double header_size;
cairo_t *cr;
- gdouble width, height;
+ gdouble width, height, page_start;
double top;
+ gint pages = 1;
setup = gtk_print_context_get_page_setup (context);
width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+ top = 0.0;
+
+ /* either draw only the right page or do not draw anything when calculating number of pages */
+ if (page_nr != -1)
+ top = top - ((page_nr) * height);
+ else
+ top = height;
+
+ page_start = top;
+
/* PrintCompItem structure contains elements to be used
* with the Print Context , obtained in comp_draw_page
*/
@@ -2447,27 +2475,30 @@ print_comp_draw_page (GtkPrintOperation *operation,
else if (vtype == E_CAL_COMPONENT_JOURNAL)
title = _("Memo");
else
- return;
+ return pages;
cr = gtk_print_context_get_cairo_context (context);
/* Print the title in a box at the top of the page. */
font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
header_size = 40;
- print_border (context, 0.0, width, 0.0, header_size,
- 1.0, 0.9);
- print_text (context, font, title, PANGO_ALIGN_CENTER, 0.0, width,
- 0.1, header_size - 0.1);
- pango_font_description_free (font);
- top = header_size + 30;
+ if (page_nr == 0) {
+ print_border (context, 0.0, width, 0.0, header_size,
+ 1.0, 0.9);
+ print_text (context, font, title, PANGO_ALIGN_CENTER, 0.0, width,
+ 0.1, header_size - 0.1);
+ pango_font_description_free (font);
+ }
+
+ top += header_size + 30;
/* Summary */
font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
e_cal_component_get_summary (comp, &text);
summary_string = g_strdup_printf (_("Summary: %s"), text.value);
- top = bound_text (context, font, summary_string, 0.0, top, width,
- height);
+ top = bound_text (context, font, summary_string, -1, 0.0, top, width,
+ height, FALSE, &page_start, &pages);
g_free (summary_string);
@@ -2476,21 +2507,22 @@ print_comp_draw_page (GtkPrintOperation *operation,
if (location && location[0]) {
location_string = g_strdup_printf (_("Location: %s"),
location);
- top = bound_text (context, font, location_string, 0.0,
- top + 3, width, height);
+ top = bound_text (context, font, location_string, -1, 0.0,
+ top + 3, width, height, FALSE, &page_start, &pages);
g_free (location_string);
}
/* Date information */
- print_date_label (context, comp, client, 0.0, width, top + 3, top + 15);
+ if (page_nr == 0)
+ print_date_label (context, comp, client, 0.0, width, top + 3, top + 15);
top += 20;
/* Attendees */
if (e_cal_component_has_attendees (comp)) {
- top = bound_text (context, font, _("Attendees: "), 0.0, top, width, height);
+ top = bound_text (context, font, _("Attendees: "), -1, 0.0, top, width, height, FALSE, &page_start, &pages);
pango_font_description_free (font);
font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
- top = print_attendees (context, font, cr, 0.0, width, top, height, comp);
+ top = print_attendees (context, font, cr, 0.0, width, top, height, comp, page_nr, &pages);
top += get_font_size (font) - 6;
}
@@ -2529,8 +2561,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
if (status_string) {
char *status_text = g_strdup_printf (_("Status: %s"),
status_string);
- top = bound_text (context, font, status_text,
- 0.0, top, width, height);
+ top = bound_text (context, font, status_text, -1,
+ 0.0, top, width, height, FALSE, &page_start, &pages);
top += get_font_size (font) - 6;
g_free (status_text);
}
@@ -2545,8 +2577,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
e_cal_component_free_priority (priority);
pri_text = g_strdup_printf (_("Priority: %s"), priority_string);
- top = bound_text (context, font, pri_text,
- 0.0, top, width, height);
+ top = bound_text (context, font, pri_text, -1,
+ 0.0, top, width, height, FALSE, &page_start, &pages);
top += get_font_size (font) - 6;
g_free (pri_text);
}
@@ -2559,8 +2591,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
percent_string = g_strdup_printf (_("Percent Complete: %i"), *percent);
e_cal_component_free_percent (percent);
- top = bound_text (context, font, percent_string,
- 0.0, top, width, height);
+ top = bound_text (context, font, percent_string, -1,
+ 0.0, top, width, height, FALSE, &page_start, &pages);
top += get_font_size (font) - 6;
}
@@ -2571,8 +2603,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
char *url_string = g_strdup_printf (_("URL: %s"),
url);
- top = bound_text (context, font, url_string,
- 0.0, top, width, height);
+ top = bound_text (context, font, url_string, -1,
+ 0.0, top, width, height, TRUE, &page_start, &pages);
top += get_font_size (font) - 6;
g_free (url_string);
}
@@ -2583,8 +2615,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
if (categories && categories[0]) {
categories_string = g_strdup_printf (_("Categories: %s"),
categories);
- top = bound_text (context, font, categories_string,
- 0.0, top, width, height);
+ top = bound_text (context, font, categories_string, -1,
+ 0.0, top, width, height, TRUE, &page_start, &pages);
top += get_font_size (font) - 6 ;
g_free (categories_string);
}
@@ -2602,8 +2634,8 @@ print_comp_draw_page (GtkPrintOperation *operation,
}
e_cal_component_free_text_list (contact_list);
- top = bound_text (context, font, contacts->str,
- 0.0, top, width, height);
+ top = bound_text (context, font, contacts->str, -1,
+ 0.0, top, width, height, TRUE, &page_start, &pages);
top += get_font_size (font) - 6;
g_string_free (contacts, TRUE);
}
@@ -2612,19 +2644,48 @@ print_comp_draw_page (GtkPrintOperation *operation,
/* Description */
e_cal_component_get_description_list (comp, &desc);
for (l = desc; l != NULL; l = l->next) {
- ECalComponentText *text = l->data;
- if (top > height) {
- top = 10; //FIXME
- cairo_show_page (cr);
+ ECalComponentText *ptext = l->data;
+ const char *line, *next_line;
+
+ for (line = ptext->value; line != NULL; line = next_line) {
+ next_line = strchr (line, '\n');
+
+ top = bound_text (context, font, line, next_line ? next_line - line : -1, 0.0, top + 3, width, height, TRUE, &page_start, &pages);
+
+ if (next_line) {
+ next_line ++;
+ if (!*next_line)
+ next_line = NULL;
+ }
}
- if (text->value != NULL)
- top = bound_text (context, font, text->value, 0.0, top + 3, width, height) + 30;
}
e_cal_component_free_text_list (desc);
pango_font_description_free (font);
+ return pages;
+}
+
+static void
+print_comp_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PrintCompItem *pci)
+{
+ print_comp_draw_real (operation, context, page_nr, pci);
+}
+
+static void
+print_comp_begin_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ PrintCompItem *pci)
+{
+ gint pages;
+
+ pages = print_comp_draw_real (operation, context, -1, pci);
+
+ gtk_print_operation_set_n_pages (operation, pages);
}
void
@@ -2642,6 +2703,10 @@ print_comp (ECalComponent *comp, ECal *client, GtkPrintOperationAction action)
gtk_print_operation_set_n_pages (operation, 1);
g_signal_connect (
+ operation, "begin-print",
+ G_CALLBACK (print_comp_begin_print), &pci);
+
+ g_signal_connect (
operation, "draw-page",
G_CALLBACK (print_comp_draw_page), &pci);