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