]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
2005-03-22 Jim Evins <evins@snaught.com>
[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 <glib/gi18n.h>
25 #include <libgnome/libgnome.h>
26 #include <libgnomeui/libgnomeui.h>
27 #include <glade/glade-xml.h>
28
29 #include "prefs-dialog.h"
30 #include "prefs.h"
31 #include "mygal/widget-color-combo.h"
32 #include "color.h"
33 #include "debug.h"
34
35 /*========================================================*/
36 /* Private macros and constants.                          */
37 /*========================================================*/
38
39 #define US_LETTER_ID "US-Letter"
40 #define A4_ID        "A4"
41
42 /*========================================================*/
43 /* Private types.                                         */
44 /*========================================================*/
45
46 struct _glPrefsDialogPrivate
47 {
48         GladeXML   *gui;
49
50         /* Units properties */
51         GtkWidget       *units_points_radio;
52         GtkWidget       *units_inches_radio;
53         GtkWidget       *units_mm_radio;
54
55         /* Page size properties */
56         GtkWidget       *page_size_us_letter_radio;
57         GtkWidget       *page_size_a4_radio;
58
59         /* Default text properties */
60         GtkWidget       *text_family_entry;
61         GtkWidget       *text_family_combo;
62         GtkWidget       *text_size_spin;
63         GtkWidget       *text_bold_toggle;
64         GtkWidget       *text_italic_toggle;
65         GtkWidget       *text_color_combo;
66         GtkWidget       *text_left_toggle;
67         GtkWidget       *text_center_toggle;
68         GtkWidget       *text_right_toggle;
69         GtkWidget       *text_line_spacing_spin;
70
71         /* Default line properties */
72         GtkWidget       *line_width_spin;
73         GtkWidget       *line_color_combo;
74
75         /* Default fill properties */
76         GtkWidget       *fill_color_combo;
77 };
78
79 /*========================================================*/
80 /* Private globals.                                       */
81 /*========================================================*/
82
83 static glHigDialogClass* parent_class = NULL;
84
85 /*========================================================*/
86 /* Private function prototypes.                           */
87 /*========================================================*/
88
89 static void gl_prefs_dialog_class_init    (glPrefsDialogClass *klass);
90 static void gl_prefs_dialog_init          (glPrefsDialog      *dlg);
91 static void gl_prefs_dialog_finalize      (GObject            *object);
92 static void gl_prefs_dialog_construct     (glPrefsDialog      *dlg);
93
94 static void response_cb                   (glPrefsDialog      *dialog,
95                                            gint                response,
96                                            gpointer            user_data);
97
98 static void construct_locale_page         (glPrefsDialog      *dlg);
99 static void construct_object_page         (glPrefsDialog      *dlg);
100
101 static void align_toggle_cb               (GtkToggleButton    *toggle,
102                                            glPrefsDialog      *dlg);
103                                                                                 
104 static void update_locale_page_from_prefs (glPrefsDialog      *dlg);
105 static void update_object_page_from_prefs (glPrefsDialog      *dlg);
106
107 static void update_prefs_from_locale_page (glPrefsDialog      *dlg);
108 static void update_prefs_from_object_page (glPrefsDialog      *dlg);
109
110 \f
111 /*****************************************************************************/
112 /* Boilerplate object stuff.                                                 */
113 /*****************************************************************************/
114 GType
115 gl_prefs_dialog_get_type (void)
116 {
117         static GType type = 0;
118
119         if (!type)
120         {
121                 static const GTypeInfo info =
122                 {
123                         sizeof (glPrefsDialogClass),
124                         NULL,           /* base_init */
125                         NULL,           /* base_finalize */
126                         (GClassInitFunc) gl_prefs_dialog_class_init,
127                         NULL,           /* class_finalize */
128                         NULL,           /* class_data */
129                         sizeof (glPrefsDialog),
130                         0,              /* n_preallocs */
131                         (GInstanceInitFunc) gl_prefs_dialog_init,
132                         NULL
133                 };
134
135                 type = g_type_register_static (GL_TYPE_HIG_DIALOG,
136                                                "glPrefsDialog", &info, 0);
137         }
138
139         return type;
140 }
141
142 static void
143 gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
144 {
145         GObjectClass *object_class = G_OBJECT_CLASS (klass);
146
147         gl_debug (DEBUG_PREFS, "");
148         
149         parent_class = g_type_class_peek_parent (klass);
150
151         object_class->finalize = gl_prefs_dialog_finalize;      
152 }
153
154 static void
155 gl_prefs_dialog_init (glPrefsDialog *dlg)
156 {
157         gl_debug (DEBUG_PREFS, "START");
158
159         dlg->priv = g_new0 (glPrefsDialogPrivate, 1);
160
161         dlg->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "prefs-dialog.glade",
162                                         "prefs_notebook",
163                                         NULL);
164
165         if (!dlg->priv->gui) {
166                 g_warning ("Could not open prefs-dialog.glade, reinstall glabels!");
167                 return;
168         }
169
170         gl_debug (DEBUG_PREFS, "END");
171 }
172
173 static void 
174 gl_prefs_dialog_finalize (GObject *object)
175 {
176         glPrefsDialog* dlg;
177         
178         gl_debug (DEBUG_PREFS, "START");
179
180         g_return_if_fail (object != NULL);
181         
182         dlg = GL_PREFS_DIALOG (object);
183
184         g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
185         g_return_if_fail (dlg->priv != NULL);
186
187         G_OBJECT_CLASS (parent_class)->finalize (object);
188
189         g_free (dlg->priv);
190
191         gl_debug (DEBUG_PREFS, "END");
192 }
193
194 /*****************************************************************************/
195 /* NEW preferences dialog.                                                   */
196 /*****************************************************************************/
197 GtkWidget*
198 gl_prefs_dialog_new (GtkWindow *parent)
199 {
200         GtkWidget *dlg;
201
202         gl_debug (DEBUG_PREFS, "START");
203         gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size);
204
205         dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
206
207         if (parent)
208                 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
209         
210         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
211
212
213         gl_debug (DEBUG_PREFS, "END");
214
215         return dlg;
216 }
217
218 /*---------------------------------------------------------------------------*/
219 /* PRIVATE.  Construct composite widget.                                     */
220 /*---------------------------------------------------------------------------*/
221 static void
222 gl_prefs_dialog_construct (glPrefsDialog *dlg)
223 {
224         GtkWidget *notebook;
225
226         g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
227         g_return_if_fail (dlg->priv != NULL);
228
229         gtk_dialog_add_button (GTK_DIALOG(dlg),
230                                GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
231
232         gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
233
234         g_signal_connect(G_OBJECT (dlg), "response",
235                          G_CALLBACK (response_cb), NULL);
236
237         notebook = glade_xml_get_widget (dlg->priv->gui, "prefs_notebook");
238         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
239
240         construct_locale_page (dlg);
241         construct_object_page (dlg);
242
243         update_locale_page_from_prefs (dlg);
244         update_object_page_from_prefs (dlg);
245
246         gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);   
247
248         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
249         gtk_window_set_title (GTK_WINDOW (dlg), _("gLabels Preferences"));
250         gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
251 }
252
253 /*---------------------------------------------------------------------------*/
254 /* PRIVATE.  "Response" callback.                                            */
255 /*---------------------------------------------------------------------------*/
256 static void
257 response_cb (glPrefsDialog *dlg,
258              gint          response,
259              gpointer      user_data)
260 {
261         gl_debug (DEBUG_VIEW, "START");
262
263         g_return_if_fail(dlg != NULL);
264         g_return_if_fail(GTK_IS_DIALOG(dlg));
265
266         switch(response) {
267         case GTK_RESPONSE_CLOSE:
268                 gtk_widget_hide (GTK_WIDGET(dlg));
269                 break;
270         case GTK_RESPONSE_DELETE_EVENT:
271                 break;
272         default:
273                 g_print ("response = %d", response);
274                 g_assert_not_reached ();
275         }
276
277         gl_debug (DEBUG_VIEW, "END");
278 }
279
280 /*--------------------------------------------------------------------------*/
281 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
282 /*--------------------------------------------------------------------------*/
283 static void
284 construct_locale_page (glPrefsDialog *dlg)
285 {
286
287         dlg->priv->units_points_radio =
288                 glade_xml_get_widget (dlg->priv->gui, "units_points_radio");
289
290         dlg->priv->units_inches_radio =
291                 glade_xml_get_widget (dlg->priv->gui, "units_inches_radio");
292
293         dlg->priv->units_mm_radio =
294                 glade_xml_get_widget (dlg->priv->gui, "units_mm_radio");
295
296         dlg->priv->page_size_us_letter_radio =
297                 glade_xml_get_widget (dlg->priv->gui, "page_size_us_letter_radio");
298
299         dlg->priv->page_size_a4_radio =
300                 glade_xml_get_widget (dlg->priv->gui, "page_size_a4_radio");
301
302         g_signal_connect_swapped (
303                 G_OBJECT(dlg->priv->units_points_radio),
304                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
305         g_signal_connect_swapped (
306                 G_OBJECT(dlg->priv->units_inches_radio),
307                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
308         g_signal_connect_swapped (
309                 G_OBJECT(dlg->priv->units_mm_radio),
310                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
311         g_signal_connect_swapped (
312                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
313                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
314         g_signal_connect_swapped (
315                 G_OBJECT(dlg->priv->page_size_a4_radio),
316                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
317 }
318
319 /*--------------------------------------------------------------------------*/
320 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
321 /*--------------------------------------------------------------------------*/
322 static void
323 construct_object_page (glPrefsDialog *dlg)
324 {
325         GList    *family_names;
326
327         dlg->priv->text_family_entry =
328                 glade_xml_get_widget (dlg->priv->gui, "text_family_entry");
329         dlg->priv->text_family_combo =
330                 glade_xml_get_widget (dlg->priv->gui, "text_family_combo");
331         dlg->priv->text_size_spin =
332                 glade_xml_get_widget (dlg->priv->gui, "text_size_spin");
333         dlg->priv->text_bold_toggle =
334                 glade_xml_get_widget (dlg->priv->gui, "text_bold_toggle");
335         dlg->priv->text_italic_toggle =
336                 glade_xml_get_widget (dlg->priv->gui, "text_italic_toggle");
337         dlg->priv->text_color_combo =
338                 glade_xml_get_widget (dlg->priv->gui, "text_color_combo");
339         dlg->priv->text_left_toggle =
340                 glade_xml_get_widget (dlg->priv->gui, "text_left_toggle");
341         dlg->priv->text_center_toggle =
342                 glade_xml_get_widget (dlg->priv->gui, "text_center_toggle");
343         dlg->priv->text_right_toggle =
344                 glade_xml_get_widget (dlg->priv->gui, "text_right_toggle");
345         dlg->priv->text_line_spacing_spin =
346                 glade_xml_get_widget (dlg->priv->gui, "text_line_spacing_spin");
347
348         dlg->priv->line_width_spin =
349                 glade_xml_get_widget (dlg->priv->gui, "line_width_spin");
350         dlg->priv->line_color_combo =
351                 glade_xml_get_widget (dlg->priv->gui, "line_color_combo");
352
353         dlg->priv->fill_color_combo =
354                 glade_xml_get_widget (dlg->priv->gui, "fill_color_combo");
355
356         /* Load family names */
357         family_names = gnome_font_family_list ();
358         gtk_combo_set_popdown_strings (GTK_COMBO(dlg->priv->text_family_combo),
359                                        family_names);
360         gnome_font_family_list_free (family_names);
361                                                                                 
362
363         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_family_entry),
364                                   "changed",
365                                   G_CALLBACK(update_prefs_from_object_page),
366                                   G_OBJECT(dlg));
367         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_size_spin),
368                                   "changed",
369                                   G_CALLBACK(update_prefs_from_object_page),
370                                   G_OBJECT(dlg));
371         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_bold_toggle),
372                                   "toggled",
373                                   G_CALLBACK(update_prefs_from_object_page),
374                                   G_OBJECT(dlg));
375         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_italic_toggle),
376                                   "toggled",
377                                   G_CALLBACK(update_prefs_from_object_page),
378                                   G_OBJECT(dlg));
379         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_color_combo),
380                                   "color_changed",
381                                   G_CALLBACK(update_prefs_from_object_page),
382                                   G_OBJECT(dlg));
383
384         g_signal_connect (G_OBJECT(dlg->priv->text_left_toggle),
385                           "toggled",
386                           G_CALLBACK(align_toggle_cb),
387                           G_OBJECT(dlg));
388         g_signal_connect (G_OBJECT(dlg->priv->text_center_toggle),
389                           "toggled",
390                           G_CALLBACK(align_toggle_cb),
391                           G_OBJECT(dlg));
392         g_signal_connect (G_OBJECT(dlg->priv->text_right_toggle),
393                           "toggled",
394                           G_CALLBACK(align_toggle_cb),
395                           G_OBJECT(dlg));
396
397         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_line_spacing_spin),
398                                   "changed",
399                                   G_CALLBACK(update_prefs_from_object_page),
400                                   G_OBJECT(dlg));
401
402         g_signal_connect_swapped (G_OBJECT(dlg->priv->line_width_spin),
403                                   "changed",
404                                   G_CALLBACK(update_prefs_from_object_page),
405                                   G_OBJECT(dlg));
406         g_signal_connect_swapped (G_OBJECT(dlg->priv->line_color_combo),
407                                   "color_changed",
408                                   G_CALLBACK(update_prefs_from_object_page),
409                                   G_OBJECT(dlg));
410
411         g_signal_connect_swapped (G_OBJECT(dlg->priv->fill_color_combo),
412                                   "color_changed",
413                                   G_CALLBACK(update_prefs_from_object_page),
414                                   G_OBJECT(dlg));
415 }
416
417
418 /*--------------------------------------------------------------------------*/
419 /* PRIVATE.  Alignment togglebutton callback.                               */
420 /*--------------------------------------------------------------------------*/
421 static void
422 align_toggle_cb (GtkToggleButton *toggle,
423                  glPrefsDialog   *dlg)
424 {
425         if (gtk_toggle_button_get_active (toggle)) {
426   
427                 if (GTK_WIDGET (toggle) == GTK_WIDGET (dlg->priv->text_left_toggle)) {
428                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
429                                                       (dlg->priv->text_center_toggle),
430                                                       FALSE);
431                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
432                                                       (dlg->priv->text_right_toggle),
433                                                       FALSE);
434                 } else if (GTK_WIDGET (toggle) ==
435                            GTK_WIDGET (dlg->priv->text_center_toggle)) {
436                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
437                                                       (dlg->priv->text_left_toggle),
438                                                       FALSE);
439                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
440                                                       (dlg->priv->text_right_toggle),
441                                                       FALSE);
442                 } else if (GTK_WIDGET (toggle) ==
443                            GTK_WIDGET (dlg->priv->text_right_toggle)) {
444                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
445                                                       (dlg->priv->text_left_toggle),
446                                                       FALSE);
447                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
448                                                       (dlg->priv->text_center_toggle),
449                                                       FALSE);
450                 }
451                                                                                 
452                 update_prefs_from_object_page (dlg);
453         }
454                                                                                 
455 }
456                                                                                 
457
458 /*--------------------------------------------------------------------------*/
459 /* PRIVATE.  Update locale page widgets from current prefs.                 */
460 /*--------------------------------------------------------------------------*/
461 static void
462 update_locale_page_from_prefs (glPrefsDialog *dlg)
463 {
464         g_signal_handlers_block_by_func (
465                 G_OBJECT(dlg->priv->units_points_radio),
466                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
467         g_signal_handlers_block_by_func (
468                 G_OBJECT(dlg->priv->units_inches_radio),
469                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
470         g_signal_handlers_block_by_func (
471                 G_OBJECT(dlg->priv->units_mm_radio),
472                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
473         g_signal_handlers_block_by_func (
474                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
475                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
476         g_signal_handlers_block_by_func (
477                 G_OBJECT(dlg->priv->page_size_a4_radio),
478                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
479
480         switch (gl_prefs->units) {
481         case GL_UNITS_POINT:
482                 gtk_toggle_button_set_active (
483                         GTK_TOGGLE_BUTTON(dlg->priv->units_points_radio),
484                         TRUE);
485                 break;
486         case GL_UNITS_INCH:
487                 gtk_toggle_button_set_active (
488                         GTK_TOGGLE_BUTTON(dlg->priv->units_inches_radio),
489                         TRUE);
490                 break;
491         case GL_UNITS_MM:
492                 gtk_toggle_button_set_active (
493                         GTK_TOGGLE_BUTTON(dlg->priv->units_mm_radio),
494                         TRUE);
495                 break;
496         default:
497                 g_warning ("Illegal units");    /* Should not happen */
498                 break;
499         }
500
501         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0) {
502                 gtk_toggle_button_set_active (
503                         GTK_TOGGLE_BUTTON(dlg->priv->page_size_us_letter_radio),
504                         TRUE);
505         } else if ( g_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0) {
506                 gtk_toggle_button_set_active (
507                         GTK_TOGGLE_BUTTON(dlg->priv->page_size_a4_radio),
508                         TRUE);
509         } else {
510                 g_warning ("Unknown default page size"); /* Shouldn't happen */
511         }
512
513         g_signal_handlers_unblock_by_func (
514                 G_OBJECT(dlg->priv->units_points_radio),
515                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
516         g_signal_handlers_unblock_by_func (
517                 G_OBJECT(dlg->priv->units_inches_radio),
518                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
519         g_signal_handlers_unblock_by_func (
520                 G_OBJECT(dlg->priv->units_mm_radio),
521                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
522         g_signal_handlers_unblock_by_func (
523                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
524                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
525         g_signal_handlers_unblock_by_func (
526                 G_OBJECT(dlg->priv->page_size_a4_radio),
527                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
528 }
529
530 /*--------------------------------------------------------------------------*/
531 /* PRIVATE.  Update object page widgets from current prefs.                 */
532 /*--------------------------------------------------------------------------*/
533 static void
534 update_object_page_from_prefs (glPrefsDialog *dlg)
535 {
536         GList    *family_names;
537         gchar    *good_font_family;
538         GdkColor *gdk_color;
539  
540         g_signal_handlers_block_by_func (
541                 G_OBJECT(dlg->priv->text_family_entry),
542                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
543         g_signal_handlers_block_by_func (
544                 G_OBJECT(dlg->priv->text_size_spin),
545                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
546         g_signal_handlers_block_by_func (
547                 G_OBJECT(dlg->priv->text_bold_toggle),
548                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
549         g_signal_handlers_block_by_func (
550                 G_OBJECT(dlg->priv->text_italic_toggle),
551                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
552         g_signal_handlers_block_by_func (
553                 G_OBJECT(dlg->priv->text_color_combo),
554                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
555         g_signal_handlers_block_by_func (
556                 G_OBJECT(dlg->priv->text_left_toggle),
557                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
558         g_signal_handlers_block_by_func (
559                 G_OBJECT(dlg->priv->text_center_toggle),
560                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
561         g_signal_handlers_block_by_func (
562                 G_OBJECT(dlg->priv->text_right_toggle),
563                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
564         g_signal_handlers_block_by_func (
565                 G_OBJECT(dlg->priv->text_line_spacing_spin),
566                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
567         g_signal_handlers_block_by_func (
568                 G_OBJECT(dlg->priv->line_width_spin),
569                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
570         g_signal_handlers_block_by_func (
571                 G_OBJECT(dlg->priv->line_color_combo),
572                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
573         g_signal_handlers_block_by_func (
574                 G_OBJECT(dlg->priv->fill_color_combo),
575                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
576
577
578         /* Make sure we have a valid font family.  if not provide a good default. */
579         family_names = gnome_font_family_list ();
580         if (g_list_find_custom (family_names,
581                                 gl_prefs->default_font_family,
582                                 (GCompareFunc)g_utf8_collate)) {
583                 good_font_family = g_strdup (gl_prefs->default_font_family);
584         } else {
585                 if (family_names != NULL) {
586                         good_font_family = g_strdup (family_names->data); /* 1st entry */
587                 } else {
588                         good_font_family = NULL;
589                 }
590         }
591         gnome_font_family_list_free (family_names);
592         gtk_entry_set_text (GTK_ENTRY (dlg->priv->text_family_entry), good_font_family);
593         g_free (good_font_family);
594
595         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->priv->text_size_spin),
596                                    gl_prefs->default_font_size);
597  
598         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_bold_toggle),
599                                       (gl_prefs->default_font_weight == GNOME_FONT_BOLD));
600  
601         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_italic_toggle),
602                                       gl_prefs->default_font_italic_flag);
603  
604         gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color);
605         color_combo_set_color (COLOR_COMBO(dlg->priv->text_color_combo), gdk_color);
606         g_free (gdk_color);
607
608         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_left_toggle),
609                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT));
610         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_center_toggle),
611                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER));
612         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_right_toggle),
613                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT));
614
615         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->priv->text_line_spacing_spin),
616                                    gl_prefs->default_text_line_spacing);
617
618         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->priv->line_width_spin),
619                                    gl_prefs->default_line_width);
620  
621         gdk_color = gl_color_to_gdk_color (gl_prefs->default_line_color);
622         color_combo_set_color (COLOR_COMBO(dlg->priv->line_color_combo), gdk_color);
623         g_free (gdk_color);
624
625
626         gdk_color = gl_color_to_gdk_color (gl_prefs->default_fill_color);
627         color_combo_set_color (COLOR_COMBO(dlg->priv->fill_color_combo), gdk_color);
628         g_free (gdk_color);
629
630
631         g_signal_handlers_unblock_by_func (
632                 G_OBJECT(dlg->priv->text_family_entry),
633                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
634         g_signal_handlers_unblock_by_func (
635                 G_OBJECT(dlg->priv->text_size_spin),
636                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
637         g_signal_handlers_unblock_by_func (
638                 G_OBJECT(dlg->priv->text_bold_toggle),
639                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
640         g_signal_handlers_unblock_by_func (
641                 G_OBJECT(dlg->priv->text_italic_toggle),
642                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
643         g_signal_handlers_unblock_by_func (
644                 G_OBJECT(dlg->priv->text_color_combo),
645                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
646         g_signal_handlers_unblock_by_func (
647                 G_OBJECT(dlg->priv->text_left_toggle),
648                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
649         g_signal_handlers_unblock_by_func (
650                 G_OBJECT(dlg->priv->text_center_toggle),
651                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
652         g_signal_handlers_unblock_by_func (
653                 G_OBJECT(dlg->priv->text_right_toggle),
654                 G_CALLBACK(align_toggle_cb), G_OBJECT(dlg));
655         g_signal_handlers_unblock_by_func (
656                 G_OBJECT(dlg->priv->text_line_spacing_spin),
657                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
658         g_signal_handlers_unblock_by_func (
659                 G_OBJECT(dlg->priv->line_width_spin),
660                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
661         g_signal_handlers_unblock_by_func (
662                 G_OBJECT(dlg->priv->line_color_combo),
663                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
664         g_signal_handlers_unblock_by_func (
665                 G_OBJECT(dlg->priv->fill_color_combo),
666                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
667 }
668
669 /*--------------------------------------------------------------------------*/
670 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
671 /*--------------------------------------------------------------------------*/
672 static void
673 update_prefs_from_locale_page (glPrefsDialog *dlg)
674 {
675         if (gtk_toggle_button_get_active (
676                     GTK_TOGGLE_BUTTON(dlg->priv->units_points_radio))) {
677                 gl_prefs->units = GL_UNITS_POINT;
678         }
679         if (gtk_toggle_button_get_active (
680                     GTK_TOGGLE_BUTTON(dlg->priv->units_inches_radio))) {
681                 gl_prefs->units = GL_UNITS_INCH;
682         }
683         if (gtk_toggle_button_get_active (
684                     GTK_TOGGLE_BUTTON(dlg->priv->units_mm_radio))) {
685                 gl_prefs->units = GL_UNITS_MM;
686         }
687
688         if (gtk_toggle_button_get_active (
689                     GTK_TOGGLE_BUTTON(dlg->priv->page_size_us_letter_radio))) {
690                 gl_prefs->default_page_size = US_LETTER_ID;
691         }
692         if (gtk_toggle_button_get_active (
693                     GTK_TOGGLE_BUTTON(dlg->priv->page_size_a4_radio))) {
694                 gl_prefs->default_page_size = A4_ID;
695         }
696
697         gl_prefs_model_save_settings (gl_prefs);
698 }
699
700 /*--------------------------------------------------------------------------*/
701 /* PRIVATE.  Update prefs from current state of object page widgets.        */
702 /*--------------------------------------------------------------------------*/
703 static void
704 update_prefs_from_object_page (glPrefsDialog *dlg)
705 {
706         GdkColor *gdk_color;
707         gboolean  is_default;
708
709
710         g_free (gl_prefs->default_font_family);
711         gl_prefs->default_font_family =
712                 gtk_editable_get_chars (GTK_EDITABLE (dlg->priv->text_family_entry),
713                                         0, -1);
714         gl_prefs->default_font_size =
715                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dlg->priv->text_size_spin));
716
717         if (gtk_toggle_button_get_active
718             (GTK_TOGGLE_BUTTON (dlg->priv->text_bold_toggle))) {
719                 gl_prefs->default_font_weight = GNOME_FONT_BOLD;
720         } else {
721                 gl_prefs->default_font_weight = GNOME_FONT_BOOK;
722         }
723
724         gl_prefs->default_font_italic_flag =
725                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
726                                               (dlg->priv->text_italic_toggle));
727
728         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->text_color_combo),
729                                            &is_default);
730         if (!is_default) {
731                 gl_prefs->default_text_color = gl_color_from_gdk_color (gdk_color);
732         }
733
734         if (gtk_toggle_button_get_active
735             (GTK_TOGGLE_BUTTON (dlg->priv->text_left_toggle))) {
736                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
737         } else
738             if (gtk_toggle_button_get_active
739                 (GTK_TOGGLE_BUTTON (dlg->priv->text_right_toggle))) {
740                 gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT;
741         } else
742             if (gtk_toggle_button_get_active
743                 (GTK_TOGGLE_BUTTON (dlg->priv->text_center_toggle))) {
744                 gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER;
745         } else {
746                 /* Should not happen. */
747                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
748         }
749                                                                                 
750
751         gl_prefs->default_text_line_spacing =
752                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dlg->priv->text_line_spacing_spin));
753
754         gl_prefs->default_line_width =
755                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dlg->priv->line_width_spin));
756
757         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->line_color_combo),
758                                            &is_default);
759         if (!is_default) {
760                 gl_prefs->default_line_color = gl_color_from_gdk_color (gdk_color);
761         }
762
763
764         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->fill_color_combo),
765                                            &is_default);
766         if (!is_default) {
767                 gl_prefs->default_fill_color = gl_color_from_gdk_color (gdk_color);
768         }
769
770         gl_prefs_model_save_settings (gl_prefs);
771 }
772
773
774