|
Packit Service |
fb6fa5 |
#include <pango/pangocairo.h>
|
|
Packit Service |
fb6fa5 |
#include <gtk/gtk.h>
|
|
Packit Service |
fb6fa5 |
#include <math.h>
|
|
Packit Service |
fb6fa5 |
#include "testprintfileoperation.h"
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* In points */
|
|
Packit Service |
fb6fa5 |
#define HEADER_HEIGHT (10*72/25.4)
|
|
Packit Service |
fb6fa5 |
#define HEADER_GAP (3*72/25.4)
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
G_DEFINE_TYPE (TestPrintFileOperation, test_print_file_operation, GTK_TYPE_PRINT_OPERATION)
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_finalize (GObject *object)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *op = TEST_PRINT_FILE_OPERATION (object);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_free (op->filename);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
G_OBJECT_CLASS (test_print_file_operation_parent_class)->finalize (object);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_init (TestPrintFileOperation *operation)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_print_operation_set_unit (GTK_PRINT_OPERATION (operation), GTK_UNIT_POINTS);
|
|
Packit Service |
fb6fa5 |
operation->font_size = 14.0;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_new (const char *filename)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *op;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
op = g_object_new (TEST_TYPE_PRINT_FILE_OPERATION, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
op->filename = g_strdup (filename);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return op;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_set_font_size (TestPrintFileOperation *op,
|
|
Packit Service |
fb6fa5 |
double points)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
op->font_size = points;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_begin_print (GtkPrintOperation *operation, GtkPrintContext *context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *op = TEST_PRINT_FILE_OPERATION (operation);
|
|
Packit Service |
fb6fa5 |
char *contents;
|
|
Packit Service |
fb6fa5 |
int i;
|
|
Packit Service |
fb6fa5 |
double height;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
height = gtk_print_context_get_height (context) - HEADER_HEIGHT - HEADER_GAP;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
op->lines_per_page = floor (height / op->font_size);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_file_get_contents (op->filename,
|
|
Packit Service |
fb6fa5 |
&contents,
|
|
Packit Service |
fb6fa5 |
NULL, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
op->lines = g_strsplit (contents, "\n", 0);
|
|
Packit Service |
fb6fa5 |
g_free (contents);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
i = 0;
|
|
Packit Service |
fb6fa5 |
while (op->lines[i] != NULL)
|
|
Packit Service |
fb6fa5 |
i++;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
op->num_lines = i;
|
|
Packit Service |
fb6fa5 |
op->num_pages = (op->num_lines - 1) / op->lines_per_page + 1;
|
|
Packit Service |
fb6fa5 |
gtk_print_operation_set_n_pages (operation, op->num_pages);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_draw_page (GtkPrintOperation *operation,
|
|
Packit Service |
fb6fa5 |
GtkPrintContext *context,
|
|
Packit Service |
fb6fa5 |
int page_nr)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
cairo_t *cr;
|
|
Packit Service |
fb6fa5 |
PangoLayout *layout;
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *op = TEST_PRINT_FILE_OPERATION (operation);
|
|
Packit Service |
fb6fa5 |
double width, text_height;
|
|
Packit Service |
fb6fa5 |
int line, i, layout_height;
|
|
Packit Service |
fb6fa5 |
PangoFontDescription *desc;
|
|
Packit Service |
fb6fa5 |
char *page_str;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cr = gtk_print_context_get_cairo_context (context);
|
|
Packit Service |
fb6fa5 |
width = gtk_print_context_get_width (context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_rectangle (cr, 0, 0, width, HEADER_HEIGHT);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_set_source_rgb (cr, 0.8, 0.8, 0.8);
|
|
Packit Service |
fb6fa5 |
cairo_fill_preserve (cr);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_set_source_rgb (cr, 0, 0, 0);
|
|
Packit Service |
fb6fa5 |
cairo_set_line_width (cr, 1);
|
|
Packit Service |
fb6fa5 |
cairo_stroke (cr);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
layout = gtk_print_context_create_pango_layout (context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
desc = pango_font_description_from_string ("sans 14");
|
|
Packit Service |
fb6fa5 |
pango_layout_set_font_description (layout, desc);
|
|
Packit Service |
fb6fa5 |
pango_font_description_free (desc);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pango_layout_set_text (layout, op->filename, -1);
|
|
Packit Service |
fb6fa5 |
pango_layout_set_width (layout, width);
|
|
Packit Service |
fb6fa5 |
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pango_layout_get_size (layout, NULL, &layout_height);
|
|
Packit Service |
fb6fa5 |
text_height = (double)layout_height / PANGO_SCALE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_move_to (cr, width / 2, (HEADER_HEIGHT - text_height) / 2);
|
|
Packit Service |
fb6fa5 |
pango_cairo_show_layout (cr, layout);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
page_str = g_strdup_printf ("%d/%d", page_nr + 1, op->num_pages);
|
|
Packit Service |
fb6fa5 |
pango_layout_set_text (layout, page_str, -1);
|
|
Packit Service |
fb6fa5 |
g_free (page_str);
|
|
Packit Service |
fb6fa5 |
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_move_to (cr, width - 2, (HEADER_HEIGHT - text_height) / 2);
|
|
Packit Service |
fb6fa5 |
pango_cairo_show_layout (cr, layout);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_unref (layout);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
layout = gtk_print_context_create_pango_layout (context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
desc = pango_font_description_from_string ("mono");
|
|
Packit Service |
fb6fa5 |
pango_font_description_set_size (desc, op->font_size * PANGO_SCALE);
|
|
Packit Service |
fb6fa5 |
pango_layout_set_font_description (layout, desc);
|
|
Packit Service |
fb6fa5 |
pango_font_description_free (desc);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cairo_move_to (cr, 0, HEADER_HEIGHT + HEADER_GAP);
|
|
Packit Service |
fb6fa5 |
line = page_nr * op->lines_per_page;
|
|
Packit Service |
fb6fa5 |
for (i = 0; i < op->lines_per_page && line < op->num_lines; i++, line++) {
|
|
Packit Service |
fb6fa5 |
pango_layout_set_text (layout, op->lines[line], -1);
|
|
Packit Service |
fb6fa5 |
pango_cairo_show_layout (cr, layout);
|
|
Packit Service |
fb6fa5 |
cairo_rel_move_to (cr, 0, op->font_size);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_unref (layout);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_end_print (GtkPrintOperation *operation, GtkPrintContext *context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
TestPrintFileOperation *op = TEST_PRINT_FILE_OPERATION (operation);
|
|
Packit Service |
fb6fa5 |
g_strfreev (op->lines);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
test_print_file_operation_class_init (TestPrintFileOperationClass *class)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GObjectClass *gobject_class = (GObjectClass *)class;
|
|
Packit Service |
fb6fa5 |
GtkPrintOperationClass *print_class = (GtkPrintOperationClass *)class;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gobject_class->finalize = test_print_file_operation_finalize;
|
|
Packit Service |
fb6fa5 |
print_class->begin_print = test_print_file_operation_begin_print;
|
|
Packit Service |
fb6fa5 |
print_class->draw_page = test_print_file_operation_draw_page;
|
|
Packit Service |
fb6fa5 |
print_class->end_print = test_print_file_operation_end_print;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
}
|