1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * wdgt_print_merge.c: print merge widget module
8 * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
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.
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.
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
27 #include "wdgt-print-merge.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>
38 #include "wdgt-mini-preview.h"
41 #include "pixmaps/collate.xpm"
42 #include "pixmaps/nocollate.xpm"
46 #define WDGT_MINI_PREVIEW_HEIGHT 175
47 #define WDGT_MINI_PREVIEW_WIDTH 150
49 /*===========================================*/
51 /*===========================================*/
53 /*===========================================*/
54 /* Local function prototypes */
55 /*===========================================*/
57 static void gl_wdgt_print_merge_finalize (GObject * object);
59 static void gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
62 static void preview_clicked (glWdgtMiniPreview *mini_preview,
66 static void collate_check_cb (GtkToggleButton * togglebutton,
68 static void spin_cb (GtkSpinButton * spinbutton,
72 /****************************************************************************/
73 /* Boilerplate Object stuff. */
74 /****************************************************************************/
75 G_DEFINE_TYPE (glWdgtPrintMerge, gl_wdgt_print_merge, GTK_TYPE_HBOX);
79 gl_wdgt_print_merge_class_init (glWdgtPrintMergeClass * class)
81 GObjectClass *object_class = G_OBJECT_CLASS (class);
83 gl_wdgt_print_merge_parent_class = g_type_class_peek_parent (class);
85 object_class->finalize = gl_wdgt_print_merge_finalize;
89 gl_wdgt_print_merge_init (glWdgtPrintMerge * merge)
91 merge->mini_preview = NULL;
93 merge->copies_spin = NULL;
94 merge->first_spin = NULL;
95 merge->collate_image = NULL;
96 merge->collate_check = NULL;
100 gl_wdgt_print_merge_finalize (GObject * object)
102 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (object);
104 g_return_if_fail (object != NULL);
105 g_return_if_fail (GL_IS_WDGT_PRINT_MERGE (object));
107 G_OBJECT_CLASS (gl_wdgt_print_merge_parent_class)->finalize (object);
111 gl_wdgt_print_merge_new (glLabel * label)
113 glWdgtPrintMerge *merge;
115 merge = g_object_new (gl_wdgt_print_merge_get_type (), NULL);
117 gl_wdgt_print_merge_construct (merge, label);
119 return GTK_WIDGET (merge);
122 /*--------------------------------------------------------------------------*/
123 /* PRIVATE. Construct composite widget. */
124 /*--------------------------------------------------------------------------*/
126 gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
129 glTemplate *template;
130 const glTemplateLabelType *label_type;
131 GtkWidget *whbox, *wvbox, *whbox1;
135 whbox = GTK_WIDGET (merge);
137 template = gl_label_get_template (label);
138 label_type = gl_template_get_first_label_type (template);
140 merge->labels_per_sheet = gl_template_get_n_labels (label_type);
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),
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),
151 wvbox = gtk_vbox_new (FALSE, GL_HIG_PAD1);
152 gtk_box_pack_start (GTK_BOX(whbox), wvbox, FALSE, FALSE, 0);
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);
160 gtk_adjustment_new (1, 1.0, merge->labels_per_sheet, 1.0, 10.0,
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);
169 gtk_box_pack_start (GTK_BOX(wvbox), gtk_label_new (""), FALSE, FALSE, 0);
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),
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);
188 gtk_box_pack_start (GTK_BOX(whbox1), merge->collate_image, FALSE, FALSE, 0);
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);
200 gl_template_free (template);
203 /*--------------------------------------------------------------------------*/
204 /* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/
205 /*--------------------------------------------------------------------------*/
207 collate_check_cb (GtkToggleButton * togglebutton,
210 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
213 if (gtk_toggle_button_get_active (togglebutton)) {
216 gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
221 gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
224 gtk_image_set_from_pixbuf (GTK_IMAGE (merge->collate_image),
228 /*--------------------------------------------------------------------------*/
229 /* PRIVATE. modify widget due to change of first spin button */
230 /*--------------------------------------------------------------------------*/
232 spin_cb (GtkSpinButton * spinbutton,
235 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
236 gint first, last, n_copies;
239 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
240 (merge->first_spin));
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),
249 gtk_widget_set_sensitive (merge->collate_check, (n_copies > 1));
250 gtk_widget_set_sensitive (merge->collate_image, (n_copies > 1));
253 /*--------------------------------------------------------------------------*/
254 /* PRIVATE. Canvas event handler, select first and last items. */
255 /*--------------------------------------------------------------------------*/
257 preview_clicked (glWdgtMiniPreview *mini_preview,
261 glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
264 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
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),
276 /****************************************************************************/
277 /* query selected range of labels within sheet or number of sheets. */
278 /****************************************************************************/
280 gl_wdgt_print_merge_get_copies (glWdgtPrintMerge *merge,
283 gboolean *collate_flag,
287 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
288 (merge->copies_spin));
290 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
291 (merge->first_spin));
293 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
294 (merge->collate_check));
296 *n_sheets = ceil ( (double)(*first_label - 1 + (*n_copies * merge->n_records))/ (double)merge->labels_per_sheet );
299 /****************************************************************************/
300 /* set range of labels within sheet or number of sheets */
301 /****************************************************************************/
303 gl_wdgt_print_merge_set_copies (glWdgtPrintMerge * merge,
307 gboolean collate_flag)
311 merge->n_records = n_records;
313 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->copies_spin),
315 gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
317 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (merge->collate_check),
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 );