]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-bc-style.c
Initial revision
[glabels] / glabels2 / src / wdgt-bc-style.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_bc_style.c:  barcode style selection widget module
5  *
6  *  Copyright (C) 2001-2002  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-bc-style.h"
26 #include "marshal.h"
27
28 #include "debug.h"
29
30 /*===========================================*/
31 /* Private types                             */
32 /*===========================================*/
33
34 enum {
35         CHANGED,
36         LAST_SIGNAL
37 };
38
39 typedef void (*glWdgtBCStyleSignal) (GObject * object, gpointer data);
40
41 /*===========================================*/
42 /* Private globals                           */
43 /*===========================================*/
44
45 static GtkContainerClass *parent_class;
46
47 static gint wdgt_bc_style_signals[LAST_SIGNAL] = { 0 };
48
49 /*===========================================*/
50 /* Local function prototypes                 */
51 /*===========================================*/
52
53 static void gl_wdgt_bc_style_class_init (glWdgtBCStyleClass * class);
54 static void gl_wdgt_bc_style_instance_init (glWdgtBCStyle * prop_style);
55 static void gl_wdgt_bc_style_finalize (GObject * object);
56 static void gl_wdgt_bc_style_construct (glWdgtBCStyle * prop_style,
57                                         gchar * label);
58 static void changed_cb (glWdgtBCStyle * prop_style);
59 \f
60 /*================================================================*/
61 /* Boilerplate Object stuff.                                      */
62 /*================================================================*/
63 guint
64 gl_wdgt_bc_style_get_type (void)
65 {
66         static guint wdgt_bc_style_type = 0;
67
68         if (!wdgt_bc_style_type) {
69                 GTypeInfo wdgt_bc_style_info = {
70                         sizeof (glWdgtBCStyleClass),
71                         NULL,
72                         NULL,
73                         (GClassInitFunc) gl_wdgt_bc_style_class_init,
74                         NULL,
75                         NULL,
76                         sizeof (glWdgtBCStyle),
77                         0,
78                         (GInstanceInitFunc) gl_wdgt_bc_style_instance_init,
79                 };
80
81                 wdgt_bc_style_type =
82                         g_type_register_static (gtk_vbox_get_type (),
83                                                 "glWdgtBCStyle",
84                                                 &wdgt_bc_style_info, 0);
85         }
86
87         return wdgt_bc_style_type;
88 }
89
90 static void
91 gl_wdgt_bc_style_class_init (glWdgtBCStyleClass * class)
92 {
93         GObjectClass *object_class;
94
95         object_class = (GObjectClass *) class;
96
97         parent_class = gtk_type_class (gtk_vbox_get_type ());
98
99         object_class->finalize = gl_wdgt_bc_style_finalize;
100
101         wdgt_bc_style_signals[CHANGED] =
102             g_signal_new ("changed",
103                           G_OBJECT_CLASS_TYPE(object_class),
104                           G_SIGNAL_RUN_LAST,
105                           G_STRUCT_OFFSET (glWdgtBCStyleClass, changed),
106                           NULL, NULL,
107                           gl_marshal_VOID__VOID,
108                           G_TYPE_NONE, 0);
109
110 }
111
112 static void
113 gl_wdgt_bc_style_instance_init (glWdgtBCStyle * prop_style)
114 {
115         prop_style->postnet_radio = NULL;
116         prop_style->ean_radio = NULL;
117         prop_style->upc_radio = NULL;
118         prop_style->isbn_radio = NULL;
119         prop_style->code39_radio = NULL;
120         prop_style->code128_radio = NULL;
121         prop_style->code128c_radio = NULL;
122         prop_style->code128b_radio = NULL;
123         prop_style->i25_radio = NULL;
124         prop_style->cbr_radio = NULL;
125         prop_style->msi_radio = NULL;
126         prop_style->pls_radio = NULL;
127 }
128
129 static void
130 gl_wdgt_bc_style_finalize (GObject * object)
131 {
132         glWdgtBCStyle *prop_style;
133         glWdgtBCStyleClass *class;
134
135         g_return_if_fail (object != NULL);
136         g_return_if_fail (GL_IS_WDGT_BC_STYLE (object));
137
138         prop_style = GL_WDGT_BC_STYLE (object);
139
140         G_OBJECT_CLASS (parent_class)->finalize (object);
141 }
142
143 GtkWidget *
144 gl_wdgt_bc_style_new (gchar * label)
145 {
146         glWdgtBCStyle *prop_style;
147
148         prop_style = g_object_new (gl_wdgt_bc_style_get_type (), NULL);
149
150         gl_wdgt_bc_style_construct (prop_style, label);
151
152         return GTK_WIDGET (prop_style);
153 }
154 \f
155 /*============================================================*/
156 /* Construct composite widget.                                */
157 /*============================================================*/
158 static void
159 gl_wdgt_bc_style_construct (glWdgtBCStyle * prop,
160                             gchar * label)
161 {
162         GtkWidget *wvbox, *wframe, *wvbox1, *whbox2, *wvbox2;
163         GSList *radio_group = NULL;
164
165         wvbox = GTK_WIDGET (prop);
166
167         wframe = gtk_frame_new (label);
168         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
169
170         wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
171         gtk_container_set_border_width (GTK_CONTAINER (wvbox1), 10);
172         gtk_container_add (GTK_CONTAINER (wframe), wvbox1);
173
174         whbox2 = gtk_hbox_new (FALSE, GNOME_PAD);
175         gtk_container_add (GTK_CONTAINER (wvbox1), whbox2);
176
177         /* ... Start column ... */
178         wvbox2 = gtk_vbox_new (FALSE, GNOME_PAD);
179         gtk_container_set_border_width (GTK_CONTAINER (wvbox2), 10);
180         gtk_box_pack_start (GTK_BOX (whbox2), wvbox2, FALSE, FALSE, 0);
181
182         /* POSTNET button */
183         prop->postnet_radio =
184             gtk_radio_button_new_with_label (radio_group, "POSTNET");
185         radio_group =
186             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->postnet_radio));
187         gtk_box_pack_start (GTK_BOX (wvbox2), prop->postnet_radio,
188                             FALSE, FALSE, 0);
189         g_signal_connect_swapped (G_OBJECT (prop->postnet_radio), "toggled",
190                                   G_CALLBACK (changed_cb),
191                                   G_OBJECT (prop));
192
193         /* EAN button */
194         prop->ean_radio = gtk_radio_button_new_with_label (radio_group, "EAN");
195         radio_group =
196             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->ean_radio));
197         gtk_box_pack_start (GTK_BOX (wvbox2), prop->ean_radio, FALSE, FALSE, 0);
198         g_signal_connect_swapped (G_OBJECT (prop->ean_radio), "toggled",
199                                   G_CALLBACK (changed_cb),
200                                   G_OBJECT (prop));
201
202         /* UPC button */
203         prop->upc_radio = gtk_radio_button_new_with_label (radio_group, "UPC");
204         radio_group =
205             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->upc_radio));
206         gtk_box_pack_start (GTK_BOX (wvbox2), prop->upc_radio, FALSE, FALSE, 0);
207         g_signal_connect_swapped (G_OBJECT (prop->upc_radio), "toggled",
208                                   G_CALLBACK (changed_cb),
209                                   G_OBJECT (prop));
210
211         /* ISBN button */
212         prop->isbn_radio =
213             gtk_radio_button_new_with_label (radio_group, "ISBN");
214         radio_group =
215             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->isbn_radio));
216         gtk_box_pack_start (GTK_BOX (wvbox2), prop->isbn_radio,
217                             FALSE, FALSE, 0);
218         g_signal_connect_swapped (G_OBJECT (prop->isbn_radio), "toggled",
219                                   G_CALLBACK (changed_cb),
220                                   G_OBJECT (prop));
221
222         /* CODE39 button */
223         prop->code39_radio =
224             gtk_radio_button_new_with_label (radio_group, "Code 39");
225         radio_group =
226             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->code39_radio));
227         gtk_box_pack_start (GTK_BOX (wvbox2), prop->code39_radio,
228                             FALSE, FALSE, 0);
229         g_signal_connect_swapped (G_OBJECT (prop->code39_radio), "toggled",
230                                   G_CALLBACK (changed_cb),
231                                   G_OBJECT (prop));
232
233         /* CODE128 button */
234         prop->code128_radio =
235             gtk_radio_button_new_with_label (radio_group, "Code 128");
236         radio_group =
237             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->code128_radio));
238         gtk_box_pack_start (GTK_BOX (wvbox2), prop->code128_radio,
239                             FALSE, FALSE, 0);
240         g_signal_connect_swapped (G_OBJECT (prop->code128_radio), "toggled",
241                                   G_CALLBACK (changed_cb),
242                                   G_OBJECT (prop));
243
244         /* ... Start column ... */
245         wvbox2 = gtk_vbox_new (FALSE, GNOME_PAD);
246         gtk_container_set_border_width (GTK_CONTAINER (wvbox2), 10);
247         gtk_box_pack_start (GTK_BOX (whbox2), wvbox2, FALSE, FALSE, 0);
248
249         /* CODE128B button */
250         prop->code128b_radio =
251             gtk_radio_button_new_with_label (radio_group, "Code 128-B");
252         radio_group =
253             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->code128b_radio));
254         gtk_box_pack_start (GTK_BOX (wvbox2), prop->code128b_radio,
255                             FALSE, FALSE, 0);
256         g_signal_connect_swapped (G_OBJECT (prop->code128b_radio), "toggled",
257                                   G_CALLBACK (changed_cb),
258                                   G_OBJECT (prop));
259
260         /* CODE128C button */
261         prop->code128c_radio =
262             gtk_radio_button_new_with_label (radio_group, "Code 128-C");
263         radio_group =
264             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->code128c_radio));
265         gtk_box_pack_start (GTK_BOX (wvbox2), prop->code128c_radio,
266                             FALSE, FALSE, 0);
267         g_signal_connect_swapped (G_OBJECT (prop->code128c_radio), "toggled",
268                                   G_CALLBACK (changed_cb),
269                                   G_OBJECT (prop));
270
271         /* I25 button */
272         prop->i25_radio =
273             gtk_radio_button_new_with_label (radio_group, "Interleaved 2 of 5");
274         radio_group =
275             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->i25_radio));
276         gtk_box_pack_start (GTK_BOX (wvbox2), prop->i25_radio, FALSE, FALSE, 0);
277         g_signal_connect_swapped (G_OBJECT (prop->i25_radio), "toggled",
278                                   G_CALLBACK (changed_cb),
279                                   G_OBJECT (prop));
280
281         /* CBR button */
282         prop->cbr_radio =
283             gtk_radio_button_new_with_label (radio_group, "Codabar");
284         radio_group =
285             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->cbr_radio));
286         gtk_box_pack_start (GTK_BOX (wvbox2), prop->cbr_radio, FALSE, FALSE, 0);
287         g_signal_connect_swapped (G_OBJECT (prop->cbr_radio), "toggled",
288                                   G_CALLBACK (changed_cb),
289                                   G_OBJECT (prop));
290
291         /* MSI button */
292         prop->msi_radio = gtk_radio_button_new_with_label (radio_group, "MSI");
293         radio_group =
294             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->msi_radio));
295         gtk_box_pack_start (GTK_BOX (wvbox2), prop->msi_radio, FALSE, FALSE, 0);
296         g_signal_connect_swapped (G_OBJECT (prop->msi_radio), "toggled",
297                                   G_CALLBACK (changed_cb),
298                                   G_OBJECT (prop));
299
300         /* PLS button */
301         prop->pls_radio =
302             gtk_radio_button_new_with_label (radio_group, "Plessey");
303         radio_group =
304             gtk_radio_button_get_group (GTK_RADIO_BUTTON (prop->pls_radio));
305         gtk_box_pack_start (GTK_BOX (wvbox2), prop->pls_radio, FALSE, FALSE, 0);
306         g_signal_connect_swapped (G_OBJECT (prop->pls_radio), "toggled",
307                                   G_CALLBACK (changed_cb),
308                                   G_OBJECT (prop));
309
310         /* ... Separator ... */
311         gtk_box_pack_start (GTK_BOX (wvbox1), gtk_hseparator_new (), FALSE,
312                             FALSE, 0);
313
314         /* Text checkbox widget */
315         prop->text_check =
316             gtk_check_button_new_with_label (_("Show text with barcode"));
317         gtk_box_pack_start (GTK_BOX (wvbox1), prop->text_check,
318                             FALSE, FALSE, 0);
319         g_signal_connect_swapped (G_OBJECT (prop->text_check), "toggled",
320                                   G_CALLBACK (changed_cb),
321                                   G_OBJECT (prop));
322
323 }
324
325 /*--------------------------------------------------------------------------*/
326 /* PRIVATE.  Callback for when any control in the widget has changed.       */
327 /*--------------------------------------------------------------------------*/
328 static void
329 changed_cb (glWdgtBCStyle * prop_style)
330 {
331         /* Emit our "changed" signal */
332         g_signal_emit (G_OBJECT (prop_style),
333                        wdgt_bc_style_signals[CHANGED], 0);
334 }
335 \f
336 /*====================================================================*/
337 /* query values from controls.                                        */
338 /*====================================================================*/
339 void
340 gl_wdgt_bc_style_get_params (glWdgtBCStyle * prop,
341                              glBarcodeStyle * style,
342                              gboolean * text_flag)
343 {
344         *text_flag =
345             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prop->text_check));
346
347         if (gtk_toggle_button_get_active
348             (GTK_TOGGLE_BUTTON (prop->postnet_radio))) {
349                 *style = GL_BARCODE_STYLE_POSTNET;
350         } else
351             if (gtk_toggle_button_get_active
352                 (GTK_TOGGLE_BUTTON (prop->ean_radio))) {
353                 *style = GL_BARCODE_STYLE_EAN;
354         } else
355             if (gtk_toggle_button_get_active
356                 (GTK_TOGGLE_BUTTON (prop->upc_radio))) {
357                 *style = GL_BARCODE_STYLE_UPC;
358         } else
359             if (gtk_toggle_button_get_active
360                 (GTK_TOGGLE_BUTTON (prop->isbn_radio))) {
361                 *style = GL_BARCODE_STYLE_ISBN;
362         } else
363             if (gtk_toggle_button_get_active
364                 (GTK_TOGGLE_BUTTON (prop->code39_radio))) {
365                 *style = GL_BARCODE_STYLE_39;
366         } else
367             if (gtk_toggle_button_get_active
368                 (GTK_TOGGLE_BUTTON (prop->code128_radio))) {
369                 *style = GL_BARCODE_STYLE_128;
370         } else
371             if (gtk_toggle_button_get_active
372                 (GTK_TOGGLE_BUTTON (prop->code128c_radio))) {
373                 *style = GL_BARCODE_STYLE_128C;
374         } else
375             if (gtk_toggle_button_get_active
376                 (GTK_TOGGLE_BUTTON (prop->code128b_radio))) {
377                 *style = GL_BARCODE_STYLE_128B;
378         } else
379             if (gtk_toggle_button_get_active
380                 (GTK_TOGGLE_BUTTON (prop->i25_radio))) {
381                 *style = GL_BARCODE_STYLE_I25;
382         } else
383             if (gtk_toggle_button_get_active
384                 (GTK_TOGGLE_BUTTON (prop->cbr_radio))) {
385                 *style = GL_BARCODE_STYLE_CBR;
386         } else
387             if (gtk_toggle_button_get_active
388                 (GTK_TOGGLE_BUTTON (prop->msi_radio))) {
389                 *style = GL_BARCODE_STYLE_MSI;
390         } else
391             if (gtk_toggle_button_get_active
392                 (GTK_TOGGLE_BUTTON (prop->pls_radio))) {
393                 *style = GL_BARCODE_STYLE_PLS;
394         }
395
396 }
397
398 /*====================================================================*/
399 /* fill in values and ranges for controls.                            */
400 /*====================================================================*/
401 void
402 gl_wdgt_bc_style_set_params (glWdgtBCStyle * prop,
403                              glBarcodeStyle style,
404                              gboolean text_flag)
405 {
406         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prop->text_check),
407                                       text_flag);
408
409         switch (style) {
410         case GL_BARCODE_STYLE_POSTNET:
411                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
412                                               (prop->postnet_radio), TRUE);
413                 break;
414         case GL_BARCODE_STYLE_EAN:
415                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
416                                               (prop->ean_radio), TRUE);
417                 break;
418         case GL_BARCODE_STYLE_UPC:
419                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
420                                               (prop->upc_radio), TRUE);
421                 break;
422         case GL_BARCODE_STYLE_ISBN:
423                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
424                                               (prop->isbn_radio), TRUE);
425                 break;
426         case GL_BARCODE_STYLE_39:
427                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
428                                               (prop->code39_radio), TRUE);
429                 break;
430         case GL_BARCODE_STYLE_128:
431                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
432                                               (prop->code128_radio), TRUE);
433                 break;
434         case GL_BARCODE_STYLE_128C:
435                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
436                                               (prop->code128c_radio), TRUE);
437                 break;
438         case GL_BARCODE_STYLE_128B:
439                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
440                                               (prop->code128b_radio), TRUE);
441                 break;
442         case GL_BARCODE_STYLE_I25:
443                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
444                                               (prop->i25_radio), TRUE);
445                 break;
446         case GL_BARCODE_STYLE_CBR:
447                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
448                                               (prop->cbr_radio), TRUE);
449                 break;
450         case GL_BARCODE_STYLE_MSI:
451                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
452                                               (prop->msi_radio), TRUE);
453                 break;
454         case GL_BARCODE_STYLE_PLS:
455                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
456                                               (prop->pls_radio), TRUE);
457                 break;
458         default:
459                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
460                                               (prop->postnet_radio), TRUE);
461                 break;
462         }
463 }