]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-print-merge.c
51a0143250bacf421aa54c99f6af5fd618182556
[glabels] / glabels2 / src / wdgt-print-merge.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_print_merge.c:  print merge widget module
5  *
6  *  Copyright (C) 2001  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include "wdgt-print-merge.h"
26 #include "wdgt-mini-preview.h"
27 #include "marshal.h"
28
29 #include "pixmaps/collate.xpm"
30 #include "pixmaps/nocollate.xpm"
31
32 #include "debug.h"
33
34 #define WDGT_MINI_PREVIEW_HEIGHT 175
35 #define WDGT_MINI_PREVIEW_WIDTH  150
36
37 /*===========================================*/
38 /* Private globals                           */
39 /*===========================================*/
40
41 static GObjectClass *parent_class;
42
43 /*===========================================*/
44 /* Local function prototypes                 */
45 /*===========================================*/
46
47 static void gl_wdgt_print_merge_class_init    (glWdgtPrintMergeClass * class);
48 static void gl_wdgt_print_merge_instance_init (glWdgtPrintMerge * merge);
49 static void gl_wdgt_print_merge_finalize      (GObject * object);
50
51 static void gl_wdgt_print_merge_construct     (glWdgtPrintMerge * merge,
52                                                glLabel * label);
53
54 static void preview_clicked                   (glWdgtMiniPreview *mini_preview,
55                                                gint i_label,
56                                                gpointer user_data);
57
58 static void collate_check_cb                  (GtkToggleButton * togglebutton,
59                                                gpointer user_data);
60 static void spin_cb                           (GtkSpinButton * spinbutton,
61                                                gpointer user_data);
62
63 \f
64 /****************************************************************************/
65 /* Boilerplate Object stuff.                                                */
66 /****************************************************************************/
67 guint
68 gl_wdgt_print_merge_get_type (void)
69 {
70         static guint wdgt_print_merge_type = 0;
71
72         if (!wdgt_print_merge_type) {
73                 GTypeInfo wdgt_print_merge_info = {
74                         sizeof (glWdgtPrintMergeClass),
75                         NULL,
76                         NULL,
77                         (GClassInitFunc) gl_wdgt_print_merge_class_init,
78                         NULL,
79                         NULL,
80                         sizeof (glWdgtPrintMerge),
81                         0,
82                         (GInstanceInitFunc) gl_wdgt_print_merge_instance_init,
83                 };
84
85                 wdgt_print_merge_type =
86                         g_type_register_static (gl_hig_hbox_get_type (),
87                                                 "glWdgtPrintMerge",
88                                                 &wdgt_print_merge_info, 0);
89         }
90
91         return wdgt_print_merge_type;
92 }
93
94 static void
95 gl_wdgt_print_merge_class_init (glWdgtPrintMergeClass * class)
96 {
97         GObjectClass *object_class;
98
99         object_class = (GObjectClass *) class;
100
101         parent_class = g_type_class_peek_parent (class);
102
103         object_class->finalize = gl_wdgt_print_merge_finalize;
104 }
105
106 static void
107 gl_wdgt_print_merge_instance_init (glWdgtPrintMerge * merge)
108 {
109         merge->mini_preview = NULL;
110
111         merge->copies_spin = NULL;
112         merge->first_spin = NULL;
113         merge->collate_image = NULL;
114         merge->collate_check = NULL;
115 }
116
117 static void
118 gl_wdgt_print_merge_finalize (GObject * object)
119 {
120         glWdgtPrintMerge *merge;
121         glWdgtPrintMergeClass *class;
122
123         g_return_if_fail (object != NULL);
124         g_return_if_fail (GL_IS_WDGT_PRINT_MERGE (object));
125
126         merge = GL_WDGT_PRINT_MERGE (object);
127
128         G_OBJECT_CLASS (parent_class)->finalize (object);
129 }
130
131 GtkWidget *
132 gl_wdgt_print_merge_new (glLabel * label)
133 {
134         glWdgtPrintMerge *merge;
135
136         merge = g_object_new (gl_wdgt_print_merge_get_type (), NULL);
137
138         gl_wdgt_print_merge_construct (merge, label);
139
140         return GTK_WIDGET (merge);
141 }
142 \f
143 /*--------------------------------------------------------------------------*/
144 /* PRIVATE.  Construct composite widget.                                    */
145 /*--------------------------------------------------------------------------*/
146 static void
147 gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
148                                glLabel * label)
149 {
150         glTemplate                *template;
151         const glTemplateLabelType *label_type;
152         GtkWidget                 *whbox, *wvbox, *whbox1;
153         GtkObject                 *adjust;
154         GdkPixbuf                 *pixbuf;
155
156         whbox = GTK_WIDGET (merge);
157
158         template   = gl_label_get_template (label);
159         label_type = gl_template_get_first_label_type (template);
160
161         merge->labels_per_sheet = gl_template_get_n_labels (label_type);
162
163         /* mini_preview canvas */
164         merge->mini_preview = gl_wdgt_mini_preview_new (WDGT_MINI_PREVIEW_HEIGHT,
165                                                         WDGT_MINI_PREVIEW_WIDTH);
166         gl_wdgt_mini_preview_set_template( GL_WDGT_MINI_PREVIEW (merge->mini_preview),
167                                            template );
168         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), merge->mini_preview);
169         gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(merge->mini_preview),
170                                               1, 1);
171
172         wvbox = gl_hig_vbox_new (GL_HIG_VBOX_INNER);
173         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wvbox);
174
175         /* First Label controls */
176         whbox1 = gl_hig_hbox_new ();
177         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox1);
178         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
179                                 gtk_label_new (_("Start on label")));
180         adjust =
181             gtk_adjustment_new (1, 1.0, merge->labels_per_sheet, 1.0, 10.0,
182                                 10.0);
183         merge->first_spin =
184             gtk_spin_button_new (GTK_ADJUSTMENT (adjust), 1.0, 0);
185         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), merge->first_spin);
186         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
187                                 gtk_label_new (_("on 1st sheet")));
188
189         /* Blank line */
190         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), gtk_label_new (""));
191
192         /* Copy & collate controls*/
193         whbox1 = gl_hig_hbox_new ();
194         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox1);
195         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
196                                 gtk_label_new (_("Copies:")));
197         adjust = gtk_adjustment_new (1, 1.0, 10.0, 1.0, 10.0, 10.0);
198         merge->copies_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust),
199                                                    1.0, 0);
200         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), merge->copies_spin);
201         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), gtk_label_new ("    "));
202         merge->collate_check = gtk_check_button_new_with_label (_("Collate"));
203         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), merge->collate_check);
204         pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
205         merge->collate_image = gtk_image_new_from_pixbuf(pixbuf);
206         gtk_widget_set_sensitive (merge->collate_check, FALSE);
207         gtk_widget_set_sensitive (merge->collate_image, FALSE);
208
209         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), merge->collate_image);
210
211         /* Connect signals to controls */
212         g_signal_connect (G_OBJECT (merge->mini_preview), "clicked",
213                           G_CALLBACK (preview_clicked), merge);
214         g_signal_connect (G_OBJECT (merge->collate_check), "toggled",
215                           G_CALLBACK (collate_check_cb), merge);
216         g_signal_connect (G_OBJECT (merge->copies_spin), "changed",
217                           G_CALLBACK (spin_cb), merge);
218         g_signal_connect (G_OBJECT (merge->first_spin), "changed",
219                           G_CALLBACK (spin_cb), merge);
220
221         gl_template_free (template);
222 }
223
224 /*--------------------------------------------------------------------------*/
225 /* PRIVATE.  Enable/Disable appropriate controls due to radio button toggle.*/
226 /*--------------------------------------------------------------------------*/
227 static void
228 collate_check_cb (GtkToggleButton * togglebutton,
229                   gpointer user_data)
230 {
231         glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
232         GdkPixbuf *pixbuf;
233
234         if (gtk_toggle_button_get_active (togglebutton)) {
235
236                 pixbuf =
237                   gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
238
239         } else {
240
241                 pixbuf =
242                   gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
243
244         }
245         gtk_image_set_from_pixbuf (GTK_IMAGE (merge->collate_image),
246                                    pixbuf);
247 }
248
249 /*--------------------------------------------------------------------------*/
250 /* PRIVATE.  modify widget due to change of first spin button               */
251 /*--------------------------------------------------------------------------*/
252 static void
253 spin_cb (GtkSpinButton * spinbutton,
254          gpointer user_data)
255 {
256         glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
257         gint first, last, n_copies;
258
259         first =
260             gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
261                                               (merge->first_spin));
262
263         n_copies =
264             gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
265                                               (merge->copies_spin));
266         last = first + (n_copies * merge->n_records) - 1;
267         gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(merge->mini_preview),
268                                          first, last );
269
270         gtk_widget_set_sensitive (merge->collate_check, (n_copies > 1));
271         gtk_widget_set_sensitive (merge->collate_image, (n_copies > 1));
272 }
273
274 /*--------------------------------------------------------------------------*/
275 /* PRIVATE.  Canvas event handler, select first and last items.             */
276 /*--------------------------------------------------------------------------*/
277 static void
278 preview_clicked (glWdgtMiniPreview *mini_preview,
279                  gint first,
280                  gpointer user_data)
281 {
282         glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
283         gint n_copies, last;
284
285         gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
286                                    first);
287
288         n_copies =
289             gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
290                                               (merge->copies_spin));
291         last = first + (n_copies * merge->n_records) - 1;
292         gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW (merge->mini_preview),
293                                          first, last);
294
295 }
296
297 /****************************************************************************/
298 /* query selected range of labels within sheet or number of sheets.         */
299 /****************************************************************************/
300 void
301 gl_wdgt_print_merge_get_copies (glWdgtPrintMerge * merge,
302                                 gint * n_copies,
303                                 gint * first_label,
304                                 gboolean * collate_flag)
305 {
306         *n_copies =
307             gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
308                                               (merge->copies_spin));
309         *first_label =
310             gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
311                                               (merge->first_spin));
312         *collate_flag =
313             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
314                                           (merge->collate_check));
315 }
316
317 /****************************************************************************/
318 /* set range of labels within sheet or number of sheets                     */
319 /****************************************************************************/
320 void
321 gl_wdgt_print_merge_set_copies (glWdgtPrintMerge * merge,
322                                 gint n_copies,
323                                 gint first_label,
324                                 gint n_records,
325                                 gboolean collate_flag)
326 {
327         gint last_label;
328
329         merge->n_records = n_records;
330
331         gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->copies_spin),
332                                    n_copies);
333         gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
334                                    first_label);
335         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (merge->collate_check),
336                                       collate_flag);
337
338         last_label = first_label + (n_copies * n_records) - 1;
339         gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW (merge->mini_preview),
340                                          first_label, last_label );
341 }