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