]> git.sur5r.net Git - glabels/blob - src/print-op-dialog.c
Recommend atril as alternative to evince
[glabels] / src / print-op-dialog.c
1 /*
2  *  print-op-dialog.c
3  *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "print-op-dialog.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <math.h>
28 #include <time.h>
29 #include <ctype.h>
30
31 #include "mini-preview.h"
32 #include "label.h"
33 #include "builder-util.h"
34
35 #include "pixmaps/collate.xpm"
36 #include "pixmaps/nocollate.xpm"
37
38 #include "debug.h"
39
40
41 #define MINI_PREVIEW_MIN_HEIGHT 175
42 #define MINI_PREVIEW_MIN_WIDTH  150
43
44
45 /*===========================================*/
46 /* Private data types                        */
47 /*===========================================*/
48
49 struct _glPrintOpDialogPrivate {
50
51         GtkBuilder *builder;
52
53         GtkWidget  *simple_frame;
54         GtkWidget  *simple_sheets_radio;
55         GtkWidget  *simple_sheets_spin;
56         GtkWidget  *simple_labels_radio;
57         GtkWidget  *simple_first_spin;
58         GtkWidget  *simple_last_spin;
59
60         GtkWidget  *merge_frame;
61         GtkWidget  *merge_first_spin;
62         GtkWidget  *merge_copies_spin;
63         GtkWidget  *merge_collate_check;
64         GtkWidget  *merge_collate_image;
65
66         GtkWidget  *outline_check;
67         GtkWidget  *reverse_check;
68         GtkWidget  *crop_marks_check;
69
70         GtkWidget  *preview;
71
72         gint       labels_per_sheet;
73         gboolean   merge_flag;
74         gint       n_records;
75
76 };
77
78
79 /*===========================================*/
80 /* Private globals                           */
81 /*===========================================*/
82
83
84 /*===========================================*/
85 /* Local function prototypes                 */
86 /*===========================================*/
87
88 static void     gl_print_op_dialog_finalize   (GObject           *object);
89
90 static void     gl_print_op_dialog_construct  (glPrintOpDialog   *op,
91                                                glLabel           *label);
92
93 static GObject *create_custom_widget_cb       (GtkPrintOperation *operation,
94                                                glLabel           *label);
95
96 static void     custom_widget_apply_cb        (GtkPrintOperation *operation,
97                                                GtkWidget         *widget,
98                                                glLabel           *label);
99
100 static void     simple_sheets_radio_cb        (GtkToggleButton   *togglebutton,
101                                                glPrintOpDialog   *op);
102
103 static void     simple_first_spin_cb          (GtkSpinButton     *spinbutton,
104                                                glPrintOpDialog   *op);
105
106 static void     simple_last_spin_cb           (GtkSpinButton     *spinbutton,
107                                                glPrintOpDialog   *op);
108
109 static void     preview_pressed_cb            (glMiniPreview     *preview,
110                                                gint               first,
111                                                gint               last,
112                                                glPrintOpDialog   *op);
113
114 static void     preview_released_cb           (glMiniPreview     *preview,
115                                                gint               first,
116                                                gint               last,
117                                                glPrintOpDialog   *op);
118
119 static void     merge_spin_cb                 (GtkSpinButton     *spinbutton,
120                                                glPrintOpDialog   *op);
121
122 static void     merge_collate_check_cb        (GtkToggleButton   *togglebutton,
123                                                glPrintOpDialog   *op);
124
125 static void     preview_clicked_cb            (glMiniPreview     *preview,
126                                                gint               first,
127                                                glPrintOpDialog   *op);
128
129 static void     option_toggled_cb             (GtkToggleButton   *togglebutton,
130                                                glPrintOpDialog   *op);
131
132
133 /*****************************************************************************/
134 /* Boilerplate object stuff.                                                 */
135 /*****************************************************************************/
136 G_DEFINE_TYPE (glPrintOpDialog, gl_print_op_dialog, GL_TYPE_PRINT_OP)
137
138
139 static void
140 gl_print_op_dialog_class_init (glPrintOpDialogClass *class)
141 {
142         GObjectClass           *object_class = G_OBJECT_CLASS (class);
143
144         gl_debug (DEBUG_PRINT, "");
145         
146         gl_print_op_dialog_parent_class = g_type_class_peek_parent (class);
147
148         object_class->finalize = gl_print_op_dialog_finalize;
149 }
150
151
152 static void
153 gl_print_op_dialog_init (glPrintOpDialog *op)
154 {
155         gl_debug (DEBUG_PRINT, "");
156
157         gtk_print_operation_set_use_full_page (GTK_PRINT_OPERATION (op), TRUE);
158
159         gtk_print_operation_set_unit (GTK_PRINT_OPERATION (op), GTK_UNIT_POINTS);
160
161         op->priv = g_new0 (glPrintOpDialogPrivate, 1);
162
163 }
164
165
166 static void 
167 gl_print_op_dialog_finalize (GObject *object)
168 {
169         glPrintOpDialog *op = GL_PRINT_OP_DIALOG (object);
170         
171         gl_debug (DEBUG_PRINT, "");
172
173         g_return_if_fail (object != NULL);
174         g_return_if_fail (GL_IS_PRINT_OP (op));
175         g_return_if_fail (op->priv != NULL);
176
177         g_object_unref (G_OBJECT(op->priv->builder));
178         g_free (op->priv);
179
180         G_OBJECT_CLASS (gl_print_op_dialog_parent_class)->finalize (object);
181
182         g_free (op->priv);
183 }
184
185
186 /*****************************************************************************/
187 /* NEW print op.                                                         */
188 /*****************************************************************************/
189 glPrintOpDialog *
190 gl_print_op_dialog_new (glLabel      *label)
191 {
192         glPrintOpDialog *op;
193
194         gl_debug (DEBUG_PRINT, "");
195
196         op = GL_PRINT_OP_DIALOG (g_object_new (GL_TYPE_PRINT_OP_DIALOG, NULL));
197
198         gl_print_op_dialog_construct (GL_PRINT_OP_DIALOG(op), label);
199
200         return op;
201 }
202
203
204 /*--------------------------------------------------------------------------*/
205 /* PRIVATE.  Construct op.                                              */
206 /*--------------------------------------------------------------------------*/
207 static void
208 gl_print_op_dialog_construct (glPrintOpDialog      *op,
209                               glLabel              *label)
210 {
211
212         gl_print_op_construct(GL_PRINT_OP (op), label);
213
214         gtk_print_operation_set_custom_tab_label ( GTK_PRINT_OPERATION (op),
215                                                    _("Labels"));
216
217         g_signal_connect (G_OBJECT (op), "create-custom-widget",
218                           G_CALLBACK (create_custom_widget_cb), label);
219
220         g_signal_connect (G_OBJECT (op), "custom-widget-apply",
221                           G_CALLBACK (custom_widget_apply_cb), label);
222
223 }
224
225
226 /*--------------------------------------------------------------------------*/
227 /* PRIVATE.  "Create custom widget" callback                                */
228 /*--------------------------------------------------------------------------*/
229 static GObject *
230 create_custom_widget_cb (GtkPrintOperation *operation,
231                          glLabel           *label)
232 {
233         gchar                  *builder_filename;
234         GtkBuilder             *builder;
235         static gchar           *object_ids[] = { "print_custom_widget_hbox",
236                                                  "adjustment1", "adjustment2",
237                                                  "adjustment3", "adjustment4",
238                                                  "adjustment5",
239                                                  NULL };
240         GError                 *error = NULL;
241         glPrintOpDialog        *op = GL_PRINT_OP_DIALOG (operation);
242         const lglTemplate      *template;
243         const lglTemplateFrame *frame;
244         GtkWidget              *hbox;
245         glMerge                *merge = NULL;
246         GdkPixbuf              *pixbuf;
247
248
249         template = gl_label_get_template (label);
250         frame = (lglTemplateFrame *)template->frames->data;
251         op->priv->labels_per_sheet = lgl_template_frame_get_n_labels (frame);
252
253         builder = gtk_builder_new ();
254         builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "print-op-dialog-custom-widget.ui", NULL);
255         gtk_builder_add_objects_from_file (builder, builder_filename, object_ids, &error);
256         g_free (builder_filename);
257         if (error) {
258                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
259                 g_error_free (error);
260                 return NULL;
261         }
262
263         gl_builder_util_get_widgets (builder,
264                                      "print_custom_widget_hbox", &hbox,
265                                      "simple_frame",             &op->priv->simple_frame,
266                                      "simple_sheets_radio",      &op->priv->simple_sheets_radio,
267                                      "simple_sheets_spin",       &op->priv->simple_sheets_spin,
268                                      "simple_labels_radio",      &op->priv->simple_labels_radio,
269                                      "simple_first_spin",        &op->priv->simple_first_spin,
270                                      "simple_last_spin",         &op->priv->simple_last_spin,
271                                      "merge_frame",              &op->priv->merge_frame,
272                                      "merge_first_spin",         &op->priv->merge_first_spin,
273                                      "merge_copies_spin",        &op->priv->merge_copies_spin,
274                                      "merge_collate_check",      &op->priv->merge_collate_check,
275                                      "merge_collate_image",      &op->priv->merge_collate_image,
276                                      "outline_check",            &op->priv->outline_check,
277                                      "reverse_check",            &op->priv->reverse_check,
278                                      "crop_marks_check",         &op->priv->crop_marks_check,
279                                      NULL);
280
281         op->priv->builder = builder;
282
283         /* ---- Install preview. ---- */
284         op->priv->preview = gl_mini_preview_new (MINI_PREVIEW_MIN_HEIGHT, MINI_PREVIEW_MIN_WIDTH);
285         gl_mini_preview_set_template (GL_MINI_PREVIEW(op->priv->preview), template);
286         gl_mini_preview_set_label (GL_MINI_PREVIEW(op->priv->preview), label);
287         gtk_box_pack_start (GTK_BOX(hbox), op->priv->preview, TRUE, TRUE, 0);
288         gtk_widget_show_all (op->priv->preview);
289
290         
291         /* ---- Activate either simple or merge print control widgets. ---- */
292         merge = gl_label_get_merge (label);
293         op->priv->merge_flag = (merge != NULL);
294         if (!op->priv->merge_flag) {
295
296                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio),
297                                               TRUE);
298                 gtk_widget_set_sensitive (op->priv->simple_first_spin, FALSE);
299                 gtk_widget_set_sensitive (op->priv->simple_last_spin, FALSE);
300
301                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin),
302                                            gl_print_op_get_n_sheets (GL_PRINT_OP(op)));
303
304                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
305                                            1, op->priv->labels_per_sheet);
306                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
307                                            1);
308
309                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
310                                            1, op->priv->labels_per_sheet);
311                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
312                                            op->priv->labels_per_sheet);
313
314                 /* Update preview. */
315                 gl_mini_preview_set_page     (GL_MINI_PREVIEW (op->priv->preview), 0);
316                 gl_mini_preview_set_n_sheets (GL_MINI_PREVIEW (op->priv->preview),
317                                               gl_print_op_get_n_sheets (GL_PRINT_OP(op)));
318                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), 1);
319                 gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview),
320                                               op->priv->labels_per_sheet);
321
322                 gtk_widget_show_all (op->priv->simple_frame);
323                 gtk_widget_hide     (op->priv->merge_frame);
324
325                 g_signal_connect (G_OBJECT (op->priv->simple_sheets_radio), "toggled",
326                                   G_CALLBACK (simple_sheets_radio_cb), op);
327                 g_signal_connect (G_OBJECT (op->priv->simple_first_spin), "changed",
328                                   G_CALLBACK (simple_first_spin_cb), op);
329                 g_signal_connect (G_OBJECT (op->priv->simple_last_spin), "changed",
330                                   G_CALLBACK (simple_last_spin_cb), op);
331                 g_signal_connect (G_OBJECT (op->priv->preview), "pressed",
332                                   G_CALLBACK (preview_pressed_cb), op);
333                 g_signal_connect (G_OBJECT (op->priv->preview), "released",
334                                   G_CALLBACK (preview_released_cb), op);
335
336         } else {
337
338                 op->priv->n_records = gl_merge_get_record_count (merge);
339
340                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->merge_first_spin),
341                                            1, op->priv->labels_per_sheet);
342                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_first_spin),
343                                            gl_print_op_get_first (GL_PRINT_OP(op)));
344
345                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_copies_spin),
346                                            gl_print_op_get_n_copies (GL_PRINT_OP(op)));
347
348                 gtk_widget_set_sensitive (op->priv->merge_collate_check,
349                                           (gl_print_op_get_n_copies (GL_PRINT_OP(op)) > 1));
350                 gtk_widget_set_sensitive (op->priv->merge_collate_image,
351                                           (gl_print_op_get_n_copies (GL_PRINT_OP(op)) > 1));
352                 
353
354                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio),
355                                               gl_print_op_get_collate_flag (GL_PRINT_OP(op)));
356
357                 if ( gl_print_op_get_collate_flag (GL_PRINT_OP(op)) )
358                 {
359                         pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
360                 }
361                 else
362                 {
363                         pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
364                 }
365
366                 gtk_image_set_from_pixbuf (GTK_IMAGE (op->priv->merge_collate_image), pixbuf);
367
368                 /* Update preview. */
369                 gl_mini_preview_set_page     (GL_MINI_PREVIEW (op->priv->preview), 0);
370                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview),
371                                               gl_print_op_get_first (GL_PRINT_OP(op)));
372                 gl_mini_preview_set_n_copies (GL_MINI_PREVIEW (op->priv->preview),
373                                               gl_print_op_get_n_copies (GL_PRINT_OP(op)));
374                 gl_mini_preview_set_collate_flag (GL_MINI_PREVIEW (op->priv->preview),
375                                                   gl_print_op_get_collate_flag (GL_PRINT_OP(op)));
376
377
378                 gtk_widget_hide     (op->priv->simple_frame);
379                 gtk_widget_show_all (op->priv->merge_frame);
380
381                 g_signal_connect (G_OBJECT (op->priv->merge_first_spin), "changed",
382                                   G_CALLBACK (merge_spin_cb), op);
383                 g_signal_connect (G_OBJECT (op->priv->merge_copies_spin), "changed",
384                                   G_CALLBACK (merge_spin_cb), op);
385                 g_signal_connect (G_OBJECT (op->priv->merge_collate_check), "toggled",
386                                   G_CALLBACK (merge_collate_check_cb), op);
387                 g_signal_connect (G_OBJECT (op->priv->preview), "clicked",
388                                   G_CALLBACK (preview_clicked_cb), op);
389                 g_signal_connect (G_OBJECT (op->priv->preview), "pressed",
390                                   G_CALLBACK (preview_pressed_cb), op);
391                 g_signal_connect (G_OBJECT (op->priv->preview), "released",
392                                   G_CALLBACK (preview_released_cb), op);
393
394                 g_object_unref (G_OBJECT(merge));
395
396         }
397
398         /* --- Set options --- */
399         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->outline_check),
400                                       gl_print_op_get_outline_flag (GL_PRINT_OP(op)));
401         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check),
402                                       gl_print_op_get_reverse_flag (GL_PRINT_OP(op)));
403         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check),
404                                       gl_print_op_get_crop_marks_flag (GL_PRINT_OP(op)));
405
406         /* --- Do we need to force the outline flag --- */
407         if (gl_print_op_is_outline_forced (GL_PRINT_OP (op)))
408         {
409                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(op->priv->outline_check),
410                                               TRUE);
411
412                 gtk_widget_set_sensitive (op->priv->outline_check, FALSE);
413                 gtk_widget_set_sensitive (op->priv->reverse_check, FALSE);
414                 gtk_widget_set_sensitive (op->priv->crop_marks_check, FALSE);
415         }
416
417         g_signal_connect (G_OBJECT (op->priv->outline_check), "toggled",
418                           G_CALLBACK (option_toggled_cb), op);
419         g_signal_connect (G_OBJECT (op->priv->reverse_check), "toggled",
420                           G_CALLBACK (option_toggled_cb), op);
421         g_signal_connect (G_OBJECT (op->priv->crop_marks_check), "toggled",
422                           G_CALLBACK (option_toggled_cb), op);
423
424         return G_OBJECT (hbox);
425 }
426
427
428 /*--------------------------------------------------------------------------*/
429 /* PRIVATE.  "Custom widget apply" callback                                 */
430 /*--------------------------------------------------------------------------*/
431 static void
432 custom_widget_apply_cb (GtkPrintOperation *operation,
433                         GtkWidget         *widget,
434                         glLabel           *label)
435 {
436         glPrintOpDialog *op    = GL_PRINT_OP_DIALOG (operation);
437         glMerge         *merge = NULL;
438         gint             n_records;
439         gint             n_sheets, first, last, n_copies;
440         gboolean         collate_flag;
441
442         gl_print_op_set_outline_flag (GL_PRINT_OP (op),
443                                       gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
444                                                                     (op->priv->outline_check)));
445         gl_print_op_set_reverse_flag (GL_PRINT_OP (op),
446                                       gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
447                                                                     (op->priv->reverse_check)));
448         gl_print_op_set_crop_marks_flag (GL_PRINT_OP (op),
449                                          gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
450                                                                        (op->priv->crop_marks_check)));
451
452
453         if (!op->priv->merge_flag)
454         {
455
456                 n_sheets = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin));
457                 gl_print_op_set_n_sheets (GL_PRINT_OP (op), n_sheets);
458
459                 first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
460                 gl_print_op_set_first (GL_PRINT_OP (op), first);
461
462                 last = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
463                 gl_print_op_set_last (GL_PRINT_OP (op), last);
464
465         }
466         else
467         {
468
469                 merge = gl_label_get_merge (label);
470
471                 n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
472                 gl_print_op_set_n_copies (GL_PRINT_OP (op), n_copies);
473
474                 first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_first_spin));
475                 gl_print_op_set_first (GL_PRINT_OP (op), first);
476
477                 collate_flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->merge_collate_check));
478                 gl_print_op_set_collate_flag (GL_PRINT_OP (op), collate_flag);
479
480                 n_records = gl_merge_get_record_count (merge);
481                 n_sheets = ceil ((first - 1 + n_copies*n_records)/(double)op->priv->labels_per_sheet);
482                 if ( n_sheets < 1 )
483                 {
484                         n_sheets = 1;
485                 }
486                 gl_print_op_set_n_sheets     (GL_PRINT_OP (op), n_sheets);
487
488                 g_object_unref (G_OBJECT(merge));
489
490         }
491
492
493 }
494
495
496 /*--------------------------------------------------------------------------*/
497 /* PRIVATE.  Simple sheets radio "toggled" callback                         */
498 /*--------------------------------------------------------------------------*/
499 static void
500 simple_sheets_radio_cb (GtkToggleButton   *togglebutton,
501                         glPrintOpDialog   *op)
502 {
503         gint first, last;
504
505         if (gtk_toggle_button_get_active (togglebutton)) {
506
507                 gtk_widget_set_sensitive (op->priv->simple_sheets_spin, TRUE);
508                 gtk_widget_set_sensitive (op->priv->simple_first_spin, FALSE);
509                 gtk_widget_set_sensitive (op->priv->simple_last_spin, FALSE);
510
511                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
512                                            1, op->priv->labels_per_sheet);
513                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
514                                            1);
515
516                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
517                                            1, op->priv->labels_per_sheet);
518                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
519                                            op->priv->labels_per_sheet);
520
521                 gl_mini_preview_set_n_sheets (GL_MINI_PREVIEW (op->priv->preview),
522                                               gl_print_op_get_n_sheets (GL_PRINT_OP(op)));
523                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), 1);
524                 gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview),
525                                               op->priv->labels_per_sheet);
526
527         } else {
528
529                 gtk_widget_set_sensitive (op->priv->simple_sheets_spin, FALSE);
530                 gtk_widget_set_sensitive (op->priv->simple_first_spin, TRUE);
531                 gtk_widget_set_sensitive (op->priv->simple_last_spin, TRUE);
532
533                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
534
535                 first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
536                 last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
537
538                 gl_mini_preview_set_n_sheets (GL_MINI_PREVIEW (op->priv->preview), 1);
539                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
540                 gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
541
542         }
543 }
544
545
546 /*--------------------------------------------------------------------------*/
547 /* PRIVATE.  Simple first label spinbutton "changed" callback               */
548 /*--------------------------------------------------------------------------*/
549 static void
550 simple_first_spin_cb (GtkSpinButton     *spinbutton,
551                       glPrintOpDialog   *op)
552 {
553         gint first, last;
554
555         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
556         last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
557
558         /* Adjust range of last spin button. */
559         gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
560                                    first, op->priv->labels_per_sheet);
561
562         /* Update preview. */
563         gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
564         gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
565
566 }
567
568
569 /*--------------------------------------------------------------------------*/
570 /* PRIVATE.  Simple last label spinbutton "changed" callback                */
571 /*--------------------------------------------------------------------------*/
572 static void
573 simple_last_spin_cb (GtkSpinButton     *spinbutton,
574                      glPrintOpDialog   *op)
575 {
576         gint first, last;
577
578         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
579         last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
580
581         /* Adjust range of first spin button. */
582         gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
583                                    1, last);
584
585         /* Update preview. */
586         gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
587         gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
588
589 }
590
591
592 /*--------------------------------------------------------------------------*/
593 /* PRIVATE.  Preview "pressed" callback                                     */
594 /*--------------------------------------------------------------------------*/
595 static void
596 preview_pressed_cb (glMiniPreview     *preview,
597                     gint               first,
598                     gint               last,
599                     glPrintOpDialog   *op)
600 {
601         gint old_first;
602
603         if ( !op->priv->merge_flag )
604         {
605
606                 /* Update controls. */
607                 old_first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
608                 if ( first > old_first )
609                 {
610                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
611                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
612                 }
613                 else
614                 {
615                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
616                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
617                 }
618                 if ( (first == 1) && (last == op->priv->labels_per_sheet) )
619                 {
620                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio), TRUE);
621                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
622                 }
623                 else
624                 {
625                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_labels_radio), TRUE);
626                 }
627
628         }
629
630         gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
631
632 }
633
634
635 /*--------------------------------------------------------------------------*/
636 /* PRIVATE.  Preview "pressed" callback                                     */
637 /*--------------------------------------------------------------------------*/
638 static void
639 preview_released_cb (glMiniPreview     *preview,
640                      gint               first,
641                      gint               last,
642                      glPrintOpDialog   *op)
643 {
644
645         gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), 0, 0);
646
647 }
648
649
650 /*--------------------------------------------------------------------------*/
651 /* PRIVATE.  "changed" callback for merge first and copies spin buttons.    */
652 /*--------------------------------------------------------------------------*/
653 static void
654 merge_spin_cb (GtkSpinButton     *spinbutton,
655                glPrintOpDialog   *op)
656 {
657         gint first, n_copies;
658
659         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_first_spin));
660
661         n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
662
663         gl_mini_preview_set_first (GL_MINI_PREVIEW(op->priv->preview), first);
664         gl_mini_preview_set_n_copies (GL_MINI_PREVIEW(op->priv->preview), n_copies);
665
666         gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
667         gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
668 }
669
670
671 /*--------------------------------------------------------------------------*/
672 /* PRIVATE.  Merge first collate check "toggled" callback                   */
673 /*--------------------------------------------------------------------------*/
674 static void
675 merge_collate_check_cb (GtkToggleButton   *togglebutton,
676                         glPrintOpDialog   *op)
677 {
678         GdkPixbuf *pixbuf;
679
680         if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->merge_collate_check)) )
681         {
682                 pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
683                 gl_mini_preview_set_collate_flag (GL_MINI_PREVIEW (op->priv->preview), TRUE);
684         }
685         else
686         {
687                 pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
688                 gl_mini_preview_set_collate_flag (GL_MINI_PREVIEW (op->priv->preview), FALSE);
689         }
690
691         gtk_image_set_from_pixbuf (GTK_IMAGE (op->priv->merge_collate_image), pixbuf);
692 }
693
694
695 /*--------------------------------------------------------------------------*/
696 /* PRIVATE.  Preview "clicked" callback                                     */
697 /*--------------------------------------------------------------------------*/
698 static void
699 preview_clicked_cb (glMiniPreview     *preview,
700                     gint               first,
701                     glPrintOpDialog   *op)
702 {
703         gint n_copies;
704
705         if ( op->priv->merge_flag )
706         {
707
708                 /* Update controls. */
709                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_first_spin), first);
710
711                 n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
712                 gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
713                 gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
714
715         }
716 }
717
718
719 /*--------------------------------------------------------------------------*/
720 /* PRIVATE.  Option checkbox "toggled" callback                             */
721 /*--------------------------------------------------------------------------*/
722 static void
723 option_toggled_cb (GtkToggleButton   *togglebutton,
724                    glPrintOpDialog   *op)
725 {
726         gboolean flag;
727
728         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->outline_check));
729         gl_mini_preview_set_outline_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
730
731         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check));
732         gl_mini_preview_set_reverse_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
733
734         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check));
735         gl_mini_preview_set_crop_marks_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
736 }
737
738
739
740
741 /*
742  * Local Variables:       -- emacs
743  * mode: C                -- emacs
744  * c-basic-offset: 8      -- emacs
745  * tab-width: 8           -- emacs
746  * indent-tabs-mode: nil  -- emacs
747  * End:                   -- emacs
748  */