2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * prop_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 "prop_bc_data.h"
30 /*===========================================*/
32 /*===========================================*/
39 typedef void (*glPropBCDataSignal) (GtkObject * object, gpointer data);
41 /*===========================================*/
43 /*===========================================*/
45 static GtkContainerClass *parent_class;
47 static gint prop_bc_data_signals[LAST_SIGNAL] = { 0 };
49 /*===========================================*/
50 /* Local function prototypes */
51 /*===========================================*/
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);
59 static void changed_cb (glPropBCData * bc_data);
60 static void radio_toggled_cb (GtkToggleButton * togglebutton,
61 glPropBCData * bc_data);
63 /*================================================================*/
64 /* Boilerplate Object stuff. */
65 /*================================================================*/
67 gl_prop_bc_data_get_type (void)
69 static guint prop_bc_data_type = 0;
71 if (!prop_bc_data_type) {
72 GtkTypeInfo prop_bc_data_info = {
74 sizeof (glPropBCData),
75 sizeof (glPropBCDataClass),
76 (GtkClassInitFunc) gl_prop_bc_data_class_init,
77 (GtkObjectInitFunc) gl_prop_bc_data_init,
82 prop_bc_data_type = gtk_type_unique (gtk_vbox_get_type (),
86 return prop_bc_data_type;
90 gl_prop_bc_data_class_init (glPropBCDataClass * class)
92 GtkObjectClass *object_class;
93 GtkWidgetClass *widget_class;
95 object_class = (GtkObjectClass *) class;
96 widget_class = (GtkWidgetClass *) class;
98 parent_class = gtk_type_class (gtk_vbox_get_type ());
100 object_class->destroy = gl_prop_bc_data_destroy;
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);
109 class->changed = NULL;
113 gl_prop_bc_data_init (glPropBCData * bc_data)
115 bc_data->literal_radio = NULL;
116 bc_data->literal_entry = NULL;
118 bc_data->key_radio = NULL;
119 bc_data->key_entry = NULL;
123 gl_prop_bc_data_destroy (GtkObject * object)
125 glPropBCData *bc_data;
126 glPropBCDataClass *class;
128 g_return_if_fail (object != NULL);
129 g_return_if_fail (GL_IS_PROP_BC_DATA (object));
131 bc_data = GL_PROP_BC_DATA (object);
132 class = GL_PROP_BC_DATA_CLASS (GTK_OBJECT (bc_data)->klass);
134 GTK_OBJECT_CLASS (parent_class)->destroy (object);
138 gl_prop_bc_data_new (gchar * label,
141 glPropBCData *bc_data;
143 bc_data = gtk_type_new (gl_prop_bc_data_get_type ());
145 gl_prop_bc_data_construct (bc_data, label, field_defs);
147 return GTK_WIDGET (bc_data);
150 /*============================================================*/
151 /* Construct composite widget. */
152 /*============================================================*/
154 gl_prop_bc_data_construct (glPropBCData * bc_data,
158 GtkWidget *wvbox, *wframe, *wtable, *wcombo;
159 GSList *radio_group = NULL;
162 wvbox = GTK_WIDGET (bc_data);
164 wframe = gtk_frame_new (label);
165 gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
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);
174 bc_data->literal_radio = gtk_radio_button_new_with_label (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,
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,
195 bc_data->key_radio = gtk_radio_button_new_with_label (radio_group,
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,
203 /* Key entry widget */
204 wcombo = gtk_combo_new ();
205 keys = gl_merge_get_key_list (field_defs);
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);
219 /*--------------------------------------------------------------------------*/
220 /* PRIVATE. Callback for when any control in the widget has changed. */
221 /*--------------------------------------------------------------------------*/
223 changed_cb (glPropBCData * bc_data)
225 /* Emit our "changed" signal */
226 gtk_signal_emit (GTK_OBJECT (bc_data), prop_bc_data_signals[CHANGED]);
229 /*--------------------------------------------------------------------------*/
230 /* PRIVATE. Callback to handle toggling of radio buttons */
231 /*--------------------------------------------------------------------------*/
233 radio_toggled_cb (GtkToggleButton * togglebutton,
234 glPropBCData * bc_data)
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);
241 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
242 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
245 /* Emit our "changed" signal */
246 gtk_signal_emit (GTK_OBJECT (bc_data), prop_bc_data_signals[CHANGED]);
249 /*--------------------------------------------------------------------------*/
250 /* Get widget data. */
251 /*--------------------------------------------------------------------------*/
253 gl_prop_bc_data_get_data (glPropBCData * bc_data,
254 gboolean * field_flag,
258 if (gtk_toggle_button_get_active
259 (GTK_TOGGLE_BUTTON (bc_data->literal_radio))) {
262 gtk_editable_get_chars (GTK_EDITABLE
263 (bc_data->literal_entry), 0, -1);
269 gtk_editable_get_chars (GTK_EDITABLE (bc_data->key_entry),
274 /*--------------------------------------------------------------------------*/
275 /* Set widget data. */
276 /*--------------------------------------------------------------------------*/
278 gl_prop_bc_data_set_data (glPropBCData * bc_data,
286 gtk_widget_set_sensitive (bc_data->key_radio, merge_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 gtk_signal_handler_block_by_func (GTK_OBJECT
297 (bc_data->literal_entry),
298 GTK_SIGNAL_FUNC (changed_cb),
300 gtk_editable_delete_text (GTK_EDITABLE (bc_data->literal_entry),
302 gtk_signal_handler_unblock_by_func (GTK_OBJECT
303 (bc_data->literal_entry),
305 (changed_cb), bc_data);
308 gtk_editable_insert_text (GTK_EDITABLE (bc_data->literal_entry),
309 data, strlen (data), &pos);
312 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
313 (bc_data->key_radio), TRUE);
315 gtk_widget_set_sensitive (bc_data->literal_entry, FALSE);
316 gtk_widget_set_sensitive (bc_data->key_entry, TRUE);
318 gtk_signal_handler_block_by_func (GTK_OBJECT
319 (bc_data->key_entry),
320 GTK_SIGNAL_FUNC (changed_cb),
322 gtk_editable_delete_text (GTK_EDITABLE (bc_data->key_entry), 0,
324 gtk_signal_handler_unblock_by_func (GTK_OBJECT
325 (bc_data->key_entry),
327 (changed_cb), bc_data);
330 gtk_editable_insert_text (GTK_EDITABLE (bc_data->key_entry),
331 data, strlen (data), &pos);