2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * merge_ui.c: document merge user interface module
6 * Copyright (C) 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
28 #include "merge-ui-text.h"
32 /*===========================================*/
34 /*===========================================*/
43 GtkWidget * (*src_new) (glMergeType);
44 void (*src_set_value) ();
45 gchar * (*src_get_value) ();
47 GtkWidget * (*field_ws_new) (glMergeType, gchar *);
48 void (*field_ws_set_field_defs) ();
49 GList * (*field_ws_get_field_defs) ();
53 /*===========================================*/
55 /*===========================================*/
57 static GtkContainerClass *parent_class;
59 static gint merge_ui_src_signals[LAST_SIGNAL] = { 0 };
60 static gint merge_ui_field_ws_signals[LAST_SIGNAL] = { 0 };
62 static BackendFunctions func[GL_MERGE_N_TYPES];
64 /*===========================================*/
65 /* Local function prototypes */
66 /*===========================================*/
68 static void gl_merge_ui_src_class_init (glMergeUISrcClass * class);
69 static void gl_merge_ui_src_instance_init (glMergeUISrc * src);
70 static void gl_merge_ui_src_finalize (GObject * object);
72 static void src_changed_cb (glMergeUISrc * src);
74 static void gl_merge_ui_field_ws_class_init (glMergeUIFieldWSClass * class);
75 static void gl_merge_ui_field_ws_instance_init (glMergeUIFieldWS * field_ws);
76 static void gl_merge_ui_field_ws_finalize (GObject * object);
78 static void field_ws_changed_cb (glMergeUIFieldWS * field_ws);
80 /*****************************************************************************/
81 /* Initialize module. */
82 /*****************************************************************************/
84 gl_merge_ui_init (void)
88 gl_debug (DEBUG_MERGE, "START");
90 /* Register backend functions. */
93 func[i].src_new = NULL;
94 func[i].src_set_value = NULL;
95 func[i].src_get_value = NULL;
96 func[i].field_ws_new = NULL;
97 func[i].field_ws_set_field_defs = NULL;
98 func[i].field_ws_get_field_defs = NULL;
100 i = GL_MERGE_TEXT_TAB;
101 func[i].src_new = gl_merge_ui_text_src_new;
102 func[i].src_set_value = gl_merge_ui_text_src_set_value;
103 func[i].src_get_value = gl_merge_ui_text_src_get_value;
104 func[i].field_ws_new = gl_merge_ui_text_field_ws_new;
105 func[i].field_ws_set_field_defs =
106 gl_merge_ui_text_field_ws_set_field_defs;
107 func[i].field_ws_get_field_defs =
108 gl_merge_ui_text_field_ws_get_field_defs;
110 i = GL_MERGE_TEXT_COMMA;
111 func[i].src_new = gl_merge_ui_text_src_new;
112 func[i].src_set_value = gl_merge_ui_text_src_set_value;
113 func[i].src_get_value = gl_merge_ui_text_src_get_value;
114 func[i].field_ws_new = gl_merge_ui_text_field_ws_new;
115 func[i].field_ws_set_field_defs =
116 gl_merge_ui_text_field_ws_set_field_defs;
117 func[i].field_ws_get_field_defs =
118 gl_merge_ui_text_field_ws_get_field_defs;
120 i = GL_MERGE_TEXT_COLON;
121 func[i].src_new = gl_merge_ui_text_src_new;
122 func[i].src_set_value = gl_merge_ui_text_src_set_value;
123 func[i].src_get_value = gl_merge_ui_text_src_get_value;
124 func[i].field_ws_new = gl_merge_ui_text_field_ws_new;
125 func[i].field_ws_set_field_defs =
126 gl_merge_ui_text_field_ws_set_field_defs;
127 func[i].field_ws_get_field_defs =
128 gl_merge_ui_text_field_ws_get_field_defs;
130 gl_debug (DEBUG_MERGE, "END");
133 /*****************************************************************************/
134 /* Boilerplate Object stuff. */
135 /*****************************************************************************/
137 gl_merge_ui_src_get_type (void)
139 static guint merge_ui_src_type = 0;
141 if (!merge_ui_src_type) {
142 GTypeInfo merge_ui_src_info = {
143 sizeof (glMergeUISrcClass),
146 (GClassInitFunc) gl_merge_ui_src_class_init,
149 sizeof (glMergeUISrc),
151 (GInstanceInitFunc) gl_merge_ui_src_instance_init,
155 g_type_register_static (gtk_vbox_get_type (),
157 &merge_ui_src_info, 0);
160 return merge_ui_src_type;
164 gl_merge_ui_src_class_init (glMergeUISrcClass * class)
166 GObjectClass *object_class;
168 gl_debug (DEBUG_MERGE, "START");
170 object_class = (GObjectClass *) class;
172 parent_class = gtk_type_class (gtk_vbox_get_type ());
174 object_class->finalize = gl_merge_ui_src_finalize;
176 merge_ui_src_signals[CHANGED] =
177 g_signal_new ("changed",
178 G_OBJECT_CLASS_TYPE(object_class),
180 G_STRUCT_OFFSET (glMergeUISrcClass, changed),
182 gl_marshal_VOID__VOID,
185 gl_debug (DEBUG_MERGE, "END");
189 gl_merge_ui_src_instance_init (glMergeUISrc * src)
191 gl_debug (DEBUG_MERGE, "START");
192 src->backend_widget = NULL;
193 gl_debug (DEBUG_MERGE, "END");
197 gl_merge_ui_src_finalize (GObject * object)
201 gl_debug (DEBUG_MERGE, "START");
203 g_return_if_fail (object != NULL);
204 g_return_if_fail (GL_IS_MERGE_UI_SRC (object));
206 src = GL_MERGE_UI_SRC (object);
208 G_OBJECT_CLASS (parent_class)->finalize (object);
210 gl_debug (DEBUG_MERGE, "END");
214 gl_merge_ui_src_new (void)
218 gl_debug (DEBUG_MERGE, "START");
220 src = g_object_new (gl_merge_ui_src_get_type (), NULL);
222 src->type = GL_MERGE_NONE;
223 src->backend_widget = gtk_label_new (_("N/A"));
224 gtk_misc_set_alignment (GTK_MISC (src->backend_widget), 0, 0.5);
225 gtk_box_pack_start (GTK_BOX (src), src->backend_widget, FALSE, FALSE,
228 gl_debug (DEBUG_MERGE, "END");
230 return GTK_WIDGET (src);
233 /*--------------------------------------------------------------------------*/
234 /* PRIVATE. Callback for when our backend widget has changed. */
235 /*--------------------------------------------------------------------------*/
237 src_changed_cb (glMergeUISrc * src)
239 gl_debug (DEBUG_MERGE, "START");
241 /* Emit our "changed" signal */
242 g_signal_emit (G_OBJECT (src), merge_ui_src_signals[CHANGED], 0);
244 gl_debug (DEBUG_MERGE, "END");
247 /*****************************************************************************/
249 /*****************************************************************************/
251 gl_merge_ui_src_set_type (glMergeUISrc * src,
254 gl_debug (DEBUG_MERGE, "START");
256 if (type != src->type) {
258 gtk_widget_destroy (src->backend_widget);
262 if (type != GL_MERGE_NONE) {
263 src->backend_widget = (func[type].src_new) (type);
265 src->backend_widget = gtk_label_new (_("N/A"));
266 gtk_misc_set_alignment (GTK_MISC (src->backend_widget),
270 gtk_box_pack_start (GTK_BOX (src), src->backend_widget,
273 if (GTK_WIDGET_VISIBLE (src)) {
274 gtk_widget_show_all (src->backend_widget);
277 if (type != GL_MERGE_NONE) {
278 g_signal_connect_swapped (G_OBJECT(src->backend_widget),
280 G_CALLBACK(src_changed_cb),
284 /* Emit our "changed" signal */
285 g_signal_emit (G_OBJECT (src),
286 merge_ui_src_signals[CHANGED], 0);
290 gl_debug (DEBUG_MERGE, "END");
293 /*****************************************************************************/
295 /*****************************************************************************/
297 gl_merge_ui_src_set_value (glMergeUISrc * src,
302 gl_debug (DEBUG_MERGE, "START");
306 if (type != GL_MERGE_NONE) {
307 func[type].src_set_value (src->backend_widget, text);
309 gl_debug (DEBUG_MERGE, "END");
313 gl_debug (DEBUG_MERGE, "END");
316 /*****************************************************************************/
318 /*****************************************************************************/
320 gl_merge_ui_src_get_value (glMergeUISrc * src)
324 gl_debug (DEBUG_MERGE, "");
328 if (type != GL_MERGE_NONE) {
329 return func[type].src_get_value (src->backend_widget);
336 /*****************************************************************************/
337 /* Boilerplate Object stuff. */
338 /*****************************************************************************/
340 gl_merge_ui_field_ws_get_type (void)
342 static guint merge_ui_field_ws_type = 0;
344 gl_debug (DEBUG_MERGE, "START");
346 if (!merge_ui_field_ws_type) {
347 GTypeInfo merge_ui_field_ws_info = {
348 sizeof (glMergeUIFieldWSClass),
351 (GClassInitFunc) gl_merge_ui_field_ws_class_init,
354 sizeof (glMergeUIFieldWS),
356 (GInstanceInitFunc) gl_merge_ui_field_ws_instance_init,
359 merge_ui_field_ws_type =
360 g_type_register_static (gtk_vbox_get_type (),
362 &merge_ui_field_ws_info, 0);
365 gl_debug (DEBUG_MERGE, "END");
367 return merge_ui_field_ws_type;
371 gl_merge_ui_field_ws_class_init (glMergeUIFieldWSClass * class)
373 GObjectClass *object_class;
375 gl_debug (DEBUG_MERGE, "START");
377 object_class = (GObjectClass *) class;
379 parent_class = gtk_type_class (gtk_vbox_get_type ());
381 object_class->finalize = gl_merge_ui_field_ws_finalize;
383 merge_ui_field_ws_signals[CHANGED] =
384 g_signal_new ("changed",
385 G_OBJECT_CLASS_TYPE(object_class),
387 G_STRUCT_OFFSET (glMergeUIFieldWSClass, changed),
389 gl_marshal_VOID__VOID,
392 gl_debug (DEBUG_MERGE, "END");
396 gl_merge_ui_field_ws_instance_init (glMergeUIFieldWS * field_ws)
398 gl_debug (DEBUG_MERGE, "START");
400 field_ws->type = GL_MERGE_NONE;
401 field_ws->src = NULL;
402 field_ws->backend_widget = NULL;
404 gl_debug (DEBUG_MERGE, "END");
408 gl_merge_ui_field_ws_finalize (GObject * object)
410 glMergeUIFieldWS *field_ws;
411 glMergeUIFieldWSClass *class;
413 gl_debug (DEBUG_MERGE, "START");
415 g_return_if_fail (object != NULL);
416 g_return_if_fail (GL_IS_MERGE_UI_FIELD_WS (object));
418 field_ws = GL_MERGE_UI_FIELD_WS (object);
420 G_OBJECT_CLASS (parent_class)->finalize (object);
422 gl_debug (DEBUG_MERGE, "END");
426 gl_merge_ui_field_ws_new (void)
428 glMergeUIFieldWS *field_ws;
430 gl_debug (DEBUG_MERGE, "START");
432 field_ws = g_object_new (gl_merge_ui_field_ws_get_type (), NULL);
434 field_ws->type = GL_MERGE_NONE;
435 field_ws->backend_widget = gtk_label_new (_("N/A"));
436 gtk_misc_set_alignment (GTK_MISC (field_ws->backend_widget), 0, 0.5);
437 gtk_box_pack_start (GTK_BOX (field_ws), field_ws->backend_widget,
440 gl_debug (DEBUG_MERGE, "END");
442 return GTK_WIDGET (field_ws);
445 /*--------------------------------------------------------------------------*/
446 /* PRIVATE. Callback for when our backend widget has changed. */
447 /*--------------------------------------------------------------------------*/
449 field_ws_changed_cb (glMergeUIFieldWS * field_ws)
451 gl_debug (DEBUG_MERGE, "START");
453 /* Emit our "changed" signal */
454 g_signal_emit (G_OBJECT (field_ws),
455 merge_ui_field_ws_signals[CHANGED], 0);
457 gl_debug (DEBUG_MERGE, "END");
460 /*****************************************************************************/
461 /* set type and src data, create appropriate backend widget. */
462 /*****************************************************************************/
464 gl_merge_ui_field_ws_set_type_src (glMergeUIFieldWS * field_ws,
468 gl_debug (DEBUG_MERGE, "START");
470 if (field_ws->src != NULL)
471 g_free (field_ws->src);
472 if (field_ws->backend_widget != NULL) {
473 gtk_widget_destroy (field_ws->backend_widget);
476 field_ws->type = type;
477 field_ws->src = g_strdup (src);
479 if (type != GL_MERGE_NONE) {
480 field_ws->backend_widget =
481 (func[type].field_ws_new) (type, src);
483 field_ws->backend_widget = gtk_label_new (_("N/A"));
484 gtk_misc_set_alignment (GTK_MISC (field_ws->backend_widget), 0,
488 gtk_box_pack_start (GTK_BOX (field_ws), field_ws->backend_widget,
491 if (type != GL_MERGE_NONE) {
492 g_signal_connect_swapped (G_OBJECT(field_ws->backend_widget),
494 G_CALLBACK(field_ws_changed_cb),
495 G_OBJECT (field_ws));
498 if (GTK_WIDGET_VISIBLE (field_ws)) {
499 gtk_widget_show_all (field_ws->backend_widget);
501 /* Emit our "changed" signal */
502 g_signal_emit (G_OBJECT (field_ws),
503 merge_ui_field_ws_signals[CHANGED], 0);
505 gl_debug (DEBUG_MERGE, "END");
508 /*****************************************************************************/
509 /* Set field definitions (associate ids with raw fields). */
510 /*****************************************************************************/
512 gl_merge_ui_field_ws_set_field_defs (glMergeUIFieldWS * field_ws,
517 gl_debug (DEBUG_MERGE, "START");
519 type = field_ws->type;
521 if (type != GL_MERGE_NONE) {
523 (func[type].field_ws_set_field_defs) (field_ws->backend_widget,
526 /* Emit our "changed" signal */
527 g_signal_emit (G_OBJECT (field_ws),
528 merge_ui_field_ws_signals[CHANGED], 0);
532 gl_debug (DEBUG_MERGE, "END");
535 /*****************************************************************************/
536 /* Get field definitions (associate ids with raw fields). */
537 /*****************************************************************************/
539 gl_merge_ui_field_ws_get_field_defs (glMergeUIFieldWS * field_ws)
543 gl_debug (DEBUG_MERGE, "");
545 type = field_ws->type;
547 if (type != GL_MERGE_NONE) {
549 return (func[type].field_ws_get_field_defs) (field_ws->