2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * merge_ui_text.c: text-file document merge user interface backend 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
24 #include "merge-ui-text.h"
25 #include "merge-text.h"
30 /*===========================================*/
32 /*===========================================*/
44 /*===========================================*/
46 /*===========================================*/
48 static GtkContainerClass *parent_class;
50 static gint merge_ui_text_src_signals[LAST_SIGNAL] = { 0 };
51 static gint merge_ui_text_field_ws_signals[LAST_SIGNAL] = { 0 };
53 /*===========================================*/
54 /* Local function prototypes */
55 /*===========================================*/
57 static void gl_merge_ui_text_src_class_init (glMergeUITextSrcClass * class);
58 static void gl_merge_ui_text_src_instance_init (glMergeUITextSrc * src);
59 static void gl_merge_ui_text_src_finalize (GObject * object);
60 static void gl_merge_ui_text_src_construct (glMergeUITextSrc * src,
63 static void src_changed_cb (glMergeUITextSrc * src);
65 static void gl_merge_ui_text_field_ws_class_init (glMergeUITextFieldWSClass * class);
66 static void gl_merge_ui_text_field_ws_instance_init (glMergeUITextFieldWS * field_ws);
67 static void gl_merge_ui_text_field_ws_finalize (GObject * object);
68 static void gl_merge_ui_text_field_ws_construct (glMergeUITextFieldWS * field_ws,
72 static void field_ws_changed_cb (glMergeUITextFieldWS * field_ws);
74 /*****************************************************************************/
75 /* Boilerplate Object stuff. */
76 /*****************************************************************************/
78 gl_merge_ui_text_src_get_type (void)
80 static guint merge_ui_text_src_type = 0;
82 if (!merge_ui_text_src_type) {
83 GTypeInfo merge_ui_text_src_info = {
84 sizeof (glMergeUITextSrcClass),
87 (GClassInitFunc) gl_merge_ui_text_src_class_init,
90 sizeof (glMergeUITextSrc),
92 (GInstanceInitFunc) gl_merge_ui_text_src_instance_init,
95 merge_ui_text_src_type =
96 g_type_register_static (gtk_vbox_get_type (),
98 &merge_ui_text_src_info, 0);
101 return merge_ui_text_src_type;
105 gl_merge_ui_text_src_class_init (glMergeUITextSrcClass * class)
107 GObjectClass *object_class;
109 object_class = (GObjectClass *) class;
111 parent_class = gtk_type_class (gtk_vbox_get_type ());
113 object_class->finalize = gl_merge_ui_text_src_finalize;
115 merge_ui_text_src_signals[CHANGED] =
116 g_signal_new ("changed",
117 G_OBJECT_CLASS_TYPE(object_class),
119 G_STRUCT_OFFSET (glMergeUITextSrcClass, changed),
121 gl_marshal_VOID__VOID,
126 gl_merge_ui_text_src_instance_init (glMergeUITextSrc * src)
128 src->type = GL_MERGE_NONE;
133 gl_merge_ui_text_src_finalize (GObject * object)
135 glMergeUITextSrc *src;
136 glMergeUITextSrcClass *class;
138 g_return_if_fail (object != NULL);
139 g_return_if_fail (GL_IS_MERGE_UI_TEXT_SRC (object));
141 src = GL_MERGE_UI_TEXT_SRC (object);
143 G_OBJECT_CLASS (parent_class)->finalize (object);
147 gl_merge_ui_text_src_new (glMergeType type)
149 glMergeUITextSrc *src;
151 src = g_object_new (gl_merge_ui_text_src_get_type (), NULL);
153 gl_merge_ui_text_src_construct (src, type);
155 return GTK_WIDGET (src);
158 /*---------------------------------------------------------------------------*/
159 /* PRIVATE. Construct composite widget. */
160 /*---------------------------------------------------------------------------*/
162 gl_merge_ui_text_src_construct (glMergeUITextSrc * src,
165 GtkWidget *wvbox, *wentry;
167 wvbox = GTK_WIDGET (src);
172 gnome_file_entry_new (NULL, _("Select merge-database source"));
173 gtk_box_pack_start (GTK_BOX (wvbox), src->entry, TRUE, TRUE, 0);
175 wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (src->entry));
176 g_signal_connect_swapped (G_OBJECT (wentry), "changed",
177 G_CALLBACK (src_changed_cb),
181 /*--------------------------------------------------------------------------*/
182 /* PRIVATE. Callback for when our backend widget has changed. */
183 /*--------------------------------------------------------------------------*/
185 src_changed_cb (glMergeUITextSrc * src)
187 /* Emit our "changed" signal */
188 g_signal_emit (G_OBJECT (src), merge_ui_text_src_signals[CHANGED], 0);
191 /*****************************************************************************/
193 /*****************************************************************************/
195 gl_merge_ui_text_src_set_value (glMergeUITextSrc * src,
200 wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (src->entry));
202 gtk_entry_set_text (GTK_ENTRY (wentry), text);
205 /*****************************************************************************/
207 /*****************************************************************************/
209 gl_merge_ui_text_src_get_value (glMergeUITextSrc * src)
211 return gnome_file_entry_get_full_path (GNOME_FILE_ENTRY (src->entry),
215 /*****************************************************************************/
216 /* Boilerplate Object stuff. */
217 /*****************************************************************************/
219 gl_merge_ui_text_field_ws_get_type (void)
221 static guint merge_ui_text_field_ws_type = 0;
223 if (!merge_ui_text_field_ws_type) {
224 GTypeInfo merge_ui_text_field_ws_info = {
225 sizeof (glMergeUITextFieldWSClass),
228 (GClassInitFunc) gl_merge_ui_text_field_ws_class_init,
231 sizeof (glMergeUITextFieldWS),
233 (GInstanceInitFunc) gl_merge_ui_text_field_ws_instance_init,
236 merge_ui_text_field_ws_type =
237 g_type_register_static (gtk_hbox_get_type (),
238 "glMergeUITextFieldWS",
239 &merge_ui_text_field_ws_info, 0);
242 return merge_ui_text_field_ws_type;
246 gl_merge_ui_text_field_ws_class_init (glMergeUITextFieldWSClass * class)
248 GObjectClass *object_class;
250 object_class = (GObjectClass *) class;
252 parent_class = gtk_type_class (gtk_hbox_get_type ());
254 object_class->finalize = gl_merge_ui_text_field_ws_finalize;
256 merge_ui_text_field_ws_signals[CHANGED] =
257 g_signal_new ("changed",
258 G_OBJECT_CLASS_TYPE(object_class),
260 G_STRUCT_OFFSET (glMergeUITextFieldWSClass, changed),
262 gl_marshal_VOID__VOID,
267 gl_merge_ui_text_field_ws_instance_init (glMergeUITextFieldWS * field_ws)
269 field_ws->type = GL_MERGE_NONE;
270 field_ws->entry_list = NULL;
274 gl_merge_ui_text_field_ws_finalize (GObject * object)
276 glMergeUITextFieldWS *field_ws;
277 glMergeUITextFieldWSClass *class;
279 g_return_if_fail (object != NULL);
280 g_return_if_fail (GL_IS_MERGE_UI_TEXT_FIELD_WS (object));
282 field_ws = GL_MERGE_UI_TEXT_FIELD_WS (object);
284 G_OBJECT_CLASS (parent_class)->finalize (object);
288 gl_merge_ui_text_field_ws_new (glMergeType type,
291 glMergeUITextFieldWS *field_ws;
293 field_ws = g_object_new (gl_merge_ui_text_field_ws_get_type (), NULL);
295 gl_merge_ui_text_field_ws_construct (field_ws, type, src);
297 return GTK_WIDGET (field_ws);
300 /*--------------------------------------------------------------------------*/
301 /* PRIVATE. Construct composite widget. */
302 /*--------------------------------------------------------------------------*/
304 gl_merge_ui_text_field_ws_construct (glMergeUITextFieldWS * field_ws,
308 GtkWidget *whbox, *wtable, *wlabel, *whline, *wentry;
310 glMergeRawField *sample_field;
311 GList *sample_field_list=NULL, *p;
313 EntryNode *entry_node;
315 field_ws->type = type;
316 field_ws->entry_list = NULL;
318 mp = gl_merge_open( type, NULL, src );
319 sample_field_list = gl_merge_get_raw_record (mp);
321 n_fields = g_list_length( sample_field_list );
323 whbox = GTK_WIDGET (field_ws);
325 wtable = gtk_table_new (n_fields + 2, 3, FALSE);
326 gtk_table_set_col_spacings (GTK_TABLE (wtable), 20);
327 gtk_table_set_row_spacings (GTK_TABLE (wtable), 10);
328 gtk_box_pack_start (GTK_BOX (whbox), wtable, FALSE, FALSE, GNOME_PAD);
330 wlabel = gtk_label_new (_("Column"));
331 gtk_misc_set_alignment (GTK_MISC (wlabel), 1, 0.5);
332 gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 0, 1, 0, 1);
334 wlabel = gtk_label_new (_("Custom field key"));
335 gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
336 gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 1, 2, 0, 1);
338 wlabel = gtk_label_new (_("Sample data"));
339 gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
340 gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 2, 3, 0, 1);
342 whline = gtk_hseparator_new ();
343 gtk_table_attach_defaults (GTK_TABLE (wtable), whline, 0, 1, 1, 2);
344 whline = gtk_hseparator_new ();
345 gtk_table_attach_defaults (GTK_TABLE (wtable), whline, 1, 2, 1, 2);
346 whline = gtk_hseparator_new ();
347 gtk_table_attach_defaults (GTK_TABLE (wtable), whline, 2, 3, 1, 2);
349 for (p = sample_field_list, i = 0; p != NULL; p = p->next, i++) {
350 sample_field = p->data;
352 wlabel = gtk_label_new (sample_field->loc);
353 gtk_misc_set_alignment (GTK_MISC (wlabel), 1, 0.5);
354 gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel,
357 wentry = gtk_entry_new ();
358 gtk_entry_set_text (GTK_ENTRY (wentry), sample_field->loc);
359 gtk_widget_set_usize (wentry, 100, 0);
360 gtk_table_attach_defaults (GTK_TABLE (wtable), wentry,
363 g_signal_connect_swapped (G_OBJECT (wentry), "changed",
364 G_CALLBACK(field_ws_changed_cb),
365 G_OBJECT (field_ws));
367 wlabel = gtk_label_new (sample_field->value);
368 gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
369 gtk_label_set_justify (GTK_LABEL(wlabel), GTK_JUSTIFY_LEFT);
370 gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel,
373 entry_node = g_new0 (EntryNode, 1);
374 entry_node->loc = g_strdup (sample_field->loc);
375 entry_node->entry = wentry;
376 field_ws->entry_list =
377 g_list_append (field_ws->entry_list, entry_node);
381 gl_merge_free_raw_record (&sample_field_list);
385 /*****************************************************************************/
386 /* Set field definitions. (associate key with locator) */
387 /*****************************************************************************/
389 gl_merge_ui_text_field_ws_set_field_defs (glMergeUITextFieldWS * field_ws,
392 GList *p_entry, *p_defs;
394 glMergeFieldDefinition *def;
396 for (p_entry = field_ws->entry_list; p_entry != NULL;
397 p_entry = p_entry->next) {
398 entry = (EntryNode *) p_entry->data;
400 for (p_defs = field_defs; p_defs != NULL; p_defs = p_defs->next) {
401 def = (glMergeFieldDefinition *) p_defs->data;
403 if (strcmp (entry->loc, def->loc) == 0) {
404 gtk_entry_set_text (GTK_ENTRY (entry->entry),
412 /*****************************************************************************/
413 /* Get field definitions. (associate key with locator) */
414 /*****************************************************************************/
416 gl_merge_ui_text_field_ws_get_field_defs (glMergeUITextFieldWS * field_ws)
418 GList *p_entry, *defs_list = NULL;
420 glMergeFieldDefinition *def;
422 for (p_entry = field_ws->entry_list; p_entry != NULL;
423 p_entry = p_entry->next) {
424 entry = (EntryNode *) p_entry->data;
426 def = g_new0 (glMergeFieldDefinition, 1);
428 def->loc = g_strdup (entry->loc);
430 gtk_editable_get_chars (GTK_EDITABLE (entry->entry), 0, -1);
432 defs_list = g_list_append (defs_list, def);
439 /*--------------------------------------------------------------------------*/
440 /* PRIVATE. Callback for when our backend widget has changed. */
441 /*--------------------------------------------------------------------------*/
443 field_ws_changed_cb (glMergeUITextFieldWS * field_ws)
445 /* Emit our "changed" signal */
446 g_signal_emit (G_OBJECT (field_ws),
447 merge_ui_text_field_ws_signals[CHANGED], 0);