1 /*
2  * Copyright (C) 2009 - 2011 Vivien Malerba <malerba@gnome-db.org>
3  * Copyright (C) 2010 David King <davidk@openismus.com>
4  * Copyright (C) 2011 Murray Cumming <murrayc@murrayc.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 
21 #include <glib/gi18n-lib.h>
22 #include <gtk/gtk.h>
23 #include "browser-canvas.h"
24 #include "browser-canvas-priv.h"
25 #include <cairo.h>
26 #include <goocanvas.h>
27 
28 typedef struct {
29 	BrowserCanvas     *canvas;
30 	GtkPrintSettings *settings;
31 	GtkPageSetup     *page_setup;
32 	gboolean          show_page_numbers;
33 
34 	gdouble           page_width, page_height;
35 	gint              h_npages, v_npages;
36 	gdouble           scale;
37 } PrintPageData;
38 
39 static GObject *print_create_custom_widget_cb (GtkPrintOperation *operation, PrintPageData *pdata);
40 static void print_begin (GtkPrintOperation *operation, GtkPrintContext *context, PrintPageData *pdata);
41 static void print_end (GtkPrintOperation *operation, GtkPrintContext *context, PrintPageData *pdata);
42 static void print_draw_page (GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, PrintPageData *pdata);
43 
44 static GtkPrintSettings *print_settings = NULL;
45 static GtkPageSetup *page_setup = NULL;
46 static gboolean show_page_numbers = TRUE;
47 
48 /**
49  * browser_canvas_print
50  * @canvas: the #BrowserCanvas to print
51  *
52  * Prints @canvas using the GTK+ printing framework (displays printing options)
53  */
54 void
55 browser_canvas_print (BrowserCanvas *canvas)
56 {
57 	GtkPrintOperation *print;
58 	GtkPrintOperationResult res;
59 	GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (canvas));
60 	PrintPageData *pdata;
61 
62 	if (!print_settings)
63 		print_settings = gtk_print_settings_new  ();
64 	if (!page_setup)
65 		page_setup = gtk_page_setup_new ();
66 
67 	pdata = g_new0 (PrintPageData, 1);
68 	pdata->canvas = canvas;
69 	pdata->settings = print_settings;
70 	pdata->page_setup = page_setup;
browser_canvas_item_get_type(void)71 	pdata->show_page_numbers = show_page_numbers;
72 
73 	print = gtk_print_operation_new ();
74 
75 	gtk_print_operation_set_print_settings (print, print_settings);
76 	gtk_print_operation_set_default_page_setup (print, pdata->page_setup);
77 
78 	g_signal_connect (print, "create-custom-widget", G_CALLBACK (print_create_custom_widget_cb), pdata);
79 	g_signal_connect (print, "begin_print", G_CALLBACK (print_begin), pdata);
80 	g_signal_connect (print, "end_print", G_CALLBACK (print_end), pdata);
81 	g_signal_connect (print, "draw_page", G_CALLBACK (print_draw_page), pdata);
82 	gtk_print_operation_set_custom_tab_label (print, _("Page size and zoom"));
83 	res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
84 				       (GtkWindow*) toplevel, NULL);
85 
86 	if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
87 		g_object_unref (print_settings);
88 		print_settings = g_object_ref (gtk_print_operation_get_print_settings (print));
89 		if (page_setup != pdata->page_setup) {
90 			g_object_unref (page_setup);
91 			page_setup = pdata->page_setup;
92 		}
93 		show_page_numbers = pdata->show_page_numbers;
94 	}
95 	else if (page_setup != pdata->page_setup)
browser_canvas_item_class_init(BrowserCanvasItemClass * class)96 		g_object_unref (pdata->page_setup);
97 
98 	g_object_unref (print);
99 	g_free (pdata);
100 }
101 
102 static void
103 print_begin (GtkPrintOperation *operation, G_GNUC_UNUSED GtkPrintContext *context, PrintPageData *pdata)
104 {
105 	gtk_print_operation_set_n_pages (operation, pdata->h_npages * pdata->v_npages);
106 	gtk_print_operation_set_default_page_setup (operation, pdata->page_setup);
107 }
108 
109 static void
110 print_end (G_GNUC_UNUSED GtkPrintOperation *operation, G_GNUC_UNUSED GtkPrintContext *context,
111 	   G_GNUC_UNUSED PrintPageData *pdata)
112 {
113 
114 }
115 
116 static void
117 print_draw_page (G_GNUC_UNUSED GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, PrintPageData *pdata)
118 {
119 	cairo_t *cr;
120 	GooCanvasBounds bounds, canvas_bounds;
121 	gint col_page, line_page;
122 #define DRAW_DEBUG
123 #undef DRAW_DEBUG
124 
125 	cr = gtk_print_context_get_cairo_context (context);
126 
127 	line_page = page_nr / pdata->h_npages;
128 	col_page = page_nr % pdata->h_npages;
129 
130 	goo_canvas_item_get_bounds (goo_canvas_get_root_item (pdata->canvas->priv->goocanvas), &canvas_bounds);
131 
132 	/*g_print ("Printing page col%d line%d\n", col_page, line_page);*/
133 
134 #ifdef DRAW_DEBUG
135 	cairo_save (cr);
136 	/* X axis */
137 	cairo_set_source_rgba (cr, 0., 1., 0., 0.8);
138 	cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
139 	cairo_set_font_size (cr, 10.);
140 	cairo_move_to (cr, 50., -2.);
141 	cairo_show_text (cr, "X");
142 	cairo_stroke (cr);
143 
144 	cairo_move_to (cr, 0., 0.);
145 	cairo_line_to (cr, 50., 0.);
146 	cairo_rel_line_to (cr, -10., 10.);
147 	cairo_stroke (cr);
148 	cairo_move_to (cr, 50., 0.);
149 	cairo_rel_line_to (cr, -10., -10.);
150 	cairo_stroke (cr);
151 
browser_canvas_item_init(BrowserCanvasItem * item)152 	/* Y axis */
153 	cairo_set_source_rgba (cr, 0., 0., 1., 0.8);
154 
155 	cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
156 	cairo_set_font_size (cr, 10.);
157 	cairo_move_to (cr, -12., 55.);
158 	cairo_show_text (cr, "Y");
159 	cairo_stroke (cr);
160 
161 	cairo_move_to (cr, 0., 0.);
162 	cairo_line_to (cr, 0., 50.);
163 	cairo_rel_line_to (cr, 10., -10.);
164 	cairo_stroke (cr);
165 	cairo_move_to (cr, 0., 50.);
166 	cairo_rel_line_to (cr, -10., -10.);
167 	cairo_stroke (cr);
168 
169 	cairo_rectangle (cr, 0, 0, gtk_print_context_get_width (context), gtk_print_context_get_height (context));
170 	cairo_set_source_rgba (cr, 0., 0., 0., 1.);
171 	cairo_set_line_width (cr, 0.5);
172 	gdouble dash_length = 2.;
browser_canvas_item_dispose(GObject * object)173 	cairo_set_dash (cr, &dash_length, 1, 0.);
174 	cairo_stroke (cr);
175 	cairo_restore (cr);
176 #endif
177 
178 	if (pdata->show_page_numbers) {
179 		cairo_text_extents_t extents;
180 		gchar *str = g_strdup_printf (_("Page %d of %d horizontally and %d of %d vertically"),
181 					      col_page + 1, pdata->h_npages,
182 					      line_page + 1, pdata->v_npages);
183 		cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
184 		cairo_set_font_size (cr, 10.);
185 		cairo_text_extents (cr, str, &extents);
186 		cairo_move_to (cr, gtk_print_context_get_width (context) - extents.width - extents.x_bearing,
187 			       gtk_print_context_get_height (context) - extents.height - extents.y_bearing);
188 		cairo_show_text (cr, str);
189 		g_free (str);
190 		cairo_stroke (cr);
191 	}
192 
browser_canvas_item_set_property(GObject * object,guint param_id,const GValue * value,GParamSpec * pspec)193 	bounds.x1 = col_page * pdata->page_width + canvas_bounds.x1;
194 	bounds.x2 = bounds.x1 + pdata->page_width;
195 	bounds.y1 = line_page * pdata->page_height + canvas_bounds.y1;
196 	bounds.y2 = bounds.y1 + pdata->page_height;
197 
198 	cairo_scale (cr, pdata->scale, pdata->scale);
199 	cairo_translate (cr, - bounds.x1, - bounds.y1);
200 	goo_canvas_render (pdata->canvas->priv->goocanvas, cr, &bounds, .8);
201 	/*
202 	g_print ("Scale %.2f, cairo's bounds: (%.2fx%.2f) => (%.2fx%.2f), canvas's bounds: (%.2fx%.2f) => (%.2fx%.2f)\n",
203 		 pdata->scale, bounds.x1, bounds.y1, bounds.x2, bounds.y2,
204 		 canvas_bounds.x1, canvas_bounds.y1, canvas_bounds.x2, canvas_bounds.y2);
205 	*/
206 }
207 
208 typedef struct {
209 	PrintPageData *pdata;
210 	GtkSpinButton *zoom;
211 	GtkSpinButton *h_npages;
212 	GtkSpinButton *v_npages;
213 } PrintCustomData;
214 
215 static void print_page_setup_cb (GtkWidget *button, PrintCustomData *cdata);
216 static void print_h_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata);
217 static void print_v_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata);
218 static void print_zoom_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata);
219 static void print_page_numbers_toggled_cb (GtkToggleButton *toggle, PrintCustomData *cdata);
220 
221 static GObject *
222 print_create_custom_widget_cb (G_GNUC_UNUSED GtkPrintOperation *operation, PrintPageData *pdata)
223 {
224 	GtkWidget *vbox, *bbox, *button, *label, *hbox, *grid, *entry;
225 	PrintCustomData *cdata;
browser_canvas_item_get_property(GObject * object,guint param_id,GValue * value,GParamSpec * pspec)226 
227 	cdata = g_new0 (PrintCustomData, 1);
228 	cdata->pdata = pdata;
229 
230 	vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
231 	gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
232 
233 	/* page size's adjustments */
234 	bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
235 	gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
236 	gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START);
237 
238 	button = gtk_button_new_with_label (_("Adjust page's size and orientation"));
239 	g_signal_connect (button, "clicked", G_CALLBACK (print_page_setup_cb), cdata);
240 	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
241 
242 	/* zoom control */
243 	label = gtk_label_new ("");
244 	gtk_label_set_markup (GTK_LABEL (label), _("<b>Zoom</b>"));
245 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
246 	gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10);
247 
248 	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* HIG */
249         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
250         label = gtk_label_new ("    ");
251         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
252 
253 	grid = gtk_grid_new ();
254 	gtk_box_pack_start (GTK_BOX (hbox), grid, TRUE, TRUE, 0);
255 
256 	label = gtk_label_new (_("Number of pages used:"));
257 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
258 	gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
259 
browser_canvas_item_get_canvas(BrowserCanvasItem * item)260 	entry = gtk_spin_button_new_with_range (1., 100., 1.);
261 	gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 0);
262 	gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1);
263 	cdata->h_npages = (GtkSpinButton*) entry;
264 	g_signal_connect (entry, "value-changed",
265 			  G_CALLBACK (print_h_npages_value_changed_cb), cdata);
266 
267 	label = gtk_label_new (_("horizontally"));
268 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
269 	gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1);
270 
271 	entry = gtk_spin_button_new_with_range (1., 100., 1.);
272 	gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 0);
273 	gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1);
274 	cdata->v_npages = (GtkSpinButton*) entry;
275 	g_signal_connect (entry, "value-changed",
276 			  G_CALLBACK (print_v_npages_value_changed_cb), cdata);
browser_canvas_item_get_edge_nodes(BrowserCanvasItem * item,BrowserCanvasItem ** from,BrowserCanvasItem ** to)277 
278 	label = gtk_label_new (_("vertically"));
279 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
280 	gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1);
281 
282 	label = gtk_label_new (_("Zoom factor:"));
283 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
284 	gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
285 
286 	entry = gtk_spin_button_new_with_range (.1, 10., .05);
287 	gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 2);
288 	gtk_grid_attach (GTK_GRID (grid), entry, 1, 2, 1, 1);
289 	cdata->zoom = (GtkSpinButton*) entry;
290 	g_signal_connect (entry, "value-changed",
291 			  G_CALLBACK (print_zoom_value_changed_cb), cdata);
292 
293 	/* misc options */
294 	label = gtk_label_new ("");
295 	gtk_label_set_markup (GTK_LABEL (label), _("<b>Page numbers</b>"));
leave_notify_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,G_GNUC_UNUSED GdkEventCrossing * event,G_GNUC_UNUSED gpointer data)296 	gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5);
297 	gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10);
298 
299 	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* HIG */
300         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
301         label = gtk_label_new ("    ");
302         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
303 
304 	bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
button_press_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventButton * event,G_GNUC_UNUSED gpointer data)305 	gtk_box_pack_start (GTK_BOX (hbox), bbox, FALSE, FALSE, 0);
306 	gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START);
307 
308 	button = gtk_check_button_new_with_label (_("Print page numbers"));
309 	g_signal_connect (button, "toggled", G_CALLBACK (print_page_numbers_toggled_cb), cdata);
310 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), cdata->pdata->show_page_numbers);
311 	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
312 
313 	/* correct start state */
314 	gtk_widget_show_all (vbox);
315 	g_object_set_data_full (G_OBJECT (vbox), "cdata", cdata, g_free);
316 
317 	/* default zoom to 1 */
318 	gtk_spin_button_set_value (cdata->zoom, 1.);
319 
320 	return G_OBJECT (vbox);
321 }
322 
323 static void
324 print_page_numbers_toggled_cb (GtkToggleButton *toggle, PrintCustomData *cdata)
325 {
326 	cdata->pdata->show_page_numbers = gtk_toggle_button_get_active (toggle);
327 }
328 
329 static void
330 print_page_setup_cb (GtkWidget *button, PrintCustomData *cdata)
331 {
332 	GtkPageSetup *setup;
333 	GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
334 
335 	setup = cdata->pdata->page_setup;
336 	cdata->pdata->page_setup = gtk_print_run_page_setup_dialog ((GtkWindow *) toplevel,
337 								    cdata->pdata->page_setup, cdata->pdata->settings);
338 	if ((cdata->pdata->page_setup != setup) && (setup != page_setup))
339 		g_object_unref (setup);
340 
341 	print_zoom_value_changed_cb (cdata->zoom, cdata);
342 }
343 
344 static void
345 print_h_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata)
346 {
347 	gdouble page_width, page_height;
348 	GooCanvasBounds bounds;
349 	gdouble canvas_height;
350 	gdouble zoom;
351 	gint h_npages, v_npages;
352 
353 	h_npages = (gint) gtk_spin_button_get_value (entry);
354 	page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS);
355 	page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS);
356 
357 	goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds);
358 	zoom = (gdouble) h_npages * page_width / (bounds.x2 - bounds.x1);
button_release_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventButton * event,G_GNUC_UNUSED gpointer data)359 
360 	canvas_height = (bounds.y2 - bounds.y1) * zoom;
361 	v_npages = (gint) (canvas_height / page_height + 1.);
362 
363 	g_signal_handlers_block_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata);
364 	gtk_spin_button_set_value (cdata->zoom, zoom);
365 	g_signal_handlers_unblock_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata);
366 	g_signal_handlers_block_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata);
367 	gtk_spin_button_set_value (cdata->v_npages, v_npages);
368 	g_signal_handlers_unblock_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata);
369 
370 	cdata->pdata->scale = zoom;
371 	cdata->pdata->page_width = page_width / zoom;
372 	cdata->pdata->page_height = page_height / zoom;
373 	cdata->pdata->h_npages = h_npages;
374 	cdata->pdata->v_npages = v_npages;
375 
376 	/*
377 	g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages,
378 		 cdata->pdata->page_width, cdata->pdata->page_height);
motion_notify_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventMotion * event,G_GNUC_UNUSED gpointer data)379 	*/
380 }
381 
382 static void
383 print_v_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata)
384 {
385 	gdouble page_width, page_height;
386 	GooCanvasBounds bounds;
387 	gdouble canvas_width;
388 	gdouble zoom;
389 	gint h_npages, v_npages;
390 
391 	v_npages = (gint) gtk_spin_button_get_value (entry);
392 	page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS);
393 	page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS);
394 
395 	goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds);
396 	zoom = (gdouble) v_npages * page_height / (bounds.y2 - bounds.y1);
397 
398 	canvas_width = (bounds.x2 - bounds.x1) * zoom;
399 	h_npages = (gint) (canvas_width / page_width + 1.);
400 
401 	g_signal_handlers_block_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata);
402 	gtk_spin_button_set_value (cdata->zoom, zoom);
403 	g_signal_handlers_unblock_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata);
404 	g_signal_handlers_block_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata);
405 	gtk_spin_button_set_value (cdata->h_npages, h_npages);
406 	g_signal_handlers_unblock_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata);
407 
408 	cdata->pdata->scale = zoom;
409 	cdata->pdata->page_width = page_width / zoom;
410 	cdata->pdata->page_height = page_height / zoom;
411 	cdata->pdata->h_npages = h_npages;
412 	cdata->pdata->v_npages = v_npages;
413 
414 	/*
415 	g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages,
416 		 cdata->pdata->page_width, cdata->pdata->page_height);
417 	*/
418 }
419 
420 static void
421 print_zoom_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata)
422 {
423 	gdouble page_width, page_height;
424 	GooCanvasBounds bounds;
425 	gdouble canvas_width, canvas_height;
426 	gdouble zoom;
427 	gint h_npages, v_npages;
428 
429 	zoom = gtk_spin_button_get_value (entry);
430 	page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS);
431 	page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS);
432 
433 	goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds);
434 	canvas_width = (bounds.x2 - bounds.x1) * zoom;
435 	canvas_height = (bounds.y2 - bounds.y1) * zoom;
436 	h_npages = (gint) (canvas_width / page_width + 1.);
437 	v_npages = (gint) (canvas_height / page_height + 1.);
438 
439 	g_signal_handlers_block_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata);
440 	gtk_spin_button_set_value (cdata->h_npages, h_npages);
441 	g_signal_handlers_unblock_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata);
442 	g_signal_handlers_block_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata);
443 	gtk_spin_button_set_value (cdata->v_npages, v_npages);
444 	g_signal_handlers_unblock_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata);
445 
446 	cdata->pdata->scale = zoom;
447 	cdata->pdata->page_width = page_width / zoom;
448 	cdata->pdata->page_height = page_height / zoom;
449 	cdata->pdata->h_npages = h_npages;
450 	cdata->pdata->v_npages = v_npages;
451 
452 	/*
453 	g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages,
454 		 cdata->pdata->page_width, cdata->pdata->page_height);
455 	*/
456 }
457 
458