]> git.sur5r.net Git - glabels/blob - glabels1/src/prop_bc_data.c
2009-09-22 Jim Evins <evins@snaught.com>
[glabels] / glabels1 / src / prop_bc_data.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  prop_bc_data.c:  barcode data 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_data.h"
26 #include "merge.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 (*glPropBCDataSignal) (GtkObject * object, gpointer data);
40
41 /*===========================================*/
42 /* Private globals                           */
43 /*===========================================*/
44
45 static GtkContainerClass *parent_class;
46
47 static gint prop_bc_data_signals[LAST_SIGNAL] = { 0 };
48
49 /*===========================================*/
50 /* Local function prototypes                 */
51 /*===========================================*/
52
53 static void gl_prop_bc_data_class_init (glPropBCDataClass * class);
54 static void gl_prop_bc_data_init (glPropBCData * bc_data);
55 static void gl_prop_bc_data_destroy (GtkObject * object);
56 static void gl_prop_bc_data_construct (glPropBCData * bc_data,
57                                        gchar * label, GList * field_defs);
58
59 static void changed_cb (glPropBCData * bc_data);
60 static void radio_toggled_cb (GtkToggleButton * togglebutton,
61                               glPropBCData * bc_data);
62 \f
63 /*================================================================*/
64 /* Boilerplate Object stuff.                                      */
65 /*================================================================*/
66 guint
67 gl_prop_bc_data_get_type (void)
68 {
69         static guint prop_bc_data_type = 0;
70
71         if (!prop_bc_data_type) {
72                 GtkTypeInfo prop_bc_data_info = {
73                         "glPropBCData",
74                         sizeof (glPropBCData),
75                         sizeof (glPropBCDataClass),
76                         (GtkClassInitFunc) gl_prop_bc_data_class_init,
77                         (GtkObjectInitFunc) gl_prop_bc_data_init,
78                         (GtkArgSetFunc) NULL,
79                         (GtkArgGetFunc) NULL,
80                 };
81
82                 prop_bc_data_type = gtk_type_unique (gtk_vbox_get_type (),
83                                                      &prop_bc_data_info);
84         }
85
86         return prop_bc_data_type;
87 }
88
89 static void
90 gl_prop_bc_data_class_init (glPropBCDataClass * class)
91 {
92         GtkObjectClass *object_class;
93         GtkWidgetClass *widget_class;
94
95         object_class = (GtkObjectClass *) class;
96         widget_class = (GtkWidgetClass *) class;
97
98         parent_class = gtk_type_class (gtk_vbox_get_type ());
99
100         object_class->destroy = gl_prop_bc_data_destroy;
101
102         prop_bc_data_signals[CHANGED] =
103             gtk_signal_new ("changed", GTK_RUN_LAST, object_class->type,
104                             GTK_SIGNAL_OFFSET (glPropBCDataClass, changed),
105                             gtk_signal_default_marshaller, GTK_TYPE_NONE, 0);
106         gtk_object_class_add_signals (object_class,
107                                       prop_bc_data_signals, LAST_SIGNAL);
108
109         class->changed = NULL;
110 }
111
112 static void
113 gl_prop_bc_data_init (glPropBCData * bc_data)
114 {
115         bc_data->literal_radio = NULL;
116         bc_data->literal_entry = NULL;
117
118         bc_data->key_radio = NULL;
119         bc_data->key_entry = NULL;
120 }
121
122 static void
123 gl_prop_bc_data_destroy (GtkObject * object)
124 {
125         glPropBCData *bc_data;
126         glPropBCDataClass *class;
127
128         g_return_if_fail (object != NULL);
129         g_return_if_fail (GL_IS_PROP_BC_DATA (object));
130
131         bc_data = GL_PROP_BC_DATA (object);
132         class = GL_PROP_BC_DATA_CLASS (GTK_OBJECT (bc_data)->klass);
133
134         GTK_OBJECT_CLASS (parent_class)->destroy (object);
135 }
136
137 GtkWidget *
138 gl_prop_bc_data_new (gchar * label,
139                      GList * field_defs)
140 {
141         glPropBCData *bc_data;
142
143         bc_data = gtk_type_new (gl_prop_bc_data_get_type ());
144
145         gl_prop_bc_data_construct (bc_data, label, field_defs);
146
147         return GTK_WIDGET (bc_data);
148 }
149
150 /*============================================================*/
151 /* Construct composite widget.                                */
152 /*============================================================*/
153 static void
154 gl_prop_bc_data_construct (glPropBCData * bc_data,
155                            gchar * label,
156                            GList * field_defs)
157 {
158         GtkWidget *wvbox, *wframe, *wtable, *wcombo;
159         GSList *radio_group = NULL;
160         GList *keys;
161
162         wvbox = GTK_WIDGET (bc_data);
163
164         wframe = gtk_frame_new (label);
165         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
166
167         wtable = gtk_table_new (2, 2, FALSE);
168         gtk_container_set_border_width (GTK_CONTAINER (wtable), 10);
169         gtk_table_set_row_spacings (GTK_TABLE (wtable), 5);
170         gtk_table_set_col_spacings (GTK_TABLE (wtable), 5);
171         gtk_container_add (GTK_CONTAINER (wframe), wtable);
172
173         /* Literal radio */
174         bc_data->literal_radio = gtk_radio_button_new_with_label (radio_group,
175                                                                   _
176                                                                   ("Literal:"));
177         radio_group =
178             gtk_radio_button_group (GTK_RADIO_BUTTON (bc_data->literal_radio));
179         gtk_signal_connect (GTK_OBJECT (bc_data->literal_radio), "toggled",
180                             GTK_SIGNAL_FUNC (radio_toggled_cb),
181                             GTK_OBJECT (bc_data));
182         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_radio,
183                                    0, 1, 0, 1);
184
185         /* Literal entry widget */
186         bc_data->literal_entry = gtk_entry_new ();
187         gtk_widget_set_usize (bc_data->literal_entry, 200, 0);
188         gtk_signal_connect_object (GTK_OBJECT (bc_data->literal_entry),
189                                    "changed", GTK_SIGNAL_FUNC (changed_cb),
190                                    GTK_OBJECT (bc_data));
191         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_entry,
192                                    1, 2, 0, 1);
193
194         /* Key radio */
195         bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
196                                                               _("Key:"));
197         gtk_signal_connect (GTK_OBJECT (bc_data->key_radio), "toggled",
198                             GTK_SIGNAL_FUNC (radio_toggled_cb),
199                             GTK_OBJECT (bc_data));
200         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->key_radio,
201                                    0, 1, 1, 2);
202
203         /* Key entry widget */
204         wcombo = gtk_combo_new ();
205         keys = gl_merge_get_key_list (field_defs);
206         if (keys != NULL)
207                 gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), keys);
208         gl_merge_free_key_list (&keys);
209         bc_data->key_entry = GTK_COMBO (wcombo)->entry;
210         gtk_entry_set_editable (GTK_ENTRY (bc_data->key_entry), FALSE);
211         gtk_widget_set_usize (wcombo, 200, 0);
212         gtk_signal_connect_object (GTK_OBJECT (bc_data->key_entry), "changed",
213                                    GTK_SIGNAL_FUNC (changed_cb),
214                                    GTK_OBJECT (bc_data));
215         gtk_table_attach_defaults (GTK_TABLE (wtable), wcombo, 1, 2, 1, 2);
216
217 }
218
219 /*--------------------------------------------------------------------------*/
220 /* PRIVATE.  Callback for when any control in the widget has changed.       */
221 /*--------------------------------------------------------------------------*/
222 static void
223 changed_cb (glPropBCData * bc_data)
224 {
225         /* Emit our "changed" signal */
226         gtk_signal_emit (GTK_OBJECT (bc_data), prop_bc_data_signals[CHANGED]);
227 }
228
229 /*--------------------------------------------------------------------------*/
230 /* PRIVATE.  Callback to handle toggling of radio buttons                   */
231 /*--------------------------------------------------------------------------*/
232 static void
233 radio_toggled_cb (GtkToggleButton * togglebutton,
234                   glPropBCData * bc_data)
235 {
236         if (gtk_toggle_button_get_active
237             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
238                 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
239                 gtk_widget_set_sensitive (bc_data->key_entry, FALSE);
240         } else {
241                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
242                 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
243         }
244
245         /* Emit our "changed" signal */
246         gtk_signal_emit (GTK_OBJECT (bc_data), prop_bc_data_signals[CHANGED]);
247 }
248
249 /*--------------------------------------------------------------------------*/
250 /* Get widget data.                                                         */
251 /*--------------------------------------------------------------------------*/
252 void
253 gl_prop_bc_data_get_data (glPropBCData * bc_data,
254                           gboolean * field_flag,
255                           gchar ** data,
256                           gchar ** key)
257 {
258         if (gtk_toggle_button_get_active
259             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
260                 *field_flag = FALSE;
261                 *data =
262                     gtk_editable_get_chars (GTK_EDITABLE
263                                             (bc_data->literal_entry), 0, -1);
264                 *key = NULL;
265         } else {
266                 *field_flag = TRUE;
267                 *data = NULL;
268                 *key =
269                     gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
270                                             0, -1);
271         }
272 }
273
274 /*--------------------------------------------------------------------------*/
275 /* Set widget data.                                                         */
276 /*--------------------------------------------------------------------------*/
277 void
278 gl_prop_bc_data_set_data (glPropBCData * bc_data,
279                           gboolean merge_flag,
280                           gboolean field_flag,
281                           gchar * data,
282                           gchar * key)
283 {
284         gint pos;
285
286         gtk_widget_set_sensitive (bc_data->key_radio, merge_flag);
287
288         if (!field_flag) {
289
290                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
291                                               (bc_data->literal_radio), TRUE);
292
293                 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
294                 gtk_widget_set_sensitive (bc_data->key_entry, FALSE);
295
296                 gtk_signal_handler_block_by_func (GTK_OBJECT
297                                                   (bc_data->literal_entry),
298                                                   GTK_SIGNAL_FUNC (changed_cb),
299                                                   bc_data);
300                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
301                                           0, -1);
302                 gtk_signal_handler_unblock_by_func (GTK_OBJECT
303                                                     (bc_data->literal_entry),
304                                                     GTK_SIGNAL_FUNC
305                                                     (changed_cb), bc_data);
306
307                 pos = 0;
308                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
309                                           data, strlen (data), &pos);
310         } else {
311
312                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
313                                               (bc_data->key_radio), TRUE);
314
315                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
316                 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
317
318                 gtk_signal_handler_block_by_func (GTK_OBJECT
319                                                   (bc_data->key_entry),
320                                                   GTK_SIGNAL_FUNC (changed_cb),
321                                                   bc_data);
322                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
323                                           -1);
324                 gtk_signal_handler_unblock_by_func (GTK_OBJECT
325                                                     (bc_data->key_entry),
326                                                     GTK_SIGNAL_FUNC
327                                                     (changed_cb), bc_data);
328
329                 pos = 0;
330                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
331                                           data, strlen (data), &pos);
332         }
333
334 }