aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/print.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2007-04-20 14:57:55 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2007-04-20 14:57:55 +0800
commit4a044a636e418f4c95a85819aa92316e21f58b35 (patch)
treefed737c87045e269aa840b770172fb798682fd10 /calendar/gui/print.c
parentba064da784cd29692e0db6d4560c7e7a8c68aeeb (diff)
downloadgsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.gz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.bz2
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.lz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.xz
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.tar.zst
gsoc2013-evolution-4a044a636e418f4c95a85819aa92316e21f58b35.zip
Clean up printing in Evolution (bug #426816)
svn path=/trunk/; revision=33440
Diffstat (limited to 'calendar/gui/print.c')
-rw-r--r--calendar/gui/print.c1339
1 files changed, 481 insertions, 858 deletions
diff --git a/calendar/gui/print.c b/calendar/gui/print.c
index 5dbff11c0a..4e158121cb 100644
--- a/calendar/gui/print.c
+++ b/calendar/gui/print.c
@@ -32,19 +32,11 @@
#include <string.h>
#include <time.h>
#include <glib.h>
-#include <gtk/gtkradiobutton.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-uidefs.h>
#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
#include <libedataserver/e-time-utils.h>
#include <libedataserver/e-data-server-util.h>
#include <e-util/e-util.h>
@@ -62,135 +54,47 @@
#include "gnome-cal.h"
#include "print.h"
-#include <libgnomeprint/gnome-print-pango.h>
#include <glade/glade-xml.h>
-#include <gtk/gtkprintunixdialog.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkpagesetupunixdialog.h>
-#include <gtk/gtkprinter.h>
-
-typedef struct EvoCalendarPrintRenderer EvoCalendarPrintRenderer;
typedef struct PrintCompItem PrintCompItem;
-typedef struct PrintTableItem PrintTableItem;
typedef struct PrintCalItem PrintCalItem;
-struct EvoCalendarPrintRenderer
-{
- GtkPrintContext *pc;
-
- /* keep one of these around: */
- PangoLayout *pl;
-};
-
-struct PrintCompItem
-{
- EvoCalendarPrintRenderer *pr;
- struct ECal *client;
- struct ECalComponent *comp;
- double r,l,b,t;
-};
-
-struct PrintCalItem
-{
- EvoCalendarPrintRenderer *pr;
- struct GnomeCalendar *gcal;
- PrintView default_view;
- double r,l,b,t;
- time_t date;
+struct PrintCompItem {
+ struct ECal *client;
+ struct ECalComponent *comp;
};
-struct PrintTableItem
-{
- struct EPrintable *printable;
- double left_margin,bottom_margin,paper_width,paper_height;
- GtkPrintContext *context;
+struct PrintCalItem {
+ struct GnomeCalendar *gcal;
+ time_t start;
};
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc, PrintCompItem *pci);
-
-static void
-comp_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr,
- PrintCompItem *pci);
-static void
-cal_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr,
- PrintCalItem *pcali);
-static void
-table_draw_page (GtkPrintOperation *print,
- GtkPrintContext *context,
- gint page_nr1,
- PrintTableItem *pti);
-
static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
+evo_calendar_print_renderer_get_width (GtkPrintContext *context,
PangoFontDescription *font,
- const char *text);
-
-GObject* create_custom_widget (GtkPrintOperation *print, GtkWidget *range);
-static void apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi);
-static PrintCalItem *
-evo_calendar_print_cal_data_new (GtkPrintContext *pc, PrintCalItem *pcali)
-{
- g_return_val_if_fail (pc, NULL);
-
- pcali->pr = g_new0 (EvoCalendarPrintRenderer, 1);
- pcali->pr->pc = pc;
- pcali->pr->pl = gtk_print_context_create_pango_layout (pc);
-
- return pcali;
-}
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc,PrintCompItem *pci)
-{
- g_return_val_if_fail (pc, NULL);
-
- pci->pr = g_new0 (EvoCalendarPrintRenderer, 1);
- pci->pr->pc = pc;
- pci->pr->pl = gtk_print_context_create_pango_layout (pc);
-
- return pci;
-}
-
-static void
-evo_calendar_print_data_free (EvoCalendarPrintRenderer *pr)
+ const char *text)
{
- g_return_if_fail (pr);
-
- g_assert (pr->pl);
- g_object_unref (G_OBJECT (pr->pl));
-
- g_free (pr);
-}
+ PangoLayout *layout;
+ gint layout_width, layout_height;
+ layout = gtk_print_context_create_pango_layout (context);
-static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
- PangoFontDescription *font,
- const char *text)
-{
- int w, h;
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_indent (layout, 0);
+ pango_layout_get_size (layout, &layout_width, &layout_height);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_indent (pr->pl, 0);
- pango_layout_get_size (pr->pl, &w, &h);
+ g_object_unref (layout);
- return w/(double)PANGO_SCALE;
+ return pango_units_to_double (layout_width);
}
-
static double
get_font_size (PangoFontDescription *font)
{
g_return_val_if_fail (font, 0.0);
- return ((double)pango_font_description_get_size (font)/(double)PANGO_SCALE);
+ return pango_units_to_double (pango_font_description_get_size (font));
}
@@ -208,8 +112,7 @@ get_font_size (PangoFontDescription *font)
#define TEMP_MARGIN .05
/* The fonts to use */
-#define REGULAR_FONT "Sans Regular"
-#define BOLD_FONT "Sans Bold"
+#define FONT_FAMILY "Sans"
/* The font size to use for normal text. */
#define DAY_NORMAL_FONT_SIZE 12
@@ -298,19 +201,6 @@ struct psinfo
double header_row_height;
};
-struct ptinfo
-{
- GList *todos;
-};
-
-struct einfo
-{
- char *text;
- time_t start;
- time_t end;
- int count;
-};
-
/* Convenience function to help the transition to timezone functions.
It converts a time_t to a struct tm. */
static struct tm*
@@ -386,39 +276,22 @@ build_month (int month, int year, int *days, int *start, int *end)
}
static PangoFontDescription *
-get_font_for_size (EvoCalendarPrintRenderer *pr, double h, GnomeFontWeight weight, gboolean italic)
+get_font_for_size (double height, PangoWeight weight)
{
- PangoFontDescription *font_desc;
- gchar *font_name;
-
- if (weight <= GNOME_FONT_BOOK)
- font_name = REGULAR_FONT;
- else
- font_name = BOLD_FONT;
-
- if (italic)
- font_name = g_strconcat (font_name, " Italic", NULL);
-
- font_desc = pango_font_description_from_string (font_name);
+ PangoFontDescription *desc;
+ gint size;
#define MAGIC_SCALE_FACTOR (0.86)
- pango_font_description_set_size (font_desc,
- h * MAGIC_SCALE_FACTOR * PANGO_SCALE );
+ size = pango_units_from_double (height * MAGIC_SCALE_FACTOR);
- if (italic)
- g_free (font_name);
+ desc = pango_font_description_new ();
+ pango_font_description_set_size (desc, size);
+ pango_font_description_set_weight (desc, weight);
+ pango_font_description_set_family_static (desc, FONT_FAMILY);
- return font_desc;
+ return desc;
}
-enum align_box {
- ALIGN_LEFT=1,
- ALIGN_RIGHT,
- ALIGN_CENTER,
- ALIGN_BORDER= 1<<8
-};
-
-
/* Prints a rectangle, with or without a border, filled or outline, and
possibly with triangular arrows at one or both horizontal edges.
width = width of border, -ve means no border.
@@ -427,32 +300,33 @@ enum align_box {
point of triangle, or -ve for no triangle. */
static void
print_border_with_triangles (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue,
- double left_triangle_width,
- double right_triangle_width)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble red, gdouble green, gdouble blue,
+ gdouble left_triangle_width,
+ gdouble right_triangle_width)
{
- cairo_t *cr;
+ cairo_t *cr = gtk_print_context_get_cairo_context (pc);
- cr = gtk_print_context_get_cairo_context (pc);
cairo_save (cr);
/* Fill in the interior of the rectangle, if desired. */
if (red >= -EPSILON && green >= -EPSILON && blue >= -EPSILON) {
- cairo_move_to (cr, l, t);
+ cairo_move_to (cr, x1, y1);
if (left_triangle_width > 0.0)
- cairo_line_to (cr, l - left_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x1 - left_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
+ cairo_line_to (cr, x1, y2);
+ cairo_line_to (cr, x2, y2);
if (right_triangle_width > 0.0)
- cairo_line_to (cr, r + right_triangle_width, (t + b) / 2);
+ cairo_line_to (cr, x2 + right_triangle_width, (y1 + y2) / 2);
- cairo_line_to (cr, r, t);
+ cairo_line_to (cr, x2, y1);
cairo_close_path (cr);
cairo_set_source_rgb (cr, red, green, blue);
cairo_fill (cr);
@@ -461,28 +335,27 @@ print_border_with_triangles (GtkPrintContext *pc,
}
/* Draw the outline, if desired. */
- if (width >= -EPSILON) {
+ if (line_width >= -EPSILON) {
cr = gtk_print_context_get_cairo_context (pc);
- cairo_move_to (cr, l, t);
+ cairo_move_to (cr, x1, y1);
if (left_triangle_width > 0.0)
- cairo_line_to (cr, l - left_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x1 - left_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
+ cairo_line_to (cr, x1, y2);
+ cairo_line_to (cr, x2, y2);
if (right_triangle_width > 0.0)
- cairo_line_to (cr, r + right_triangle_width,
- (t + b) / 2);
+ cairo_line_to (cr, x2 + right_triangle_width,
+ (y1 + y2) / 2);
- cairo_line_to (cr, r, t);
+ cairo_line_to (cr, x2, y1);
cairo_close_path (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_set_line_width (cr, width);
+ cairo_set_line_width (cr, line_width);
cairo_stroke (cr);
-
}
cairo_restore (cr);
@@ -494,35 +367,39 @@ print_border_with_triangles (GtkPrintContext *pc,
fillcolor = shade of fill, -ve means no fill. */
static void
print_border_rgb (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double red, double green, double blue)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble red, gdouble green, gdouble blue)
{
- print_border_with_triangles (pc, l, r, t, b, width, red, green, blue, -1.0, -1.0);
+ print_border_with_triangles (
+ pc, x1, x2, y1, y2, line_width,
+ red, green, blue, -1.0, -1.0);
}
static void
print_border (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double width, double fillcolor)
+ gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2,
+ gdouble line_width,
+ gdouble fillcolor)
{
- print_border_rgb (pc, l, r, t, b, width, fillcolor, fillcolor, fillcolor);
+ print_border_rgb (
+ pc, x1, x2, y1, y2, line_width,
+ fillcolor, fillcolor, fillcolor);
}
static void
-print_rectangle (GtkPrintContext *pc,
- double l, double r, double t, double b,
- double red, double green, double blue)
+print_rectangle (GtkPrintContext *context,
+ gdouble x, gdouble y,
+ gdouble width, gdouble height,
+ gdouble red, gdouble green, gdouble blue)
{
- cairo_t *cr;
-
- cr = gtk_print_context_get_cairo_context (pc);
+ cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
cairo_save (cr);
- cairo_move_to (cr, l, t);
- cairo_line_to (cr, l, b);
- cairo_line_to (cr, r, b);
- cairo_line_to (cr, r, t);
- cairo_close_path (cr);
+ cairo_rectangle (cr, x, y, width, height);
cairo_set_source_rgb (cr, red, green, blue);
cairo_fill (cr);
@@ -530,74 +407,62 @@ print_rectangle (GtkPrintContext *pc,
}
/* Prints 1 line of aligned text in a box. It is centered vertically, and
- the horizontal alignment can be either ALIGN_LEFT, ALIGN_RIGHT, or
- ALIGN_CENTER. */
+ the horizontal alignment can be either PANGO_ALIGN_LEFT, PANGO_ALIGN_RIGHT,
+ or PANGO_ALIGN_CENTER. */
static double
-print_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text (GtkPrintContext *context, PangoFontDescription *desc,
+ const char *text, PangoAlignment alignment,
+ gdouble x1, gdouble x2, gdouble y1, gdouble y2)
{
- double w, x;
- int pw, ph;
+ PangoLayout *layout;
+ gint layout_width, layout_height;
cairo_t *cr;
- cr = gtk_print_context_get_cairo_context (pr->pc);
- cairo_save (cr);
+ cr = gtk_print_context_get_cairo_context (context);
+ layout = gtk_print_context_create_pango_layout (context);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_width (pr->pl, -1); /* ensure no line-wrapping occurs */
- pango_layout_set_indent (pr->pl, 0);
- pango_layout_get_size (pr->pl, &pw, &ph);
- w = pw/(double)PANGO_SCALE;
-
- switch (align & 3) {
- case ALIGN_LEFT:
- default:
- x = l;
- break;
- case ALIGN_RIGHT:
- x = r - w;
- break;
- case ALIGN_CENTER:
- x = l + ((r - l) - w) / 2;
- break;
- }
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_alignment (layout, alignment);
+ pango_layout_set_text (layout, text, -1);
- /* Make sure we don't go off the left edge. */
- x = MAX (l, x);
+ /* Grab the width before expanding the layout. */
+ pango_layout_get_size (layout, &layout_width, &layout_height);
+
+ pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+
+ cairo_save (cr);
/* Set a clipping rectangle. */
- cairo_move_to (cr, l, t);
- cairo_rectangle (cr, l, t, r, b);
+ cairo_move_to (cr, x1, y1);
+ cairo_rectangle (cr, x1, y1, x2, y2);
cairo_clip (cr);
cairo_new_path (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_move_to (cr, x, t);
- pango_cairo_show_layout (cr, pr->pl);
+ cairo_move_to (cr, x1, y1);
+ pango_cairo_show_layout (cr, layout);
cairo_stroke(cr);
+
cairo_restore (cr);
- return w;
+ g_object_unref (layout);
+
+ return pango_units_to_double (layout_width);
}
-/* gets/frees the font for you, as a book font */
+/* gets/frees the font for you, as a normal font */
static double
-print_text_size(EvoCalendarPrintRenderer *pr, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text_size (GtkPrintContext *context, const char *text,
+ PangoAlignment alignment, gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2)
{
PangoFontDescription *font;
double w;
-
- if(t > b)
- font = get_font_for_size (pr,t - b, GNOME_FONT_BOOK, FALSE);
- else
- {
- font = get_font_for_size (pr, b - t , GNOME_FONT_BOOK, FALSE);
- }
- w = print_text(pr, font, text, align, l, r, t, b);
+
+ font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_NORMAL);
+ w = print_text (context, font, text, alignment, x1, x2, y1, y2);
pango_font_description_free (font);
return w;
@@ -605,42 +470,36 @@ print_text_size(EvoCalendarPrintRenderer *pr, const char *text,
/* gets/frees the font for you, as a bold font */
static double
-print_text_size_bold(EvoCalendarPrintRenderer *pr, const char *text,
- enum align_box align, double l, double r, double t, double b)
+print_text_size_bold (GtkPrintContext *context, const char *text,
+ PangoAlignment alignment, gdouble x1, gdouble x2,
+ gdouble y1, gdouble y2)
{
PangoFontDescription *font;
double w;
- if (t > b)
- font = get_font_for_size (pr, t - b , GNOME_FONT_BOLD, FALSE);
- else
- font = get_font_for_size (pr, b - t, GNOME_FONT_BOLD, FALSE);
-
- w = print_text(pr, font, text, align, l, r, t, b);
+ font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_BOLD);
+ w = print_text (context, font, text, alignment, x1, x2, y1, y2);
pango_font_description_free (font);
return w;
}
static void
-titled_box (EvoCalendarPrintRenderer *pr, const char *text, PangoFontDescription *font,
- enum align_box align, double *l, double *r, double *t, double *b,
- double linewidth)
+titled_box (GtkPrintContext *context, const char *text,
+ PangoFontDescription *font, PangoAlignment alignment,
+ gdouble *x1, gdouble *y1, gdouble *x2, gdouble *y2,
+ gdouble linewidth)
{
double size;
size = get_font_size (font);
- if (align & ALIGN_BORDER) {
- print_border (pr->pc, *l, *r, *t, *t + size * 1.4,
- linewidth, 0.9);
- print_border (pr->pc, *l, *r, *t + size * 1.4, *b,
- linewidth, -1.0);
- *l += 2;
- *r -= 2;
- *b += 2;
- }
- print_text (pr, font, text, align, *l, *r, *t, *t + size * 1.4);
- *t += size * 1.4;
+ print_border (context, *x1, *x2, *y1, *y1 + size * 1.4, linewidth, 0.9);
+ print_border (context, *x1, *x2, *y1 + size * 1.4, *y2, linewidth, -1.0);
+ *x1 += 2;
+ *x2 -= 2;
+ *y2 += 2;
+ print_text (context, font, text, alignment, *x1, *x2, *y1, *y1 + size * 1.4);
+ *y1 += size * 1.4;
}
enum datefmt {
@@ -714,8 +573,8 @@ instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gp
print out the month small, embolden any days with events.
*/
static void
-print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t month,
- double left, double right, double top, double bottom,
+print_month_small (GtkPrintContext *context, GnomeCalendar *gcal, time_t month,
+ gdouble x1, gdouble y1, gdouble x2, gdouble y2,
int titleflags, time_t greystart, time_t greyend,
int bordertitle)
{
@@ -731,7 +590,7 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
double header_size, col_width, row_height, text_xpad, w;
double cell_top, cell_bottom, cell_left, cell_right, text_right;
- /* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=Thursday */
+ /* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=thursday */
char *daynames[] = { N_("Su"), N_("Mo"), N_("Tu"), N_("We"),
N_("Th"), N_("Fr"), N_("Sa") };
cairo_t *cr;
@@ -739,29 +598,21 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
/* Print the title, e.g. 'June 2001', in the top 16% of the area. */
format_date (month, titleflags, buf, 100);
- if(top < bottom)
- header_size = (bottom - top) * 0.16;
- else
- header_size = (top - bottom) * 0.16;
+ header_size = ABS (y2 - y1) * 0.16;
- font = get_font_for_size (pr, header_size, GNOME_FONT_BOLD, FALSE);
- if (bordertitle) {
- print_border (pr->pc, left, right, top, top + header_size,
- 1.0, 0.9);
- }
- print_text (pr, font, buf, ALIGN_CENTER, left, right,
- top, top + header_size);
+ font = get_font_for_size (header_size, PANGO_WEIGHT_BOLD);
+ if (bordertitle)
+ print_border (context, x1, x2, y1, y1 + header_size, 1.0, 0.9);
+ print_text (context, font, buf, PANGO_ALIGN_CENTER, x1, x2,
+ y1, y1 + header_size);
pango_font_description_free (font);
- top += header_size;
- col_width = (right - left) / 7;
+ y1 += header_size;
+ col_width = (x2 - x1) / 7;
/* The top row with the day abbreviations gets an extra bit of
vertical space around it. */
- if (bottom > top )
- row_height = (bottom - top) / 7.4;
- else
- row_height = (top - bottom ) / 7.4;
+ row_height = ABS (y2 - y1) / 7.4;
/* First we need to calculate a reasonable font size. We start with a
rough guess of just under the height of each row. */
@@ -779,39 +630,41 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
tm = *convert_timet_to_struct_tm (month, zone);
build_month (tm.tm_mon, tm.tm_year + 1900, days, 0, 0);
- font_normal = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
- font_bold = get_font_for_size (pr, font_size, GNOME_FONT_BOLD, FALSE);
+ font_normal = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
+ font_bold = get_font_for_size (font_size, PANGO_WEIGHT_BOLD);
/* Get a reasonable estimate of the largest number we will need,
and use it to calculate the offset from the right edge of the
cell that we should put the numbers. */
- w = evo_calendar_print_renderer_get_width (pr, font_bold, "23");
+ w = evo_calendar_print_renderer_get_width (context, font_bold, "23");
text_xpad = (col_width - w) / 2;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
/* Print the abbreviated day names across the top in bold. */
week_start_day = calendar_config_get_week_start_day ();
weekday = week_start_day;
for (x = 0; x < 7; x++) {
- print_text (pr, font_bold, _(daynames[weekday]), ALIGN_CENTER,
- left + x * col_width, left + (x + 1) * col_width,
- top, top + row_height * 1.4);
+ print_text (
+ context, font_bold,
+ _(daynames[weekday]), PANGO_ALIGN_RIGHT,
+ x1 + x * col_width, x1 + (x + 1) * col_width,
+ y1, y1 + row_height * 1.4);
weekday = (weekday + 1) % 7;
}
- top += row_height * 1.4;
+ y1 += row_height * 1.4;
now = time_month_begin_with_zone (month, zone);
for (y = 0; y < 6; y++) {
- cell_top = top + y * row_height;
+ cell_top = y1 + y * row_height;
cell_bottom = cell_top + row_height;
for (x = 0; x < 7; x++) {
- cell_left = left + x * col_width;
+ cell_left = x1 + x * col_width;
/* We add a 0.05 to make sure the cells meet up with
each other. Otherwise you sometimes get lines
between them which looks bad. Maybe I'm not using
@@ -834,12 +687,12 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
next = time_add_day_with_zone (now, 1, zone);
if ((now >= greystart && now < greyend)
|| (greystart >= now && greystart < next)) {
- print_border (pr->pc,
+ print_border (context,
cell_left, cell_right,
cell_top, cell_bottom,
-1.0, 0.75);
}
- print_text (pr, font, buf, ALIGN_RIGHT,
+ print_text (context, font, buf, PANGO_ALIGN_RIGHT,
cell_left, text_right,
cell_top, cell_bottom);
@@ -851,43 +704,49 @@ print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t mon
pango_font_description_free (font_bold);
}
-
/* wraps text into the print context, not taking up more than its allowed space */
static double
-bound_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
- double left, double right, double top, double bottom, double indent)
+bound_text (GtkPrintContext *context,
+ PangoFontDescription *font,
+ const gchar *text,
+ gdouble x1, gdouble y1,
+ gdouble x2, gdouble y2)
{
- /* Let Pango do all the work: */
- int w=0, h=0;
+ PangoLayout *layout;
+ gint layout_width, layout_height;
cairo_t *cr;
-
- cr = gtk_print_context_get_cairo_context (pr->pc);
+
+ cr = gtk_print_context_get_cairo_context (context);
+ layout = gtk_print_context_create_pango_layout (context);
+
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+ pango_layout_get_size (layout, &layout_width, &layout_height);
+
cairo_save (cr);
/* Set a clipping rectangle. */
- cairo_move_to (cr, left, top);
- cairo_rectangle (cr, left, top, right, bottom);
+ cairo_move_to (cr, x1, y1);
+ cairo_rectangle (cr, x1, y1, x2, y2);
cairo_clip (cr);
cairo_new_path (cr);
- pango_layout_set_font_description (pr->pl, font);
- pango_layout_set_text (pr->pl, text, -1);
- pango_layout_set_indent (pr->pl, indent * PANGO_SCALE);
- pango_layout_set_width (pr->pl, (right-left)*PANGO_SCALE);
-
- cairo_move_to (cr, left, top);
- pango_cairo_show_layout (cr, pr->pl);
+ cairo_move_to (cr, x1, y1);
+ pango_cairo_show_layout (cr, layout);
cairo_stroke (cr);
cairo_restore (cr);
- pango_layout_get_size (pr->pl, &w, &h);
- return top + ((double)h/(double)PANGO_SCALE);
+
+ g_object_unref (layout);
+
+ return y1 + pango_units_to_double (layout_height);
}
/* Draw the borders, lines, and times down the left of the day view. */
static void
-print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_day_background (GtkPrintContext *context, GnomeCalendar *gcal,
time_t whence, struct pdinfo *pdi,
double left, double right, double top, double bottom)
{
@@ -903,16 +762,16 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
cairo_t *cr;
/* Fill the time column in light-gray. */
- print_border (pr->pc, left, left + width, top, bottom, -1.0, 0.9);
+ print_border (context, left, left + width, top, bottom, -1.0, 0.9);
/* Draw the border around the entire view. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
- print_border (pr->pc, left, right, top, bottom, 1.0, -1.0);
+ print_border (context, left, right, top, bottom, 1.0, -1.0);
/* Draw the vertical line on the right of the time column. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_line_width (cr, 0.0);
cairo_move_to (cr, left + width, bottom);
cairo_line_to (cr, left + width, top);
@@ -928,12 +787,12 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
font_size = yinc * 0.6;
max_font_size = width * 0.5;
hour_font_size = MIN (font_size, max_font_size);
- font_hour = get_font_for_size (pr, hour_font_size, GNOME_FONT_BOLD, FALSE);
+ font_hour = get_font_for_size (hour_font_size, PANGO_WEIGHT_BOLD);
font_size = yinc * 0.33;
max_font_size = width * 0.25;
minute_font_size = MIN (font_size, max_font_size);
- font_minute = get_font_for_size (pr, minute_font_size, GNOME_FONT_BOLD, FALSE);
+ font_minute = get_font_for_size (minute_font_size, PANGO_WEIGHT_BOLD);
use_24_hour = calendar_config_get_24_hour_format ();
@@ -941,7 +800,7 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
hour_minute_x = left + width * 0.58;
for (i = pdi->start_hour; i < pdi->end_hour; i++) {
y = top + yinc * (row + 1) ;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
if (use_24_hour) {
@@ -960,16 +819,16 @@ print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
/* the hour label/minute */
sprintf (buf, "%d", hour);
- print_text (pr, font_hour, buf, ALIGN_RIGHT,
+ print_text (context, font_hour, buf, PANGO_ALIGN_RIGHT,
left, hour_minute_x,
y - yinc + yinc / 2, y - yinc + yinc / 2 + hour_font_size);
- print_text (pr, font_minute, minute, ALIGN_LEFT,
+ print_text (context, font_minute, minute, PANGO_ALIGN_LEFT,
hour_minute_x, left + width - 3,
y - yinc + yinc / 2, y - yinc + yinc / 2 + minute_font_size);
/* Draw the horizontal line between hours, across the entire
width of the day view. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, left, y);
cairo_line_to (cr, right, y);
cairo_set_line_width (cr, 1);
@@ -1096,7 +955,7 @@ free_event_array (GArray *array)
static void
-print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_long_event (GtkPrintContext *context, PangoFontDescription *font,
double left, double right, double top, double bottom,
double row_height, EDayViewEvent *event,
struct pdinfo *pdi, ECalModel *model)
@@ -1126,7 +985,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
y2 = y1 + row_height-7;
red = green = blue = 0.95;
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_with_triangles (pr->pc, x1, x2, y1, y2, 0.5, red, green, blue,
+ print_border_with_triangles (context, x1, x2, y1, y2, 0.5, red, green, blue,
left_triangle_width,
right_triangle_width);
@@ -1145,7 +1004,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x1 += 4;
- x1 += print_text (pr, font, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+ x1 += print_text (context, font, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
}
/* If the event ends before the end of the last day being printed,
@@ -1163,7 +1022,7 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x2 -= 4;
- x2 -= print_text (pr, font, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+ x2 -= print_text (context, font, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
}
/* Print the text. */
@@ -1172,12 +1031,12 @@ print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
x1 += 4;
x2 -= 4;
- print_text (pr, font, text, ALIGN_CENTER, x1, x2, y1, y2);
+ print_text (context, font, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
}
static void
-print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_event (GtkPrintContext *context, PangoFontDescription *font,
double left, double right, double top, double bottom,
EDayViewEvent *event, struct pdinfo *pdi, ECalModel *model)
{
@@ -1219,7 +1078,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
red = green = blue = 0.95;
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
- print_border_rgb (pr->pc, x1, x2, y1, y2, 1.0, red, green, blue);
+ print_border_rgb (context, x1, x2, y1, y2, 1.0, red, green, blue);
summary = icalcomponent_get_summary (event->comp_data->icalcomp);
text = summary ? (char*) summary : "";
@@ -1249,7 +1108,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
free_text = TRUE;
}
- bound_text (pr, font, text, x1 + 2, x2 - 2, y1, y2, 0);
+ bound_text (context, font, text, x1 + 2, y1, x2 - 2, y2);
if (free_text)
g_free (text);
@@ -1257,7 +1116,7 @@ print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
static void
-print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_day_details (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom)
{
icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1323,10 +1182,10 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
pdi.day_starts, &rows_in_top_display);
/*Print the long events. */
- font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
for (i = 0; i < pdi.long_events->len; i++) {
event = &g_array_index (pdi.long_events, EDayViewEvent, i);
- print_day_long_event (pr, font, left, right, top, bottom,
+ print_day_long_event (context, font, left, right, top, bottom,
DAY_VIEW_ROW_HEIGHT, event, &pdi, model);
}
@@ -1337,10 +1196,10 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY);
/* Draw the border around the long events. */
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
- print_border (pr->pc, left, right,
+ print_border (context, left, right,
top, top + rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4,
1.0, -1.0);
@@ -1348,7 +1207,7 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
top += rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 2;
/* Draw the borders, lines, and times down the left. */
- print_day_background (pr, gcal, whence, &pdi,
+ print_day_background (context, gcal, whence, &pdi,
left, right, top, bottom);
/* Now adjust to get rid of the time column. */
left += DAY_VIEW_TIME_COLUMN_WIDTH;
@@ -1364,11 +1223,11 @@ print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whe
else
max_font_size = ((bottom - top ) / pdi.rows) - 4;
font_size = MIN(DAY_NORMAL_FONT_SIZE, max_font_size);
- font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
for (i = 0; i < pdi.events[0]->len; i++) {
event = &g_array_index (pdi.events[0], EDayViewEvent, i);
- print_day_event (pr, font, left, right, top, bottom,
+ print_day_event (context, font, left, right, top, bottom,
event, &pdi, model);
}
@@ -1400,7 +1259,7 @@ print_is_one_day_week_event (EWeekViewEvent *event,
static void
-print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_long_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double x1, double x2, double y1, double y2,
EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1420,7 +1279,7 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
if (event->end > psi->day_starts[span->start_day + span->num_days])
right_triangle_width = 4;
- print_border_with_triangles (pr->pc, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
+ print_border_with_triangles (context, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
left_triangle_width,
right_triangle_width);
@@ -1439,7 +1298,7 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x1 += 4;
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
}
/* If the event ends before the end of the last day being printed,
@@ -1457,17 +1316,17 @@ print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
buffer, sizeof (buffer));
x2 -= 4;
- x2 -= print_text_size (pr, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+ x2 -= print_text_size (context, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
}
x1 += 4;
x2 -= 4;
- print_text_size (pr, text, ALIGN_CENTER, x1, x2, y1, y2);
+ print_text_size (context, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
}
static void
-print_week_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_day_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double x1, double x2, double y1, double y2,
EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1486,24 +1345,24 @@ print_week_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
buffer, sizeof (buffer));
- print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue);
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
- print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);
-
+ print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
+ print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);
+
date_tm.tm_hour = event->end_minute / 60;
date_tm.tm_min = event->end_minute % 60;
e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
buffer, sizeof (buffer));
- print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue);
- x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
- print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);
+ print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue);
+ x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
+ print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);
}
static void
-print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_event (GtkPrintContext *context, PangoFontDescription *font,
struct psinfo *psi,
double left, double top,
double cell_width, double cell_height,
@@ -1570,11 +1429,11 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
if (print_is_one_day_week_event (event, span,
psi->day_starts)) {
- print_week_day_event (pr, font, psi,
+ print_week_day_event (context, font, psi,
x1, x2, y1, y2,
event, span, text, red, green, blue);
} else {
- print_week_long_event (pr, font, psi,
+ print_week_long_event (context, font, psi,
x1, x2, y1, y2,
event, span, text, red, green, blue);
}
@@ -1584,7 +1443,8 @@ print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
static void
-print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_view_background (GtkPrintContext *context,
+ PangoFontDescription *font,
struct psinfo *psi,
double left, double top,
double cell_width, double cell_height)
@@ -1617,7 +1477,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
if (psi->multi_week_view && (tm.tm_mon != psi->month))
fillcolor = 0.9;
- print_border (pr->pc, x1, x2, y1, y2, 1.0, fillcolor);
+ print_border (context, x1, x2, y1, y2, 1.0, fillcolor);
if (psi->multi_week_view) {
if (tm.tm_mday == 1)
@@ -1625,7 +1485,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
else
format_string = "%d";
} else {
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, x1 + 0.1 * cell_width,
y1 + psi->header_row_height - 4);
@@ -1646,7 +1506,7 @@ print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *
e_utf8_strftime (buffer, sizeof (buffer), format_string, &tm);
- print_text_size (pr, buffer, ALIGN_RIGHT,
+ print_text_size (context, buffer, PANGO_ALIGN_RIGHT,
x1, x2 - 4, y1 + 2, y1 + 2 + font_size);
}
}
@@ -1698,7 +1558,7 @@ print_week_summary_cb (ECalComponent *comp,
}
static void
-print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_week_summary (GtkPrintContext *context, GnomeCalendar *gcal,
time_t whence, gboolean multi_week_view, int weeks_shown,
int month, double font_size,
double left, double right, double top, double bottom)
@@ -1776,14 +1636,14 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
psi.rows_per_compressed_cell = (cell_height - psi.header_row_height)
/ psi.row_height;
- font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
/* Draw the grid and the day names/numbers. */
- print_week_view_background (pr, font, &psi, left, top,
+ print_week_view_background (context, font, &psi, left, top,
cell_width, cell_height);
/* Print the events. */
for (event_num = 0; event_num < psi.events->len; event_num++) {
event = &g_array_index (psi.events, EWeekViewEvent, event_num);
- print_week_event (pr, font, &psi, left, top,
+ print_week_event (context, font, &psi, left, top,
cell_width, cell_height, model, event, spans);
}
@@ -1799,7 +1659,7 @@ print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
static void
-print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_year_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom,
int morerows)
{
@@ -1833,8 +1693,8 @@ print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t wh
for (col = 0; col < cols; col++) {
l = left + col_width * col;
r = l + col_width;
- print_month_small (pr, gcal, now,
- l + 8, r - 8, t - 8, b + 8,
+ print_month_small (context, gcal, now,
+ l + 8, t - 8, r - 8, b + 8,
DATE_MONTH, 0, 0, TRUE);
now = time_add_month_with_zone (now, 1, zone);
}
@@ -1842,7 +1702,7 @@ print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t wh
}
static void
-print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_month_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
double left, double right, double top, double bottom)
{
icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1880,7 +1740,7 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
tm = *convert_timet_to_struct_tm (date, zone);
tm.tm_mday = (tm.tm_mday % 7) + 7;
- font = get_font_for_size (pr, MONTH_NORMAL_FONT_SIZE, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (MONTH_NORMAL_FONT_SIZE, PANGO_WEIGHT_BOLD);
font_size = get_font_size (font);
columns = compress_weekend ? 6 : 7;
@@ -1903,8 +1763,8 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
x1 = left + cell_width * col;
x2 = x1 + cell_width;
- print_border (pr->pc, x1, x2, y1, y2, 1.0, -1.0);
- print_text_size (pr, buffer, ALIGN_CENTER, x1, x2, y1, y2);
+ print_border (context, x1, x2, y1, y2, 1.0, -1.0);
+ print_text_size (context, buffer, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
tm.tm_mday++;
tm.tm_wday = (tm.tm_wday + 1) % 7;
@@ -1912,14 +1772,14 @@ print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t w
pango_font_description_free (font);
top = y2;
- print_week_summary (pr, gcal, date, TRUE, 6, month,
+ print_week_summary (context, gcal, date, TRUE, 6, month,
MONTH_NORMAL_FONT_SIZE,
left, right, top, bottom);
}
static void
-print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_todo_details (GtkPrintContext *context, GnomeCalendar *gcal,
time_t start, time_t end,
double left, double right, double top, double bottom)
{
@@ -1938,16 +1798,16 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
table = e_calendar_table_get_table (task_pad);
model = e_calendar_table_get_model (task_pad);
- font_summary = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font_summary = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_set_line_width (cr, 0.0);
top +=2;
- titled_box (pr, _("Tasks"), font_summary, ALIGN_CENTER | ALIGN_BORDER,
- &left, &right, &top, &bottom, 1.0);
+ titled_box (context, _("Tasks"), font_summary, PANGO_ALIGN_CENTER,
+ &left, &top, &right, &bottom, 1.0);
y = top;
yend = bottom - 2;
@@ -1979,14 +1839,14 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
break;
/* Print the box to put the tick in. */
- print_border (pr->pc, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
+ print_border (context, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
/* If the task is complete, print a tick in the box. */
e_cal_component_get_completed (comp, &tt);
if (tt) {
e_cal_component_free_icaltimetype (tt);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_move_to (cr, x + 3, y + 11);
cairo_line_to (cr, x + 5, y + 14);
@@ -1995,12 +1855,12 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
cairo_stroke (cr);
}
- y = bound_text (pr, font_summary, summary.value,
- x + 14, xend, y+4, yend, 0);
+ y = bound_text (context, font_summary, summary.value,
+ x + 14, y + 4, xend, yend);
y += get_font_size (font_summary)-5;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
cairo_move_to (cr, x, y);
cairo_line_to (cr, xend, y);
cairo_set_line_width (cr, 1);
@@ -2012,146 +1872,53 @@ print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
pango_font_description_free (font_summary);
}
-
-/* Value for the PrintView enum */
-static const int print_view_map[] = {
- PRINT_VIEW_DAY,
- PRINT_VIEW_WEEK,
- PRINT_VIEW_MONTH,
- PRINT_VIEW_YEAR,
- -1
-};
-
-/* Creates the range selector widget for printing a calendar */
-static GtkWidget *
-range_selector_new (GtkWidget *dialog, time_t at, int *view)
-{
- icaltimezone *zone = calendar_config_get_icaltimezone ();
- GtkWidget *box;
- GtkWidget *radio;
- GSList *group;
- char text[1024];
- char str1[512];
- char str2[512];
- struct tm tm;
- time_t week_begin, week_end;
- struct tm week_begin_tm, week_end_tm;
- gint week_start_day;
-
- box = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
-
- tm = *convert_timet_to_struct_tm (at, zone);
-
- /* Day */
-
- e_utf8_strftime (text, sizeof (text), _("Selected day (%a %b %d %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (NULL, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Week */
-
- week_start_day = calendar_config_get_week_start_day ();
- week_begin = time_week_begin_with_zone (at, week_start_day, zone);
- /* If the week starts on a Sunday, we have to show the Saturday first,
- since the weekend is compressed. If the original date passed in was
- a Saturday, we need to move on to the next Saturday, else we move
- back to the last one. */
- if (week_start_day == 0) {
- if (tm.tm_wday == 6)
- week_begin = time_add_day_with_zone (week_begin, 6, zone);
- else
- week_begin = time_add_day_with_zone (week_begin, -1, zone);
- }
- week_end = time_add_day_with_zone (week_begin, 6, zone);
-
- week_begin_tm = *convert_timet_to_struct_tm (week_begin, zone);
- week_end_tm = *convert_timet_to_struct_tm (week_end, zone);
-
- if (week_begin_tm.tm_mon == week_end_tm.tm_mon) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %d %Y"), &week_end_tm);
- } else {
- if (week_begin_tm.tm_year == week_end_tm.tm_year) {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- } else {
- e_utf8_strftime (str1, sizeof (str1), _("%a %b %d %Y"), &week_begin_tm);
- e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
- }
- }
-
- g_snprintf (text, sizeof (text), _("Selected week (%s - %s)"), str1, str2);
-
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Month */
-
- e_utf8_strftime (text, sizeof (text), _("Selected month (%b %Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Year */
-
- e_utf8_strftime (text, sizeof (text), _("Selected year (%Y)"), &tm);
- radio = gtk_radio_button_new_with_label (group, text);
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio));
- gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
- /* Select default */
-
- e_dialog_widget_hook_value (dialog, radio, view, (gpointer) print_view_map);
-
- gtk_widget_show_all (box);
- return box;
-}
-
-
static void
-print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_day_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
int i, days = 1;
- double todo, header, l;
+ double todo, l;
char buf[100];
cairo_t *cr;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
for (i = 0; i < days; i++) {
- todo = (right - left) * 0.75 + left;
- /* header = top - HEADER_HEIGHT;*/
- header = HEADER_HEIGHT + top;
+ todo = width * 0.75;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
/* Print the main view with all the events in. */
- print_day_details (pr, gcal, date,
- left, todo - 2.0, header, bottom);
+ print_day_details (context, gcal, date,
+ 0.0, todo - 2.0, HEADER_HEIGHT,
+ height);
/* Print the TaskPad down the right. */
- print_todo_details (pr, gcal, 0, INT_MAX,
- todo, right, header, bottom);
+ print_todo_details (context, gcal, 0, INT_MAX,
+ todo, width, HEADER_HEIGHT,
+ height);
/* Print the filled border around the header. */
- print_border (pr->pc, left, right, top, header + 2.0, 1.0, 0.9);
+ print_border (context, 0.0, width,
+ 0.0, HEADER_HEIGHT + 2.0, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - SMALL_MONTH_SPACING;
+ l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2 - SMALL_MONTH_SPACING;
- print_month_small (pr, gcal, date,
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 4,
+ print_month_small (context, gcal, date,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
DATE_MONTH | DATE_YEAR, date, date, FALSE);
l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 4,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
@@ -2159,32 +1926,38 @@ print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
format_date (date, DATE_DAY | DATE_MONTH | DATE_YEAR,
buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 4, todo, top + 4, top + 4 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 4, todo, 4,
+ 4 + 24);
/* Print the day, e.g. 'Tuesday'. */
format_date (date, DATE_DAYNAME, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 4, todo, top + 32, top + 32 + 18);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 4, todo, 32,
+ 32 + 18);
date = time_add_day_with_zone (date, 1, zone);
}
}
-
static void
-print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_week_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header, l;
+ double l;
char buf[100];
time_t when;
gint week_start_day;
struct tm tm;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
- header = HEADER_HEIGHT - top;
tm = *convert_timet_to_struct_tm (date, zone);
week_start_day = calendar_config_get_week_start_day ();
when = time_week_begin_with_zone (date, week_start_day, zone);
@@ -2199,101 +1972,115 @@ print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
}
/* Print the main week view. */
- print_week_summary (pr, gcal, when, FALSE, 1, 0,
+ print_week_summary (context, gcal, when, FALSE, 1, 0,
WEEK_NORMAL_FONT_SIZE,
- left, right, header + 20, bottom);
+ 0.0, width,
+ HEADER_HEIGHT + 20, height);
/* Print the border around the main view. */
- print_border (pr->pc, left, right, header , bottom, 1.0, -1.0);
+ print_border (context, 0.0, width, HEADER_HEIGHT ,
+ height, 1.0, -1.0);
/* Print the border around the header area. */
- print_border (pr->pc, left, right, top, header + 2.0 + 20, 1.0, 0.9);
+ print_border (context, 0.0, width,
+ 0.0, HEADER_HEIGHT + 2.0 + 20, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
+ l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
- SMALL_MONTH_SPACING;
- print_month_small (pr, gcal, when,
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 30,
+ print_month_small (context, gcal, when,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
DATE_MONTH | DATE_YEAR, when,
time_add_week_with_zone (when, 1, zone), FALSE);
l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (when, 1, zone),
- l, l + SMALL_MONTH_WIDTH,
- top + 4, header + 30,
+ l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
DATE_MONTH | DATE_YEAR, when,
time_add_week_with_zone (when, 1, zone), FALSE);
/* Print the start day of the week, e.g. '7th May 2001'. */
format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 3, right, top + 4, top + 4 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 3, width,
+ 4, 4 + 24);
/* Print the end day of the week, e.g. '13th May 2001'. */
when = time_add_day_with_zone (when, 6, zone);
format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_LEFT,
- left + 3, right, top + 24 + 3, top + 24 + 3 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+ 3, width,
+ 24 + 3, 24 + 3 + 24);
}
static void
-print_month_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_month_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
icaltimezone *zone = calendar_config_get_icaltimezone ();
- double header;
char buf[100];
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
- header = top + HEADER_HEIGHT;
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
/* Print the main month view. */
- print_month_summary (pr, gcal, date, left, right, header, bottom);
+ print_month_summary (context, gcal, date, 0.0, width, HEADER_HEIGHT, height);
/* Print the border around the header. */
- print_border (pr->pc, left, right, top, header, 1.0, 0.9);
+ print_border (context, 0.0, width, 0.0, HEADER_HEIGHT, 1.0, 0.9);
/* Print the 2 mini calendar-months. */
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, 1, zone),
- right - (right - left) / 7 + 2, right - 8,
- top + 4, header,
+ width - width / 7 + 2, 4,
+ width - 8, HEADER_HEIGHT,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
- print_month_small (pr, gcal,
+ print_month_small (context, gcal,
time_add_month_with_zone (date, -1, zone),
- left + 8, left + (right - left) / 7 - 2,
- top + 4, header,
+ 8, 4, width / 7 - 2, HEADER_HEIGHT,
DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
/* Print the month, e.g. 'May 2001'. */
format_date (date, DATE_MONTH | DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_CENTER,
- left + 3, right - 3, top + 3, top + 3 + 24);
+ print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+ 3, width - 3,
+ 3, 3 + 24);
}
-
+/* XXX Evolution doesn't have a "year" view. */
static void
-print_year_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
- double left, double right, double top, double bottom)
+print_year_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
{
+ GtkPageSetup *setup;
char buf[100];
cairo_t *cr;
+ gdouble width, height;
+
+ setup = gtk_print_context_get_page_setup (context);
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+
+ cr = gtk_print_context_get_cairo_context (context);
cairo_show_page (cr);
- print_year_summary (pr, gcal, date, left, right, top + 50, bottom,
- TRUE);
+ print_year_summary (context, gcal, date, 0.0,
+ width, 50,
+ height, TRUE);
/* centered title */
format_date (date, DATE_YEAR, buf, 100);
- print_text_size_bold (pr, buf, ALIGN_CENTER,
- left+3, right, top+3, top + 27);
- cr=gtk_print_context_get_cairo_context (pr->pc);
+ print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+ 3, width,
+ 3, 27);
+ cr=gtk_print_context_get_cairo_context (context);
cairo_show_page (cr);
}
@@ -2337,7 +2124,7 @@ get_zone_from_tzid (ECal *client, const char *tzid)
}
static void
-print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client,
+print_date_label (GtkPrintContext *context, ECalComponent *comp, ECal *client,
double left, double right, double top, double bottom)
{
icaltimezone *start_zone, *end_zone, *due_zone, *completed_zone;
@@ -2405,16 +2192,65 @@ print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *clien
write_label_piece (due, buffer, 1024, _("Due "), NULL);
}
- print_text_size_bold (pr, buffer, ALIGN_LEFT,
+ print_text_size_bold (context, buffer, PANGO_ALIGN_LEFT,
left, right, top, top - 15);
}
static void
-print_comp_item (PrintCompItem *pci)
-
+print_calendar_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PrintCalItem *pcali)
+{
+ switch (gnome_calendar_get_view (pcali->gcal)) {
+ case GNOME_CAL_DAY_VIEW:
+ print_day_view (context, pcali->gcal, pcali->start);
+ break;
+ case GNOME_CAL_WORK_WEEK_VIEW:
+ case GNOME_CAL_WEEK_VIEW:
+ print_week_view (context, pcali->gcal, pcali->start);
+ break;
+ case GNOME_CAL_MONTH_VIEW:
+ print_month_view (context, pcali->gcal, pcali->start);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+void
+print_calendar (GnomeCalendar *gcal, GtkPrintOperationAction action,
+ time_t start)
+{
+ GtkPrintOperation *operation;
+ PrintCalItem pcali;
+
+ g_return_if_fail (gcal != NULL);
+ g_return_if_fail (GNOME_IS_CALENDAR (gcal));
+
+ pcali.gcal = gcal;
+ pcali.start = start;
+
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
+
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (print_calendar_draw_page), &pcali);
+
+ gtk_print_operation_run (operation, action, NULL, NULL);
+
+ g_object_unref (operation);
+}
+
+static void
+print_comp_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PrintCompItem *pci)
{
+ GtkPageSetup *setup;
PangoFontDescription *font;
- EvoCalendarPrintRenderer *pr;
ECal *client;
ECalComponent *comp;
ECalComponentVType vtype;
@@ -2426,20 +2262,19 @@ print_comp_item (PrintCompItem *pci)
char *categories_string, *location_string, *summary_string;
double header_size;
cairo_t *cr;
- double left, right, top, bottom;
+ gdouble width, height;
+ double top;
+
+ setup = gtk_print_context_get_page_setup (context);
+
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+ height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
/* PrintCompItem structure contains elements to be used
* with the Print Context , obtained in comp_draw_page
*/
- comp = g_new0 (ECalComponent, 1);
- client = g_new0 (ECal, 1);
- pr = pci->pr;
client = pci->client;
comp = pci->comp;
- left = pci->l;
- right = pci->r;
- top = pci->t;
- bottom = pci->b;
vtype = e_cal_component_get_vtype (comp);
@@ -2453,25 +2288,25 @@ print_comp_item (PrintCompItem *pci)
else
return;
- cr = gtk_print_context_get_cairo_context (pr->pc);
+ cr = gtk_print_context_get_cairo_context (context);
/* Print the title in a box at the top of the page. */
- font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
header_size = 40;
- print_border (pr->pc, left, right, top, top+header_size,
+ print_border (context, 0.0, width, 0.0, header_size,
1.0, 0.9);
- print_text (pr, font, title, ALIGN_CENTER, left, right,
- top + 0.1, top +header_size - 0.1);
+ print_text (context, font, title, PANGO_ALIGN_CENTER, 0.0, width,
+ 0.1, header_size - 0.1);
pango_font_description_free (font);
- top += header_size + 30;
+ top = header_size + 30;
/* Summary */
- font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+ font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
e_cal_component_get_summary (comp, &text);
summary_string = g_strdup_printf (_("Summary: %s"), text.value);
- top = bound_text (pr, font, summary_string, left, right,
- top, bottom, 0);
+ top = bound_text (context, font, summary_string, 0.0, top, width,
+ height);
g_free (summary_string);
@@ -2480,16 +2315,16 @@ print_comp_item (PrintCompItem *pci)
if (location && location[0]) {
location_string = g_strdup_printf (_("Location: %s"),
location);
- top = bound_text (pr, font, location_string, left, right,
- top + 3, bottom, 0);
+ top = bound_text (context, font, location_string, 0.0,
+ top + 3, width, height);
g_free (location_string);
}
pango_font_description_free (font);
/* Date information */
- print_date_label (pr, comp, client, left, right, top + 3, top + 15);
+ print_date_label (context, comp, client, 0.0, width, top + 3, top + 15);
top += 20;
- font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+ font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
/* For a VTODO we print the Status, Priority, % Complete and URL. */
if (vtype == E_CAL_COMPONENT_TODO) {
@@ -2522,8 +2357,8 @@ print_comp_item (PrintCompItem *pci)
if (status_string) {
char *status_text = g_strdup_printf (_("Status: %s"),
status_string);
- top = bound_text (pr, font, status_text,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, status_text,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (status_text);
}
@@ -2538,8 +2373,8 @@ print_comp_item (PrintCompItem *pci)
e_cal_component_free_priority (priority);
pri_text = g_strdup_printf (_("Priority: %s"), priority_string);
- top = bound_text (pr, font, pri_text,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, pri_text,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (pri_text);
}
@@ -2552,8 +2387,8 @@ print_comp_item (PrintCompItem *pci)
percent_string = g_strdup_printf (_("Percent Complete: %i"), *percent);
e_cal_component_free_percent (percent);
- top = bound_text (pr, font, percent_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, percent_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
}
@@ -2564,8 +2399,8 @@ print_comp_item (PrintCompItem *pci)
char *url_string = g_strdup_printf (_("URL: %s"),
url);
- top = bound_text (pr, font, url_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, url_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_free (url_string);
}
@@ -2576,8 +2411,8 @@ print_comp_item (PrintCompItem *pci)
if (categories && categories[0]) {
categories_string = g_strdup_printf (_("Categories: %s"),
categories);
- top = bound_text (pr, font, categories_string,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, categories_string,
+ 0.0, top, width, height);
top += get_font_size (font) - 6 ;
g_free (categories_string);
}
@@ -2595,8 +2430,8 @@ print_comp_item (PrintCompItem *pci)
}
e_cal_component_free_text_list (contact_list);
- top = bound_text (pr, font, contacts->str,
- left, right, top, bottom, 0);
+ top = bound_text (context, font, contacts->str,
+ 0.0, top, width, height);
top += get_font_size (font) - 6;
g_string_free (contacts, TRUE);
}
@@ -2606,12 +2441,12 @@ print_comp_item (PrintCompItem *pci)
e_cal_component_get_description_list (comp, &desc);
for (l = desc; l != NULL; l = l->next) {
ECalComponentText *text = l->data;
- if (top > bottom) {
+ if (top > height) {
top = 10; //FIXME
cairo_show_page (cr);
}
if (text->value != NULL)
- top = bound_text (pr, font, text->value, left, right, top + 3, bottom, 0) + 30;
+ top = bound_text (context, font, text->value, 0.0, top + 3, width, height) + 30;
}
@@ -2621,311 +2456,99 @@ print_comp_item (PrintCompItem *pci)
}
void
-print_calendar (GnomeCalendar *gcal, gboolean preview, time_t date,
- PrintView default_view)
+print_comp (ECalComponent *comp, ECal *client, GtkPrintOperationAction action)
{
- GtkPrintSettings *settings;
- GtkPrintOperationResult res;
- GtkPrintOperation *print;
- GtkPaperSize *paper_size;
- GtkPageSetup *page_setup;
- GtkWidget *gpd;
- GtkWidget *range;
- PrintCalItem *pcali;
- int view;
- double r, t, w, h;
+ GtkPrintOperation *operation;
+ PrintCompItem pci;
- g_return_if_fail (gcal != NULL);
- g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-
- view = (int) default_view;
+ g_return_if_fail (E_IS_CAL_COMPONENT (comp));
- pcali = g_new0 (PrintCalItem, 1);
- pcali->gcal = g_new0 (GnomeCalendar, 1);
+ pci.comp = comp;
+ pci.client = client;
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
+ operation = e_print_operation_new ();
- settings = gtk_print_settings_new ();
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
- range = range_selector_new (gpd, date, &view);
+ g_signal_connect (
+ operation, "draw-page",
+ G_CALLBACK (print_comp_draw_page), &pci);
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
-
- pcali->b = h * (1.0 - TEMP_MARGIN);
- pcali->l = r * TEMP_MARGIN;
- pcali->t = t * (1.0 - TEMP_MARGIN);
- pcali->r = w * (1.0 - TEMP_MARGIN);
- pcali->default_view = default_view;
- pcali->gcal = gcal;
- pcali->date = date;
-
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
-
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
-
- g_signal_connect (print, "create-custom-widget", G_CALLBACK (create_custom_widget), range);
- g_signal_connect (print, "custom-widget-apply", G_CALLBACK (apply_custom_widget), NULL);
- g_signal_connect (print, "draw_page", G_CALLBACK (cal_draw_page), pcali);
-
- /* Runs the print dialog, recursively, emitting signals */
- if (preview)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
- else
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-
- /* Save the user configured settings back to the gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
-
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
-
- }
+ gtk_print_operation_run (operation, action, NULL, NULL);
-}
-
-void
-print_comp (ECalComponent *comp, ECal *client, gboolean preview)
-{
- GtkPrintOperation *print;
- GtkPrintSettings *settings;
- GtkPaperSize *paper_size;
- PrintCompItem *pci;
- GtkPrintOperationResult res;
- GtkPageSetup *page_setup;
- gdouble t, r, w,h;
- GtkWidget *gpd;
-
- g_return_if_fail (comp != NULL);
- g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
- pci = g_new0 (PrintCompItem, 1);
-
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
-
- settings = gtk_print_settings_new ();
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
-
- /* Values using the print context , used in comp_draw_page */
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
- pci->b = h * (1.0 - TEMP_MARGIN);
- pci->l = r * TEMP_MARGIN;
- pci->t = t * (1.0 - TEMP_MARGIN);
- pci->r = w * (1.0 - TEMP_MARGIN);
- pci->comp = comp;
- pci->client = client;
-
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
-
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
-
- g_signal_connect (print, "draw_page", G_CALLBACK (comp_draw_page), pci);
-
- gtk_print_operation_set_print_settings (print, settings);
-
- /* Runs a dialog , emitting various signals based on user response */
- if (preview)
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- else
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG , NULL, NULL);
-
- /* Saves the user configuration in gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
-
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
- }
+ g_object_unref (operation);
}
static void
-print_title (GtkPrintContext *context, const char *title,
- double page_width, double page_height, double left_margin, double bottom_margin)
+print_title (GtkPrintContext *context, const gchar *text, gdouble page_width)
{
- PangoFontDescription *font;
- PangoLayout *pl;
- double w, x, y;
+ PangoFontDescription *desc;
+ PangoLayout *layout;
cairo_t *cr;
cr = gtk_print_context_get_cairo_context (context);
- cairo_save (cr);
- pl = gtk_print_context_create_pango_layout (context);
- font = pango_font_description_from_string("Sans Bold 18");
- pango_layout_set_font_description (pl, font);
- pango_layout_set_text (pl, title, -1);
-
- w = pango_layout_get_width (pl)/(double)PANGO_SCALE;
- y = page_height ;
- x = (page_width - w) / 2;
-
- cairo_move_to (cr, x, y );
- pango_cairo_show_layout (cr, pl);
+ desc = pango_font_description_from_string (FONT_FAMILY " Bold 18");
- cairo_restore (cr);
- pango_font_description_free (font);
+ layout = gtk_print_context_create_pango_layout (context);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+ pango_layout_set_width (layout, pango_units_from_double (page_width));
-}
+ cairo_save (cr);
-void
-print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview)
-{
- EPrintable *printable;
- GtkPrintOperationResult res;
- GtkPrintSettings *settings;
- GtkPrintOperation *print;
- GtkPageSetup *page_setup;
- GtkPaperSize *paper_size;
- GtkWidget *gpd;
- PrintTableItem *pti;
- double w, h, t, r, l, b;
-
- pti = g_new0 (PrintTableItem, 1);
-
- print = gtk_print_operation_new ();
- paper_size = gtk_paper_size_new ("iso_a4");
- page_setup = gtk_page_setup_new();
- gtk_page_setup_set_paper_size(page_setup, paper_size);
-
- w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
- h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
- t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
- r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
-
- b =h * (1.0 - TEMP_MARGIN);
- l =r * TEMP_MARGIN;
- t =t * (1.0 - TEMP_MARGIN);
- r =w * (1.0 - TEMP_MARGIN);
-
- pti->left_margin = l;
- pti->bottom_margin = b;
- pti->paper_width = r - l;
- pti->paper_height= t + 10;
+ cairo_move_to (cr, 0.0, 0.0);
+ pango_cairo_show_layout (cr, layout);
- settings = e_print_load_settings ();
- gpd = e_print_get_dialog_with_config (dialog_title, 0, settings);
- printable = e_table_get_printable (etable);
+ cairo_restore (cr);
- g_object_ref_sink (printable);
- e_printable_reset (printable);
- pti->printable = printable;
+ g_object_unref (layout);
- gtk_print_operation_set_default_page_setup (print, page_setup);
- gtk_print_operation_set_n_pages (print, 1);
+ pango_font_description_free (desc);
+}
- /* FIX ME ,Allow it to use the default settings for the first time */
- gtk_print_operation_set_print_settings (print, settings);
+static void
+print_table_draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ EPrintable *printable)
+{
+ GtkPageSetup *setup;
+ gdouble width, height;
- /* runs the dialog emitting the signals based on user response */
- g_signal_connect (print, "draw_page", G_CALLBACK (table_draw_page), pti);
- if (!preview)
- res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
- else
- gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-
+ setup = gtk_print_context_get_page_setup (context);
- /* Saves the user configuration in gconf */
- settings = gtk_print_operation_get_print_settings (print);
- e_print_save_settings (settings);
+ width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- g_object_unref (print);
- }
- else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
- /* FIX ME */
- }
-}
+ do {
+ /* TODO Allow the user to customize the title. */
+ print_title (context, _("Upcoming Appointments"), width);
-static void
-comp_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintCompItem *pci)
-{
- pci = evo_calendar_print_data_new (context, pci);
- print_comp_item (pci);
-}
+ if (e_printable_data_left (printable))
+ e_printable_print_page (
+ printable, context, width, 24, TRUE);
-static void
-cal_draw_page(GtkPrintOperation *print1, GtkPrintContext *context, gint page_nr1, PrintCalItem *pcali)
-{
- pcali = evo_calendar_print_cal_data_new (context, pcali);
-
- switch (pcali->default_view) {
- case PRINT_VIEW_DAY:
- print_day_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_WEEK:
- print_week_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_MONTH:
- print_month_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- case PRINT_VIEW_YEAR:
- print_year_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
- break;
- default:
- g_assert_not_reached ();
- }
+ } while (e_printable_data_left (printable));
}
-static void
-table_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintTableItem *pti)
+void
+print_table (ETable *table, const gchar *dialog_title,
+ const gchar *print_header, GtkPrintOperationAction action)
{
- pti->context = context;
-
- do {
- print_title (context,"Table", pti->paper_width, pti->paper_height, pti->left_margin, pti->bottom_margin);
-
- if (e_printable_data_left (pti->printable))
- e_printable_print_page (pti->printable, pti->context,
- pti->paper_width, pti->paper_height + 24, TRUE);
+ GtkPrintOperation *operation;
+ EPrintable *printable;
- } while (e_printable_data_left (pti->printable));
-}
+ printable = e_table_get_printable (table);
+ g_object_ref_sink (printable);
+ e_printable_reset (printable);
-/*
- * This callback creates a custom widget that gets inserted into the
- * print operation dialog, the custom widget contains the range,
- * day, view, month, or year
- */
+ operation = e_print_operation_new ();
+ gtk_print_operation_set_n_pages (operation, 1);
-GObject* create_custom_widget (GtkPrintOperation *print,GtkWidget *range)
-{
- return range;
-}
+ g_signal_connect (
+ operation, "draw_page",
+ G_CALLBACK (print_table_draw_page), printable);
-/*
- * Read the information from the custom widget and print day, view, or
- * month based on user selection
- */
+ gtk_print_operation_run (operation, action, NULL, NULL);
-static void
-apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi)
-{
- gchar str;
- str = e_dialog_editable_get (dialog);
- printf("%sValue of Radio Button \n", str);
+ g_object_unref (operation);
}
-