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