]> git.sur5r.net Git - glabels/blob - glabels2/src/prefs-dialog.c
Changed object property dialogs to a single object property editor sidebar.
[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
69         /* Default line properties */
70         GtkWidget       *line_width_spin;
71         GtkWidget       *line_color_combo;
72
73         /* Default fill properties */
74         GtkWidget       *fill_color_combo;
75 };
76
77 /*========================================================*/
78 /* Private globals.                                       */
79 /*========================================================*/
80
81 static glHigDialogClass* parent_class = NULL;
82
83 /*========================================================*/
84 /* Private function prototypes.                           */
85 /*========================================================*/
86
87 static void gl_prefs_dialog_class_init    (glPrefsDialogClass *klass);
88 static void gl_prefs_dialog_init          (glPrefsDialog      *dlg);
89 static void gl_prefs_dialog_finalize      (GObject            *object);
90 static void gl_prefs_dialog_construct     (glPrefsDialog      *dlg);
91
92 static void response_cb                   (glPrefsDialog      *dialog,
93                                            gint                response,
94                                            gpointer            user_data);
95
96 static void construct_locale_page         (glPrefsDialog      *dlg);
97 static void construct_object_page         (glPrefsDialog      *dlg);
98
99 static void align_toggle_cb               (GtkToggleButton    *toggle,
100                                            glPrefsDialog      *dlg);
101                                                                                 
102 static void update_locale_page_from_prefs (glPrefsDialog      *dlg);
103 static void update_object_page_from_prefs (glPrefsDialog      *dlg);
104
105 static void update_prefs_from_locale_page (glPrefsDialog      *dlg);
106 static void update_prefs_from_object_page (glPrefsDialog      *dlg);
107
108 \f
109 /*****************************************************************************/
110 /* Boilerplate object stuff.                                                 */
111 /*****************************************************************************/
112 GType
113 gl_prefs_dialog_get_type (void)
114 {
115         static GType dialog_type = 0;
116
117         if (!dialog_type)
118         {
119                 static const GTypeInfo dialog_info =
120                 {
121                         sizeof (glPrefsDialogClass),
122                         NULL,           /* base_init */
123                         NULL,           /* base_finalize */
124                         (GClassInitFunc) gl_prefs_dialog_class_init,
125                         NULL,           /* class_finalize */
126                         NULL,           /* class_data */
127                         sizeof (glPrefsDialog),
128                         0,              /* n_preallocs */
129                         (GInstanceInitFunc) gl_prefs_dialog_init
130                 };
131
132                 dialog_type = g_type_register_static (GL_TYPE_HIG_DIALOG,
133                                                       "glPrefsDialog",
134                                                       &dialog_info, 
135                                                       0);
136         }
137
138         return dialog_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 ("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
203         dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
204
205         if (parent)
206                 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
207         
208         gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
209
210
211         gl_debug (DEBUG_PREFS, "END");
212
213         return dlg;
214 }
215
216 /*---------------------------------------------------------------------------*/
217 /* PRIVATE.  Construct composite widget.                                     */
218 /*---------------------------------------------------------------------------*/
219 static void
220 gl_prefs_dialog_construct (glPrefsDialog *dlg)
221 {
222         GtkWidget *notebook;
223
224         g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
225         g_return_if_fail (dlg->priv != NULL);
226
227         gtk_dialog_add_button (GTK_DIALOG(dlg),
228                                GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
229
230         gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
231
232         g_signal_connect(G_OBJECT (dlg), "response",
233                          G_CALLBACK (response_cb), NULL);
234
235         notebook = glade_xml_get_widget (dlg->priv->gui, "prefs_notebook");
236         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
237
238         construct_locale_page (dlg);
239         construct_object_page (dlg);
240
241         update_locale_page_from_prefs (dlg);
242         update_object_page_from_prefs (dlg);
243
244         gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);   
245
246         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
247         gtk_window_set_title (GTK_WINDOW (dlg), _("gLabels Preferences"));
248         gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
249 }
250
251 /*---------------------------------------------------------------------------*/
252 /* PRIVATE.  "Response" callback.                                            */
253 /*---------------------------------------------------------------------------*/
254 static void
255 response_cb (glPrefsDialog *dlg,
256              gint          response,
257              gpointer      user_data)
258 {
259         gl_debug (DEBUG_VIEW, "START");
260
261         g_return_if_fail(dlg != NULL);
262         g_return_if_fail(GTK_IS_DIALOG(dlg));
263
264         switch(response) {
265         case GTK_RESPONSE_CLOSE:
266                 gtk_widget_hide (GTK_WIDGET(dlg));
267                 break;
268         case GTK_RESPONSE_DELETE_EVENT:
269                 break;
270         default:
271                 g_print ("response = %d", response);
272                 g_assert_not_reached ();
273         }
274
275         gl_debug (DEBUG_VIEW, "END");
276 }
277
278 /*--------------------------------------------------------------------------*/
279 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
280 /*--------------------------------------------------------------------------*/
281 static void
282 construct_locale_page (glPrefsDialog *dlg)
283 {
284
285         dlg->priv->units_points_radio =
286                 glade_xml_get_widget (dlg->priv->gui, "units_points_radio");
287
288         dlg->priv->units_inches_radio =
289                 glade_xml_get_widget (dlg->priv->gui, "units_inches_radio");
290
291         dlg->priv->units_mm_radio =
292                 glade_xml_get_widget (dlg->priv->gui, "units_mm_radio");
293
294         dlg->priv->page_size_us_letter_radio =
295                 glade_xml_get_widget (dlg->priv->gui, "page_size_us_letter_radio");
296
297         dlg->priv->page_size_a4_radio =
298                 glade_xml_get_widget (dlg->priv->gui, "page_size_a4_radio");
299
300         g_signal_connect_swapped (
301                 G_OBJECT(dlg->priv->units_points_radio),
302                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
303         g_signal_connect_swapped (
304                 G_OBJECT(dlg->priv->units_inches_radio),
305                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
306         g_signal_connect_swapped (
307                 G_OBJECT(dlg->priv->units_mm_radio),
308                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
309         g_signal_connect_swapped (
310                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
311                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
312         g_signal_connect_swapped (
313                 G_OBJECT(dlg->priv->page_size_a4_radio),
314                 "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
315 }
316
317 /*--------------------------------------------------------------------------*/
318 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
319 /*--------------------------------------------------------------------------*/
320 static void
321 construct_object_page (glPrefsDialog *dlg)
322 {
323         GList    *family_names;
324
325         dlg->priv->text_family_entry =
326                 glade_xml_get_widget (dlg->priv->gui, "text_family_entry");
327         dlg->priv->text_family_combo =
328                 glade_xml_get_widget (dlg->priv->gui, "text_family_combo");
329         dlg->priv->text_size_spin =
330                 glade_xml_get_widget (dlg->priv->gui, "text_size_spin");
331         dlg->priv->text_bold_toggle =
332                 glade_xml_get_widget (dlg->priv->gui, "text_bold_toggle");
333         dlg->priv->text_italic_toggle =
334                 glade_xml_get_widget (dlg->priv->gui, "text_italic_toggle");
335         dlg->priv->text_color_combo =
336                 glade_xml_get_widget (dlg->priv->gui, "text_color_combo");
337         dlg->priv->text_left_toggle =
338                 glade_xml_get_widget (dlg->priv->gui, "text_left_toggle");
339         dlg->priv->text_center_toggle =
340                 glade_xml_get_widget (dlg->priv->gui, "text_center_toggle");
341         dlg->priv->text_right_toggle =
342                 glade_xml_get_widget (dlg->priv->gui, "text_right_toggle");
343
344         dlg->priv->line_width_spin =
345                 glade_xml_get_widget (dlg->priv->gui, "line_width_spin");
346         dlg->priv->line_color_combo =
347                 glade_xml_get_widget (dlg->priv->gui, "line_color_combo");
348
349         dlg->priv->fill_color_combo =
350                 glade_xml_get_widget (dlg->priv->gui, "fill_color_combo");
351
352         /* Load family names */
353         family_names = gnome_font_family_list ();
354         gtk_combo_set_popdown_strings (GTK_COMBO(dlg->priv->text_family_combo),
355                                        family_names);
356         gnome_font_family_list_free (family_names);
357                                                                                 
358
359         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_family_entry),
360                                   "changed",
361                                   G_CALLBACK(update_prefs_from_object_page),
362                                   G_OBJECT(dlg));
363         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_size_spin),
364                                   "changed",
365                                   G_CALLBACK(update_prefs_from_object_page),
366                                   G_OBJECT(dlg));
367         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_bold_toggle),
368                                   "toggled",
369                                   G_CALLBACK(update_prefs_from_object_page),
370                                   G_OBJECT(dlg));
371         g_signal_connect_swapped (G_OBJECT(dlg->priv->text_italic_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_color_combo),
376                                   "color_changed",
377                                   G_CALLBACK(update_prefs_from_object_page),
378                                   G_OBJECT(dlg));
379
380         g_signal_connect (G_OBJECT(dlg->priv->text_left_toggle),
381                           "toggled",
382                           G_CALLBACK(align_toggle_cb),
383                           G_OBJECT(dlg));
384         g_signal_connect (G_OBJECT(dlg->priv->text_center_toggle),
385                           "toggled",
386                           G_CALLBACK(align_toggle_cb),
387                           G_OBJECT(dlg));
388         g_signal_connect (G_OBJECT(dlg->priv->text_right_toggle),
389                           "toggled",
390                           G_CALLBACK(align_toggle_cb),
391                           G_OBJECT(dlg));
392
393         g_signal_connect_swapped (G_OBJECT(dlg->priv->line_width_spin),
394                                   "changed",
395                                   G_CALLBACK(update_prefs_from_object_page),
396                                   G_OBJECT(dlg));
397         g_signal_connect_swapped (G_OBJECT(dlg->priv->line_color_combo),
398                                   "color_changed",
399                                   G_CALLBACK(update_prefs_from_object_page),
400                                   G_OBJECT(dlg));
401
402         g_signal_connect_swapped (G_OBJECT(dlg->priv->fill_color_combo),
403                                   "color_changed",
404                                   G_CALLBACK(update_prefs_from_object_page),
405                                   G_OBJECT(dlg));
406 }
407
408
409 /*--------------------------------------------------------------------------*/
410 /* PRIVATE.  Alignment togglebutton callback.                               */
411 /*--------------------------------------------------------------------------*/
412 static void
413 align_toggle_cb (GtkToggleButton *toggle,
414                  glPrefsDialog   *dlg)
415 {
416         if (gtk_toggle_button_get_active (toggle)) {
417   
418                 if (GTK_WIDGET (toggle) == GTK_WIDGET (dlg->priv->text_left_toggle)) {
419                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
420                                                       (dlg->priv->text_center_toggle),
421                                                       FALSE);
422                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
423                                                       (dlg->priv->text_right_toggle),
424                                                       FALSE);
425                 } else if (GTK_WIDGET (toggle) ==
426                            GTK_WIDGET (dlg->priv->text_center_toggle)) {
427                         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
428                                                       (dlg->priv->text_left_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_right_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_center_toggle),
440                                                       FALSE);
441                 }
442                                                                                 
443                 update_prefs_from_object_page (dlg);
444         }
445                                                                                 
446 }
447                                                                                 
448
449 /*--------------------------------------------------------------------------*/
450 /* PRIVATE.  Update locale page widgets from current prefs.                 */
451 /*--------------------------------------------------------------------------*/
452 static void
453 update_locale_page_from_prefs (glPrefsDialog *dlg)
454 {
455         g_signal_handlers_block_by_func (
456                 G_OBJECT(dlg->priv->units_points_radio),
457                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
458         g_signal_handlers_block_by_func (
459                 G_OBJECT(dlg->priv->units_inches_radio),
460                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
461         g_signal_handlers_block_by_func (
462                 G_OBJECT(dlg->priv->units_mm_radio),
463                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
464         g_signal_handlers_block_by_func (
465                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
466                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
467         g_signal_handlers_block_by_func (
468                 G_OBJECT(dlg->priv->page_size_a4_radio),
469                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
470
471         switch (gl_prefs->units) {
472         case GL_PREFS_UNITS_PTS:
473                 gtk_toggle_button_set_active (
474                         GTK_TOGGLE_BUTTON(dlg->priv->units_points_radio),
475                         TRUE);
476                 break;
477         case GL_PREFS_UNITS_INCHES:
478                 gtk_toggle_button_set_active (
479                         GTK_TOGGLE_BUTTON(dlg->priv->units_inches_radio),
480                         TRUE);
481                 break;
482         case GL_PREFS_UNITS_MM:
483                 gtk_toggle_button_set_active (
484                         GTK_TOGGLE_BUTTON(dlg->priv->units_mm_radio),
485                         TRUE);
486                 break;
487         default:
488                 g_warning ("Illegal units");    /* Should not happen */
489                 break;
490         }
491
492         if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0) {
493                 gtk_toggle_button_set_active (
494                         GTK_TOGGLE_BUTTON(dlg->priv->page_size_us_letter_radio),
495                         TRUE);
496         } else if ( g_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0) {
497                 gtk_toggle_button_set_active (
498                         GTK_TOGGLE_BUTTON(dlg->priv->page_size_a4_radio),
499                         TRUE);
500         } else {
501                 g_warning ("Unknown default page size"); /* Shouldn't happen */
502         }
503
504         g_signal_handlers_unblock_by_func (
505                 G_OBJECT(dlg->priv->units_points_radio),
506                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
507         g_signal_handlers_unblock_by_func (
508                 G_OBJECT(dlg->priv->units_inches_radio),
509                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
510         g_signal_handlers_unblock_by_func (
511                 G_OBJECT(dlg->priv->units_mm_radio),
512                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
513         g_signal_handlers_unblock_by_func (
514                 G_OBJECT(dlg->priv->page_size_us_letter_radio),
515                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
516         g_signal_handlers_unblock_by_func (
517                 G_OBJECT(dlg->priv->page_size_a4_radio),
518                 G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dlg));
519 }
520
521 /*--------------------------------------------------------------------------*/
522 /* PRIVATE.  Update object page widgets from current prefs.                 */
523 /*--------------------------------------------------------------------------*/
524 static void
525  update_object_page_from_prefs (glPrefsDialog *dlg)
526 {
527         GList    *family_names;
528         gchar    *good_font_family;
529         GdkColor *gdk_color;
530  
531         g_signal_handlers_block_by_func (
532                 G_OBJECT(dlg->priv->text_family_entry),
533                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
534         g_signal_handlers_block_by_func (
535                 G_OBJECT(dlg->priv->text_size_spin),
536                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
537         g_signal_handlers_block_by_func (
538                 G_OBJECT(dlg->priv->text_bold_toggle),
539                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
540         g_signal_handlers_block_by_func (
541                 G_OBJECT(dlg->priv->text_italic_toggle),
542                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
543         g_signal_handlers_block_by_func (
544                 G_OBJECT(dlg->priv->text_color_combo),
545                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
546         g_signal_handlers_block_by_func (
547                 G_OBJECT(dlg->priv->text_left_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_center_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_right_toggle),
554                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
555         g_signal_handlers_block_by_func (
556                 G_OBJECT(dlg->priv->line_width_spin),
557                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
558         g_signal_handlers_block_by_func (
559                 G_OBJECT(dlg->priv->line_color_combo),
560                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
561         g_signal_handlers_block_by_func (
562                 G_OBJECT(dlg->priv->fill_color_combo),
563                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
564
565
566         /* Make sure we have a valid font family.  if not provide a good default. */
567         family_names = gnome_font_family_list ();
568         if (g_list_find_custom (family_names,
569                                 gl_prefs->default_font_family,
570                                 (GCompareFunc)g_utf8_collate)) {
571                 good_font_family = g_strdup (gl_prefs->default_font_family);
572         } else {
573                 if (family_names != NULL) {
574                         good_font_family = g_strdup (family_names->data); /* 1st entry */
575                 } else {
576                         good_font_family = NULL;
577                 }
578         }
579         gnome_font_family_list_free (family_names);
580         gtk_entry_set_text (GTK_ENTRY (dlg->priv->text_family_entry), good_font_family);
581         g_free (good_font_family);
582
583         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->priv->text_size_spin),
584                                    gl_prefs->default_font_size);
585  
586         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_bold_toggle),
587                                       (gl_prefs->default_font_weight == GNOME_FONT_BOLD));
588  
589         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_italic_toggle),
590                                       gl_prefs->default_font_italic_flag);
591  
592         gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color);
593         color_combo_set_color (COLOR_COMBO(dlg->priv->text_color_combo), gdk_color);
594         g_free (gdk_color);
595
596         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_left_toggle),
597                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT));
598         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_center_toggle),
599                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER));
600         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->text_right_toggle),
601                                  (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT));
602
603
604         gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->priv->line_width_spin),
605                                    gl_prefs->default_line_width);
606  
607         gdk_color = gl_color_to_gdk_color (gl_prefs->default_line_color);
608         color_combo_set_color (COLOR_COMBO(dlg->priv->line_color_combo), gdk_color);
609         g_free (gdk_color);
610
611
612         gdk_color = gl_color_to_gdk_color (gl_prefs->default_fill_color);
613         color_combo_set_color (COLOR_COMBO(dlg->priv->fill_color_combo), gdk_color);
614         g_free (gdk_color);
615
616
617         g_signal_handlers_unblock_by_func (
618                 G_OBJECT(dlg->priv->text_family_entry),
619                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
620         g_signal_handlers_unblock_by_func (
621                 G_OBJECT(dlg->priv->text_size_spin),
622                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
623         g_signal_handlers_unblock_by_func (
624                 G_OBJECT(dlg->priv->text_bold_toggle),
625                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
626         g_signal_handlers_unblock_by_func (
627                 G_OBJECT(dlg->priv->text_italic_toggle),
628                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
629         g_signal_handlers_unblock_by_func (
630                 G_OBJECT(dlg->priv->text_color_combo),
631                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
632         g_signal_handlers_unblock_by_func (
633                 G_OBJECT(dlg->priv->text_left_toggle),
634                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
635         g_signal_handlers_unblock_by_func (
636                 G_OBJECT(dlg->priv->text_center_toggle),
637                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
638         g_signal_handlers_unblock_by_func (
639                 G_OBJECT(dlg->priv->text_right_toggle),
640                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
641         g_signal_handlers_unblock_by_func (
642                 G_OBJECT(dlg->priv->line_width_spin),
643                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
644         g_signal_handlers_unblock_by_func (
645                 G_OBJECT(dlg->priv->line_color_combo),
646                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
647         g_signal_handlers_unblock_by_func (
648                 G_OBJECT(dlg->priv->fill_color_combo),
649                 G_CALLBACK(update_prefs_from_object_page), G_OBJECT(dlg));
650 }
651
652 /*--------------------------------------------------------------------------*/
653 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
654 /*--------------------------------------------------------------------------*/
655 static void
656 update_prefs_from_locale_page (glPrefsDialog *dlg)
657 {
658         if (gtk_toggle_button_get_active (
659                     GTK_TOGGLE_BUTTON(dlg->priv->units_points_radio))) {
660                 gl_prefs->units = GL_PREFS_UNITS_PTS;
661         }
662         if (gtk_toggle_button_get_active (
663                     GTK_TOGGLE_BUTTON(dlg->priv->units_inches_radio))) {
664                 gl_prefs->units = GL_PREFS_UNITS_INCHES;
665         }
666         if (gtk_toggle_button_get_active (
667                     GTK_TOGGLE_BUTTON(dlg->priv->units_mm_radio))) {
668                 gl_prefs->units = GL_PREFS_UNITS_MM;
669         }
670
671         if (gtk_toggle_button_get_active (
672                     GTK_TOGGLE_BUTTON(dlg->priv->page_size_us_letter_radio))) {
673                 gl_prefs->default_page_size = US_LETTER_ID;
674         }
675         if (gtk_toggle_button_get_active (
676                     GTK_TOGGLE_BUTTON(dlg->priv->page_size_a4_radio))) {
677                 gl_prefs->default_page_size = A4_ID;
678         }
679
680         gl_prefs_save_settings ();
681 }
682
683 /*--------------------------------------------------------------------------*/
684 /* PRIVATE.  Update prefs from current state of object page widgets.        */
685 /*--------------------------------------------------------------------------*/
686 static void
687 update_prefs_from_object_page (glPrefsDialog *dlg)
688 {
689         GdkColor *gdk_color;
690         gboolean  is_default;
691
692
693         g_free (gl_prefs->default_font_family);
694         gl_prefs->default_font_family =
695                 gtk_editable_get_chars (GTK_EDITABLE (dlg->priv->text_family_entry),
696                                         0, -1);
697         gl_prefs->default_font_size =
698                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dlg->priv->text_size_spin));
699
700         if (gtk_toggle_button_get_active
701             (GTK_TOGGLE_BUTTON (dlg->priv->text_bold_toggle))) {
702                 gl_prefs->default_font_weight = GNOME_FONT_BOLD;
703         } else {
704                 gl_prefs->default_font_weight = GNOME_FONT_BOOK;
705         }
706
707         gl_prefs->default_font_italic_flag =
708                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
709                                               (dlg->priv->text_italic_toggle));
710
711         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->text_color_combo),
712                                            &is_default);
713         if (!is_default) {
714                 gl_prefs->default_text_color = gl_color_from_gdk_color (gdk_color);
715         }
716
717         if (gtk_toggle_button_get_active
718             (GTK_TOGGLE_BUTTON (dlg->priv->text_left_toggle))) {
719                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
720         } else
721             if (gtk_toggle_button_get_active
722                 (GTK_TOGGLE_BUTTON (dlg->priv->text_right_toggle))) {
723                 gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT;
724         } else
725             if (gtk_toggle_button_get_active
726                 (GTK_TOGGLE_BUTTON (dlg->priv->text_center_toggle))) {
727                 gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER;
728         } else {
729                 /* Should not happen. */
730                 gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
731         }
732                                                                                 
733
734         gl_prefs->default_line_width =
735                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(dlg->priv->line_width_spin));
736
737         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->line_color_combo),
738                                            &is_default);
739         if (!is_default) {
740                 gl_prefs->default_line_color = gl_color_from_gdk_color (gdk_color);
741         }
742
743
744         gdk_color = color_combo_get_color (COLOR_COMBO(dlg->priv->fill_color_combo),
745                                            &is_default);
746         if (!is_default) {
747                 gl_prefs->default_fill_color = gl_color_from_gdk_color (gdk_color);
748         }
749
750         gl_prefs_save_settings ();
751 }
752
753
754