2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * wdgt_bc_data.c: barcode data widget module
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include "wdgt-bc-data.h"
31 /*===========================================*/
33 /*===========================================*/
40 typedef void (*glWdgtBCDataSignal) (GObject * object, gpointer data);
42 /*===========================================*/
44 /*===========================================*/
46 static glHigVBoxClass *parent_class;
48 static gint wdgt_bc_data_signals[LAST_SIGNAL] = { 0 };
50 /*===========================================*/
51 /* Local function prototypes */
52 /*===========================================*/
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,
60 static void changed_cb (glWdgtBCData *bc_data);
61 static void radio_toggled_cb (GtkToggleButton *togglebutton,
62 glWdgtBCData *bc_data);
65 /****************************************************************************/
66 /* Boilerplate Object stuff. */
67 /****************************************************************************/
69 gl_wdgt_bc_data_get_type (void)
71 static guint wdgt_bc_data_type = 0;
73 if (!wdgt_bc_data_type) {
74 GTypeInfo wdgt_bc_data_info = {
75 sizeof (glWdgtBCDataClass),
78 (GClassInitFunc) gl_wdgt_bc_data_class_init,
81 sizeof (glWdgtBCData),
83 (GInstanceInitFunc) gl_wdgt_bc_data_instance_init,
87 g_type_register_static (gl_hig_vbox_get_type (),
89 &wdgt_bc_data_info, 0);
92 return wdgt_bc_data_type;
96 gl_wdgt_bc_data_class_init (glWdgtBCDataClass *class)
98 GObjectClass *object_class;
100 gl_debug (DEBUG_WDGT, "START");
102 object_class = (GObjectClass *) class;
104 parent_class = g_type_class_peek_parent (class);
106 object_class->finalize = gl_wdgt_bc_data_finalize;
108 wdgt_bc_data_signals[CHANGED] =
109 g_signal_new ("changed",
110 G_OBJECT_CLASS_TYPE(object_class),
112 G_STRUCT_OFFSET (glWdgtBCDataClass, changed),
114 gl_marshal_VOID__VOID,
117 gl_debug (DEBUG_WDGT, "END");
121 gl_wdgt_bc_data_instance_init (glWdgtBCData *bc_data)
123 gl_debug (DEBUG_WDGT, "START");
125 bc_data->literal_radio = NULL;
126 bc_data->literal_entry = NULL;
128 bc_data->key_radio = NULL;
129 bc_data->key_combo = NULL;
130 bc_data->key_entry = NULL;
132 gl_debug (DEBUG_WDGT, "END");
136 gl_wdgt_bc_data_finalize (GObject *object)
138 glWdgtBCData *bc_data;
139 glWdgtBCDataClass *class;
141 gl_debug (DEBUG_WDGT, "START");
143 g_return_if_fail (object != NULL);
144 g_return_if_fail (GL_IS_WDGT_BC_DATA (object));
146 bc_data = GL_WDGT_BC_DATA (object);
148 G_OBJECT_CLASS (parent_class)->finalize (object);
150 gl_debug (DEBUG_WDGT, "END");
153 /****************************************************************************/
155 /****************************************************************************/
157 gl_wdgt_bc_data_new (GList *field_defs)
159 glWdgtBCData *bc_data;
161 gl_debug (DEBUG_WDGT, "START");
163 bc_data = g_object_new (gl_wdgt_bc_data_get_type (), NULL);
165 gl_wdgt_bc_data_construct (bc_data, field_defs);
167 gl_debug (DEBUG_WDGT, "END");
169 return GTK_WIDGET (bc_data);
172 /*--------------------------------------------------------------------------*/
173 /* PRIVATE. Construct composite widget. */
174 /*--------------------------------------------------------------------------*/
176 gl_wdgt_bc_data_construct (glWdgtBCData *bc_data,
179 GtkWidget *wvbox, *whbox;
180 GSList *radio_group = NULL;
183 gl_debug (DEBUG_WDGT, "START");
185 wvbox = GTK_WIDGET (bc_data);
187 /* ---- Literal line ---- */
188 whbox = gl_hig_hbox_new ();
189 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
192 bc_data->literal_radio = gtk_radio_button_new_with_label (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),
200 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->literal_radio);
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),
208 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->literal_entry);
210 /* ---- Key line ---- */
211 whbox = gl_hig_hbox_new ();
212 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
215 bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
217 g_signal_connect (G_OBJECT (bc_data->key_radio), "toggled",
218 G_CALLBACK (radio_toggled_cb),
220 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->key_radio);
222 /* Key entry widget */
223 bc_data->key_combo = gtk_combo_new ();
224 keys = gl_merge_get_key_list (field_defs);
226 gtk_combo_set_popdown_strings (GTK_COMBO (bc_data->key_combo),
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),
235 gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), bc_data->key_combo);
237 gl_debug (DEBUG_WDGT, "END");
240 /*--------------------------------------------------------------------------*/
241 /* PRIVATE. Callback for when any control in the widget has changed. */
242 /*--------------------------------------------------------------------------*/
244 changed_cb (glWdgtBCData *bc_data)
246 gl_debug (DEBUG_WDGT, "START");
248 /* Emit our "changed" signal */
249 g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
251 gl_debug (DEBUG_WDGT, "END");
254 /*--------------------------------------------------------------------------*/
255 /* PRIVATE. Callback to handle toggling of radio buttons */
256 /*--------------------------------------------------------------------------*/
258 radio_toggled_cb (GtkToggleButton *togglebutton,
259 glWdgtBCData *bc_data)
261 gl_debug (DEBUG_WDGT, "START");
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);
268 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
269 gtk_widget_set_sensitive (bc_data->key_combo, TRUE);
272 /* Emit our "changed" signal */
273 g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
275 gl_debug (DEBUG_WDGT, "END");
278 /****************************************************************************/
279 /* Set new field definitions. */
280 /****************************************************************************/
282 gl_wdgt_bc_data_set_field_defs (glWdgtBCData *bc_data,
287 gl_debug (DEBUG_WDGT, "START");
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),
293 gl_merge_free_key_list (&keys);
295 keys = g_list_append (keys, "");
296 gtk_combo_set_popdown_strings (GTK_COMBO (bc_data->key_combo),
301 gl_debug (DEBUG_WDGT, "END");
305 /****************************************************************************/
306 /* Get widget data. */
307 /****************************************************************************/
309 gl_wdgt_bc_data_get_data (glWdgtBCData *bc_data)
311 glTextNode *text_node;
313 gl_debug (DEBUG_WDGT, "START");
315 text_node = g_new0(glTextNode,1);
317 if (gtk_toggle_button_get_active
318 (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
319 text_node->field_flag = FALSE;
321 gtk_editable_get_chars (GTK_EDITABLE
322 (bc_data->literal_entry), 0, -1);
324 text_node->field_flag = TRUE;
326 gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
328 gl_debug (DEBUG_WDGT, "text_node: field_flag=%d, data=%s",
329 text_node->field_flag, text_node->data);
332 gl_debug (DEBUG_WDGT, "END");
337 /****************************************************************************/
338 /* Set widget data. */
339 /****************************************************************************/
341 gl_wdgt_bc_data_set_data (glWdgtBCData *bc_data,
343 glTextNode *text_node)
347 gl_debug (DEBUG_WDGT, "START");
349 gtk_widget_set_sensitive (bc_data->key_radio, merge_flag);
351 if (!text_node->field_flag) {
353 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
354 (bc_data->literal_radio), TRUE);
356 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
357 gtk_widget_set_sensitive (bc_data->key_combo, FALSE);
359 g_signal_handlers_block_by_func (G_OBJECT
360 (bc_data->literal_entry),
361 G_CALLBACK (changed_cb),
363 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
365 g_signal_handlers_unblock_by_func (G_OBJECT
366 (bc_data->literal_entry),
368 (changed_cb), bc_data);
371 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
373 strlen (text_node->data),
377 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
378 (bc_data->key_radio), TRUE);
380 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
381 gtk_widget_set_sensitive (bc_data->key_combo, TRUE);
383 g_signal_handlers_block_by_func (G_OBJECT
384 (bc_data->key_entry),
385 G_CALLBACK (changed_cb),
387 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
389 g_signal_handlers_unblock_by_func (G_OBJECT
390 (bc_data->key_entry),
392 (changed_cb), bc_data);
395 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
397 strlen (text_node->data),
401 gl_debug (DEBUG_WDGT, "END");
404 /****************************************************************************/
405 /* Set size group for internal labels */
406 /****************************************************************************/
408 gl_wdgt_bc_data_set_label_size_group (glWdgtBCData *bc_data,
409 GtkSizeGroup *label_size_group)
411 gl_debug (DEBUG_WDGT, "START");
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);
416 gl_debug (DEBUG_WDGT, "END");