/* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2007-2009 Holger Berndt <hb@claws-mail.org>,
+ * Copyright (C) 2007-2012 Holger Berndt <hb@claws-mail.org>,
* Colin Leroy <colin@colino.net>, and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
#ifdef HAVE_CONFIG_H
# include "config.h"
+#include "claws-features.h"
#endif
#include "defs.h"
#include "printing.h"
#include "image_viewer.h"
-#if GTK_CHECK_VERSION(2,10,0) && !defined(USE_GNOMEPRINT)
-
#include "gtkutils.h"
#include "toolbar.h"
#include "prefs_common.h"
gint img_cnt;
gdouble zoom;
gdouble ypos_line;
+ GtkImage *avatar;
};
typedef struct {
read_from_file = FALSE;
-#if GTK_CHECK_VERSION(2,14,0)
/* try reading the page setup from file */
page_setup_filename = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
PRINTING_PAGE_SETUP_STORAGE_FILE, NULL);
} else {
debug_print("Printing: Could not read page setup from key file\n");
}
-#else
- key_file_read = FALSE;
- keyfile = NULL;
- page_setup_filename = NULL;
-#endif
/* if reading from file did not work, or has not been tried (GTK+ < 2.14), use prefs */
if (!read_from_file) {
}
void printing_print_full(GtkWindow *parent, PrintRenderer *renderer, gpointer renderer_data,
- gint sel_start, gint sel_end)
+ gint sel_start, gint sel_end, GtkImage *avatar)
{
GtkPrintOperation *op;
GtkPrintOperationResult res;
print_data->renderer_data = renderer_data;
print_data->sel_start = sel_start;
print_data->sel_end = sel_end;
+ print_data->avatar = (avatar != NULL? GTK_IMAGE(g_object_ref(avatar)): NULL);
print_data->zoom = 1.;
/* Config for printing */
gtk_print_operation_set_print_settings(op, settings);
gtk_print_operation_set_default_page_setup(op, page_setup);
-#if GTK_CHECK_VERSION(2, 18, 0)
/* enable Page Size and Orientation in the print dialog */
gtk_print_operation_set_embed_page_setup(op, TRUE);
-#endif
-
/* signals */
g_signal_connect(op, "begin_print", G_CALLBACK(renderer->cb_begin_print), print_data);
g_signal_connect(op, "draw_page", G_CALLBACK(renderer->cb_draw_page), print_data);
g_list_free(print_data->page_breaks);
if (print_data->layout)
g_object_unref(print_data->layout);
+ if (print_data->avatar)
+ g_object_unref(print_data->avatar);
g_free(print_data);
return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
}
-void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end)
+void printing_print(GtkTextView *text_view, GtkWindow *parent, gint sel_start, gint sel_end, GtkImage *avatar)
{
PrintRenderer *textview_renderer = g_new0(PrintRenderer, 1);
textview_renderer->cb_begin_print = printing_textview_cb_begin_print;
textview_renderer->cb_draw_page = printing_textview_cb_draw_page;
- printing_print_full(parent, textview_renderer, text_view, sel_start, sel_end);
+ printing_print_full(parent, textview_renderer, text_view, sel_start, sel_end, avatar);
g_free(textview_renderer);
}
prefs_common.print_margin_right = (int) (100*gtk_page_setup_get_right_margin(page_setup,
PAGE_MARGIN_STORAGE_UNIT));
-#if GTK_CHECK_VERSION(2,14,0)
/* save to file */
keyfile = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
PRINTING_PAGE_SETUP_STORAGE_FILE, NULL);
debug_print("Printing: Could not store page setup in file `%s'\n", keyfile);
}
g_free(keyfile);
-#endif
}
static gboolean cb_preview(GtkPrintOperation *operation,
static GdkGeometry geometry;
GtkWidget *dialog = NULL;
GtkWidget *statusbar = gtk_hbox_new(2, FALSE);
- CLAWS_TIP_DECL();
debug_print("Creating internal print preview\n");
/* toolbar */
toolbar = gtk_toolbar_new();
-#if (GTK_CHECK_VERSION(2,16,0))
gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar), GTK_ORIENTATION_HORIZONTAL);
-#else
- gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
-#endif
+
switch (prefs_common.toolbar_style) {
case TOOLBAR_ICON:
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
-#if !(GTK_CHECK_VERSION(2,12,0))
-#define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
- gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(widget), GTK_TOOLTIPS(tips), \
- tip, NULL); \
-}
-#else
#define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip); \
}
-#endif
#define TOOLBAR_ITEM(item,text,tooltip,cb,cbdata) { \
item = GTK_WIDGET(gtk_tool_button_new_from_stock(text)); \
_("Previous page"), cb_preview_go_previous, preview_data);
page = gtk_label_new("");
- gtk_widget_set_size_request(page, 100, -1);
preview_data->page_nr_label = page;
TOOLBAR_ITEM(preview_data->next, GTK_STOCK_GO_FORWARD,
preview_data->area = da;
/* cairo context */
- cr = gdk_cairo_create(da->window);
+ cr = gdk_cairo_create(gtk_widget_get_window(da));
gtk_print_context_set_cairo_context(context, cr, PREVIEW_SCALE, PREVIEW_SCALE);
cairo_destroy(cr);
{
PreviewData *preview_data = (PreviewData *)data;
if (event->type == GDK_KEY_PRESS)
- if (((GdkEventKey *)event)->keyval != GDK_Escape)
+ if (((GdkEventKey *)event)->keyval != GDK_KEY_Escape)
return FALSE;
if (preview_data->rendering)
return FALSE;
gpointer data)
{
PreviewData *preview_data;
- GtkPageOrientation orientation;
GtkPaperSize *paper_size;
gint paper_width;
gint paper_height;
preview_data = (PreviewData*) data;
debug_print("got_page_size\n");
- orientation = gtk_page_setup_get_orientation(page_setup);
paper_size = gtk_page_setup_get_paper_size(page_setup);
paper_width = (gint)(gtk_paper_size_get_width(paper_size, GTK_UNIT_INCH)
* PREVIEW_SCALE);
gpointer data)
{
PreviewData *preview_data = data;
- GdkGC *gc;
- GdkColor white;
- GdkColor black;
- GdkColor gray;
cairo_t *cr;
debug_print("preview_expose (current %p)\n", preview_data->current_page);
- gdk_window_clear(preview_data->area->window);
-
- white.red = 65535;
- white.green = 65535;
- white.blue = 65535;
- black.red = 0;
- black.green = 0;
- black.blue = 0;
- gray.red = 32700;
- gray.green = 32700;
- gray.blue = 32700;
- gc = gdk_gc_new(GDK_DRAWABLE(preview_data->area->window));
+ cr = gdk_cairo_create(gtk_widget_get_window(preview_data->area));
/* background */
- gdk_gc_set_rgb_fg_color(gc, &gray);
- gdk_draw_rectangle(preview_data->area->window, gc, TRUE, 0, 0,
- preview_data->area->allocation.width,
- preview_data->area->allocation.height);
+ cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+ cairo_rectangle(cr, event->area.x, event->area.y, event->area.width, event->area.height);
+ cairo_fill(cr);
/* shadow */
- gdk_gc_set_rgb_fg_color(gc, &black);
- gdk_draw_rectangle(preview_data->area->window, gc, TRUE,
- PREVIEW_SHADOW_OFFSET, PREVIEW_SHADOW_OFFSET,
- preview_data->page_width+PREVIEW_SHADOW_OFFSET,
- preview_data->page_height+PREVIEW_SHADOW_OFFSET);
+ cairo_set_source_rgb(cr, 0., 0., 0.);
+ cairo_rectangle(cr, PREVIEW_SHADOW_OFFSET, PREVIEW_SHADOW_OFFSET,
+ preview_data->page_width+PREVIEW_SHADOW_OFFSET,
+ preview_data->page_height+PREVIEW_SHADOW_OFFSET);
+ cairo_fill(cr);
/* paper */
- gdk_gc_set_rgb_fg_color(gc, &white);
- gdk_draw_rectangle(preview_data->area->window, gc, TRUE, 0, 0,
- preview_data->page_width,
- preview_data->page_height);
-
- g_object_unref(gc);
+ cairo_set_source_rgb(cr, 1., 1., 1.);
+ cairo_rectangle(cr, 0, 0,
+ preview_data->page_width,
+ preview_data->page_height);
+ cairo_fill(cr);
- cr = gdk_cairo_create(preview_data->area->window);
gtk_print_context_set_cairo_context(preview_data->context, cr, PREVIEW_SCALE, PREVIEW_SCALE);
cairo_destroy(cr);
static void cb_preview_zoom_fit(GtkButton *button, gpointer data)
{
PreviewData *preview_data = (PreviewData*) data;
+ GtkAllocation allocation;
gdouble zoom_w;
gdouble zoom_h;
- zoom_w = ((gdouble)preview_data->scrolled_window->allocation.width) /
+ gtk_widget_get_allocation(preview_data->scrolled_window, &allocation);
+ zoom_w = ((gdouble)allocation.width) /
((gdouble)preview_data->page_width/preview_data->print_data->zoom +
PREVIEW_SHADOW_OFFSET);
- zoom_h = ((gdouble)preview_data->scrolled_window->allocation.height) /
+ zoom_h = ((gdouble)allocation.height) /
((gdouble)preview_data->page_height/preview_data->print_data->zoom +
PREVIEW_SHADOW_OFFSET);
PangoFontDescription *desc;
int start, ii;
PangoLayoutIter *iter;
- double start_pos;
gint header_end_pos;
gint num_header_lines;
gint dummy;
page_height = 0;
start = 0;
ii = 0;
- start_pos = 0.;
iter = pango_layout_get_iter(print_data->layout);
/* find the last character of the header */
do {
PangoRectangle logical_rect;
- PangoLayoutLine *line;
PangoAttrShape *attr = NULL;
- int baseline;
if (ii >= start) {
- line = pango_layout_iter_get_line(iter);
-
pango_layout_iter_get_line_extents(iter, NULL, &logical_rect);
- baseline = pango_layout_iter_get_baseline(iter);
if ((attr = g_hash_table_lookup(print_data->images,
GINT_TO_POINTER(pango_layout_iter_get_index(iter)))) != NULL) {
pango_layout_iter_get_line_extents(iter, NULL, &logical_rect);
baseline = pango_layout_iter_get_baseline(iter);
- if (ii == start)
+ if (ii == start) {
start_pos = ((double)logical_rect.y) / PANGO_SCALE;
-
+ }
/* Draw header separator line */
if (ii == 0 && print_data->ypos_line >= 0) {
cairo_surface_t *surface;
}
ii++;
} while(ii < end && (notlast = pango_layout_iter_next_line(iter)));
+
+ if (print_data->avatar && page_nr == 0) {
+ cairo_surface_t *surface;
+ GdkPixbuf *pixbuf = gtk_image_get_pixbuf(print_data->avatar);
+ gdouble startx, starty;
+
+ startx = gtk_print_context_get_width(context)/print_data->zoom;
+
+ startx -= ((double)gdk_pixbuf_get_width(pixbuf));
+
+ starty = start_pos;
+
+ surface = pixbuf_to_surface(pixbuf);
+ cairo_set_source_surface (cr, surface, startx, starty);
+ cairo_paint (cr);
+ cairo_surface_destroy (surface);
+ }
+
pango_layout_iter_free(iter);
debug_print("Sent page %d to printer\n", page_nr+1);
}
attr_color = (PangoAttrColor*) attr;
g_object_get(G_OBJECT(tag), "background-gdk",
&color, NULL);
- if (printing_is_pango_gdk_color_equal(&(attr_color->color),
+ if (color &&
+ printing_is_pango_gdk_color_equal(&(attr_color->color),
color)) {
attr->end_index = printing_text_iter_get_offset_bytes(print_data, &iter);
pango_attr_list_insert(attr_list, attr);
*/
static gint printing_text_iter_get_offset_bytes(PrintData *print_data, const GtkTextIter *iter)
{
- gint off_chars;
gint off_bytes;
gchar *text;
GtkTextIter start;
- off_chars = gtk_text_iter_get_offset(iter);
if (print_data->sel_start < 0 || print_data->sel_end <= print_data->sel_start) {
gtk_text_buffer_get_start_iter(gtk_text_iter_get_buffer(iter), &start);
} else {
else
gtk_widget_set_sensitive(preview_data->zoom_out, TRUE);
}
-
-#endif /* GTK+ >= 2.10.0 */