2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * wdgt_print_merge.c: print merge widget module
6 * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include "wdgt-print-merge.h"
26 #include "wdgt-mini-preview.h"
29 #include "pixmaps/collate.xpm"
30 #include "pixmaps/nocollate.xpm"
34 #define WDGT_MINI_PREVIEW_HEIGHT 175
35 #define WDGT_MINI_PREVIEW_WIDTH 150
37 /*===========================================*/
39 /*===========================================*/
41 static GObjectClass *parent_class;
43 /*===========================================*/
44 /* Local function prototypes */
45 /*===========================================*/
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);
51 static void gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
54 static void preview_clicked (glWdgtMiniPreview *mini_preview,
58 static void collate_check_cb (GtkToggleButton * togglebutton,
60 static void spin_cb (GtkSpinButton * spinbutton,
64 /****************************************************************************/
65 /* Boilerplate Object stuff. */
66 /****************************************************************************/
68 gl_wdgt_print_merge_get_type (void)
70 static guint wdgt_print_merge_type = 0;
72 if (!wdgt_print_merge_type) {
73 GTypeInfo wdgt_print_merge_info = {
74 sizeof (glWdgtPrintMergeClass),
77 (GClassInitFunc) gl_wdgt_print_merge_class_init,
80 sizeof (glWdgtPrintMerge),
82 (GInstanceInitFunc) gl_wdgt_print_merge_instance_init,
85 wdgt_print_merge_type =
86 g_type_register_static (gl_hig_hbox_get_type (),
88 &wdgt_print_merge_info, 0);
91 return wdgt_print_merge_type;
95 gl_wdgt_print_merge_class_init (glWdgtPrintMergeClass * class)
97 GObjectClass *object_class;
99 object_class = (GObjectClass *) class;
101 parent_class = g_type_class_peek_parent (class);
103 object_class->finalize = gl_wdgt_print_merge_finalize;
107 gl_wdgt_print_merge_instance_init (glWdgtPrintMerge * merge)
109 merge->mini_preview = NULL;
111 merge->copies_spin = NULL;
112 merge->first_spin = NULL;
113 merge->collate_image = NULL;
114 merge->collate_check = NULL;
118 gl_wdgt_print_merge_finalize (GObject * object)
120 glWdgtPrintMerge *merge;
121 glWdgtPrintMergeClass *class;
123 g_return_if_fail (object != NULL);
124 g_return_if_fail (GL_IS_WDGT_PRINT_MERGE (object));
126 merge = GL_WDGT_PRINT_MERGE (object);
128 G_OBJECT_CLASS (parent_class)->finalize (object);
132 gl_wdgt_print_merge_new (glLabel * label)
134 glWdgtPrintMerge *merge;
136 merge = g_object_new (gl_wdgt_print_merge_get_type (), NULL);
138 gl_wdgt_print_merge_construct (merge, label);
140 return GTK_WIDGET (merge);
143 /*--------------------------------------------------------------------------*/
144 /* PRIVATE. Construct composite widget. */
145 /*--------------------------------------------------------------------------*/
147 gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
150 glTemplate *template;
151 const glTemplateLabelType *label_type;
152 GtkWidget *whbox, *wvbox, *whbox1;
156 whbox = GTK_WIDGET (merge);
158 template = gl_label_get_template (label);
159 label_type = gl_template_get_first_label_type (template);
161 merge->labels_per_sheet = gl_template_get_n_labels (label_type);
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),
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),
172 wvbox = gl_hig_vbox_new (GL_HIG_VBOX_INNER);
173 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wvbox);
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")));
181 gtk_adjustment_new (1, 1.0, merge->labels_per_sheet, 1.0, 10.0,
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")));
190 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), gtk_label_new (""));
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),
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);
209 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), merge->collate_image);
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);
221 gl_template_free (template);
224 /*--------------------------------------------------------------------------*/
225 /* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/
226 /*--------------------------------------------------------------------------*/
228 collate_check_cb (GtkToggleButton * togglebutton,
231 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
234 if (gtk_toggle_button_get_active (togglebutton)) {
237 gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
242 gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
245 gtk_image_set_from_pixbuf (GTK_IMAGE (merge->collate_image),
249 /*--------------------------------------------------------------------------*/
250 /* PRIVATE. modify widget due to change of first spin button */
251 /*--------------------------------------------------------------------------*/
253 spin_cb (GtkSpinButton * spinbutton,
256 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
257 gint first, last, n_copies;
260 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
261 (merge->first_spin));
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),
270 gtk_widget_set_sensitive (merge->collate_check, (n_copies > 1));
271 gtk_widget_set_sensitive (merge->collate_image, (n_copies > 1));
274 /*--------------------------------------------------------------------------*/
275 /* PRIVATE. Canvas event handler, select first and last items. */
276 /*--------------------------------------------------------------------------*/
278 preview_clicked (glWdgtMiniPreview *mini_preview,
282 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
285 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
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),
297 /****************************************************************************/
298 /* query selected range of labels within sheet or number of sheets. */
299 /****************************************************************************/
301 gl_wdgt_print_merge_get_copies (glWdgtPrintMerge * merge,
304 gboolean * collate_flag)
307 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
308 (merge->copies_spin));
310 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
311 (merge->first_spin));
313 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
314 (merge->collate_check));
317 /****************************************************************************/
318 /* set range of labels within sheet or number of sheets */
319 /****************************************************************************/
321 gl_wdgt_print_merge_set_copies (glWdgtPrintMerge * merge,
325 gboolean collate_flag)
329 merge->n_records = n_records;
331 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->copies_spin),
333 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
335 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (merge->collate_check),
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 );