]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
3466ca9008d943f48732b106b8d0d8d74d074b4d
[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 glHigDialogClass* 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), _("gLabels 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         case GTK_RESPONSE_DELETE_EVENT:
251                 break;
252         default:
253                 g_print ("response = %d", response);
254                 g_assert_not_reached ();
255         }
256
257         gl_debug (DEBUG_VIEW, "END");
258 }
259
260 /*--------------------------------------------------------------------------*/
261 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
262 /*--------------------------------------------------------------------------*/
263 static GtkWidget *
264 locale_page (glPrefsDialog *dlg)
265 {
266         GtkWidget *wlabel, *wvbox, *wframe;
267         GSList *radio_group = NULL;
268
269         wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
270
271         wlabel = gtk_label_new (_("Select locale specific behavior."));
272         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
273         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
274
275         /* ----- Display Units Frame ------------------------------------ */
276         wframe = gl_hig_category_new (_("Display units"));
277         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
278
279         radio_group = NULL;
280
281         dlg->private->units_points_radio =
282             gtk_radio_button_new_with_label (radio_group, _("Points"));
283         radio_group =
284                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
285         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
286                                     dlg->private->units_points_radio);
287
288         dlg->private->units_inches_radio =
289             gtk_radio_button_new_with_label (radio_group, _("Inches"));
290         radio_group =
291                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
292         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
293                                     dlg->private->units_inches_radio);
294
295         dlg->private->units_mm_radio =
296             gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
297         radio_group =
298                 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
299         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
300                                     dlg->private->units_mm_radio);
301
302         /* ----- Page Size Frame ------------------------------------ */
303         wframe = gl_hig_category_new (_("Default page size"));
304         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
305
306         radio_group = NULL;
307
308         dlg->private->page_size_us_letter_radio =
309             gtk_radio_button_new_with_label (radio_group, US_LETTER);
310         radio_group =
311             gtk_radio_button_get_group (GTK_RADIO_BUTTON
312                                     (dlg->private->page_size_us_letter_radio));
313         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
314                                     dlg->private->page_size_us_letter_radio);
315
316         dlg->private->page_size_a4_radio =
317             gtk_radio_button_new_with_label (radio_group, A4);
318         radio_group =
319             gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
320         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
321                                     dlg->private->page_size_a4_radio);
322
323         g_signal_connect_swapped (
324                 G_OBJECT(dlg->private->units_points_radio),
325                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
326         g_signal_connect_swapped (
327                 G_OBJECT(dlg->private->units_inches_radio),
328                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
329         g_signal_connect_swapped (
330                 G_OBJECT(dlg->private->units_mm_radio),
331                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
332         g_signal_connect_swapped (
333                 G_OBJECT(dlg->private->page_size_us_letter_radio),
334                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
335         g_signal_connect_swapped (
336                 G_OBJECT(dlg->private->page_size_a4_radio),
337                 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
338
339         return wvbox;
340 }
341
342 /*--------------------------------------------------------------------------*/
343 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
344 /*--------------------------------------------------------------------------*/
345 static GtkWidget *
346 object_page (glPrefsDialog *dlg)
347 {
348         GtkWidget *wlabel, *wvbox, *wframe;
349         GtkSizeGroup *label_size_group;
350
351         wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
352         label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
353
354         wlabel = gtk_label_new (_("Select default properties for new objects."));
355         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
356         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
357
358         /* ------ text props entry ------ */
359         wframe = gl_hig_category_new (_("Text"));
360         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
361         dlg->private->text = gl_wdgt_text_props_new ();
362         gl_wdgt_text_props_set_label_size_group (GL_WDGT_TEXT_PROPS(dlg->private->text),
363                                                  label_size_group);
364         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
365                                     dlg->private->text);
366
367         /* ------ Line box ------ */
368         wframe = gl_hig_category_new (_("Line"));
369         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
370         dlg->private->line = gl_wdgt_line_new ();
371         gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(dlg->private->line),
372                                            label_size_group);
373         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
374                                     dlg->private->line);
375
376         /* ------ Fill box ------ */
377         wframe = gl_hig_category_new (_("Fill"));
378         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
379         dlg->private->fill = gl_wdgt_fill_new ();
380         gl_wdgt_fill_set_label_size_group (GL_WDGT_FILL(dlg->private->fill),
381                                            label_size_group);
382         gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
383                                     dlg->private->fill);
384
385         g_signal_connect_swapped (G_OBJECT(dlg->private->text),
386                                   "changed",
387                                   G_CALLBACK(update_prefs_from_object_page),
388                                   dlg);
389         g_signal_connect_swapped (G_OBJECT(dlg->private->line),
390                                   "changed",
391                                   G_CALLBACK(update_prefs_from_object_page),
392                                   dlg);
393         g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
394                                   "changed",
395                                   G_CALLBACK(update_prefs_from_object_page),
396                                   dlg);
397         return wvbox;
398 }
399
400
401 /*--------------------------------------------------------------------------*/
402 /* PRIVATE.  Update locale page widgets from current prefs.                 */
403 /*--------------------------------------------------------------------------*/
404 static update_locale_page_from_prefs (glPrefsDialog *dlg)
405 {
406         g_signal_handlers_block_by_func (
407                 G_OBJECT(dlg->private->units_points_radio),
408                 G_CALLBACK(update_prefs_from_locale_page), dlg);
409         g_signal_handlers_block_by_func (
410                 G_OBJECT(dlg->private->units_inches_radio),
411                 G_CALLBACK(update_prefs_from_locale_page), dlg);
412         g_signal_handlers_block_by_func (
413                 G_OBJECT(dlg->private->units_mm_radio),
414                 G_CALLBACK(update_prefs_from_locale_page), dlg);
415         g_signal_handlers_block_by_func (
416                 G_OBJECT(dlg->private->page_size_us_letter_radio),
417                 G_CALLBACK(update_prefs_from_locale_page), dlg);
418         g_signal_handlers_block_by_func (
419                 G_OBJECT(dlg->private->page_size_a4_radio),
420                 G_CALLBACK(update_prefs_from_locale_page), dlg);
421
422         switch (gl_prefs->units) {
423         case GL_PREFS_UNITS_PTS:
424                 gtk_toggle_button_set_active (
425                         GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
426                         TRUE);
427                 break;
428         case GL_PREFS_UNITS_INCHES:
429                 gtk_toggle_button_set_active (
430                         GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
431                         TRUE);
432                 break;
433         case GL_PREFS_UNITS_MM:
434                 gtk_toggle_button_set_active (
435                         GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
436                         TRUE);
437                 break;
438         default:
439                 g_warning ("Illegal units");    /* Should not happen */
440                 break;
441         }
442
443         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
444                 gtk_toggle_button_set_active (
445                         GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
446                         TRUE);
447         } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
448                 gtk_toggle_button_set_active (
449                         GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
450                         TRUE);
451         } else {
452                 g_warning ("Unknown default page size"); /* Shouldn't happen */
453         }
454
455         g_signal_handlers_unblock_by_func (
456                 G_OBJECT(dlg->private->units_points_radio),
457                 G_CALLBACK(update_prefs_from_locale_page), dlg);
458         g_signal_handlers_unblock_by_func (
459                 G_OBJECT(dlg->private->units_inches_radio),
460                 G_CALLBACK(update_prefs_from_locale_page), dlg);
461         g_signal_handlers_unblock_by_func (
462                 G_OBJECT(dlg->private->units_mm_radio),
463                 G_CALLBACK(update_prefs_from_locale_page), dlg);
464         g_signal_handlers_unblock_by_func (
465                 G_OBJECT(dlg->private->page_size_us_letter_radio),
466                 G_CALLBACK(update_prefs_from_locale_page), dlg);
467         g_signal_handlers_unblock_by_func (
468                 G_OBJECT(dlg->private->page_size_a4_radio),
469                 G_CALLBACK(update_prefs_from_locale_page), dlg);
470 }
471
472 /*--------------------------------------------------------------------------*/
473 /* PRIVATE.  Update object page widgets from current prefs.                 */
474 /*--------------------------------------------------------------------------*/
475 static update_object_page_from_prefs (glPrefsDialog *dlg)
476 {
477         g_signal_handlers_block_by_func (
478                 G_OBJECT(dlg->private->text),
479                 G_CALLBACK(update_prefs_from_object_page), dlg);
480         g_signal_handlers_block_by_func (
481                 G_OBJECT(dlg->private->line),
482                 G_CALLBACK(update_prefs_from_object_page), dlg);
483         g_signal_handlers_block_by_func (
484                 G_OBJECT(dlg->private->fill),
485                 G_CALLBACK(update_prefs_from_object_page), dlg);
486
487         gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
488                                        gl_prefs->default_font_family,
489                                        gl_prefs->default_font_size,
490                                        gl_prefs->default_font_weight,
491                                        gl_prefs->default_font_italic_flag,
492                                        gl_prefs->default_text_color,
493                                        gl_prefs->default_text_alignment);
494
495         gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
496                                  gl_prefs->default_line_width,
497                                  gl_prefs->default_line_color);
498
499         gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
500                                  gl_prefs->default_fill_color);
501
502         g_signal_handlers_unblock_by_func (
503                 G_OBJECT(dlg->private->text),
504                 G_CALLBACK(update_prefs_from_object_page), dlg);
505         g_signal_handlers_unblock_by_func (
506                 G_OBJECT(dlg->private->line),
507                 G_CALLBACK(update_prefs_from_object_page), dlg);
508         g_signal_handlers_unblock_by_func (
509                 G_OBJECT(dlg->private->fill),
510                 G_CALLBACK(update_prefs_from_object_page), dlg);
511 }
512
513 /*--------------------------------------------------------------------------*/
514 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
515 /*--------------------------------------------------------------------------*/
516 static update_prefs_from_locale_page (glPrefsDialog *dlg)
517 {
518         if (gtk_toggle_button_get_active (
519                     GTK_TOGGLE_BUTTON(dlg->private->units_points_radio))) {
520                 gl_prefs->units = GL_PREFS_UNITS_PTS;
521         }
522         if (gtk_toggle_button_get_active (
523                     GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio))) {
524                 gl_prefs->units = GL_PREFS_UNITS_INCHES;
525         }
526         if (gtk_toggle_button_get_active (
527                     GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio))) {
528                 gl_prefs->units = GL_PREFS_UNITS_MM;
529         }
530
531         if (gtk_toggle_button_get_active (
532                     GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio))) {
533                 gl_prefs->default_page_size = US_LETTER;
534         }
535         if (gtk_toggle_button_get_active (
536                     GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio))) {
537                 gl_prefs->default_page_size = A4;
538         }
539
540         gl_prefs_save_settings ();
541 }
542
543 /*--------------------------------------------------------------------------*/
544 /* PRIVATE.  Update prefs from current state of object page widgets.        */
545 /*--------------------------------------------------------------------------*/
546 static update_prefs_from_object_page (glPrefsDialog *dlg)
547 {
548         gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
549                                        &gl_prefs->default_font_family,
550                                        &gl_prefs->default_font_size,
551                                        &gl_prefs->default_font_weight,
552                                        &gl_prefs->default_font_italic_flag,
553                                        &gl_prefs->default_text_color,
554                                        &gl_prefs->default_text_alignment);
555
556         gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
557                                  &gl_prefs->default_line_width,
558                                  &gl_prefs->default_line_color);
559
560         gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
561                                  &gl_prefs->default_fill_color);
562
563         gl_prefs_save_settings ();
564 }
565
566
567