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 GtkContainerClass *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,
58 gchar * label, GList * field_defs);
60 static void changed_cb (glWdgtBCData * bc_data);
61 static void radio_toggled_cb (GtkToggleButton * togglebutton,
62 glWdgtBCData * bc_data);
64 /*================================================================*/
65 /* Boilerplate Object stuff. */
66 /*================================================================*/
68 gl_wdgt_bc_data_get_type (void)
70 static guint wdgt_bc_data_type = 0;
72 if (!wdgt_bc_data_type) {
73 GTypeInfo wdgt_bc_data_info = {
74 sizeof (glWdgtBCDataClass),
77 (GClassInitFunc) gl_wdgt_bc_data_class_init,
80 sizeof (glWdgtBCData),
82 (GInstanceInitFunc) gl_wdgt_bc_data_instance_init,
86 g_type_register_static (gtk_vbox_get_type (),
88 &wdgt_bc_data_info, 0);
91 return wdgt_bc_data_type;
95 gl_wdgt_bc_data_class_init (glWdgtBCDataClass * class)
97 GObjectClass *object_class;
99 object_class = (GObjectClass *) class;
101 parent_class = gtk_type_class (gtk_vbox_get_type ());
103 object_class->finalize = gl_wdgt_bc_data_finalize;
105 wdgt_bc_data_signals[CHANGED] =
106 g_signal_new ("changed",
107 G_OBJECT_CLASS_TYPE(object_class),
109 G_STRUCT_OFFSET (glWdgtBCDataClass, changed),
111 gl_marshal_VOID__VOID,
117 gl_wdgt_bc_data_instance_init (glWdgtBCData * bc_data)
119 bc_data->literal_radio = NULL;
120 bc_data->literal_entry = NULL;
122 bc_data->key_radio = NULL;
123 bc_data->key_entry = NULL;
127 gl_wdgt_bc_data_finalize (GObject * object)
129 glWdgtBCData *bc_data;
130 glWdgtBCDataClass *class;
132 g_return_if_fail (object != NULL);
133 g_return_if_fail (GL_IS_WDGT_BC_DATA (object));
135 bc_data = GL_WDGT_BC_DATA (object);
137 G_OBJECT_CLASS (parent_class)->finalize (object);
141 gl_wdgt_bc_data_new (gchar * label,
144 glWdgtBCData *bc_data;
146 bc_data = g_object_new (gl_wdgt_bc_data_get_type (), NULL);
148 gl_wdgt_bc_data_construct (bc_data, label, field_defs);
150 return GTK_WIDGET (bc_data);
153 /*============================================================*/
154 /* Construct composite widget. */
155 /*============================================================*/
157 gl_wdgt_bc_data_construct (glWdgtBCData * bc_data,
161 GtkWidget *wvbox, *wframe, *wtable, *wcombo;
162 GSList *radio_group = NULL;
165 wvbox = GTK_WIDGET (bc_data);
167 wframe = gtk_frame_new (label);
168 gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
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);
177 bc_data->literal_radio = gtk_radio_button_new_with_label (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),
185 gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_radio,
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),
194 gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->literal_entry,
198 bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
200 g_signal_connect (G_OBJECT (bc_data->key_radio), "toggled",
201 G_CALLBACK (radio_toggled_cb),
203 gtk_table_attach_defaults (GTK_TABLE (wtable), bc_data->key_radio,
206 /* Key entry widget */
207 wcombo = gtk_combo_new ();
208 keys = gl_merge_get_key_list (field_defs);
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),
218 gtk_table_attach_defaults (GTK_TABLE (wtable), wcombo, 1, 2, 1, 2);
222 /*--------------------------------------------------------------------------*/
223 /* PRIVATE. Callback for when any control in the widget has changed. */
224 /*--------------------------------------------------------------------------*/
226 changed_cb (glWdgtBCData * bc_data)
228 /* Emit our "changed" signal */
229 g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
232 /*--------------------------------------------------------------------------*/
233 /* PRIVATE. Callback to handle toggling of radio buttons */
234 /*--------------------------------------------------------------------------*/
236 radio_toggled_cb (GtkToggleButton * togglebutton,
237 glWdgtBCData * bc_data)
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);
244 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
245 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
248 /* Emit our "changed" signal */
249 g_signal_emit (G_OBJECT (bc_data), wdgt_bc_data_signals[CHANGED], 0);
252 /*--------------------------------------------------------------------------*/
253 /* Get widget data. */
254 /*--------------------------------------------------------------------------*/
256 gl_wdgt_bc_data_get_data (glWdgtBCData * bc_data)
258 glTextNode *text_node;
260 text_node = g_new0(glTextNode,1);
262 if (gtk_toggle_button_get_active
263 (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
264 text_node->field_flag = FALSE;
266 gtk_editable_get_chars (GTK_EDITABLE
267 (bc_data->literal_entry), 0, -1);
269 text_node->field_flag = TRUE;
271 gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
276 /*--------------------------------------------------------------------------*/
277 /* Set widget data. */
278 /*--------------------------------------------------------------------------*/
280 gl_wdgt_bc_data_set_data (glWdgtBCData * bc_data,
282 glTextNode *text_node)
286 gtk_widget_set_sensitive (bc_data->key_radio, merge_flag);
288 if (!text_node->field_flag) {
290 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
291 (bc_data->literal_radio), TRUE);
293 gtk_widget_set_sensitive (bc_data->literal_entry, TRUE);
294 gtk_widget_set_sensitive (bc_data->key_entry, FALSE);
296 g_signal_handlers_block_by_func (G_OBJECT
297 (bc_data->literal_entry),
298 G_CALLBACK (changed_cb),
300 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
302 g_signal_handlers_unblock_by_func (G_OBJECT
303 (bc_data->literal_entry),
305 (changed_cb), bc_data);
308 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
310 strlen (text_node->data),
314 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
315 (bc_data->key_radio), TRUE);
317 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
318 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
320 g_signal_handlers_block_by_func (G_OBJECT
321 (bc_data->key_entry),
322 G_CALLBACK (changed_cb),
324 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
326 g_signal_handlers_unblock_by_func (G_OBJECT
327 (bc_data->key_entry),
329 (changed_cb), bc_data);
332 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
334 strlen (text_node->data),