]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
Removed all remnants of MDI/BONOBO-MDI. We now use an SDI application model.
[glabels] / glabels2 / src / prefs-dialog.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  prefs-dialog.c:  Preferences dialog module
5  *
6  *  Copyright (C) 2001-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 <libgnome/libgnome.h>
25 #include <libgnomeui/libgnomeui.h>
26
27 #include "prefs-dialog.h"
28 #include "prefs.h"
29 #include "wdgt-line.h"
30 #include "wdgt-fill.h"
31 #include "wdgt-text-props.h"
32 #include "debug.h"
33
34 /*========================================================*/
35 /* Private macros and constants.                          */
36 /*========================================================*/
37
38 #define US_LETTER "US Letter"
39 #define A4        "A4"
40
41 /*========================================================*/
42 /* Private types.                                         */
43 /*========================================================*/
44
45 struct _glPrefsDialogPrivate
46 {
47         GtkWidget* categories_tree;
48
49         GtkWidget* notebook;
50
51         GtkTreeModel *categories_tree_model;
52
53         /* Units page */
54         GtkWidget       *units_points_radio;
55         GtkWidget       *units_inches_radio;
56         GtkWidget       *units_mm_radio;
57
58         /* Page size page */
59         GtkWidget       *page_size_us_letter_radio;
60         GtkWidget       *page_size_a4_radio;
61
62         /* Default text properties */
63         GtkWidget       *text;
64
65         /* Default line properties */
66         GtkWidget       *line;
67
68         /* Default fill properties */
69         GtkWidget       *fill;
70 };
71
72 /*========================================================*/
73 /* Private globals.                                       */
74 /*========================================================*/
75
76 static GtkDialogClass* parent_class = NULL;
77
78 /*========================================================*/
79 /* Private function prototypes.                           */
80 /*========================================================*/
81
82 static void gl_prefs_dialog_class_init  (glPrefsDialogClass *klass);
83 static void gl_prefs_dialog_init        (glPrefsDialog *dlg);
84 static void gl_prefs_dialog_finalize    (GObject *object);
85 static void gl_prefs_dialog_construct   (glPrefsDialog *dlg);
86
87 static void response_cb                 (glPrefsDialog *dialog,
88                                          gint response,
89                                          gpointer user_data);
90
91 static GtkWidget *locale_page (glPrefsDialog *dlg);
92 static GtkWidget *object_page (glPrefsDialog *dlg);
93
94 static update_locale_page_from_prefs (glPrefsDialog *dlg);
95 static update_object_page_from_prefs (glPrefsDialog *dlg);
96
97 static update_prefs_from_locale_page (glPrefsDialog *dlg);
98 static update_prefs_from_object_page (glPrefsDialog *dlg);
99
100 \f
101 /*****************************************************************************/
102 /* Boilerplate object stuff.                                                 */
103 /*****************************************************************************/
104 GType
105 gl_prefs_dialog_get_type (void)
106 {
107         static GType dialog_type = 0;
108
109         if (!dialog_type)
110         {
111                 static const GTypeInfo dialog_info =
112                 {
113                         sizeof (glPrefsDialogClass),
114                         NULL,           /* base_init */
115                         NULL,           /* base_finalize */
116                         (GClassInitFunc) gl_prefs_dialog_class_init,
117                         NULL,           /* class_finalize */
118                         NULL,           /* class_data */
119                         sizeof (glPrefsDialog),
120                         0,              /* n_preallocs */
121                         (GInstanceInitFunc) gl_prefs_dialog_init
122                 };
123
124                 dialog_type = g_type_register_static (GL_TYPE_HIG_DIALOG,
125                                                       "glPrefsDialog",
126                                                       &dialog_info, 
127                                                       0);
128         }
129
130         return dialog_type;
131 }
132
133 static void
134 gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
135 {
136         GObjectClass *object_class = G_OBJECT_CLASS (klass);
137
138         gl_debug (DEBUG_PREFS, "");
139         
140         parent_class = g_type_class_peek_parent (klass);
141
142         object_class->finalize = gl_prefs_dialog_finalize;      
143 }
144
145 static void
146 gl_prefs_dialog_init (glPrefsDialog *dlg)
147 {
148         gl_debug (DEBUG_PREFS, "");
149
150         dlg->private = g_new0 (glPrefsDialogPrivate, 1);
151 }
152
153 static void 
154 gl_prefs_dialog_finalize (GObject *object)
155 {
156         glPrefsDialog* dlg;
157         
158         gl_debug (DEBUG_PREFS, "");
159
160         g_return_if_fail (object != NULL);
161         
162         dlg = GL_PREFS_DIALOG (object);
163
164         g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
165         g_return_if_fail (dlg->private != NULL);
166
167         G_OBJECT_CLASS (parent_class)->finalize (object);
168
169         g_free (dlg->private);
170 }
171
172 /*****************************************************************************/
173 /* NEW preferences dialog.                                                   */
174 /*****************************************************************************/
175 GtkWidget*
176 gl_prefs_dialog_new (GtkWindow *parent)
177 {
178         GtkWidget *dlg;
179
180         gl_debug (DEBUG_PREFS, "");
181
182         dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
183
184         if (parent)
185                 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
186         
187         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
188
189         return dlg;
190 }
191
192 /*---------------------------------------------------------------------------*/
193 /* PRIVATE.  Construct composite widget.                                     */
194 /*---------------------------------------------------------------------------*/
195 static void
196 gl_prefs_dialog_construct (glPrefsDialog *dlg)
197 {
198         GtkWidget *notebook, *wlabel, *wvbox, *wvbox1, *whbox, *wframe;
199         GSList *radio_group = NULL;
200
201         g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
202         g_return_if_fail (dlg->private != NULL);
203
204         gtk_dialog_add_button (GTK_DIALOG(dlg),
205                                GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
206
207         gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
208
209         g_signal_connect(G_OBJECT (dlg), "response",
210                          G_CALLBACK (response_cb), NULL);
211
212         notebook = gtk_notebook_new ();
213         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
214
215         gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
216                                   locale_page (dlg),
217                                   gtk_label_new (_("Locale")));
218
219         gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
220                                   object_page (dlg),
221                                   gtk_label_new (_("Object defaults")));
222
223         update_locale_page_from_prefs (dlg);
224         update_object_page_from_prefs (dlg);
225
226         gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);   
227
228         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
229         gtk_window_set_title (GTK_WINDOW (dlg), _("Preferences"));
230         gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
231 }
232
233 /*---------------------------------------------------------------------------*/
234 /* PRIVATE.  "Response" callback.                                            */
235 /*---------------------------------------------------------------------------*/
236 static void
237 response_cb (glPrefsDialog *dlg,
238              gint          response,
239              gpointer      user_data)
240 {
241         gl_debug (DEBUG_VIEW, "START");
242
243         g_return_if_fail(dlg != NULL);
244         g_return_if_fail(GTK_IS_DIALOG(dlg));
245
246         switch(response) {
247         case GTK_RESPONSE_CLOSE:
248                 gtk_widget_hide (GTK_WIDGET(dlg));
249                 break;
250         default:
251                 g_assert_not_reached();
252         }
253
254         gl_debug (DEBUG_VIEW, "END");
255 }
256
257 /*--------------------------------------------------------------------------*/
258 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
259 /*--------------------------------------------------------------------------*/
260 static GtkWidget *
261 locale_page (glPrefsDialog *dlg)
262 {
263         GtkWidget *wlabel, *wvbox, *wframe;
264         GSList *radio_group = NULL;
265
266         wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
267
268         wlabel = gtk_label_new (_("Select locale specific behavior."));
269         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
270         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
271
272         /* ----- Display Units Frame ------------------------------------ */
273         wframe = gl_hig_category_new (_("Display units"));
274         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
275
276         radio_group = NULL;
277
278         dlg->private->units_points_radio =
279             gtk_radio_button_new_with_label (radio_group, _("Points"));
280         radio_group =
281                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
282         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
283                                     dlg->private->units_points_radio);
284
285         dlg->private->units_inches_radio =
286             gtk_radio_button_new_with_label (radio_group, _("Inches"));
287         radio_group =
288                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
289         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
290                                     dlg->private->units_inches_radio);
291
292         dlg->private->units_mm_radio =
293             gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
294         radio_group =
295                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
296         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
297                                     dlg->private->units_mm_radio);
298
299         /* ----- Page Size Frame ------------------------------------ */
300         wframe = gl_hig_category_new (_("Default page size"));
301         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
302
303         radio_group = NULL;
304
305         dlg->private->page_size_us_letter_radio =
306             gtk_radio_button_new_with_label (radio_group, US_LETTER);
307         radio_group =
308             gtk_radio_button_get_group (GTK_RADIO_BUTTON
309                                     (dlg->private->page_size_us_letter_radio));
310         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
311                                     dlg->private->page_size_us_letter_radio);
312
313         dlg->private->page_size_a4_radio =
314             gtk_radio_button_new_with_label (radio_group, A4);
315         radio_group =
316             gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
317         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
318                                     dlg->private->page_size_a4_radio);
319
320         g_signal_connect_swapped (
321                 G_OBJECT(dlg->private->units_points_radio),
322                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
323         g_signal_connect_swapped (
324                 G_OBJECT(dlg->private->units_inches_radio),
325                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
326         g_signal_connect_swapped (
327                 G_OBJECT(dlg->private->units_mm_radio),
328                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
329         g_signal_connect_swapped (
330                 G_OBJECT(dlg->private->page_size_us_letter_radio),
331                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
332         g_signal_connect_swapped (
333                 G_OBJECT(dlg->private->page_size_a4_radio),
334                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
335
336         return wvbox;
337 }
338
339 /*--------------------------------------------------------------------------*/
340 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
341 /*--------------------------------------------------------------------------*/
342 static GtkWidget *
343 object_page (glPrefsDialog *dlg)
344 {
345         GtkWidget *wlabel, *wvbox, *wframe;
346         GtkSizeGroup *label_size_group;
347
348         wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
349         label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
350
351         wlabel = gtk_label_new (_("Select default properties for new objects."));
352         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
353         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
354
355         /* ------ text props entry ------ */
356         wframe = gl_hig_category_new (_("Text"));
357         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
358         dlg->private->text = gl_wdgt_text_props_new ();
359         gl_wdgt_text_props_set_label_size_group (GL_WDGT_TEXT_PROPS(dlg->private->text),
360                                                  label_size_group);
361         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
362                                     dlg->private->text);
363
364         /* ------ Line box ------ */
365         wframe = gl_hig_category_new (_("Line"));
366         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
367         dlg->private->line = gl_wdgt_line_new ();
368         gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(dlg->private->line),
369                                            label_size_group);
370         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
371                                     dlg->private->line);
372
373         /* ------ Fill box ------ */
374         wframe = gl_hig_category_new (_("Fill"));
375         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
376         dlg->private->fill = gl_wdgt_fill_new ();
377         gl_wdgt_fill_set_label_size_group (GL_WDGT_FILL(dlg->private->fill),
378                                            label_size_group);
379         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
380                                     dlg->private->fill);
381
382         g_signal_connect_swapped (G_OBJECT(dlg->private->text),
383                                   "changed",
384                                   G_CALLBACK(update_prefs_from_object_page),
385                                   dlg);
386         g_signal_connect_swapped (G_OBJECT(dlg->private->line),
387                                   "changed",
388                                   G_CALLBACK(update_prefs_from_object_page),
389                                   dlg);
390         g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
391                                   "changed",
392                                   G_CALLBACK(update_prefs_from_object_page),
393                                   dlg);
394         return wvbox;
395 }
396
397
398 /*--------------------------------------------------------------------------*/
399 /* PRIVATE.  Update locale page widgets from current prefs.                 */
400 /*--------------------------------------------------------------------------*/
401 static update_locale_page_from_prefs (glPrefsDialog *dlg)
402 {
403         g_signal_handlers_block_by_func (
404                 G_OBJECT(dlg->private->units_points_radio),
405                 G_CALLBACK(update_prefs_from_locale_page), dlg);
406         g_signal_handlers_block_by_func (
407                 G_OBJECT(dlg->private->units_inches_radio),
408                 G_CALLBACK(update_prefs_from_locale_page), dlg);
409         g_signal_handlers_block_by_func (
410                 G_OBJECT(dlg->private->units_mm_radio),
411                 G_CALLBACK(update_prefs_from_locale_page), dlg);
412         g_signal_handlers_block_by_func (
413                 G_OBJECT(dlg->private->page_size_us_letter_radio),
414                 G_CALLBACK(update_prefs_from_locale_page), dlg);
415         g_signal_handlers_block_by_func (
416                 G_OBJECT(dlg->private->page_size_a4_radio),
417                 G_CALLBACK(update_prefs_from_locale_page), dlg);
418
419         switch (gl_prefs->units) {
420         case GL_PREFS_UNITS_PTS:
421                 gtk_toggle_button_set_active (
422                         GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
423                         TRUE);
424                 break;
425         case GL_PREFS_UNITS_INCHES:
426                 gtk_toggle_button_set_active (
427                         GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
428                         TRUE);
429                 break;
430         case GL_PREFS_UNITS_MM:
431                 gtk_toggle_button_set_active (
432                         GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
433                         TRUE);
434                 break;
435         default:
436                 g_warning ("Illegal units");    /* Should not happen */
437                 break;
438         }
439
440         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
441                 gtk_toggle_button_set_active (
442                         GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
443                         TRUE);
444         } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
445                 gtk_toggle_button_set_active (
446                         GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
447                         TRUE);
448         } else {
449                 g_warning ("Unknown default page size"); /* Shouldn't happen */
450         }
451
452         g_signal_handlers_unblock_by_func (
453                 G_OBJECT(dlg->private->units_points_radio),
454                 G_CALLBACK(update_prefs_from_locale_page), dlg);
455         g_signal_handlers_unblock_by_func (
456                 G_OBJECT(dlg->private->units_inches_radio),
457                 G_CALLBACK(update_prefs_from_locale_page), dlg);
458         g_signal_handlers_unblock_by_func (
459                 G_OBJECT(dlg->private->units_mm_radio),
460                 G_CALLBACK(update_prefs_from_locale_page), dlg);
461         g_signal_handlers_unblock_by_func (
462                 G_OBJECT(dlg->private->page_size_us_letter_radio),
463                 G_CALLBACK(update_prefs_from_locale_page), dlg);
464         g_signal_handlers_unblock_by_func (
465                 G_OBJECT(dlg->private->page_size_a4_radio),
466                 G_CALLBACK(update_prefs_from_locale_page), dlg);
467 }
468
469 /*--------------------------------------------------------------------------*/
470 /* PRIVATE.  Update object page widgets from current prefs.                 */
471 /*--------------------------------------------------------------------------*/
472 static update_object_page_from_prefs (glPrefsDialog *dlg)
473 {
474         g_signal_handlers_block_by_func (
475                 G_OBJECT(dlg->private->text),
476                 G_CALLBACK(update_prefs_from_object_page), dlg);
477         g_signal_handlers_block_by_func (
478                 G_OBJECT(dlg->private->line),
479                 G_CALLBACK(update_prefs_from_object_page), dlg);
480         g_signal_handlers_block_by_func (
481                 G_OBJECT(dlg->private->fill),
482                 G_CALLBACK(update_prefs_from_object_page), dlg);
483
484         gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
485                                        gl_prefs->default_font_family,
486                                        gl_prefs->default_font_size,
487                                        gl_prefs->default_font_weight,
488                                        gl_prefs->default_font_italic_flag,
489                                        gl_prefs->default_text_color,
490                                        gl_prefs->default_text_alignment);
491
492         gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
493                                  gl_prefs->default_line_width,
494                                  gl_prefs->default_line_color);
495
496         gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
497                                  gl_prefs->default_fill_color);
498
499         g_signal_handlers_unblock_by_func (
500                 G_OBJECT(dlg->private->text),
501                 G_CALLBACK(update_prefs_from_object_page), dlg);
502         g_signal_handlers_unblock_by_func (
503                 G_OBJECT(dlg->private->line),
504                 G_CALLBACK(update_prefs_from_object_page), dlg);
505         g_signal_handlers_unblock_by_func (
506                 G_OBJECT(dlg->private->fill),
507                 G_CALLBACK(update_prefs_from_object_page), dlg);
508 }
509
510 /*--------------------------------------------------------------------------*/
511 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
512 /*--------------------------------------------------------------------------*/
513 static update_prefs_from_locale_page (glPrefsDialog *dlg)
514 {
515         if (gtk_toggle_button_get_active (
516                     GTK_TOGGLE_BUTTON(dlg->private->units_points_radio)) == 0) {
517                 gl_prefs->units = GL_PREFS_UNITS_PTS;
518         }
519         if (gtk_toggle_button_get_active (
520                     GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio)) == 0) {
521                 gl_prefs->units = GL_PREFS_UNITS_INCHES;
522         }
523         if (gtk_toggle_button_get_active (
524                     GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio)) == 0) {
525                 gl_prefs->units = GL_PREFS_UNITS_MM;
526         }
527
528         if (gtk_toggle_button_get_active (
529                     GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio)) == 0) {
530                 gl_prefs->default_page_size = US_LETTER;
531         }
532         if (gtk_toggle_button_get_active (
533                     GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio)) == 0) {
534                 gl_prefs->default_page_size = A4;
535         }
536
537         gl_prefs_save_settings ();
538 }
539
540 /*--------------------------------------------------------------------------*/
541 /* PRIVATE.  Update prefs from current state of object page widgets.        */
542 /*--------------------------------------------------------------------------*/
543 static update_prefs_from_object_page (glPrefsDialog *dlg)
544 {
545         gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
546                                        &gl_prefs->default_font_family,
547                                        &gl_prefs->default_font_size,
548                                        &gl_prefs->default_font_weight,
549                                        &gl_prefs->default_font_italic_flag,
550                                        &gl_prefs->default_text_color,
551                                        &gl_prefs->default_text_alignment);
552
553         gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
554                                  &gl_prefs->default_line_width,
555                                  &gl_prefs->default_line_color);
556
557         gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
558                                  &gl_prefs->default_fill_color);
559
560         gl_prefs_save_settings ();
561 }
562
563
564