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