2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * prefs-dialog.c: Preferences dialog module
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
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.
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.
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
24 #include <libgnome/libgnome.h>
25 #include <libgnomeui/libgnomeui.h>
27 #include "prefs-dialog.h"
29 #include "wdgt-line.h"
30 #include "wdgt-fill.h"
31 #include "wdgt-text-props.h"
34 /*========================================================*/
35 /* Private macros and constants. */
36 /*========================================================*/
38 #define US_LETTER "US Letter"
41 /*========================================================*/
43 /*========================================================*/
45 struct _glPrefsDialogPrivate
47 GtkWidget* categories_tree;
51 GtkTreeModel *categories_tree_model;
54 GtkWidget *units_points_radio;
55 GtkWidget *units_inches_radio;
56 GtkWidget *units_mm_radio;
59 GtkWidget *page_size_us_letter_radio;
60 GtkWidget *page_size_a4_radio;
62 /* Default text properties */
65 /* Default line properties */
68 /* Default fill properties */
72 /*========================================================*/
73 /* Private globals. */
74 /*========================================================*/
76 static GtkDialogClass* parent_class = NULL;
78 /*========================================================*/
79 /* Private function prototypes. */
80 /*========================================================*/
82 static void gl_prefs_dialog_class_init (glPrefsDialogClass *klass);
83 static void gl_prefs_dialog_init (glPrefsDialog *dlg);
84 static void gl_prefs_dialog_finalize (GObject *object);
85 static void gl_prefs_dialog_construct (glPrefsDialog *dlg);
87 static void response_cb (glPrefsDialog *dialog,
91 static GtkWidget *locale_page (glPrefsDialog *dlg);
92 static GtkWidget *object_page (glPrefsDialog *dlg);
94 static update_locale_page_from_prefs (glPrefsDialog *dlg);
95 static update_object_page_from_prefs (glPrefsDialog *dlg);
97 static update_prefs_from_locale_page (glPrefsDialog *dlg);
98 static update_prefs_from_object_page (glPrefsDialog *dlg);
101 /*****************************************************************************/
102 /* Boilerplate object stuff. */
103 /*****************************************************************************/
105 gl_prefs_dialog_get_type (void)
107 static GType dialog_type = 0;
111 static const GTypeInfo dialog_info =
113 sizeof (glPrefsDialogClass),
114 NULL, /* base_init */
115 NULL, /* base_finalize */
116 (GClassInitFunc) gl_prefs_dialog_class_init,
117 NULL, /* class_finalize */
118 NULL, /* class_data */
119 sizeof (glPrefsDialog),
121 (GInstanceInitFunc) gl_prefs_dialog_init
124 dialog_type = g_type_register_static (GL_TYPE_HIG_DIALOG,
134 gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
136 GObjectClass *object_class = G_OBJECT_CLASS (klass);
138 gl_debug (DEBUG_PREFS, "");
140 parent_class = g_type_class_peek_parent (klass);
142 object_class->finalize = gl_prefs_dialog_finalize;
146 gl_prefs_dialog_init (glPrefsDialog *dlg)
148 gl_debug (DEBUG_PREFS, "");
150 dlg->private = g_new0 (glPrefsDialogPrivate, 1);
154 gl_prefs_dialog_finalize (GObject *object)
158 gl_debug (DEBUG_PREFS, "");
160 g_return_if_fail (object != NULL);
162 dlg = GL_PREFS_DIALOG (object);
164 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
165 g_return_if_fail (dlg->private != NULL);
167 G_OBJECT_CLASS (parent_class)->finalize (object);
169 g_free (dlg->private);
172 /*****************************************************************************/
173 /* NEW preferences dialog. */
174 /*****************************************************************************/
176 gl_prefs_dialog_new (GtkWindow *parent)
180 gl_debug (DEBUG_PREFS, "");
182 dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
185 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
187 gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
192 /*---------------------------------------------------------------------------*/
193 /* PRIVATE. Construct composite widget. */
194 /*---------------------------------------------------------------------------*/
196 gl_prefs_dialog_construct (glPrefsDialog *dlg)
198 GtkWidget *notebook, *wlabel, *wvbox, *wvbox1, *whbox, *wframe;
199 GSList *radio_group = NULL;
201 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
202 g_return_if_fail (dlg->private != NULL);
204 gtk_dialog_add_button (GTK_DIALOG(dlg),
205 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
207 gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
209 g_signal_connect(G_OBJECT (dlg), "response",
210 G_CALLBACK (response_cb), NULL);
212 notebook = gtk_notebook_new ();
213 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
215 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
217 gtk_label_new (_("Locale")));
219 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
221 gtk_label_new (_("Object defaults")));
223 update_locale_page_from_prefs (dlg);
224 update_object_page_from_prefs (dlg);
226 gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);
228 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
229 gtk_window_set_title (GTK_WINDOW (dlg), _("Preferences"));
230 gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
233 /*---------------------------------------------------------------------------*/
234 /* PRIVATE. "Response" callback. */
235 /*---------------------------------------------------------------------------*/
237 response_cb (glPrefsDialog *dlg,
241 gl_debug (DEBUG_VIEW, "START");
243 g_return_if_fail(dlg != NULL);
244 g_return_if_fail(GTK_IS_DIALOG(dlg));
247 case GTK_RESPONSE_CLOSE:
248 gtk_widget_hide (GTK_WIDGET(dlg));
251 g_assert_not_reached();
254 gl_debug (DEBUG_VIEW, "END");
257 /*--------------------------------------------------------------------------*/
258 /* PRIVATE. Build Locale Properties Notebook Tab */
259 /*--------------------------------------------------------------------------*/
261 locale_page (glPrefsDialog *dlg)
263 GtkWidget *wlabel, *wvbox, *wframe;
264 GSList *radio_group = NULL;
266 wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
268 wlabel = gtk_label_new (_("Select locale specific behavior."));
269 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
270 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
272 /* ----- Display Units Frame ------------------------------------ */
273 wframe = gl_hig_category_new (_("Display units"));
274 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
278 dlg->private->units_points_radio =
279 gtk_radio_button_new_with_label (radio_group, _("Points"));
281 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
282 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
283 dlg->private->units_points_radio);
285 dlg->private->units_inches_radio =
286 gtk_radio_button_new_with_label (radio_group, _("Inches"));
288 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
289 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
290 dlg->private->units_inches_radio);
292 dlg->private->units_mm_radio =
293 gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
295 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
296 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
297 dlg->private->units_mm_radio);
299 /* ----- Page Size Frame ------------------------------------ */
300 wframe = gl_hig_category_new (_("Default page size"));
301 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
305 dlg->private->page_size_us_letter_radio =
306 gtk_radio_button_new_with_label (radio_group, US_LETTER);
308 gtk_radio_button_get_group (GTK_RADIO_BUTTON
309 (dlg->private->page_size_us_letter_radio));
310 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
311 dlg->private->page_size_us_letter_radio);
313 dlg->private->page_size_a4_radio =
314 gtk_radio_button_new_with_label (radio_group, A4);
316 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
317 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
318 dlg->private->page_size_a4_radio);
320 g_signal_connect_swapped (
321 G_OBJECT(dlg->private->units_points_radio),
322 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
323 g_signal_connect_swapped (
324 G_OBJECT(dlg->private->units_inches_radio),
325 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
326 g_signal_connect_swapped (
327 G_OBJECT(dlg->private->units_mm_radio),
328 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
329 g_signal_connect_swapped (
330 G_OBJECT(dlg->private->page_size_us_letter_radio),
331 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
332 g_signal_connect_swapped (
333 G_OBJECT(dlg->private->page_size_a4_radio),
334 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
339 /*--------------------------------------------------------------------------*/
340 /* PRIVATE. Build Default Object Properties Notebook Tab */
341 /*--------------------------------------------------------------------------*/
343 object_page (glPrefsDialog *dlg)
345 GtkWidget *wlabel, *wvbox, *wframe;
346 GtkSizeGroup *label_size_group;
348 wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
349 label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
351 wlabel = gtk_label_new (_("Select default properties for new objects."));
352 gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
353 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
355 /* ------ text props entry ------ */
356 wframe = gl_hig_category_new (_("Text"));
357 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
358 dlg->private->text = gl_wdgt_text_props_new ();
359 gl_wdgt_text_props_set_label_size_group (GL_WDGT_TEXT_PROPS(dlg->private->text),
361 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
364 /* ------ Line box ------ */
365 wframe = gl_hig_category_new (_("Line"));
366 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
367 dlg->private->line = gl_wdgt_line_new ();
368 gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(dlg->private->line),
370 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
373 /* ------ Fill box ------ */
374 wframe = gl_hig_category_new (_("Fill"));
375 gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
376 dlg->private->fill = gl_wdgt_fill_new ();
377 gl_wdgt_fill_set_label_size_group (GL_WDGT_FILL(dlg->private->fill),
379 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
382 g_signal_connect_swapped (G_OBJECT(dlg->private->text),
384 G_CALLBACK(update_prefs_from_object_page),
386 g_signal_connect_swapped (G_OBJECT(dlg->private->line),
388 G_CALLBACK(update_prefs_from_object_page),
390 g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
392 G_CALLBACK(update_prefs_from_object_page),
398 /*--------------------------------------------------------------------------*/
399 /* PRIVATE. Update locale page widgets from current prefs. */
400 /*--------------------------------------------------------------------------*/
401 static update_locale_page_from_prefs (glPrefsDialog *dlg)
403 g_signal_handlers_block_by_func (
404 G_OBJECT(dlg->private->units_points_radio),
405 G_CALLBACK(update_prefs_from_locale_page), dlg);
406 g_signal_handlers_block_by_func (
407 G_OBJECT(dlg->private->units_inches_radio),
408 G_CALLBACK(update_prefs_from_locale_page), dlg);
409 g_signal_handlers_block_by_func (
410 G_OBJECT(dlg->private->units_mm_radio),
411 G_CALLBACK(update_prefs_from_locale_page), dlg);
412 g_signal_handlers_block_by_func (
413 G_OBJECT(dlg->private->page_size_us_letter_radio),
414 G_CALLBACK(update_prefs_from_locale_page), dlg);
415 g_signal_handlers_block_by_func (
416 G_OBJECT(dlg->private->page_size_a4_radio),
417 G_CALLBACK(update_prefs_from_locale_page), dlg);
419 switch (gl_prefs->units) {
420 case GL_PREFS_UNITS_PTS:
421 gtk_toggle_button_set_active (
422 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
425 case GL_PREFS_UNITS_INCHES:
426 gtk_toggle_button_set_active (
427 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
430 case GL_PREFS_UNITS_MM:
431 gtk_toggle_button_set_active (
432 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
436 g_warning ("Illegal units"); /* Should not happen */
440 if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
441 gtk_toggle_button_set_active (
442 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
444 } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
445 gtk_toggle_button_set_active (
446 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
449 g_warning ("Unknown default page size"); /* Shouldn't happen */
452 g_signal_handlers_unblock_by_func (
453 G_OBJECT(dlg->private->units_points_radio),
454 G_CALLBACK(update_prefs_from_locale_page), dlg);
455 g_signal_handlers_unblock_by_func (
456 G_OBJECT(dlg->private->units_inches_radio),
457 G_CALLBACK(update_prefs_from_locale_page), dlg);
458 g_signal_handlers_unblock_by_func (
459 G_OBJECT(dlg->private->units_mm_radio),
460 G_CALLBACK(update_prefs_from_locale_page), dlg);
461 g_signal_handlers_unblock_by_func (
462 G_OBJECT(dlg->private->page_size_us_letter_radio),
463 G_CALLBACK(update_prefs_from_locale_page), dlg);
464 g_signal_handlers_unblock_by_func (
465 G_OBJECT(dlg->private->page_size_a4_radio),
466 G_CALLBACK(update_prefs_from_locale_page), dlg);
469 /*--------------------------------------------------------------------------*/
470 /* PRIVATE. Update object page widgets from current prefs. */
471 /*--------------------------------------------------------------------------*/
472 static update_object_page_from_prefs (glPrefsDialog *dlg)
474 g_signal_handlers_block_by_func (
475 G_OBJECT(dlg->private->text),
476 G_CALLBACK(update_prefs_from_object_page), dlg);
477 g_signal_handlers_block_by_func (
478 G_OBJECT(dlg->private->line),
479 G_CALLBACK(update_prefs_from_object_page), dlg);
480 g_signal_handlers_block_by_func (
481 G_OBJECT(dlg->private->fill),
482 G_CALLBACK(update_prefs_from_object_page), dlg);
484 gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
485 gl_prefs->default_font_family,
486 gl_prefs->default_font_size,
487 gl_prefs->default_font_weight,
488 gl_prefs->default_font_italic_flag,
489 gl_prefs->default_text_color,
490 gl_prefs->default_text_alignment);
492 gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
493 gl_prefs->default_line_width,
494 gl_prefs->default_line_color);
496 gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
497 gl_prefs->default_fill_color);
499 g_signal_handlers_unblock_by_func (
500 G_OBJECT(dlg->private->text),
501 G_CALLBACK(update_prefs_from_object_page), dlg);
502 g_signal_handlers_unblock_by_func (
503 G_OBJECT(dlg->private->line),
504 G_CALLBACK(update_prefs_from_object_page), dlg);
505 g_signal_handlers_unblock_by_func (
506 G_OBJECT(dlg->private->fill),
507 G_CALLBACK(update_prefs_from_object_page), dlg);
510 /*--------------------------------------------------------------------------*/
511 /* PRIVATE. Update prefs from current state of locale page widgets. */
512 /*--------------------------------------------------------------------------*/
513 static update_prefs_from_locale_page (glPrefsDialog *dlg)
515 if (gtk_toggle_button_get_active (
516 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio)) == 0) {
517 gl_prefs->units = GL_PREFS_UNITS_PTS;
519 if (gtk_toggle_button_get_active (
520 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio)) == 0) {
521 gl_prefs->units = GL_PREFS_UNITS_INCHES;
523 if (gtk_toggle_button_get_active (
524 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio)) == 0) {
525 gl_prefs->units = GL_PREFS_UNITS_MM;
528 if (gtk_toggle_button_get_active (
529 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio)) == 0) {
530 gl_prefs->default_page_size = US_LETTER;
532 if (gtk_toggle_button_get_active (
533 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio)) == 0) {
534 gl_prefs->default_page_size = A4;
537 gl_prefs_save_settings ();
540 /*--------------------------------------------------------------------------*/
541 /* PRIVATE. Update prefs from current state of object page widgets. */
542 /*--------------------------------------------------------------------------*/
543 static update_prefs_from_object_page (glPrefsDialog *dlg)
545 gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
546 &gl_prefs->default_font_family,
547 &gl_prefs->default_font_size,
548 &gl_prefs->default_font_weight,
549 &gl_prefs->default_font_italic_flag,
550 &gl_prefs->default_text_color,
551 &gl_prefs->default_text_alignment);
553 gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
554 &gl_prefs->default_line_width,
555 &gl_prefs->default_line_color);
557 gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
558 &gl_prefs->default_fill_color);
560 gl_prefs_save_settings ();