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