]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-bc-data.c
Initial revision
[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 GtkContainerClass *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                                        gchar * label, 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 \f
64 /*================================================================*/
65 /* Boilerplate Object stuff.                                      */
66 /*================================================================*/
67 guint
68 gl_wdgt_bc_data_get_type (void)
69 {
70         static guint wdgt_bc_data_type = 0;
71
72         if (!wdgt_bc_data_type) {
73                 GTypeInfo wdgt_bc_data_info = {
74                         sizeof (glWdgtBCDataClass),
75                         NULL,
76                         NULL,
77                         (GClassInitFunc) gl_wdgt_bc_data_class_init,
78                         NULL,
79                         NULL,
80                         sizeof (glWdgtBCData),
81                         0,
82                         (GInstanceInitFunc) gl_wdgt_bc_data_instance_init,
83                 };
84
85                 wdgt_bc_data_type =
86                         g_type_register_static (gtk_vbox_get_type (),
87                                                 "glWdgtBCData",
88                                                 &wdgt_bc_data_info, 0);
89         }
90
91         return wdgt_bc_data_type;
92 }
93
94 static void
95 gl_wdgt_bc_data_class_init (glWdgtBCDataClass * class)
96 {
97         GObjectClass *object_class;
98
99         object_class = (GObjectClass *) class;
100
101         parent_class = gtk_type_class (gtk_vbox_get_type ());
102
103         object_class->finalize = gl_wdgt_bc_data_finalize;
104
105         wdgt_bc_data_signals[CHANGED] =
106             g_signal_new ("changed",
107                           G_OBJECT_CLASS_TYPE(object_class),
108                           G_SIGNAL_RUN_LAST,
109                           G_STRUCT_OFFSET (glWdgtBCDataClass, changed),
110                           NULL, NULL,
111                           gl_marshal_VOID__VOID,
112                           G_TYPE_NONE, 0);
113
114 }
115
116 static void
117 gl_wdgt_bc_data_instance_init (glWdgtBCData * bc_data)
118 {
119         bc_data->literal_radio = NULL;
120         bc_data->literal_entry = NULL;
121
122         bc_data->key_radio = NULL;
123         bc_data->key_entry = NULL;
124 }
125
126 static void
127 gl_wdgt_bc_data_finalize (GObject * object)
128 {
129         glWdgtBCData *bc_data;
130         glWdgtBCDataClass *class;
131
132         g_return_if_fail (object != NULL);
133         g_return_if_fail (GL_IS_WDGT_BC_DATA (object));
134
135         bc_data = GL_WDGT_BC_DATA (object);
136
137         G_OBJECT_CLASS (parent_class)->finalize (object);
138 }
139
140 GtkWidget *
141 gl_wdgt_bc_data_new (gchar * label,
142                      GList * field_defs)
143 {
144         glWdgtBCData *bc_data;
145
146         bc_data = g_object_new (gl_wdgt_bc_data_get_type (), NULL);
147
148         gl_wdgt_bc_data_construct (bc_data, label, field_defs);
149
150         return GTK_WIDGET (bc_data);
151 }
152
153 /*============================================================*/
154 /* Construct composite widget.                                */
155 /*============================================================*/
156 static void
157 gl_wdgt_bc_data_construct (glWdgtBCData * bc_data,
158                            gchar * label,
159                            GList * field_defs)
160 {
161         GtkWidget *wvbox, *wframe, *wtable, *wcombo;
162         GSList *radio_group = NULL;
163         GList *keys;
164
165         wvbox = GTK_WIDGET (bc_data);
166
167         wframe = gtk_frame_new (label);
168         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
169
170         wtable = gtk_table_new (2, 2, FALSE);
171         gtk_container_set_border_width (GTK_CONTAINER (wtable), 10);
172         gtk_table_set_row_spacings (GTK_TABLE (wtable), 5);
173         gtk_table_set_col_spacings (GTK_TABLE (wtable), 5);
174         gtk_container_add (GTK_CONTAINER (wframe), wtable);
175
176         /* Literal radio */
177         bc_data->literal_radio = gtk_radio_button_new_with_label (radio_group,
178                                                                   _
179                                                                   ("Literal:"));
180         radio_group =
181             gtk_radio_button_get_group (GTK_RADIO_BUTTON (bc_data->literal_radio));
182         g_signal_connect (G_OBJECT (bc_data->literal_radio), "toggled",
183                           G_CALLBACK (radio_toggled_cb),
184                           G_OBJECT (bc_data));
185         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_radio,
186                                    0, 1, 0, 1);
187
188         /* Literal entry widget */
189         bc_data->literal_entry = gtk_entry_new ();
190         gtk_widget_set_size_request (bc_data->literal_entry, 200, -1);
191         g_signal_connect_swapped (G_OBJECT (bc_data->literal_entry),
192                                   "changed", G_CALLBACK (changed_cb),
193                                   G_OBJECT (bc_data));
194         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_entry,
195                                    1, 2, 0, 1);
196
197         /* Key radio */
198         bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
199                                                               _("Key:"));
200         g_signal_connect (G_OBJECT (bc_data->key_radio), "toggled",
201                           G_CALLBACK (radio_toggled_cb),
202                           G_OBJECT (bc_data));
203         gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->key_radio,
204                                    0, 1, 1, 2);
205
206         /* Key entry widget */
207         wcombo = gtk_combo_new ();
208         keys = gl_merge_get_key_list (field_defs);
209         if (keys != NULL)
210                 gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), keys);
211         gl_merge_free_key_list (&keys);
212         bc_data->key_entry = GTK_COMBO (wcombo)->entry;
213         gtk_entry_set_editable (GTK_ENTRY (bc_data->key_entry), FALSE);
214         gtk_widget_set_size_request (wcombo, 200, -1);
215         g_signal_connect_swapped (G_OBJECT (bc_data->key_entry), "changed",
216                                   G_CALLBACK (changed_cb),
217                                   G_OBJECT (bc_data));
218         gtk_table_attach_defaults (GTK_TABLE (wtable), wcombo, 1, 2, 1, 2);
219
220 }
221
222 /*--------------------------------------------------------------------------*/
223 /* PRIVATE.  Callback for when any control in the widget has changed.       */
224 /*--------------------------------------------------------------------------*/
225 static void
226 changed_cb (glWdgtBCData * bc_data)
227 {
228         /* Emit our "changed" signal */
229         g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
230 }
231
232 /*--------------------------------------------------------------------------*/
233 /* PRIVATE.  Callback to handle toggling of radio buttons                   */
234 /*--------------------------------------------------------------------------*/
235 static void
236 radio_toggled_cb (GtkToggleButton * togglebutton,
237                   glWdgtBCData * bc_data)
238 {
239         if (gtk_toggle_button_get_active
240             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
241                 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
242                 gtk_widget_set_sensitive (bc_data->key_entry, FALSE);
243         } else {
244                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
245                 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
246         }
247
248         /* Emit our "changed" signal */
249         g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
250 }
251
252 /*--------------------------------------------------------------------------*/
253 /* Get widget data.                                                         */
254 /*--------------------------------------------------------------------------*/
255 glTextNode *
256 gl_wdgt_bc_data_get_data (glWdgtBCData * bc_data)
257 {
258         glTextNode *text_node;
259
260         text_node = g_new0(glTextNode,1);
261
262         if (gtk_toggle_button_get_active
263             (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
264                 text_node->field_flag = FALSE;
265                 text_node->data =
266                     gtk_editable_get_chars (GTK_EDITABLE
267                                             (bc_data->literal_entry), 0, -1);
268         } else {
269                 text_node->field_flag = TRUE;
270                 text_node->data = 
271                     gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
272                                             0, -1);
273         }
274 }
275
276 /*--------------------------------------------------------------------------*/
277 /* Set widget data.                                                         */
278 /*--------------------------------------------------------------------------*/
279 void
280 gl_wdgt_bc_data_set_data (glWdgtBCData * bc_data,
281                           gboolean merge_flag,
282                           glTextNode *text_node)
283 {
284         gint pos;
285
286         gtk_widget_set_sensitive (bc_data->key_radio, merge_flag);
287
288         if (!text_node->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                 g_signal_handlers_block_by_func (G_OBJECT
297                                                 (bc_data->literal_entry),
298                                                 G_CALLBACK (changed_cb),
299                                                 bc_data);
300                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
301                                           0, -1);
302                 g_signal_handlers_unblock_by_func (G_OBJECT
303                                                   (bc_data->literal_entry),
304                                                   G_CALLBACK
305                                                   (changed_cb), bc_data);
306
307                 pos = 0;
308                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
309                                           text_node->data,
310                                           strlen (text_node->data),
311                                           &pos);
312         } else {
313
314                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
315                                               (bc_data->key_radio), TRUE);
316
317                 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
318                 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
319
320                 g_signal_handlers_block_by_func (G_OBJECT
321                                                 (bc_data->key_entry),
322                                                 G_CALLBACK (changed_cb),
323                                                 bc_data);
324                 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
325                                           -1);
326                 g_signal_handlers_unblock_by_func (G_OBJECT
327                                                   (bc_data->key_entry),
328                                                   G_CALLBACK
329                                                   (changed_cb), bc_data);
330
331                 pos = 0;
332                 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
333                                           text_node->data,
334                                           strlen (text_node->data),
335                                           &pos);
336         }
337
338 }