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