]> git.sur5r.net Git - glabels/blob - glabels2/src/merge-properties.c
Initial revision
[glabels] / glabels2 / src / merge-properties.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  merge_properties.c:  document merge properties dialog module
5  *
6  *  Copyright (C) 2001  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 "glabels.h"
25 #include "mdi.h"
26 #include "view.h"
27 #include "merge.h"
28 #include "merge-ui.h"
29 #include "merge-properties.h"
30
31 #include "debug.h"
32
33 /*===========================================*/
34 /* Private data types                        */
35 /*===========================================*/
36
37 typedef struct {
38         GtkWidget *dialog;
39
40         glView *view;
41         glLabel *label;
42
43         GtkWidget *type_entry;
44         GtkWidget *src_entry;
45         GtkWidget *field_ws;
46
47         glMergeType src_type;
48         gchar *field_ws_src;
49
50 } PropertyDialogPassback;
51
52 /*===========================================*/
53 /* Private globals                           */
54 /*===========================================*/
55
56 /*===========================================*/
57 /* Local function prototypes                 */
58 /*===========================================*/
59
60 static void create_merge_dialog_widgets (GtkDialog * dialog,
61                                          PropertyDialogPassback * data);
62
63 static void type_changed_cb (GtkWidget * widget, PropertyDialogPassback * data);
64 static void src_changed_cb (GtkWidget * widget, PropertyDialogPassback * data);
65
66 static void response_cb (GtkDialog * dialog, gint response,
67                          PropertyDialogPassback * data);
68 \f
69 /****************************************************************************/
70 /* Launch merge properties dialog.                                          */
71 /****************************************************************************/
72 void
73 gl_merge_properties_dialog (glView * view)
74 {
75         static PropertyDialogPassback *data = NULL;
76         GtkWidget *dialog;
77         BonoboWindow *win = glabels_get_active_window ();
78
79         if (data == NULL) {
80                 data = g_new0 (PropertyDialogPassback, 1);
81         }
82
83         dialog = gtk_dialog_new_with_buttons (
84                                    _("Edit document-merge properties"),
85                                    GTK_WINDOW (win),
86                                    GTK_DIALOG_DESTROY_WITH_PARENT,
87                                    GTK_STOCK_OK, GTK_RESPONSE_OK,
88                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
89                                    NULL);
90
91         data->dialog = dialog;
92         data->view = view;
93         data->label = view->label;
94
95         data->type_entry = NULL;
96         data->src_entry = NULL;
97         data->field_ws = NULL;
98
99         create_merge_dialog_widgets (GTK_DIALOG (dialog), data);
100
101         g_signal_connect (G_OBJECT(dialog), "response",
102                           G_CALLBACK(response_cb), data);
103
104         gtk_widget_show_all (GTK_WIDGET (dialog));
105
106 }
107
108 /*--------------------------------------------------------------------------*/
109 /* PRIVATE.  Create and add start page to druid.                            */
110 /*--------------------------------------------------------------------------*/
111 static void
112 create_merge_dialog_widgets (GtkDialog * dialog,
113                              PropertyDialogPassback * data)
114 {
115         GtkWidget *wvbox, *wframe, *whbox, *wtable, *wlabel, *wcombo, *wscroll;
116         GList *texts;
117         glMerge *merge;
118         glMergeType type;
119         gchar *src;
120         GList *fields;
121
122         merge = gl_label_get_merge (data->label);
123         type = merge->type;
124         src  = merge->src;
125         fields = merge->field_defs;
126         gl_merge_free (&merge);
127
128         wvbox = dialog->vbox;
129
130         wframe = gtk_frame_new (_("Source"));
131         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
132
133         whbox = gtk_hbox_new (FALSE, GNOME_PAD);
134         gtk_container_add (GTK_CONTAINER (wframe), whbox);
135
136         wtable = gtk_table_new (2, 2, FALSE);
137         gtk_container_set_border_width (GTK_CONTAINER (wtable), 10);
138         gtk_table_set_row_spacings (GTK_TABLE (wtable), 5);
139         gtk_table_set_col_spacings (GTK_TABLE (wtable), 5);
140         gtk_box_pack_start (GTK_BOX (whbox), wtable, FALSE, FALSE, GNOME_PAD);
141
142         wlabel = gtk_label_new (_("Format:"));
143         gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
144         gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 0, 1, 0, 1);
145
146         wcombo = gtk_combo_new ();
147         gtk_widget_set_usize (wcombo, 400, -1);
148         texts = gl_merge_get_long_texts_list ();
149         gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), texts);
150         gl_merge_free_long_texts_list (&texts);
151         data->type_entry = GTK_COMBO (wcombo)->entry;
152         gtk_entry_set_editable (GTK_ENTRY (data->type_entry), FALSE);
153         gtk_table_attach_defaults (GTK_TABLE (wtable), wcombo, 1, 2, 0, 1);
154         gtk_entry_set_text (GTK_ENTRY (data->type_entry),
155                             gl_merge_type_to_long_text (type));
156
157         wlabel = gtk_label_new (_("Location:"));
158         gtk_misc_set_alignment (GTK_MISC (wlabel), 0, 0.5);
159         gtk_table_attach_defaults (GTK_TABLE (wtable), wlabel, 0, 1, 1, 2);
160
161         data->src_entry = gl_merge_ui_src_new ();
162         gtk_table_attach_defaults (GTK_TABLE (wtable), data->src_entry, 1, 2, 1,
163                                    2);
164         gl_merge_ui_src_set_type (GL_MERGE_UI_SRC (data->src_entry), type);
165         gl_merge_ui_src_set_value (GL_MERGE_UI_SRC (data->src_entry), src);
166
167         wframe = gtk_frame_new (_("Fields"));
168         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
169
170         wscroll = gtk_scrolled_window_new (NULL, NULL);
171         gtk_container_set_border_width (GTK_CONTAINER (wscroll), 5);
172         gtk_widget_set_usize (wscroll, 500, 300);
173         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
174                                         GTK_POLICY_AUTOMATIC,
175                                         GTK_POLICY_AUTOMATIC);
176         gtk_container_add (GTK_CONTAINER (wframe), wscroll);
177
178         data->field_ws = gl_merge_ui_field_ws_new ();
179         gtk_container_set_border_width (GTK_CONTAINER (data->field_ws), 10);
180         gl_merge_ui_field_ws_set_type_src (GL_MERGE_UI_FIELD_WS
181                                            (data->field_ws), type, src);
182         gl_merge_ui_field_ws_set_field_defs (GL_MERGE_UI_FIELD_WS
183                                              (data->field_ws), fields);
184         gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (wscroll),
185                                                data->field_ws);
186
187         g_signal_connect (G_OBJECT (data->type_entry), "changed",
188                           G_CALLBACK (type_changed_cb), data);
189         g_signal_connect (G_OBJECT (data->src_entry), "changed",
190                           G_CALLBACK (src_changed_cb), data);
191
192 }
193
194 /*--------------------------------------------------------------------------*/
195 /* PRIVATE.  type "changed" callback.                                       */
196 /*--------------------------------------------------------------------------*/
197 static void
198 type_changed_cb (GtkWidget * widget,
199                  PropertyDialogPassback * data)
200 {
201         glMergeType type;
202         gchar *type_text;
203
204         type_text = gtk_editable_get_chars (GTK_EDITABLE (data->type_entry),
205                                             0, -1);
206         type = gl_merge_long_text_to_type (type_text);
207         g_free (type_text);
208
209         gl_merge_ui_src_set_type (GL_MERGE_UI_SRC (data->src_entry), type);
210 }
211
212 /*--------------------------------------------------------------------------*/
213 /* PRIVATE.  source "changed" callback.                                     */
214 /*--------------------------------------------------------------------------*/
215 static void
216 src_changed_cb (GtkWidget * widget,
217                 PropertyDialogPassback * data)
218 {
219         glMergeType type;
220         gchar *type_text, *src;
221
222         type_text = gtk_editable_get_chars (GTK_EDITABLE (data->type_entry),
223                                             0, -1);
224         type = gl_merge_long_text_to_type (type_text);
225         g_free (type_text);
226
227         src = gl_merge_ui_src_get_value (GL_MERGE_UI_SRC (data->src_entry));
228         gl_merge_ui_field_ws_set_type_src (GL_MERGE_UI_FIELD_WS
229                                            (data->field_ws), type, src);
230 }
231
232 /*--------------------------------------------------------------------------*/
233 /* PRIVATE.  response callback.                                             */
234 /*--------------------------------------------------------------------------*/
235 static void
236 response_cb (GtkDialog * dialog,
237              gint response,
238              PropertyDialogPassback * data)
239 {
240         gchar *type_text;
241         glMerge *merge;
242
243         switch (response) {
244
245         case GTK_RESPONSE_OK:
246
247                 merge = gl_merge_new();
248
249                 type_text =
250                        gtk_editable_get_chars (GTK_EDITABLE (data->type_entry),
251                                                     0, -1);
252                 merge->type = gl_merge_long_text_to_type (type_text);
253                 g_free (type_text);
254
255                 merge->src =
256                         gl_merge_ui_src_get_value (GL_MERGE_UI_SRC (data->src_entry));
257
258                 merge->field_defs =
259                         gl_merge_ui_field_ws_get_field_defs (GL_MERGE_UI_FIELD_WS
260                                                              (data->field_ws));
261
262                 gl_label_set_merge (data->label, merge);
263
264                 gl_merge_free (&merge);
265
266                 break;
267         }
268
269         gtk_widget_destroy (data->dialog);
270 }