static void e_table_group_container_print_page (EPrintable *ep, GtkPrintContext *context, gdouble width, gdouble height, gboolean quantize, ETGCPrintContext *groupcontext) { cairo_t *cr; gdouble yd = height; gdouble child_height; ETableGroupContainerChildNode *child_node; GList *child; EPrintable *child_printable; gchar *string; PangoLayout *layout; PangoFontDescription *desc; child_printable = groupcontext->child_printable; child = groupcontext->child; yd = 6.5 * 72; height = 5 * 72; if (child_printable) { if (child) child_node = child->data; else child_node = NULL; g_object_ref (child_printable); } else { if (!child) { return; } else { child_node = child->data; child_printable = e_table_group_get_printable(child_node->child); if (child_printable) g_object_ref (child_printable); e_printable_reset(child_printable); } } layout = gtk_print_context_create_pango_layout (context); desc = pango_font_description_new (); pango_font_description_set_family_static (desc, "Helvetica"); pango_font_description_set_size (desc, TEXT_HEIGHT); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); while (1) { child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize); cr = gtk_print_context_get_cairo_context (context); cairo_save (cr); cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT); cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT); cairo_set_source_rgb (cr, .7, .7, .7) ; cairo_fill(cr) ; cairo_restore (cr); cairo_save (cr); cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT); cairo_clip (cr); cairo_restore (cr); cairo_move_to(cr, 0, 0); if (groupcontext->etgc->ecol->text) string = g_strdup_printf ("%s : %s (%d item%s)", groupcontext->etgc->ecol->text, child_node->string, (gint) child_node->count, child_node->count == 1 ? "" : "s"); else string = g_strdup_printf ("%s (%d item%s)", child_node->string, (gint) child_node->count, child_node->count == 1 ? "" : "s"); pango_layout_set_text (layout, string, -1); pango_cairo_show_layout (cr, layout); g_free(string); cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ; cairo_move_to(cr, 0, 0); cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height); cairo_clip(cr); e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize); yd += child_height + TEXT_AREA_HEIGHT; if (e_printable_data_left(child_printable)) break; child = child->next; if (!child) { child_printable = NULL; break; } child_node = child->data; if (child_printable) g_object_unref (child_printable); child_printable = e_table_group_get_printable(child_node->child); if (child_printable) g_object_ref (child_printable); e_printable_reset(child_printable); } if (groupcontext->child_printable) g_object_unref (groupcontext->child_printable); groupcontext->child_printable = child_printable; groupcontext->child = child; g_object_unref (layout); }
static VALUE rg_create_pango_layout(VALUE self) { return GOBJ2RVALU(gtk_print_context_create_pango_layout(_SELF(self))); }
GList * balsa_print_object_default(GList * list, GtkPrintContext * context, LibBalsaMessageBody * body, BalsaPrintSetup * psetup) { BalsaPrintObjectDefault *pod; BalsaPrintObject *po; gchar *conttype; PangoFontDescription *header_font; PangoLayout *test_layout; PangoTabArray *tabs; GString *desc_buf; gdouble c_max_height; gchar *part_desc; pod = g_object_new(BALSA_TYPE_PRINT_OBJECT_DEFAULT, NULL); g_assert(pod != NULL); po = BALSA_PRINT_OBJECT(pod); /* create the part */ po->depth = psetup->curr_depth; po->c_width = psetup->c_width - 2 * psetup->curr_depth * C_LABEL_SEP; /* get a pixbuf according to the mime type */ conttype = libbalsa_message_body_get_mime_type(body); pod->pixbuf = libbalsa_icon_finder(NULL, conttype, NULL, NULL, GTK_ICON_SIZE_DND); pod->c_image_width = gdk_pixbuf_get_width(pod->pixbuf); pod->c_image_height = gdk_pixbuf_get_height(pod->pixbuf); /* create a layout for calculating the maximum label width */ header_font = pango_font_description_from_string(balsa_app.print_header_font); test_layout = gtk_print_context_create_pango_layout(context); pango_layout_set_font_description(test_layout, header_font); pango_font_description_free(header_font); desc_buf = g_string_new(""); /* add type and filename (if available) */ pod->p_label_width = p_string_width_from_layout(test_layout, _("Type:")); if ((part_desc = libbalsa_vfs_content_description(conttype))) g_string_append_printf(desc_buf, "%s\t%s (%s)", _("Type:"), part_desc, conttype); else g_string_append_printf(desc_buf, "%s\t%s", _("Type:"), conttype); g_free(part_desc); g_free(conttype); if (body->filename) { gint p_fnwidth = p_string_width_from_layout(test_layout, _("File name:")); if (p_fnwidth > pod->p_label_width) pod->p_label_width = p_fnwidth; g_string_append_printf(desc_buf, "\n%s\t%s", _("File name:"), body->filename); } /* add a small space between label and value */ pod->p_label_width += C_TO_P(C_LABEL_SEP); /* configure the layout so we can calculate the text height */ pango_layout_set_indent(test_layout, -pod->p_label_width); tabs = pango_tab_array_new_with_positions(1, FALSE, PANGO_TAB_LEFT, pod->p_label_width); pango_layout_set_tabs(test_layout, tabs); pango_tab_array_free(tabs); pango_layout_set_width(test_layout, C_TO_P(po->c_width - 4 * C_LABEL_SEP - pod->c_image_width)); pango_layout_set_alignment(test_layout, PANGO_ALIGN_LEFT); pod->c_text_height = P_TO_C(p_string_height_from_layout(test_layout, desc_buf->str)); pod->description = g_string_free(desc_buf, FALSE); /* check if we should move to the next page */ c_max_height = MAX(pod->c_text_height, pod->c_image_height); if (psetup->c_y_pos + c_max_height > psetup->c_height) { psetup->c_y_pos = 0; psetup->page_count++; } /* remember the extent */ po->on_page = psetup->page_count - 1; po->c_at_x = psetup->c_x0 + po->depth * C_LABEL_SEP; po->c_at_y = psetup->c_y0 + psetup->c_y_pos; po->c_width = psetup->c_width - 2 * po->depth * C_LABEL_SEP; po->c_height = c_max_height; /* adjust the y position */ psetup->c_y_pos += c_max_height; return g_list_append(list, po); }
static void draw_page (GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, gpointer user_data) { PrintData *data = (PrintData *)user_data; cairo_t *cr; PangoLayout *layout; gint text_width, text_height; gdouble width; gint line, i; PangoFontDescription *desc; gchar *page_str; cr = gtk_print_context_get_cairo_context (context); width = gtk_print_context_get_width (context); cairo_rectangle (cr, 0, 0, width, HEADER_HEIGHT); cairo_set_source_rgb (cr, 0.8, 0.8, 0.8); cairo_fill_preserve (cr); cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_line_width (cr, 1); cairo_stroke (cr); layout = gtk_print_context_create_pango_layout (context); desc = pango_font_description_from_string ("sans 14"); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); pango_layout_set_text (layout, data->resourcename, -1); pango_layout_get_pixel_size (layout, &text_width, &text_height); if (text_width > width) { pango_layout_set_width (layout, width); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_START); pango_layout_get_pixel_size (layout, &text_width, &text_height); } cairo_move_to (cr, (width - text_width) / 2, (HEADER_HEIGHT - text_height) / 2); pango_cairo_show_layout (cr, layout); page_str = g_strdup_printf ("%d/%d", page_nr + 1, data->num_pages); pango_layout_set_text (layout, page_str, -1); g_free (page_str); pango_layout_set_width (layout, -1); pango_layout_get_pixel_size (layout, &text_width, &text_height); cairo_move_to (cr, width - text_width - 4, (HEADER_HEIGHT - text_height) / 2); pango_cairo_show_layout (cr, layout); g_object_unref (layout); layout = gtk_print_context_create_pango_layout (context); desc = pango_font_description_from_string ("monospace"); pango_font_description_set_size (desc, data->font_size * PANGO_SCALE); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); cairo_move_to (cr, 0, HEADER_HEIGHT + HEADER_GAP); line = page_nr * data->lines_per_page; for (i = 0; i < data->lines_per_page && line < data->num_lines; i++) { pango_layout_set_text (layout, data->lines[line], -1); pango_cairo_show_layout (cr, layout); cairo_rel_move_to (cr, 0, data->font_size); line++; } g_object_unref (layout); }