]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
2008-10-23 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / prefs-dialog.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  prefs-dialog.c:  Preferences dialog module
7  *
8  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "prefs-dialog.h"
27
28 #include <glib/gi18n.h>
29 #include <gtk/gtkbuilder.h>
30 #include <gtk/gtktogglebutton.h>
31 #include <gtk/gtkstock.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtkspinbutton.h>
34
35 #include "prefs.h"
36 #include "hig.h"
37 #include "color-combo.h"
38 #include "color.h"
39 #include "util.h"
40
41 #include "debug.h"
42
43 /*========================================================*/
44 /* Private macros and constants.                          */
45 /*========================================================*/
46
47 #define US_LETTER_ID "US-Letter"
48 #define A4_ID        "A4"
49
50 /*========================================================*/
51 /* Private types.                                         */
52 /*========================================================*/
53
54 struct _glPrefsDialogPrivate
55 {
56         GtkBuilder      *gui;
57
58         /* Units properties */
59         GtkWidget       *units_points_radio;
60         GtkWidget       *units_inches_radio;
61         GtkWidget       *units_mm_radio;
62
63         /* Page size properties */
64         GtkWidget       *page_size_us_letter_radio;
65         GtkWidget       *page_size_a4_radio;
66
67         /* Default text properties */
68         GtkWidget       *text_family_combo;
69         GtkWidget       *text_size_spin;
70         GtkWidget       *text_bold_toggle;
71         GtkWidget       *text_italic_toggle;
72         GtkWidget       *text_color_hbox;
73         GtkWidget       *text_color_combo;
74         GtkWidget       *text_left_toggle;
75         GtkWidget       *text_center_toggle;
76         GtkWidget       *text_right_toggle;
77         GtkWidget       *text_line_spacing_spin;
78
79         /* Default line properties */
80         GtkWidget       *line_width_spin;
81         GtkWidget       *line_color_hbox;
82         GtkWidget       *line_color_combo;
83
84         /* Default fill properties */
85         GtkWidget       *fill_color_hbox;
86         GtkWidget       *fill_color_combo;
87
88         /* Prevent recursion */
89         gboolean    stop_signals;
90 };
91
92 /*========================================================*/
93 /* Private globals.                                       */
94 /*========================================================*/
95
96
97 /*========================================================*/
98 /* Private function prototypes.                           */
99 /*========================================================*/
100
101 static void gl_prefs_dialog_finalize      (GObject            *object);
102 static void gl_prefs_dialog_construct     (glPrefsDialog      *dialog);
103
104 static void response_cb                   (glPrefsDialog      *dialog,
105                                            gint                response,
106                                            gpointer            user_data);
107
108 static void construct_locale_page         (glPrefsDialog      *dialog);
109 static void construct_object_page         (glPrefsDialog      *dialog);
110
111 static void align_toggle_cb               (GtkToggleButton    *toggle,
112                                            glPrefsDialog      *dialog);
113                                                                                 
114 static void update_locale_page_from_prefs (glPrefsDialog      *dialog);
115 static void update_object_page_from_prefs (glPrefsDialog      *dialog);
116
117 static void update_prefs_from_locale_page (glPrefsDialog      *dialog);
118 static void update_prefs_from_object_page (glPrefsDialog      *dialog);
119
120 \f
121 /*****************************************************************************/
122 /* Boilerplate object stuff.                                                 */
123 /*****************************************************************************/
124 G_DEFINE_TYPE (glPrefsDialog, gl_prefs_dialog, GTK_TYPE_DIALOG);
125
126 static void
127 gl_prefs_dialog_class_init (glPrefsDialogClass *class)
128 {
129         GObjectClass *object_class = G_OBJECT_CLASS (class);
130
131         gl_debug (DEBUG_PREFS, "");
132         
133         gl_prefs_dialog_parent_class = g_type_class_peek_parent (class);
134
135         object_class->finalize = gl_prefs_dialog_finalize;      
136 }
137
138 static void
139 gl_prefs_dialog_init (glPrefsDialog *dialog)
140 {
141         GError *error = NULL;
142
143         gl_debug (DEBUG_PREFS, "START");
144
145         dialog->priv = g_new0 (glPrefsDialogPrivate, 1);
146
147         dialog->priv->gui = gtk_builder_new ();
148         gtk_builder_add_from_file (dialog->priv->gui,
149                                    GLABELS_BUILDER_DIR "prefs-dialog.builder",
150                                    &error);
151         if (error) {
152                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
153                 g_error_free (error);
154                 return;
155         }
156
157         gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2);
158
159         gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
160         gtk_dialog_add_button (GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
161         gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
162
163         g_signal_connect(G_OBJECT (dialog), "response",
164                          G_CALLBACK (response_cb), NULL);
165
166         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
167         gtk_window_set_title (GTK_WINDOW (dialog), _("gLabels Preferences"));
168         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
169
170         gl_debug (DEBUG_PREFS, "END");
171 }
172
173 static void 
174 gl_prefs_dialog_finalize (GObject *object)
175 {
176         glPrefsDialog* dialog = GL_PREFS_DIALOG (object);
177         
178         gl_debug (DEBUG_PREFS, "START");
179
180         g_return_if_fail (object != NULL);
181         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
182         g_return_if_fail (dialog->priv != NULL);
183
184         if (dialog->priv->gui)
185         {
186                 g_object_unref (G_OBJECT (dialog->priv->gui));
187         }
188         g_free (dialog->priv);
189
190         G_OBJECT_CLASS (gl_prefs_dialog_parent_class)->finalize (object);
191
192         gl_debug (DEBUG_PREFS, "END");
193 }
194
195 /*****************************************************************************/
196 /* NEW preferences dialog.                                                   */
197 /*****************************************************************************/
198 GtkWidget*
199 gl_prefs_dialog_new (GtkWindow *parent)
200 {
201         GtkWidget *dialog;
202
203         gl_debug (DEBUG_PREFS, "START");
204         gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size);
205
206         dialog = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
207
208         if (parent)
209                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
210         
211         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dialog));
212
213
214         gl_debug (DEBUG_PREFS, "END");
215
216         return dialog;
217 }
218
219 /*---------------------------------------------------------------------------*/
220 /* PRIVATE.  Construct composite widget.                                     */
221 /*---------------------------------------------------------------------------*/
222 static void
223 gl_prefs_dialog_construct (glPrefsDialog *dialog)
224 {
225         GtkWidget *notebook;
226
227         g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
228         g_return_if_fail (dialog->priv != NULL);
229
230         gl_util_get_builder_widgets (dialog->priv->gui,
231                                      "prefs_notebook", &notebook,
232                                      NULL);
233         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, FALSE, FALSE, 0);
234
235         construct_locale_page (dialog);
236         construct_object_page (dialog);
237
238         update_locale_page_from_prefs (dialog);
239         update_object_page_from_prefs (dialog);
240
241         gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);   
242 }
243
244 /*---------------------------------------------------------------------------*/
245 /* PRIVATE.  "Response" callback.                                            */
246 /*---------------------------------------------------------------------------*/
247 static void
248 response_cb (glPrefsDialog *dialog,
249              gint          response,
250              gpointer      user_data)
251 {
252         gl_debug (DEBUG_VIEW, "START");
253
254         g_return_if_fail(dialog != NULL);
255         g_return_if_fail(GTK_IS_DIALOG(dialog));
256
257         switch(response) {
258         case GTK_RESPONSE_CLOSE:
259                 gtk_widget_hide (GTK_WIDGET(dialog));
260                 break;
261         case GTK_RESPONSE_DELETE_EVENT:
262                 break;
263         default:
264                 g_print ("response = %d", response);
265                 g_assert_not_reached ();
266         }
267
268         gl_debug (DEBUG_VIEW, "END");
269 }
270
271 /*--------------------------------------------------------------------------*/
272 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
273 /*--------------------------------------------------------------------------*/
274 static void
275 construct_locale_page (glPrefsDialog *dialog)
276 {
277
278         gl_util_get_builder_widgets (dialog->priv->gui,
279                                      "units_points_radio",        &dialog->priv->units_points_radio,
280                                      "units_inches_radio",        &dialog->priv->units_inches_radio,
281                                      "units_mm_radio",            &dialog->priv->units_mm_radio,
282                                      "page_size_us_letter_radio", &dialog->priv->page_size_us_letter_radio,
283                                      "page_size_a4_radio",        &dialog->priv->page_size_a4_radio,
284                                      NULL);
285
286         g_signal_connect_swapped (
287                 G_OBJECT(dialog->priv->units_points_radio),
288                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
289         g_signal_connect_swapped (
290                 G_OBJECT(dialog->priv->units_inches_radio),
291                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
292         g_signal_connect_swapped (
293                 G_OBJECT(dialog->priv->units_mm_radio),
294                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
295         g_signal_connect_swapped (
296                 G_OBJECT(dialog->priv->page_size_us_letter_radio),
297                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
298         g_signal_connect_swapped (
299                 G_OBJECT(dialog->priv->page_size_a4_radio),
300                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
301 }
302
303 /*--------------------------------------------------------------------------*/
304 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
305 /*--------------------------------------------------------------------------*/
306 static void
307 construct_object_page (glPrefsDialog *dialog)
308 {
309         GList    *family_names;
310
311         gl_util_get_builder_widgets (dialog->priv->gui,
312                                      "text_family_combo",      &dialog->priv->text_family_combo,
313                                      "text_size_spin",         &dialog->priv->text_size_spin,
314                                      "text_bold_toggle",       &dialog->priv->text_bold_toggle,
315                                      "text_italic_toggle",     &dialog->priv->text_italic_toggle,
316                                      "text_color_hbox",        &dialog->priv->text_color_hbox,
317                                      "text_left_toggle",       &dialog->priv->text_left_toggle,
318                                      "text_center_toggle",     &dialog->priv->text_center_toggle,
319                                      "text_right_toggle",      &dialog->priv->text_right_toggle,
320                                      "text_line_spacing_spin", &dialog->priv->text_line_spacing_spin,
321                                      "line_width_spin",        &dialog->priv->line_width_spin,
322                                      "line_color_hbox",        &dialog->priv->line_color_hbox,
323                                      "fill_color_hbox",        &dialog->priv->fill_color_hbox,
324                                      NULL);
325
326         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->text_family_combo));
327
328         dialog->priv->text_color_combo = gl_color_combo_new (NULL, _("Default"),
329                                                              GL_COLOR_TEXT_DEFAULT,
330                                                              gl_prefs->default_text_color);
331         dialog->priv->line_color_combo = gl_color_combo_new (NULL, _("No Line"),
332                                                              GL_COLOR_NO_LINE,
333                                                              gl_prefs->default_line_color);
334         dialog->priv->fill_color_combo = gl_color_combo_new (NULL, _("No Fill"),
335                                                              GL_COLOR_NO_FILL,
336                                                              gl_prefs->default_fill_color);
337
338         gtk_container_add (GTK_CONTAINER (dialog->priv->text_color_hbox),
339                            dialog->priv->text_color_combo);
340         gtk_container_add (GTK_CONTAINER (dialog->priv->line_color_hbox),
341                            dialog->priv->line_color_combo);
342         gtk_container_add (GTK_CONTAINER (dialog->priv->fill_color_hbox),
343                            dialog->priv->fill_color_combo);
344
345         /* Load family names */
346         family_names = gl_util_get_font_family_list ();
347         gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->text_family_combo),
348                                        family_names);
349                                                                                 
350
351         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_family_combo),
352                                   "changed",
353                                   G_CALLBACK(update_prefs_from_object_page),
354                                   G_OBJECT(dialog));
355         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_size_spin),
356                                   "changed",
357                                   G_CALLBACK(update_prefs_from_object_page),
358                                   G_OBJECT(dialog));
359         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_bold_toggle),
360                                   "toggled",
361                                   G_CALLBACK(update_prefs_from_object_page),
362                                   G_OBJECT(dialog));
363         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_italic_toggle),
364                                   "toggled",
365                                   G_CALLBACK(update_prefs_from_object_page),
366                                   G_OBJECT(dialog));
367         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_color_combo),
368                                   "color_changed",
369                                   G_CALLBACK(update_prefs_from_object_page),
370                                   G_OBJECT(dialog));
371
372         g_signal_connect (G_OBJECT(dialog->priv->text_left_toggle),
373                           "toggled",
374                           G_CALLBACK(align_toggle_cb),
375                           G_OBJECT(dialog));
376         g_signal_connect (G_OBJECT(dialog->priv->text_center_toggle),
377                           "toggled",
378                           G_CALLBACK(align_toggle_cb),
379                           G_OBJECT(dialog));
380         g_signal_connect (G_OBJECT(dialog->priv->text_right_toggle),
381                           "toggled",
382                           G_CALLBACK(align_toggle_cb),
383                           G_OBJECT(dialog));
384
385         g_signal_connect_swapped (G_OBJECT(dialog->priv->text_line_spacing_spin),
386                                   "changed",
387                                   G_CALLBACK(update_prefs_from_object_page),
388                                   G_OBJECT(dialog));
389
390         g_signal_connect_swapped (G_OBJECT(dialog->priv->line_width_spin),
391                                   "changed",
392                                   G_CALLBACK(update_prefs_from_object_page),
393                                   G_OBJECT(dialog));
394         g_signal_connect_swapped (G_OBJECT(dialog->priv->line_color_combo),
395                                   "color_changed",
396                                   G_CALLBACK(update_prefs_from_object_page),
397                                   G_OBJECT(dialog));
398
399         g_signal_connect_swapped (G_OBJECT(dialog->priv->fill_color_combo),
400                                   "color_changed",
401                                   G_CALLBACK(update_prefs_from_object_page),
402                                   G_OBJECT(dialog));
403 }
404
405
406 /*--------------------------------------------------------------------------*/
407 /* PRIVATE.  Alignment togglebutton callback.                               */
408 /*--------------------------------------------------------------------------*/
409 static void
410 align_toggle_cb (GtkToggleButton *toggle,
411                  glPrefsDialog   *dialog)
412 {
413         if (gtk_toggle_button_get_active (toggle))
414         {
415   
416                 if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_left_toggle))
417                 {
418                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
419                                                       (dialog->priv->text_center_toggle),
420                                                       FALSE);
421                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
422                                                       (dialog->priv->text_right_toggle),
423                                                       FALSE);
424                 }
425                 else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_center_toggle))
426                 {
427                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
428                                                       (dialog->priv->text_left_toggle),
429                                                       FALSE);
430                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
431                                                       (dialog->priv->text_right_toggle),
432                                                       FALSE);
433                 }
434                 else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_right_toggle))
435                 {
436                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
437                                                       (dialog->priv->text_left_toggle),
438                                                       FALSE);
439                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
440                                                       (dialog->priv->text_center_toggle),
441                                                       FALSE);
442                 }
443                                                                                 
444                 update_prefs_from_object_page (dialog);
445         }
446                                                                                 
447 }
448                                                                                 
449
450 /*--------------------------------------------------------------------------*/
451 /* PRIVATE.  Update locale page widgets from current prefs.                 */
452 /*--------------------------------------------------------------------------*/
453 static void
454 update_locale_page_from_prefs (glPrefsDialog *dialog)
455 {
456         dialog->priv->stop_signals = TRUE;
457
458         switch (gl_prefs->units) {
459         case LGL_UNITS_POINT:
460                 gtk_toggle_button_set_active (
461                         GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio),
462                         TRUE);
463                 break;
464         case LGL_UNITS_INCH:
465                 gtk_toggle_button_set_active (
466                         GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio),
467                         TRUE);
468                 break;
469         case LGL_UNITS_MM:
470                 gtk_toggle_button_set_active (
471                         GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio),
472                         TRUE);
473                 break;
474         default:
475                 g_message ("Illegal units");    /* Should not happen */
476                 break;
477         }
478
479         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0)
480         {
481                 gtk_toggle_button_set_active (
482                         GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio), TRUE);
483         }
484         else if ( g_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0)
485         {
486                 gtk_toggle_button_set_active (
487                         GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio), TRUE);
488         }
489         else
490         {
491                 g_message ("Unknown default page size"); /* Shouldn't happen */
492         }
493
494         dialog->priv->stop_signals = FALSE;
495 }
496
497 /*--------------------------------------------------------------------------*/
498 /* PRIVATE.  Update object page widgets from current prefs.                 */
499 /*--------------------------------------------------------------------------*/
500 static void
501 update_object_page_from_prefs (glPrefsDialog *dialog)
502 {
503         GList    *family_names;
504         gchar    *good_font_family;
505  
506         dialog->priv->stop_signals = TRUE;
507
508
509         /* Make sure we have a valid font family.  if not provide a good default. */
510         family_names = gl_util_get_font_family_list ();
511         if (g_list_find_custom (family_names,
512                                 gl_prefs->default_font_family,
513                                 (GCompareFunc)g_utf8_collate))
514         {
515                 good_font_family = g_strdup (gl_prefs->default_font_family);
516         }
517         else
518         {
519                 if (family_names != NULL)
520                 {
521                         good_font_family = g_strdup (family_names->data); /* 1st entry */
522                 }
523                 else
524                 {
525                         good_font_family = NULL;
526                 }
527         }
528         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo),
529                                            good_font_family);
530         g_free (good_font_family);
531
532         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_size_spin),
533                                    gl_prefs->default_font_size);
534  
535         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle),
536                                       (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD));
537  
538         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_italic_toggle),
539                                       gl_prefs->default_font_italic_flag);
540  
541         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
542                                   gl_prefs->default_text_color);
543
544         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle),
545                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT));
546         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle),
547                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER));
548         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle),
549                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT));
550
551         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_line_spacing_spin),
552                                    gl_prefs->default_text_line_spacing);
553
554         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->line_width_spin),
555                                    gl_prefs->default_line_width);
556  
557         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
558                 gl_prefs->default_line_color);
559
560
561         gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
562                                   gl_prefs->default_fill_color);
563
564
565         dialog->priv->stop_signals = FALSE;
566 }
567
568 /*--------------------------------------------------------------------------*/
569 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
570 /*--------------------------------------------------------------------------*/
571 static void
572 update_prefs_from_locale_page (glPrefsDialog *dialog)
573 {
574         if (dialog->priv->stop_signals) return;
575
576         if (gtk_toggle_button_get_active (
577                     GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio)))
578         {
579                 gl_prefs->units = LGL_UNITS_POINT;
580         }
581         if (gtk_toggle_button_get_active (
582                     GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio)))
583         {
584                 gl_prefs->units = LGL_UNITS_INCH;
585         }
586         if (gtk_toggle_button_get_active (
587                     GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio)))
588         {
589                 gl_prefs->units = LGL_UNITS_MM;
590         }
591
592         if (gtk_toggle_button_get_active (
593                     GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio)))
594         {
595                 g_free (gl_prefs->default_page_size);
596                 gl_prefs->default_page_size = g_strdup (US_LETTER_ID);
597         }
598         if (gtk_toggle_button_get_active (
599                     GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio)))
600         {
601                 g_free (gl_prefs->default_page_size);
602                 gl_prefs->default_page_size = g_strdup (A4_ID);
603         }
604
605         gl_prefs_model_save_settings (gl_prefs);
606 }
607
608 /*--------------------------------------------------------------------------*/
609 /* PRIVATE.  Update prefs from current state of object page widgets.        */
610 /*--------------------------------------------------------------------------*/
611 static void
612 update_prefs_from_object_page (glPrefsDialog *dialog)
613 {
614         guint     color;
615         gboolean  is_default;
616
617         if (dialog->priv->stop_signals) return;
618
619         g_free (gl_prefs->default_font_family);
620         gl_prefs->default_font_family =
621                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo));
622         gl_prefs->default_font_size =
623                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_size_spin));
624
625         if (gtk_toggle_button_get_active
626             (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle)))
627         {
628                 gl_prefs->default_font_weight = PANGO_WEIGHT_BOLD;
629         }
630         else
631         {
632                 gl_prefs->default_font_weight = PANGO_WEIGHT_NORMAL;
633         }
634
635         gl_prefs->default_font_italic_flag =
636                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
637                                               (dialog->priv->text_italic_toggle));
638
639         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
640                                           &is_default);
641         if (!is_default)
642         {
643                 gl_prefs->default_text_color = color;
644         }
645
646         if (gtk_toggle_button_get_active
647             (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle)))
648         {
649                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
650         }
651         else if (gtk_toggle_button_get_active
652                  (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle)))
653         {
654                 gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT;
655         }
656         else if (gtk_toggle_button_get_active
657                  (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle)))
658         {
659                 gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER;
660         }
661         else
662         {
663                 /* Should not happen. */
664                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
665         }
666                                                                                 
667
668         gl_prefs->default_text_line_spacing =
669                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_line_spacing_spin));
670
671         gl_prefs->default_line_width =
672                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->line_width_spin));
673
674         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
675                                           &is_default);
676         if (!is_default)
677         {
678                 gl_prefs->default_line_color = color;
679         }
680
681
682         color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
683                                           &is_default);
684         if (!is_default)
685         {
686                 gl_prefs->default_fill_color = color;
687         }
688
689         gl_prefs_model_save_settings (gl_prefs);
690 }
691
692
693