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 "bonobo-mdi.h"
28 #include "prefs-dialog.h"
31 #include "wdgt-line.h"
32 #include "wdgt-fill.h"
33 #include "wdgt-text-props.h"
36 /*========================================================*/
37 /* Private macros and constants. */
38 /*========================================================*/
40 #define US_LETTER "US Letter"
43 /*========================================================*/
45 /*========================================================*/
47 struct _glPrefsDialogPrivate
49 GtkWidget* categories_tree;
53 GtkTreeModel *categories_tree_model;
56 GtkWidget *units_points_radio;
57 GtkWidget *units_inches_radio;
58 GtkWidget *units_mm_radio;
61 GtkWidget *page_size_us_letter_radio;
62 GtkWidget *page_size_a4_radio;
64 /* Default text properties */
67 /* Default line properties */
70 /* Default fill properties */
74 /*========================================================*/
75 /* Private globals. */
76 /*========================================================*/
78 static GtkDialogClass* parent_class = NULL;
80 /*========================================================*/
81 /* Private function prototypes. */
82 /*========================================================*/
84 static void gl_prefs_dialog_class_init (glPrefsDialogClass *klass);
85 static void gl_prefs_dialog_init (glPrefsDialog *dlg);
86 static void gl_prefs_dialog_finalize (GObject *object);
87 static void gl_prefs_dialog_construct (glPrefsDialog *dlg);
89 static void response_cb (glPrefsDialog *dialog,
93 static GtkWidget *locale_page (glPrefsDialog *dlg);
94 static GtkWidget *object_page (glPrefsDialog *dlg);
96 static update_locale_page_from_prefs (glPrefsDialog *dlg);
97 static update_object_page_from_prefs (glPrefsDialog *dlg);
99 static update_prefs_from_locale_page (glPrefsDialog *dlg);
100 static update_prefs_from_object_page (glPrefsDialog *dlg);
103 /*****************************************************************************/
104 /* Boilerplate object stuff. */
105 /*****************************************************************************/
107 gl_prefs_dialog_get_type (void)
109 static GType dialog_type = 0;
113 static const GTypeInfo dialog_info =
115 sizeof (glPrefsDialogClass),
116 NULL, /* base_init */
117 NULL, /* base_finalize */
118 (GClassInitFunc) gl_prefs_dialog_class_init,
119 NULL, /* class_finalize */
120 NULL, /* class_data */
121 sizeof (glPrefsDialog),
123 (GInstanceInitFunc) gl_prefs_dialog_init
126 dialog_type = g_type_register_static (GTK_TYPE_DIALOG,
136 gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
138 GObjectClass *object_class = G_OBJECT_CLASS (klass);
140 gl_debug (DEBUG_PREFS, "");
142 parent_class = g_type_class_peek_parent (klass);
144 object_class->finalize = gl_prefs_dialog_finalize;
148 gl_prefs_dialog_init (glPrefsDialog *dlg)
150 gl_debug (DEBUG_PREFS, "");
152 dlg->private = g_new0 (glPrefsDialogPrivate, 1);
156 gl_prefs_dialog_finalize (GObject *object)
160 gl_debug (DEBUG_PREFS, "");
162 g_return_if_fail (object != NULL);
164 dlg = GL_PREFS_DIALOG (object);
166 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
167 g_return_if_fail (dlg->private != NULL);
169 G_OBJECT_CLASS (parent_class)->finalize (object);
171 g_free (dlg->private);
174 /*****************************************************************************/
175 /* NEW preferences dialog. */
176 /*****************************************************************************/
178 gl_prefs_dialog_new (GtkWindow *parent)
182 gl_debug (DEBUG_PREFS, "");
184 dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
187 gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
189 gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
194 /*---------------------------------------------------------------------------*/
195 /* PRIVATE. Construct composite widget. */
196 /*---------------------------------------------------------------------------*/
198 gl_prefs_dialog_construct (glPrefsDialog *dlg)
200 GtkWidget *notebook, *wlabel, *wvbox, *wvbox1, *whbox, *wframe;
201 GSList *radio_group = NULL;
203 g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
204 g_return_if_fail (dlg->private != NULL);
206 gtk_dialog_add_button (GTK_DIALOG(dlg),
207 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
209 gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
211 g_signal_connect(G_OBJECT (dlg), "response",
212 G_CALLBACK (response_cb), NULL);
214 notebook = gtk_notebook_new ();
215 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg)->vbox),
216 notebook, TRUE, TRUE, 0);
218 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
220 gtk_label_new (_("Locale")));
222 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
224 gtk_label_new (_("Object defaults")));
226 update_locale_page_from_prefs (dlg);
227 update_object_page_from_prefs (dlg);
229 gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);
231 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
232 gtk_window_set_title (GTK_WINDOW (dlg), _("Preferences"));
233 gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
236 /*---------------------------------------------------------------------------*/
237 /* PRIVATE. "Response" callback. */
238 /*---------------------------------------------------------------------------*/
240 response_cb (glPrefsDialog *dlg,
244 gl_debug (DEBUG_VIEW, "START");
246 g_return_if_fail(dlg != NULL);
247 g_return_if_fail(GTK_IS_DIALOG(dlg));
250 case GTK_RESPONSE_CLOSE:
251 gtk_widget_hide (GTK_WIDGET(dlg));
254 g_assert_not_reached();
257 gl_debug (DEBUG_VIEW, "END");
260 /*--------------------------------------------------------------------------*/
261 /* PRIVATE. Build Locale Properties Notebook Tab */
262 /*--------------------------------------------------------------------------*/
264 locale_page (glPrefsDialog *dlg)
266 GtkWidget *wlabel, *wvbox, *whbox, *wvbox1, *wframe;
267 GSList *radio_group = NULL;
269 wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
270 gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
272 wlabel = gtk_label_new (_("Select locale specific behavior."));
273 gtk_box_pack_start (GTK_BOX (wvbox), wlabel, FALSE, FALSE, 0);
275 whbox = gtk_hbox_new (TRUE, GNOME_PAD);
276 gtk_box_pack_start (GTK_BOX (wvbox), whbox, FALSE, FALSE, 0);
278 /* ----- Display Units Frame ------------------------------------ */
279 wframe = gtk_frame_new (_("Display units"));
280 gtk_box_pack_start (GTK_BOX (whbox), wframe, FALSE, TRUE, 0);
282 wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
283 gtk_container_set_border_width (GTK_CONTAINER (wvbox1), 10);
284 gtk_container_add (GTK_CONTAINER (wframe), wvbox1);
288 dlg->private->units_points_radio =
289 gtk_radio_button_new_with_label (radio_group, _("Points"));
291 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
292 gtk_box_pack_start (GTK_BOX (wvbox1), dlg->private->units_points_radio,
295 dlg->private->units_inches_radio =
296 gtk_radio_button_new_with_label (radio_group, _("Inches"));
298 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
299 gtk_box_pack_start (GTK_BOX (wvbox1), dlg->private->units_inches_radio,
302 dlg->private->units_mm_radio =
303 gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
305 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
306 gtk_box_pack_start (GTK_BOX (wvbox1), dlg->private->units_mm_radio,
309 /* ----- Page Size Frame ------------------------------------ */
310 wframe = gtk_frame_new (_("Default page size"));
311 gtk_box_pack_start (GTK_BOX (whbox), wframe, FALSE, TRUE, 0);
313 wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
314 gtk_container_set_border_width (GTK_CONTAINER (wvbox1), 10);
315 gtk_container_add (GTK_CONTAINER (wframe), wvbox1);
319 dlg->private->page_size_us_letter_radio =
320 gtk_radio_button_new_with_label (radio_group, US_LETTER);
322 gtk_radio_button_get_group (GTK_RADIO_BUTTON
323 (dlg->private->page_size_us_letter_radio));
324 gtk_box_pack_start (GTK_BOX (wvbox1), dlg->private->page_size_us_letter_radio, FALSE,
327 dlg->private->page_size_a4_radio =
328 gtk_radio_button_new_with_label (radio_group, A4);
330 gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
331 gtk_box_pack_start (GTK_BOX (wvbox1), dlg->private->page_size_a4_radio,
334 g_signal_connect_swapped (
335 G_OBJECT(dlg->private->units_points_radio),
336 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
337 g_signal_connect_swapped (
338 G_OBJECT(dlg->private->units_inches_radio),
339 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
340 g_signal_connect_swapped (
341 G_OBJECT(dlg->private->units_mm_radio),
342 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
343 g_signal_connect_swapped (
344 G_OBJECT(dlg->private->page_size_us_letter_radio),
345 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
346 g_signal_connect_swapped (
347 G_OBJECT(dlg->private->page_size_a4_radio),
348 "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
353 /*--------------------------------------------------------------------------*/
354 /* PRIVATE. Build Default Object Properties Notebook Tab */
355 /*--------------------------------------------------------------------------*/
357 object_page (glPrefsDialog *dlg)
359 GtkWidget *wlabel, *wvbox, *whbox;
361 wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
362 gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
364 wlabel = gtk_label_new (_("Select default properties for new objects."));
365 gtk_box_pack_start (GTK_BOX (wvbox), wlabel, FALSE, FALSE, 0);
367 /* text props entry */
369 gl_wdgt_text_props_new ("Text");
370 gtk_box_pack_start (GTK_BOX (wvbox), dlg->private->text,
373 whbox = gtk_hbox_new (TRUE, GNOME_PAD);
374 gtk_box_pack_start (GTK_BOX (wvbox), whbox, FALSE, FALSE, 0);
376 /* ------ Line box ------ */
377 dlg->private->line = gl_wdgt_line_new (_("Line"));
378 gtk_box_pack_start (GTK_BOX (whbox), dlg->private->line,
381 /* ------ Fill box ------ */
382 dlg->private->fill = gl_wdgt_fill_new (_("Fill"));
383 gtk_box_pack_start (GTK_BOX (whbox), dlg->private->fill,
386 g_signal_connect_swapped (G_OBJECT(dlg->private->text),
388 G_CALLBACK(update_prefs_from_object_page),
390 g_signal_connect_swapped (G_OBJECT(dlg->private->line),
392 G_CALLBACK(update_prefs_from_object_page),
394 g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
396 G_CALLBACK(update_prefs_from_object_page),
402 /*--------------------------------------------------------------------------*/
403 /* PRIVATE. Update locale page widgets from current prefs. */
404 /*--------------------------------------------------------------------------*/
405 static update_locale_page_from_prefs (glPrefsDialog *dlg)
407 g_signal_handlers_block_by_func (
408 G_OBJECT(dlg->private->units_points_radio),
409 G_CALLBACK(update_prefs_from_locale_page), dlg);
410 g_signal_handlers_block_by_func (
411 G_OBJECT(dlg->private->units_inches_radio),
412 G_CALLBACK(update_prefs_from_locale_page), dlg);
413 g_signal_handlers_block_by_func (
414 G_OBJECT(dlg->private->units_mm_radio),
415 G_CALLBACK(update_prefs_from_locale_page), dlg);
416 g_signal_handlers_block_by_func (
417 G_OBJECT(dlg->private->page_size_us_letter_radio),
418 G_CALLBACK(update_prefs_from_locale_page), dlg);
419 g_signal_handlers_block_by_func (
420 G_OBJECT(dlg->private->page_size_a4_radio),
421 G_CALLBACK(update_prefs_from_locale_page), dlg);
423 switch (gl_prefs->units) {
424 case GL_PREFS_UNITS_PTS:
425 gtk_toggle_button_set_active (
426 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
429 case GL_PREFS_UNITS_INCHES:
430 gtk_toggle_button_set_active (
431 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
434 case GL_PREFS_UNITS_MM:
435 gtk_toggle_button_set_active (
436 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
440 g_warning ("Illegal units"); /* Should not happen */
444 if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
445 gtk_toggle_button_set_active (
446 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
448 } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
449 gtk_toggle_button_set_active (
450 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
453 g_warning ("Unknown default page size"); /* Shouldn't happen */
456 g_signal_handlers_unblock_by_func (
457 G_OBJECT(dlg->private->units_points_radio),
458 G_CALLBACK(update_prefs_from_locale_page), dlg);
459 g_signal_handlers_unblock_by_func (
460 G_OBJECT(dlg->private->units_inches_radio),
461 G_CALLBACK(update_prefs_from_locale_page), dlg);
462 g_signal_handlers_unblock_by_func (
463 G_OBJECT(dlg->private->units_mm_radio),
464 G_CALLBACK(update_prefs_from_locale_page), dlg);
465 g_signal_handlers_unblock_by_func (
466 G_OBJECT(dlg->private->page_size_us_letter_radio),
467 G_CALLBACK(update_prefs_from_locale_page), dlg);
468 g_signal_handlers_unblock_by_func (
469 G_OBJECT(dlg->private->page_size_a4_radio),
470 G_CALLBACK(update_prefs_from_locale_page), dlg);
473 /*--------------------------------------------------------------------------*/
474 /* PRIVATE. Update object page widgets from current prefs. */
475 /*--------------------------------------------------------------------------*/
476 static update_object_page_from_prefs (glPrefsDialog *dlg)
478 g_signal_handlers_block_by_func (
479 G_OBJECT(dlg->private->text),
480 G_CALLBACK(update_prefs_from_object_page), dlg);
481 g_signal_handlers_block_by_func (
482 G_OBJECT(dlg->private->line),
483 G_CALLBACK(update_prefs_from_object_page), dlg);
484 g_signal_handlers_block_by_func (
485 G_OBJECT(dlg->private->fill),
486 G_CALLBACK(update_prefs_from_object_page), dlg);
488 gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
489 gl_prefs->default_font_family,
490 gl_prefs->default_font_size,
491 gl_prefs->default_font_weight,
492 gl_prefs->default_font_italic_flag,
493 gl_prefs->default_text_color,
494 gl_prefs->default_text_alignment);
496 gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
497 gl_prefs->default_line_width,
498 gl_prefs->default_line_color);
500 gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
501 gl_prefs->default_fill_color);
503 g_signal_handlers_unblock_by_func (
504 G_OBJECT(dlg->private->text),
505 G_CALLBACK(update_prefs_from_object_page), dlg);
506 g_signal_handlers_unblock_by_func (
507 G_OBJECT(dlg->private->line),
508 G_CALLBACK(update_prefs_from_object_page), dlg);
509 g_signal_handlers_unblock_by_func (
510 G_OBJECT(dlg->private->fill),
511 G_CALLBACK(update_prefs_from_object_page), dlg);
514 /*--------------------------------------------------------------------------*/
515 /* PRIVATE. Update prefs from current state of locale page widgets. */
516 /*--------------------------------------------------------------------------*/
517 static update_prefs_from_locale_page (glPrefsDialog *dlg)
519 if (gtk_toggle_button_get_active (
520 GTK_TOGGLE_BUTTON(dlg->private->units_points_radio)) == 0) {
521 gl_prefs->units = GL_PREFS_UNITS_PTS;
523 if (gtk_toggle_button_get_active (
524 GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio)) == 0) {
525 gl_prefs->units = GL_PREFS_UNITS_INCHES;
527 if (gtk_toggle_button_get_active (
528 GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio)) == 0) {
529 gl_prefs->units = GL_PREFS_UNITS_MM;
532 if (gtk_toggle_button_get_active (
533 GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio)) == 0) {
534 gl_prefs->default_page_size = US_LETTER;
536 if (gtk_toggle_button_get_active (
537 GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio)) == 0) {
538 gl_prefs->default_page_size = A4;
541 gl_prefs_save_settings ();
544 /*--------------------------------------------------------------------------*/
545 /* PRIVATE. Update prefs from current state of object page widgets. */
546 /*--------------------------------------------------------------------------*/
547 static update_prefs_from_object_page (glPrefsDialog *dlg)
549 gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
550 &gl_prefs->default_font_family,
551 &gl_prefs->default_font_size,
552 &gl_prefs->default_font_weight,
553 &gl_prefs->default_font_italic_flag,
554 &gl_prefs->default_text_color,
555 &gl_prefs->default_text_alignment);
557 gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
558 &gl_prefs->default_line_width,
559 &gl_prefs->default_line_color);
561 gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
562 &gl_prefs->default_fill_color);
564 gl_prefs_save_settings ();