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