]> git.sur5r.net Git - glabels/blob - glabels2/src/merge-ui-text.c
Initial revision
[glabels] / glabels2 / src / merge-ui-text.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  merge_ui_text.c:  text-file document merge user interface backend module
5  *
6  *  Copyright (C) 2002  Jim Evins <evins@snaught.com>.
7  *
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.
12  *
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.
17  *
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
21  */
22 #include <config.h>
23
24 #include "merge-ui-text.h"
25 #include "merge-text.h"
26 #include "marshal.h"
27
28 #include "debug.h"
29
30 /*===========================================*/
31 /* Private types                             */
32 /*===========================================*/
33
34 enum {
35         CHANGED,
36         LAST_SIGNAL
37 };
38
39 typedef struct {
40         gchar *loc;
41         GtkWidget *entry;
42 } EntryNode;
43
44 /*===========================================*/
45 /* Private globals                           */
46 /*===========================================*/
47
48 static GtkContainerClass *parent_class;
49
50 static gint merge_ui_text_src_signals[LAST_SIGNAL] = { 0 };
51 static gint merge_ui_text_field_ws_signals[LAST_SIGNAL] = { 0 };
52
53 /*===========================================*/
54 /* Local function prototypes                 */
55 /*===========================================*/
56
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,
61                                             glMergeType type);
62
63 static void src_changed_cb (glMergeUITextSrc * src);
64
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,
69                                                  glMergeType type,
70                                                  gchar * src);
71
72 static void field_ws_changed_cb (glMergeUITextFieldWS * field_ws);
73 \f
74 /*****************************************************************************/
75 /* Boilerplate Object stuff.                                                 */
76 /*****************************************************************************/
77 guint
78 gl_merge_ui_text_src_get_type (void)
79 {
80         static guint merge_ui_text_src_type = 0;
81
82         if (!merge_ui_text_src_type) {
83                 GTypeInfo merge_ui_text_src_info = {
84                         sizeof (glMergeUITextSrcClass),
85                         NULL,
86                         NULL,
87                         (GClassInitFunc) gl_merge_ui_text_src_class_init,
88                         NULL,
89                         NULL,
90                         sizeof (glMergeUITextSrc),
91                         0,
92                         (GInstanceInitFunc) gl_merge_ui_text_src_instance_init,
93                 };
94
95                 merge_ui_text_src_type =
96                         g_type_register_static (gtk_vbox_get_type (),
97                                                 "glMergeUITextSrc",
98                                                 &merge_ui_text_src_info, 0);
99         }
100
101         return merge_ui_text_src_type;
102 }
103
104 static void
105 gl_merge_ui_text_src_class_init (glMergeUITextSrcClass * class)
106 {
107         GObjectClass *object_class;
108
109         object_class = (GObjectClass *) class;
110
111         parent_class = gtk_type_class (gtk_vbox_get_type ());
112
113         object_class->finalize = gl_merge_ui_text_src_finalize;
114
115         merge_ui_text_src_signals[CHANGED] =
116             g_signal_new ("changed",
117                           G_OBJECT_CLASS_TYPE(object_class),
118                           G_SIGNAL_RUN_LAST,
119                           G_STRUCT_OFFSET (glMergeUITextSrcClass, changed),
120                           NULL, NULL,
121                           gl_marshal_VOID__VOID,
122                           G_TYPE_NONE, 0);
123 }
124
125 static void
126 gl_merge_ui_text_src_instance_init (glMergeUITextSrc * src)
127 {
128         src->type = GL_MERGE_NONE;
129         src->entry = NULL;
130 }
131
132 static void
133 gl_merge_ui_text_src_finalize (GObject * object)
134 {
135         glMergeUITextSrc *src;
136         glMergeUITextSrcClass *class;
137
138         g_return_if_fail (object != NULL);
139         g_return_if_fail (GL_IS_MERGE_UI_TEXT_SRC (object));
140
141         src = GL_MERGE_UI_TEXT_SRC (object);
142
143         G_OBJECT_CLASS (parent_class)->finalize (object);
144 }
145
146 GtkWidget *
147 gl_merge_ui_text_src_new (glMergeType type)
148 {
149         glMergeUITextSrc *src;
150
151         src = g_object_new (gl_merge_ui_text_src_get_type (), NULL);
152
153         gl_merge_ui_text_src_construct (src, type);
154
155         return GTK_WIDGET (src);
156 }
157
158 /*---------------------------------------------------------------------------*/
159 /* PRIVATE.  Construct composite widget.                                     */
160 /*---------------------------------------------------------------------------*/
161 static void
162 gl_merge_ui_text_src_construct (glMergeUITextSrc * src,
163                                 glMergeType type)
164 {
165         GtkWidget *wvbox, *wentry;
166
167         wvbox = GTK_WIDGET (src);
168
169         src->type = type;
170
171         src->entry =
172             gnome_file_entry_new (NULL, _("Select merge-database source"));
173         gtk_box_pack_start (GTK_BOX (wvbox), src->entry, TRUE, TRUE, 0);
174
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),
178                                   G_OBJECT (src));
179 }
180
181 /*--------------------------------------------------------------------------*/
182 /* PRIVATE.  Callback for when our backend widget has changed.              */
183 /*--------------------------------------------------------------------------*/
184 static void
185 src_changed_cb (glMergeUITextSrc * src)
186 {
187         /* Emit our "changed" signal */
188         g_signal_emit (G_OBJECT (src), merge_ui_text_src_signals[CHANGED], 0);
189 }
190
191 /*****************************************************************************/
192 /* Set src name.                                                             */
193 /*****************************************************************************/
194 void
195 gl_merge_ui_text_src_set_value (glMergeUITextSrc * src,
196                                 gchar * text)
197 {
198         GtkWidget *wentry;
199
200         wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (src->entry));
201
202         gtk_entry_set_text (GTK_ENTRY (wentry), text);
203 }
204
205 /*****************************************************************************/
206 /* Get src name.                                                             */
207 /*****************************************************************************/
208 gchar *
209 gl_merge_ui_text_src_get_value (glMergeUITextSrc * src)
210 {
211         return gnome_file_entry_get_full_path (GNOME_FILE_ENTRY (src->entry),
212                                                TRUE);
213 }
214
215 /*****************************************************************************/
216 /* Boilerplate Object stuff.                                                 */
217 /*****************************************************************************/
218 guint
219 gl_merge_ui_text_field_ws_get_type (void)
220 {
221         static guint merge_ui_text_field_ws_type = 0;
222
223         if (!merge_ui_text_field_ws_type) {
224                 GTypeInfo merge_ui_text_field_ws_info = {
225                         sizeof (glMergeUITextFieldWSClass),
226                         NULL,
227                         NULL,
228                         (GClassInitFunc) gl_merge_ui_text_field_ws_class_init,
229                         NULL,
230                         NULL,
231                         sizeof (glMergeUITextFieldWS),
232                         0,
233                         (GInstanceInitFunc) gl_merge_ui_text_field_ws_instance_init,
234                 };
235
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);
240         }
241
242         return merge_ui_text_field_ws_type;
243 }
244
245 static void
246 gl_merge_ui_text_field_ws_class_init (glMergeUITextFieldWSClass * class)
247 {
248         GObjectClass *object_class;
249
250         object_class = (GObjectClass *) class;
251
252         parent_class = gtk_type_class (gtk_hbox_get_type ());
253
254         object_class->finalize = gl_merge_ui_text_field_ws_finalize;
255
256         merge_ui_text_field_ws_signals[CHANGED] =
257             g_signal_new ("changed",
258                           G_OBJECT_CLASS_TYPE(object_class),
259                           G_SIGNAL_RUN_LAST,
260                           G_STRUCT_OFFSET (glMergeUITextFieldWSClass, changed),
261                           NULL, NULL,
262                           gl_marshal_VOID__VOID,
263                           G_TYPE_NONE, 0);
264 }
265
266 static void
267 gl_merge_ui_text_field_ws_instance_init (glMergeUITextFieldWS * field_ws)
268 {
269         field_ws->type = GL_MERGE_NONE;
270         field_ws->entry_list = NULL;
271 }
272
273 static void
274 gl_merge_ui_text_field_ws_finalize (GObject * object)
275 {
276         glMergeUITextFieldWS *field_ws;
277         glMergeUITextFieldWSClass *class;
278
279         g_return_if_fail (object != NULL);
280         g_return_if_fail (GL_IS_MERGE_UI_TEXT_FIELD_WS (object));
281
282         field_ws = GL_MERGE_UI_TEXT_FIELD_WS (object);
283
284         G_OBJECT_CLASS (parent_class)->finalize (object);
285 }
286
287 GtkWidget *
288 gl_merge_ui_text_field_ws_new (glMergeType type,
289                                gchar * src)
290 {
291         glMergeUITextFieldWS *field_ws;
292
293         field_ws = g_object_new (gl_merge_ui_text_field_ws_get_type (), NULL);
294
295         gl_merge_ui_text_field_ws_construct (field_ws, type, src);
296
297         return GTK_WIDGET (field_ws);
298 }
299
300 /*--------------------------------------------------------------------------*/
301 /* PRIVATE.  Construct composite widget.                                    */
302 /*--------------------------------------------------------------------------*/
303 static void
304 gl_merge_ui_text_field_ws_construct (glMergeUITextFieldWS * field_ws,
305                                      glMergeType type,
306                                      gchar * src)
307 {
308         GtkWidget *whbox, *wtable, *wlabel, *whline, *wentry;
309         glMergeInput *mp;
310         glMergeRawField *sample_field;
311         GList *sample_field_list=NULL, *p;
312         gint n_fields, i;
313         EntryNode *entry_node;
314
315         field_ws->type = type;
316         field_ws->entry_list = NULL;
317
318         mp = gl_merge_open( type, NULL, src );
319         sample_field_list = gl_merge_get_raw_record (mp);
320         gl_merge_close(mp);
321         n_fields = g_list_length( sample_field_list );
322
323         whbox = GTK_WIDGET (field_ws);
324
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);
329
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);
333
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);
337
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);
341
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);
348
349         for (p = sample_field_list, i = 0; p != NULL; p = p->next, i++) {
350                 sample_field = p->data;
351
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,
355                                            0, 1, i + 2, i + 3);
356
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,
361                                            1, 2, i + 2, i + 3);
362
363                 g_signal_connect_swapped (G_OBJECT (wentry), "changed",
364                                           G_CALLBACK(field_ws_changed_cb),
365                                           G_OBJECT (field_ws));
366
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,
371                                            2, 3, i + 2, i + 3);
372
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);
378
379         }
380
381         gl_merge_free_raw_record (&sample_field_list);
382
383 }
384
385 /*****************************************************************************/
386 /* Set field definitions.  (associate key with locator)                      */
387 /*****************************************************************************/
388 void
389 gl_merge_ui_text_field_ws_set_field_defs (glMergeUITextFieldWS * field_ws,
390                                           GList * field_defs)
391 {
392         GList *p_entry, *p_defs;
393         EntryNode *entry;
394         glMergeFieldDefinition *def;
395
396         for (p_entry = field_ws->entry_list; p_entry != NULL;
397              p_entry = p_entry->next) {
398                 entry = (EntryNode *) p_entry->data;
399
400                 for (p_defs = field_defs; p_defs != NULL; p_defs = p_defs->next) {
401                         def = (glMergeFieldDefinition *) p_defs->data;
402
403                         if (strcmp (entry->loc, def->loc) == 0) {
404                                 gtk_entry_set_text (GTK_ENTRY (entry->entry),
405                                                     def->key);
406                         }
407                 }
408         }
409
410 }
411
412 /*****************************************************************************/
413 /* Get field definitions.  (associate key with locator)                      */
414 /*****************************************************************************/
415 GList *
416 gl_merge_ui_text_field_ws_get_field_defs (glMergeUITextFieldWS * field_ws)
417 {
418         GList *p_entry, *defs_list = NULL;
419         EntryNode *entry;
420         glMergeFieldDefinition *def;
421
422         for (p_entry = field_ws->entry_list; p_entry != NULL;
423              p_entry = p_entry->next) {
424                 entry = (EntryNode *) p_entry->data;
425
426                 def = g_new0 (glMergeFieldDefinition, 1);
427
428                 def->loc = g_strdup (entry->loc);
429                 def->key =
430                     gtk_editable_get_chars (GTK_EDITABLE (entry->entry), 0, -1);
431
432                 defs_list = g_list_append (defs_list, def);
433
434         }
435
436         return defs_list;
437 }
438
439 /*--------------------------------------------------------------------------*/
440 /* PRIVATE.  Callback for when our backend widget has changed.              */
441 /*--------------------------------------------------------------------------*/
442 static void
443 field_ws_changed_cb (glMergeUITextFieldWS * field_ws)
444 {
445         /* Emit our "changed" signal */
446         g_signal_emit (G_OBJECT (field_ws),
447                        merge_ui_text_field_ws_signals[CHANGED], 0);
448 }