]> git.sur5r.net Git - glabels/blob - src/print-op-dialog.c
Imported Upstream version 3.0.0
[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                 gl_print_op_set_n_sheets     (GL_PRINT_OP (op), n_sheets);
483
484                 g_object_unref (G_OBJECT(merge));
485
486         }
487
488
489 }
490
491
492 /*--------------------------------------------------------------------------*/
493 /* PRIVATE.  Simple sheets radio "toggled" callback                         */
494 /*--------------------------------------------------------------------------*/
495 static void
496 simple_sheets_radio_cb (GtkToggleButton   *togglebutton,
497                         glPrintOpDialog   *op)
498 {
499         gint first, last;
500
501         if (gtk_toggle_button_get_active (togglebutton)) {
502
503                 gtk_widget_set_sensitive (op->priv->simple_sheets_spin, TRUE);
504                 gtk_widget_set_sensitive (op->priv->simple_first_spin, FALSE);
505                 gtk_widget_set_sensitive (op->priv->simple_last_spin, FALSE);
506
507                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
508                                            1, op->priv->labels_per_sheet);
509                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
510                                            1);
511
512                 gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
513                                            1, op->priv->labels_per_sheet);
514                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
515                                            op->priv->labels_per_sheet);
516
517                 gl_mini_preview_set_n_sheets (GL_MINI_PREVIEW (op->priv->preview),
518                                               gl_print_op_get_n_sheets (GL_PRINT_OP(op)));
519                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), 1);
520                 gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview),
521                                               op->priv->labels_per_sheet);
522
523         } else {
524
525                 gtk_widget_set_sensitive (op->priv->simple_sheets_spin, FALSE);
526                 gtk_widget_set_sensitive (op->priv->simple_first_spin, TRUE);
527                 gtk_widget_set_sensitive (op->priv->simple_last_spin, TRUE);
528
529                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
530
531                 first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
532                 last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
533
534                 gl_mini_preview_set_n_sheets (GL_MINI_PREVIEW (op->priv->preview), 1);
535                 gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
536                 gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
537
538         }
539 }
540
541
542 /*--------------------------------------------------------------------------*/
543 /* PRIVATE.  Simple first label spinbutton "changed" callback               */
544 /*--------------------------------------------------------------------------*/
545 static void
546 simple_first_spin_cb (GtkSpinButton     *spinbutton,
547                       glPrintOpDialog   *op)
548 {
549         gint first, last;
550
551         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
552         last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
553
554         /* Adjust range of last spin button. */
555         gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
556                                    first, op->priv->labels_per_sheet);
557
558         /* Update preview. */
559         gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
560         gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
561
562 }
563
564
565 /*--------------------------------------------------------------------------*/
566 /* PRIVATE.  Simple last label spinbutton "changed" callback                */
567 /*--------------------------------------------------------------------------*/
568 static void
569 simple_last_spin_cb (GtkSpinButton     *spinbutton,
570                      glPrintOpDialog   *op)
571 {
572         gint first, last;
573
574         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
575         last  = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
576
577         /* Adjust range of first spin button. */
578         gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
579                                    1, last);
580
581         /* Update preview. */
582         gl_mini_preview_set_first    (GL_MINI_PREVIEW (op->priv->preview), first);
583         gl_mini_preview_set_last     (GL_MINI_PREVIEW (op->priv->preview), last);
584
585 }
586
587
588 /*--------------------------------------------------------------------------*/
589 /* PRIVATE.  Preview "pressed" callback                                     */
590 /*--------------------------------------------------------------------------*/
591 static void
592 preview_pressed_cb (glMiniPreview     *preview,
593                     gint               first,
594                     gint               last,
595                     glPrintOpDialog   *op)
596 {
597         gint old_first;
598
599         if ( !op->priv->merge_flag )
600         {
601
602                 /* Update controls. */
603                 old_first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
604                 if ( first > old_first )
605                 {
606                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
607                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
608                 }
609                 else
610                 {
611                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
612                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
613                 }
614                 if ( (first == 1) && (last == op->priv->labels_per_sheet) )
615                 {
616                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio), TRUE);
617                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
618                 }
619                 else
620                 {
621                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_labels_radio), TRUE);
622                 }
623
624         }
625
626         gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
627
628 }
629
630
631 /*--------------------------------------------------------------------------*/
632 /* PRIVATE.  Preview "pressed" callback                                     */
633 /*--------------------------------------------------------------------------*/
634 static void
635 preview_released_cb (glMiniPreview     *preview,
636                      gint               first,
637                      gint               last,
638                      glPrintOpDialog   *op)
639 {
640
641         gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), 0, 0);
642
643 }
644
645
646 /*--------------------------------------------------------------------------*/
647 /* PRIVATE.  "changed" callback for merge first and copies spin buttons.    */
648 /*--------------------------------------------------------------------------*/
649 static void
650 merge_spin_cb (GtkSpinButton     *spinbutton,
651                glPrintOpDialog   *op)
652 {
653         gint first, n_copies;
654
655         first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_first_spin));
656
657         n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
658
659         gl_mini_preview_set_first (GL_MINI_PREVIEW(op->priv->preview), first);
660         gl_mini_preview_set_n_copies (GL_MINI_PREVIEW(op->priv->preview), n_copies);
661
662         gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
663         gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
664 }
665
666
667 /*--------------------------------------------------------------------------*/
668 /* PRIVATE.  Merge first collate check "toggled" callback                   */
669 /*--------------------------------------------------------------------------*/
670 static void
671 merge_collate_check_cb (GtkToggleButton   *togglebutton,
672                         glPrintOpDialog   *op)
673 {
674         GdkPixbuf *pixbuf;
675
676         if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->merge_collate_check)) )
677         {
678                 pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
679                 gl_mini_preview_set_collate_flag (GL_MINI_PREVIEW (op->priv->preview), TRUE);
680         }
681         else
682         {
683                 pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
684                 gl_mini_preview_set_collate_flag (GL_MINI_PREVIEW (op->priv->preview), FALSE);
685         }
686
687         gtk_image_set_from_pixbuf (GTK_IMAGE (op->priv->merge_collate_image), pixbuf);
688 }
689
690
691 /*--------------------------------------------------------------------------*/
692 /* PRIVATE.  Preview "clicked" callback                                     */
693 /*--------------------------------------------------------------------------*/
694 static void
695 preview_clicked_cb (glMiniPreview     *preview,
696                     gint               first,
697                     glPrintOpDialog   *op)
698 {
699         gint n_copies;
700
701         if ( op->priv->merge_flag )
702         {
703
704                 /* Update controls. */
705                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_first_spin), first);
706
707                 n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
708                 gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
709                 gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
710
711         }
712 }
713
714
715 /*--------------------------------------------------------------------------*/
716 /* PRIVATE.  Option checkbox "toggled" callback                             */
717 /*--------------------------------------------------------------------------*/
718 static void
719 option_toggled_cb (GtkToggleButton   *togglebutton,
720                    glPrintOpDialog   *op)
721 {
722         gboolean flag;
723
724         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->outline_check));
725         gl_mini_preview_set_outline_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
726
727         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check));
728         gl_mini_preview_set_reverse_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
729
730         flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check));
731         gl_mini_preview_set_crop_marks_flag (GL_MINI_PREVIEW (op->priv->preview), flag);
732 }
733
734
735
736
737 /*
738  * Local Variables:       -- emacs
739  * mode: C                -- emacs
740  * c-basic-offset: 8      -- emacs
741  * tab-width: 8           -- emacs
742  * indent-tabs-mode: nil  -- emacs
743  * End:                   -- emacs
744  */