]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-bc-data.c
58f6a0ea792d499dfb08927f585baa7e64e980f5
[glabels] / glabels2 / src / wdgt-bc-data.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_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 "wdgt-bc-data.h"
26 #include "merge.h"
27 #include "marshal.h"
28
29 #include "debug.h"
30
31 /*===========================================*/
32 /* Private types                             */
33 /*===========================================*/
34
35 enum {
36         CHANGED,
37         LAST_SIGNAL
38 };
39
40 typedef void (*glWdgtBCDataSignal) (GObject * object, gpointer data);
41
42 /*===========================================*/
43 /* Private globals                           */
44 /*===========================================*/
45
46 static glHigVBoxClass *parent_class;
47
48 static gint wdgt_bc_data_signals[LAST_SIGNAL] = { 0 };
49
50 /*===========================================*/
51 /* Local function prototypes                 */
52 /*===========================================*/
53
54 static void gl_wdgt_bc_data_class_init    (glWdgtBCDataClass *class);
55 static void gl_wdgt_bc_data_instance_init (glWdgtBCData      *bc_data);
56 static void gl_wdgt_bc_data_finalize      (GObject           *object);
57 static void gl_wdgt_bc_data_construct     (glWdgtBCData      *bc_data,
58                                            GList             *field_defs);
59
60 static void changed_cb                    (glWdgtBCData      *bc_data);
61 static void radio_toggled_cb              (GtkToggleButton   *togglebutton,
62                                            glWdgtBCData      *bc_data);
63
64 \f
65 /****************************************************************************/
66 /* Boilerplate Object stuff.                                                */
67 /****************************************************************************/
68 guint
69 gl_wdgt_bc_data_get_type (void)
70 {
71         static guint wdgt_bc_data_type = 0;
72
73         if (!wdgt_bc_data_type) {
74                 GTypeInfo wdgt_bc_data_info = {
75                         sizeof (glWdgtBCDataClass),
76                         NULL,
77                         NULL,
78                         (GClassInitFunc) gl_wdgt_bc_data_class_init,
79                         NULL,
80                         NULL,
81                         sizeof (glWdgtBCData),
82                         0,
83                         (GInstanceInitFunc) gl_wdgt_bc_data_instance_init,
84                 };
85
86                 wdgt_bc_data_type =
87                         g_type_register_static (gl_hig_vbox_get_type (),
88                                                 "glWdgtBCData",
89                                                 &wdgt_bc_data_info, 0);
90         }
91
92         return wdgt_bc_data_type;
93 }
94
95 static void
96 gl_wdgt_bc_data_class_init (glWdgtBCDataClass *class)
97 {
98         GObjectClass *object_class;
99
100         gl_debug (DEBUG_WDGT, "START");
101
102         object_class = (GObjectClass *) class;
103
104         parent_class = g_type_class_peek_parent (class);
105
106         object_class->finalize = gl_wdgt_bc_data_finalize;
107
108         wdgt_bc_data_signals[CHANGED] =
109             g_signal_new ("changed",
110                           G_OBJECT_CLASS_TYPE(object_class),
111                           G_SIGNAL_RUN_LAST,
112                           G_STRUCT_OFFSET (glWdgtBCDataClass, changed),
113                           NULL, NULL,
114                           gl_marshal_VOID__VOID,
115                           G_TYPE_NONE, 0);
116
117         gl_debug (DEBUG_WDGT, "END");
118 }
119
120 static void
121 gl_wdgt_bc_data_instance_init (glWdgtBCData *bc_data)
122 {
123         gl_debug (DEBUG_WDGT, "START");
124
125         bc_data->literal_radio = NULL;
126         bc_data->literal_entry = NULL;
127
128         bc_data->key_radio = NULL;
129         bc_data->key_combo = NULL;
130         bc_data->key_entry = NULL;
131
132         gl_debug (DEBUG_WDGT, "END");
133 }
134
135 static void
136 gl_wdgt_bc_data_finalize (GObject *object)
137 {
138         glWdgtBCData *bc_data;
139         glWdgtBCDataClass *class;
140
141         gl_debug (DEBUG_WDGT, "START");
142
143         g_return_if_fail (object != NULL);
144         g_return_if_fail (GL_IS_WDGT_BC_DATA (object));
145
146         bc_data = GL_WDGT_BC_DATA (object);
147
148         G_OBJECT_CLASS (parent_class)->finalize (object);
149
150         gl_debug (DEBUG_WDGT, "END");
151 }
152
153 /****************************************************************************/
154 /* New widget.                                                              */
155 /****************************************************************************/
156 GtkWidget *
157 gl_wdgt_bc_data_new (GList *field_defs)
158 {
159         glWdgtBCData *bc_data;
160
161         gl_debug (DEBUG_WDGT, "START");
162
163         bc_data = g_object_new (gl_wdgt_bc_data_get_type (), NULL);
164
165         gl_wdgt_bc_data_construct (bc_data, field_defs);
166
167         gl_debug (DEBUG_WDGT, "END");
168
169         return GTK_WIDGET (bc_data);
170 }
171
172 /*--------------------------------------------------------------------------*/
173 /* PRIVATE.  Construct composite widget.                                    */
174 /*--------------------------------------------------------------------------*/
175 static void
176 gl_wdgt_bc_data_construct (glWdgtBCData *bc_data,
177                            GList        *field_defs)
178 {
179         GtkWidget *wvbox, *whbox;
180         GSList *radio_group = NULL;
181         GList *keys;
182
183         gl_debug (DEBUG_WDGT, "START");
184
185         wvbox = GTK_WIDGET (bc_data);
186
187         /* ---- Literal line ---- */
188         whbox = gl_hig_hbox_new ();
189         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
190
191         /* Literal radio */
192         bc_data->literal_radio = gtk_radio_button_new_with_label (radio_group,
193                                                                   _
194                                                                   ("Literal:"));
195         radio_group =
196             gtk_radio_button_get_group (GTK_RADIO_BUTTON (bc_data->literal_radio));
197         g_signal_connect (G_OBJECT (bc_data->literal_radio), "toggled",
198                           G_CALLBACK (radio_toggled_cb),
199                           G_OBJECT (bc_data));
200         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->literal_radio);
201
202         /* Literal entry widget */
203         bc_data->literal_entry = gtk_entry_new ();
204         gtk_widget_set_size_request (bc_data->literal_entry, 200, -1);
205         g_signal_connect_swapped (G_OBJECT (bc_data->literal_entry),
206                                   "changed", G_CALLBACK (changed_cb),
207                                   G_OBJECT (bc_data));
208         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->literal_entry);
209
210         /* ---- Key line ---- */
211         whbox = gl_hig_hbox_new ();
212         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
213
214         /* Key radio */
215         bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
216                                                               _("Key:"));
217         g_signal_connect (G_OBJECT (bc_data->key_radio), "toggled",
218                           G_CALLBACK (radio_toggled_cb),
219                           G_OBJECT (bc_data));
220         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->key_radio);
221
222         /* Key entry widget */
223         bc_data->key_combo = gtk_combo_new ();
224         keys = gl_merge_get_key_list (field_defs);
225         if (keys != NULL)
226                 gtk_combo_set_popdown_strings (GTK_COMBO (bc_data->key_combo),
227                                                keys);
228         gl_merge_free_key_list (&keys);
229         bc_data->key_entry = GTK_COMBO (bc_data->key_combo)->entry;
230         gtk_entry_set_editable (GTK_ENTRY (bc_data->key_entry), FALSE);
231         gtk_widget_set_size_request (bc_data->key_combo, 200, -1);
232         g_signal_connect_swapped (G_OBJECT (bc_data->key_entry), "changed",
233                                   G_CALLBACK (changed_cb),
234                                   G_OBJECT (bc_data));
235         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->key_combo);
236
237         gl_debug (DEBUG_WDGT, "END");
238 }
239
240 /*--------------------------------------------------------------------------*/
241 /* PRIVATE.  Callback for when any control in the widget has changed.       */
242 /*--------------------------------------------------------------------------*/
243 static void
244 changed_cb (glWdgtBCData *bc_data)
245 {
246         gl_debug (DEBUG_WDGT, "START");
247
248         /* Emit our "changed" signal */
249         g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
250
251         gl_debug (DEBUG_WDGT, "END");
252 }
253
254 /*--------------------------------------------------------------------------*/
255 /* PRIVATE.  Callback to handle toggling of radio buttons                   */
256 /*--------------------------------------------------------------------------*/
257 static void
258 radio_toggled_cb (GtkToggleButton *togglebutton,
259                   glWdgtBCData    *bc_data)
260 {
261         gl_debug (DEBUG_WDGT, "START");
262
263         if (gtk_toggle_button_get_active
264             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
265                 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
266                 gtk_widget_set_sensitive (bc_data->key_combo, FALSE);
267         } else {
268                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
269                 gtk_widget_set_sensitive (bc_data->key_combo, TRUE);
270         }
271
272         /* Emit our "changed" signal */
273         g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
274
275         gl_debug (DEBUG_WDGT, "END");
276 }
277
278 /****************************************************************************/
279 /* Set new field definitions.                                               */
280 /****************************************************************************/
281 void
282 gl_wdgt_bc_data_set_field_defs  (glWdgtBCData *bc_data,
283                                  GList        *field_defs)
284 {
285         GList *keys;
286
287         gl_debug (DEBUG_WDGT, "START");
288
289         keys = gl_merge_get_key_list (field_defs);
290         if ( keys != NULL ) {
291                 gtk_combo_set_popdown_strings (GTK_COMBO (bc_data->key_combo),
292                                                keys);
293                 gl_merge_free_key_list (&keys);
294         } else {
295                 keys = g_list_append (keys, "");
296                 gtk_combo_set_popdown_strings (GTK_COMBO (bc_data->key_combo),
297                                                keys);
298                 g_list_free (keys);
299         }
300
301         gl_debug (DEBUG_WDGT, "END");
302 }
303
304
305 /****************************************************************************/
306 /* Get widget data.                                                         */
307 /****************************************************************************/
308 glTextNode *
309 gl_wdgt_bc_data_get_data (glWdgtBCData *bc_data)
310 {
311         glTextNode *text_node;
312
313         gl_debug (DEBUG_WDGT, "START");
314
315         text_node = g_new0(glTextNode,1);
316
317         if (gtk_toggle_button_get_active
318             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
319                 text_node->field_flag = FALSE;
320                 text_node->data =
321                     gtk_editable_get_chars (GTK_EDITABLE
322                                             (bc_data->literal_entry), 0, -1);
323         } else {
324                 text_node->field_flag = TRUE;
325                 text_node->data = 
326                     gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
327                                             0, -1);
328                 gl_debug (DEBUG_WDGT, "text_node: field_flag=%d, data=%s",
329                           text_node->field_flag, text_node->data);
330         }
331
332         gl_debug (DEBUG_WDGT, "END");
333
334         return text_node;
335 }
336
337 /****************************************************************************/
338 /* Set widget data.                                                         */
339 /****************************************************************************/
340 void
341 gl_wdgt_bc_data_set_data (glWdgtBCData *bc_data,
342                           gboolean      merge_flag,
343                           glTextNode   *text_node)
344 {
345         gint pos;
346
347         gl_debug (DEBUG_WDGT, "START");
348
349         gtk_widget_set_sensitive (bc_data->key_radio, merge_flag);
350
351         if (!text_node->field_flag) {
352
353                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
354                                               (bc_data->literal_radio), TRUE);
355
356                 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
357                 gtk_widget_set_sensitive (bc_data->key_combo, FALSE);
358
359                 g_signal_handlers_block_by_func (G_OBJECT
360                                                 (bc_data->literal_entry),
361                                                 G_CALLBACK (changed_cb),
362                                                 bc_data);
363                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
364                                           0, -1);
365                 g_signal_handlers_unblock_by_func (G_OBJECT
366                                                   (bc_data->literal_entry),
367                                                   G_CALLBACK
368                                                   (changed_cb), bc_data);
369
370                 pos = 0;
371                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
372                                           text_node->data,
373                                           strlen (text_node->data),
374                                           &pos);
375         } else {
376
377                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
378                                               (bc_data->key_radio), TRUE);
379
380                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
381                 gtk_widget_set_sensitive (bc_data->key_combo, TRUE);
382
383                 g_signal_handlers_block_by_func (G_OBJECT
384                                                 (bc_data->key_entry),
385                                                 G_CALLBACK (changed_cb),
386                                                 bc_data);
387                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
388                                           -1);
389                 g_signal_handlers_unblock_by_func (G_OBJECT
390                                                   (bc_data->key_entry),
391                                                   G_CALLBACK
392                                                   (changed_cb), bc_data);
393
394                 pos = 0;
395                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
396                                           text_node->data,
397                                           strlen (text_node->data),
398                                           &pos);
399         }
400
401         gl_debug (DEBUG_WDGT, "END");
402 }
403
404 /****************************************************************************/
405 /* Set size group for internal labels                                       */
406 /****************************************************************************/
407 void
408 gl_wdgt_bc_data_set_label_size_group (glWdgtBCData   *bc_data,
409                                       GtkSizeGroup   *label_size_group)
410 {
411         gl_debug (DEBUG_WDGT, "START");
412
413         gtk_size_group_add_widget (label_size_group, bc_data->literal_radio);
414         gtk_size_group_add_widget (label_size_group, bc_data->key_radio);
415
416         gl_debug (DEBUG_WDGT, "END");
417 }