]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/prefs-dialog.c
2009-09-17 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / prefs-dialog.c
index 523f06a7e5a0aa8e6115101db54fa3b753e55e6a..97c0546bd4213d7af347feeedb0f24bdb72cd22e 100644 (file)
@@ -1,42 +1,48 @@
 /*
- *  (GLABELS) Label and Business Card Creation program for GNOME
+ *  prefs-dialog.c
+ *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
  *
- *  prefs-dialog.c:  Preferences dialog module
+ *  This file is part of gLabels.
  *
- *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
- *
- *  This program is free software; you can redistribute it and/or modify
+ *  gLabels is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
- *  This program is distributed in the hope that it will be useful,
+ *  gLabels is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
  */
-#include <config.h>
 
-#include <libgnome/libgnome.h>
-#include <libgnomeui/libgnomeui.h>
+#include <config.h>
 
 #include "prefs-dialog.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
 #include "prefs.h"
-#include "wdgt-line.h"
-#include "wdgt-fill.h"
-#include "wdgt-text-props.h"
+#include "hig.h"
+#include "color-combo.h"
+#include "color.h"
+#include "font-combo.h"
+#include "font-util.h"
+#include "util.h"
+
 #include "debug.h"
 
+
 /*========================================================*/
 /* Private macros and constants.                          */
 /*========================================================*/
 
-#define US_LETTER "US Letter"
-#define A4        "A4"
+#define US_LETTER_ID "US-Letter"
+#define A4_ID        "A4"
+
 
 /*========================================================*/
 /* Private types.                                         */
 
 struct _glPrefsDialogPrivate
 {
-       GtkWidget* categories_tree;
-
-       GtkWidget* notebook;
-
-       GtkTreeModel *categories_tree_model;
+       GtkBuilder      *builder;
 
-       /* Units page */
+       /* Units properties */
        GtkWidget       *units_points_radio;
        GtkWidget       *units_inches_radio;
        GtkWidget       *units_mm_radio;
 
-       /* Page size page */
+       /* Page size properties */
        GtkWidget       *page_size_us_letter_radio;
        GtkWidget       *page_size_a4_radio;
 
        /* Default text properties */
-       GtkWidget       *text;
+       GtkWidget       *text_family_hbox;
+       GtkWidget       *text_family_combo;
+       GtkWidget       *text_size_spin;
+       GtkWidget       *text_bold_toggle;
+       GtkWidget       *text_italic_toggle;
+       GtkWidget       *text_color_hbox;
+       GtkWidget       *text_color_combo;
+       GtkWidget       *text_left_toggle;
+       GtkWidget       *text_center_toggle;
+       GtkWidget       *text_right_toggle;
+       GtkWidget       *text_line_spacing_spin;
 
        /* Default line properties */
-       GtkWidget       *line;
+       GtkWidget       *line_width_spin;
+       GtkWidget       *line_color_hbox;
+       GtkWidget       *line_color_combo;
 
        /* Default fill properties */
-       GtkWidget       *fill;
+       GtkWidget       *fill_color_hbox;
+       GtkWidget       *fill_color_combo;
+
+        /* Prevent recursion */
+       gboolean    stop_signals;
 };
 
+
 /*========================================================*/
 /* Private globals.                                       */
 /*========================================================*/
 
-static GtkDialogClass* parent_class = NULL;
 
 /*========================================================*/
 /* Private function prototypes.                           */
 /*========================================================*/
 
-static void gl_prefs_dialog_class_init         (glPrefsDialogClass *klass);
-static void gl_prefs_dialog_init               (glPrefsDialog *dlg);
-static void gl_prefs_dialog_finalize           (GObject *object);
-static void gl_prefs_dialog_construct   (glPrefsDialog *dlg);
+static void gl_prefs_dialog_finalize             (GObject            *object);
+static void gl_prefs_dialog_construct     (glPrefsDialog      *dialog);
+
+static void response_cb                   (glPrefsDialog      *dialog,
+                                          gint                response,
+                                          gpointer            user_data);
 
-static void response_cb                 (glPrefsDialog *dialog,
-                                        gint response,
-                                        gpointer user_data);
+static void construct_locale_page         (glPrefsDialog      *dialog);
+static void construct_object_page         (glPrefsDialog      *dialog);
 
-static GtkWidget *locale_page (glPrefsDialog *dlg);
-static GtkWidget *object_page (glPrefsDialog *dlg);
+static void align_toggle_cb               (GtkToggleButton    *toggle,
+                                          glPrefsDialog      *dialog);
+                                                                                
+static void update_locale_page_from_prefs (glPrefsDialog      *dialog);
+static void update_object_page_from_prefs (glPrefsDialog      *dialog);
 
-static update_locale_page_from_prefs (glPrefsDialog *dlg);
-static update_object_page_from_prefs (glPrefsDialog *dlg);
+static void update_prefs_from_locale_page (glPrefsDialog      *dialog);
+static void update_prefs_from_object_page (glPrefsDialog      *dialog);
 
-static update_prefs_from_locale_page (glPrefsDialog *dlg);
-static update_prefs_from_object_page (glPrefsDialog *dlg);
 
-\f
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-GType
-gl_prefs_dialog_get_type (void)
-{
-       static GType dialog_type = 0;
-
-       if (!dialog_type)
-       {
-               static const GTypeInfo dialog_info =
-               {
-                       sizeof (glPrefsDialogClass),
-                       NULL,           /* base_init */
-                       NULL,           /* base_finalize */
-                       (GClassInitFunc) gl_prefs_dialog_class_init,
-                       NULL,           /* class_finalize */
-                       NULL,           /* class_data */
-                       sizeof (glPrefsDialog),
-                       0,              /* n_preallocs */
-                       (GInstanceInitFunc) gl_prefs_dialog_init
-               };
-
-               dialog_type = g_type_register_static (GL_TYPE_HIG_DIALOG,
-                                                     "glPrefsDialog",
-                                                     &dialog_info, 
-                                                     0);
-       }
-
-       return dialog_type;
-}
+G_DEFINE_TYPE (glPrefsDialog, gl_prefs_dialog, GTK_TYPE_DIALOG);
+
 
 static void
-gl_prefs_dialog_class_init (glPrefsDialogClass *klass)
+gl_prefs_dialog_class_init (glPrefsDialogClass *class)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GObjectClass *object_class = G_OBJECT_CLASS (class);
 
        gl_debug (DEBUG_PREFS, "");
        
-       parent_class = g_type_class_peek_parent (klass);
+       gl_prefs_dialog_parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize = gl_prefs_dialog_finalize;      
 }
 
+
 static void
-gl_prefs_dialog_init (glPrefsDialog *dlg)
+gl_prefs_dialog_init (glPrefsDialog *dialog)
 {
-       gl_debug (DEBUG_PREFS, "");
+        static gchar *object_ids[] = { "prefs_notebook",
+                                       "adjustment1",  "adjustment2",  "adjustment3",
+                                       NULL };
+        GError *error = NULL;
+
+       gl_debug (DEBUG_PREFS, "START");
+
+       dialog->priv = g_new0 (glPrefsDialogPrivate, 1);
+
+        dialog->priv->builder = gtk_builder_new ();
+        gtk_builder_add_objects_from_file (dialog->priv->builder,
+                                           GLABELS_BUILDER_DIR "prefs-dialog.builder",
+                                           object_ids,
+                                           &error);
+       if (error) {
+               g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
+                g_error_free (error);
+               return;
+       }
+
+       gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2);
 
-       dlg->private = g_new0 (glPrefsDialogPrivate, 1);
+       gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+       gtk_dialog_add_button (GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+       gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
+
+       g_signal_connect(G_OBJECT (dialog), "response",
+                        G_CALLBACK (response_cb), NULL);
+
+        gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+        gtk_window_set_title (GTK_WINDOW (dialog), _("gLabels Preferences"));
+        gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+
+       gl_debug (DEBUG_PREFS, "END");
 }
 
+
 static void 
 gl_prefs_dialog_finalize (GObject *object)
 {
-       glPrefsDialog* dlg;
+       glPrefsDialog* dialog = GL_PREFS_DIALOG (object);
        
-       gl_debug (DEBUG_PREFS, "");
+       gl_debug (DEBUG_PREFS, "START");
 
        g_return_if_fail (object != NULL);
-       
-       dlg = GL_PREFS_DIALOG (object);
+       g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
+       g_return_if_fail (dialog->priv != NULL);
 
-       g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
-       g_return_if_fail (dlg->private != NULL);
+       if (dialog->priv->builder)
+        {
+               g_object_unref (G_OBJECT (dialog->priv->builder));
+       }
+       g_free (dialog->priv);
 
-       G_OBJECT_CLASS (parent_class)->finalize (object);
+       G_OBJECT_CLASS (gl_prefs_dialog_parent_class)->finalize (object);
 
-       g_free (dlg->private);
+       gl_debug (DEBUG_PREFS, "END");
 }
 
+
 /*****************************************************************************/
 /* NEW preferences dialog.                                                   */
 /*****************************************************************************/
 GtkWidget*
 gl_prefs_dialog_new (GtkWindow *parent)
 {
-       GtkWidget *dlg;
+       GtkWidget *dialog;
 
-       gl_debug (DEBUG_PREFS, "");
+       gl_debug (DEBUG_PREFS, "START");
+       gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size);
 
-       dlg = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
+       dialog = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL));
 
        if (parent)
-               gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
+               gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
        
-       gl_prefs_dialog_construct (GL_PREFS_DIALOG(dlg));
+       gl_prefs_dialog_construct (GL_PREFS_DIALOG(dialog));
 
-       return dlg;
+
+       gl_debug (DEBUG_PREFS, "END");
+
+       return dialog;
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Construct composite widget.                                     */
 /*---------------------------------------------------------------------------*/
 static void
-gl_prefs_dialog_construct (glPrefsDialog *dlg)
+gl_prefs_dialog_construct (glPrefsDialog *dialog)
 {
-       GtkWidget *notebook, *wlabel, *wvbox, *wvbox1, *whbox, *wframe;
-       GSList *radio_group = NULL;
-
-       g_return_if_fail (GL_IS_PREFS_DIALOG (dlg));
-       g_return_if_fail (dlg->private != NULL);
-
-       gtk_dialog_add_button (GTK_DIALOG(dlg),
-                              GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
-
-       gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
-
-       g_signal_connect(G_OBJECT (dlg), "response",
-                        G_CALLBACK (response_cb), NULL);
-
-       notebook = gtk_notebook_new ();
-       gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
+       GtkWidget *notebook;
 
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
-                                 locale_page (dlg),
-                                 gtk_label_new (_("Locale")));
+       g_return_if_fail (GL_IS_PREFS_DIALOG (dialog));
+       g_return_if_fail (dialog->priv != NULL);
 
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
-                                 object_page (dlg),
-                                 gtk_label_new (_("Object defaults")));
+        gl_util_get_builder_widgets (dialog->priv->builder,
+                                     "prefs_notebook", &notebook,
+                                     NULL);
+       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, FALSE, FALSE, 0);
 
-       update_locale_page_from_prefs (dlg);
-       update_object_page_from_prefs (dlg);
+       construct_locale_page (dialog);
+       construct_object_page (dialog);
 
-        gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);   
+       update_locale_page_from_prefs (dialog);
+       update_object_page_from_prefs (dialog);
 
-        gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
-        gtk_window_set_title (GTK_WINDOW (dlg), _("Preferences"));
-        gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
+        gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);   
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  "Response" callback.                                            */
 /*---------------------------------------------------------------------------*/
 static void
-response_cb (glPrefsDialog *dlg,
+response_cb (glPrefsDialog *dialog,
             gint          response,
             gpointer      user_data)
 {
        gl_debug (DEBUG_VIEW, "START");
 
-       g_return_if_fail(dlg != NULL);
-       g_return_if_fail(GTK_IS_DIALOG(dlg));
+       g_return_if_fail(dialog != NULL);
+       g_return_if_fail(GTK_IS_DIALOG(dialog));
 
        switch(response) {
        case GTK_RESPONSE_CLOSE:
-               gtk_widget_hide (GTK_WIDGET(dlg));
+               gtk_widget_hide (GTK_WIDGET(dialog));
+               break;
+       case GTK_RESPONSE_DELETE_EVENT:
                break;
        default:
-               g_assert_not_reached();
+               g_print ("response = %d", response);
+               g_assert_not_reached ();
        }
 
        gl_debug (DEBUG_VIEW, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Build Locale Properties Notebook Tab                           */
 /*--------------------------------------------------------------------------*/
-static GtkWidget *
-locale_page (glPrefsDialog *dlg)
+static void
+construct_locale_page (glPrefsDialog *dialog)
 {
-       GtkWidget *wlabel, *wvbox, *wframe;
-       GSList *radio_group = NULL;
-
-       wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
-
-       wlabel = gtk_label_new (_("Select locale specific behavior."));
-       gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
-
-       /* ----- Display Units Frame ------------------------------------ */
-       wframe = gl_hig_category_new (_("Display units"));
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
-
-       radio_group = NULL;
-
-       dlg->private->units_points_radio =
-           gtk_radio_button_new_with_label (radio_group, _("Points"));
-       radio_group =
-               gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_points_radio));
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->units_points_radio);
-
-       dlg->private->units_inches_radio =
-           gtk_radio_button_new_with_label (radio_group, _("Inches"));
-       radio_group =
-               gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_inches_radio));
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->units_inches_radio);
-
-       dlg->private->units_mm_radio =
-           gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
-       radio_group =
-               gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->units_mm_radio));
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->units_mm_radio);
-
-       /* ----- Page Size Frame ------------------------------------ */
-       wframe = gl_hig_category_new (_("Default page size"));
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
-
-       radio_group = NULL;
-
-       dlg->private->page_size_us_letter_radio =
-           gtk_radio_button_new_with_label (radio_group, US_LETTER);
-       radio_group =
-           gtk_radio_button_get_group (GTK_RADIO_BUTTON
-                                   (dlg->private->page_size_us_letter_radio));
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->page_size_us_letter_radio);
-
-       dlg->private->page_size_a4_radio =
-           gtk_radio_button_new_with_label (radio_group, A4);
-       radio_group =
-           gtk_radio_button_get_group (GTK_RADIO_BUTTON (dlg->private->page_size_a4_radio));
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->page_size_a4_radio);
+
+        gl_util_get_builder_widgets (dialog->priv->builder,
+                                     "units_points_radio",        &dialog->priv->units_points_radio,
+                                     "units_inches_radio",        &dialog->priv->units_inches_radio,
+                                     "units_mm_radio",            &dialog->priv->units_mm_radio,
+                                     "page_size_us_letter_radio", &dialog->priv->page_size_us_letter_radio,
+                                     "page_size_a4_radio",        &dialog->priv->page_size_a4_radio,
+                                     NULL);
 
        g_signal_connect_swapped (
-               G_OBJECT(dlg->private->units_points_radio),
-               "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
+               G_OBJECT(dialog->priv->units_points_radio),
+               "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
        g_signal_connect_swapped (
-               G_OBJECT(dlg->private->units_inches_radio),
-               "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
+               G_OBJECT(dialog->priv->units_inches_radio),
+               "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
        g_signal_connect_swapped (
-               G_OBJECT(dlg->private->units_mm_radio),
-               "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
+               G_OBJECT(dialog->priv->units_mm_radio),
+               "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
        g_signal_connect_swapped (
-               G_OBJECT(dlg->private->page_size_us_letter_radio),
-               "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
+               G_OBJECT(dialog->priv->page_size_us_letter_radio),
+               "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
        g_signal_connect_swapped (
-               G_OBJECT(dlg->private->page_size_a4_radio),
-               "toggled", G_CALLBACK(update_prefs_from_locale_page), dlg);
-
-       return wvbox;
+               G_OBJECT(dialog->priv->page_size_a4_radio),
+               "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog));
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Build Default Object Properties Notebook Tab                   */
 /*--------------------------------------------------------------------------*/
-static GtkWidget *
-object_page (glPrefsDialog *dlg)
+static void
+construct_object_page (glPrefsDialog *dialog)
 {
-       GtkWidget *wlabel, *wvbox, *wframe;
-       GtkSizeGroup *label_size_group;
-
-       wvbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
-       label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
-       wlabel = gtk_label_new (_("Select default properties for new objects."));
-       gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wlabel);
-
-       /* ------ text props entry ------ */
-       wframe = gl_hig_category_new (_("Text"));
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
-       dlg->private->text = gl_wdgt_text_props_new ();
-       gl_wdgt_text_props_set_label_size_group (GL_WDGT_TEXT_PROPS(dlg->private->text),
-                                                label_size_group);
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->text);
-
-       /* ------ Line box ------ */
-       wframe = gl_hig_category_new (_("Line"));
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
-       dlg->private->line = gl_wdgt_line_new ();
-       gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(dlg->private->line),
-                                          label_size_group);
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->line);
-
-       /* ------ Fill box ------ */
-       wframe = gl_hig_category_new (_("Fill"));
-       gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), wframe);
-       dlg->private->fill = gl_wdgt_fill_new ();
-       gl_wdgt_fill_set_label_size_group (GL_WDGT_FILL(dlg->private->fill),
-                                          label_size_group);
-       gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe),
-                                   dlg->private->fill);
-
-       g_signal_connect_swapped (G_OBJECT(dlg->private->text),
+        gl_util_get_builder_widgets (dialog->priv->builder,
+                                     "text_family_hbox",       &dialog->priv->text_family_hbox,
+                                     "text_size_spin",         &dialog->priv->text_size_spin,
+                                     "text_bold_toggle",       &dialog->priv->text_bold_toggle,
+                                     "text_italic_toggle",     &dialog->priv->text_italic_toggle,
+                                     "text_color_hbox",        &dialog->priv->text_color_hbox,
+                                     "text_left_toggle",       &dialog->priv->text_left_toggle,
+                                     "text_center_toggle",     &dialog->priv->text_center_toggle,
+                                     "text_right_toggle",      &dialog->priv->text_right_toggle,
+                                     "text_line_spacing_spin", &dialog->priv->text_line_spacing_spin,
+                                     "line_width_spin",        &dialog->priv->line_width_spin,
+                                     "line_color_hbox",        &dialog->priv->line_color_hbox,
+                                     "fill_color_hbox",        &dialog->priv->fill_color_hbox,
+                                     NULL);
+
+        dialog->priv->text_family_combo = gl_font_combo_new ("Sans");
+
+       dialog->priv->text_color_combo = gl_color_combo_new (_("Default"),
+                                                             GL_COLOR_TEXT_DEFAULT,
+                                                             gl_prefs->default_text_color);
+       dialog->priv->line_color_combo = gl_color_combo_new (_("No Line"),
+                                                             GL_COLOR_NO_LINE,
+                                                             gl_prefs->default_line_color);
+       dialog->priv->fill_color_combo = gl_color_combo_new (_("No Fill"),
+                                                             GL_COLOR_NO_FILL,
+                                                             gl_prefs->default_fill_color);
+
+        gtk_box_pack_start (GTK_BOX (dialog->priv->text_family_hbox),
+                            dialog->priv->text_family_combo,
+                            FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (dialog->priv->text_color_hbox),
+                            dialog->priv->text_color_combo,
+                            FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (dialog->priv->line_color_hbox),
+                            dialog->priv->line_color_combo,
+                            FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (dialog->priv->fill_color_hbox),
+                            dialog->priv->fill_color_combo,
+                            FALSE, FALSE, 0);
+
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_family_combo),
+                                 "changed",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_size_spin),
                                  "changed",
                                  G_CALLBACK(update_prefs_from_object_page),
-                                 dlg);
-       g_signal_connect_swapped (G_OBJECT(dlg->private->line),
+                                 G_OBJECT(dialog));
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_bold_toggle),
+                                 "toggled",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_italic_toggle),
+                                 "toggled",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_color_combo),
+                                 "color_changed",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
+
+       g_signal_connect (G_OBJECT(dialog->priv->text_left_toggle),
+                         "toggled",
+                         G_CALLBACK(align_toggle_cb),
+                         G_OBJECT(dialog));
+       g_signal_connect (G_OBJECT(dialog->priv->text_center_toggle),
+                         "toggled",
+                         G_CALLBACK(align_toggle_cb),
+                         G_OBJECT(dialog));
+       g_signal_connect (G_OBJECT(dialog->priv->text_right_toggle),
+                         "toggled",
+                         G_CALLBACK(align_toggle_cb),
+                         G_OBJECT(dialog));
+
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->text_line_spacing_spin),
                                  "changed",
                                  G_CALLBACK(update_prefs_from_object_page),
-                                 dlg);
-       g_signal_connect_swapped (G_OBJECT(dlg->private->fill),
+                                 G_OBJECT(dialog));
+
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->line_width_spin),
                                  "changed",
                                  G_CALLBACK(update_prefs_from_object_page),
-                                 dlg);
-       return wvbox;
+                                 G_OBJECT(dialog));
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->line_color_combo),
+                                 "color_changed",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
+
+       g_signal_connect_swapped (G_OBJECT(dialog->priv->fill_color_combo),
+                                 "color_changed",
+                                 G_CALLBACK(update_prefs_from_object_page),
+                                 G_OBJECT(dialog));
 }
 
 
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Alignment togglebutton callback.                               */
+/*--------------------------------------------------------------------------*/
+static void
+align_toggle_cb (GtkToggleButton *toggle,
+                 glPrefsDialog   *dialog)
+{
+        if (gtk_toggle_button_get_active (toggle))
+        {
+  
+                if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_left_toggle))
+                {
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_center_toggle),
+                                                      FALSE);
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_right_toggle),
+                                                      FALSE);
+                }
+                else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_center_toggle))
+                {
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_left_toggle),
+                                                      FALSE);
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_right_toggle),
+                                                      FALSE);
+                }
+                else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_right_toggle))
+                {
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_left_toggle),
+                                                      FALSE);
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                                      (dialog->priv->text_center_toggle),
+                                                      FALSE);
+                }
+                                                                                
+               update_prefs_from_object_page (dialog);
+        }
+                                                                                
+}
+                                                                                
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Update locale page widgets from current prefs.                 */
 /*--------------------------------------------------------------------------*/
-static update_locale_page_from_prefs (glPrefsDialog *dlg)
+static void
+update_locale_page_from_prefs (glPrefsDialog *dialog)
 {
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->units_points_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->units_inches_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->units_mm_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->page_size_us_letter_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->page_size_a4_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
+       dialog->priv->stop_signals = TRUE;
 
        switch (gl_prefs->units) {
-       case GL_PREFS_UNITS_PTS:
+       case LGL_UNITS_POINT:
                gtk_toggle_button_set_active (
-                       GTK_TOGGLE_BUTTON(dlg->private->units_points_radio),
+                       GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio),
                        TRUE);
                break;
-       case GL_PREFS_UNITS_INCHES:
+       case LGL_UNITS_INCH:
                gtk_toggle_button_set_active (
-                       GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio),
+                       GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio),
                        TRUE);
                break;
-       case GL_PREFS_UNITS_MM:
+       case LGL_UNITS_MM:
                gtk_toggle_button_set_active (
-                       GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio),
+                       GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio),
                        TRUE);
                break;
        default:
-               g_warning ("Illegal units");    /* Should not happen */
+               g_message ("Illegal units");    /* Should not happen */
                break;
        }
 
-       if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER) == 0) {
+       if ( g_ascii_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0)
+        {
                gtk_toggle_button_set_active (
-                       GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio),
-                       TRUE);
-       } else if ( g_strcasecmp(gl_prefs->default_page_size, A4) == 0) {
+                       GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio), TRUE);
+       }
+        else if ( g_ascii_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0)
+        {
                gtk_toggle_button_set_active (
-                       GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio),
-                       TRUE);
-       } else {
-               g_warning ("Unknown default page size"); /* Shouldn't happen */
+                       GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio), TRUE);
+       }
+        else
+        {
+               g_message ("Unknown default page size"); /* Shouldn't happen */
        }
 
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->units_points_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->units_inches_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->units_mm_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->page_size_us_letter_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->page_size_a4_radio),
-               G_CALLBACK(update_prefs_from_locale_page), dlg);
+       dialog->priv->stop_signals = FALSE;
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Update object page widgets from current prefs.                 */
 /*--------------------------------------------------------------------------*/
-static update_object_page_from_prefs (glPrefsDialog *dlg)
+static void
+update_object_page_from_prefs (glPrefsDialog *dialog)
 {
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->text),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->line),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
-       g_signal_handlers_block_by_func (
-               G_OBJECT(dlg->private->fill),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
-
-       gl_wdgt_text_props_set_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
-                                      gl_prefs->default_font_family,
-                                      gl_prefs->default_font_size,
-                                      gl_prefs->default_font_weight,
-                                      gl_prefs->default_font_italic_flag,
-                                      gl_prefs->default_text_color,
-                                      gl_prefs->default_text_alignment);
-
-       gl_wdgt_line_set_params (GL_WDGT_LINE(dlg->private->line),
-                                gl_prefs->default_line_width,
-                                gl_prefs->default_line_color);
-
-       gl_wdgt_fill_set_params (GL_WDGT_FILL(dlg->private->fill),
-                                gl_prefs->default_fill_color);
-
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->text),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->line),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
-       g_signal_handlers_unblock_by_func (
-               G_OBJECT(dlg->private->fill),
-               G_CALLBACK(update_prefs_from_object_page), dlg);
+       dialog->priv->stop_signals = TRUE;
+
+       gl_font_combo_set_family (GL_FONT_COMBO (dialog->priv->text_family_combo),
+                                  gl_prefs->default_font_family);
+
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_size_spin),
+                                   gl_prefs->default_font_size);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle),
+                                      (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD));
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_italic_toggle),
+                                      gl_prefs->default_font_italic_flag);
+        gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
+                                  gl_prefs->default_text_color);
+
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle),
+                                 (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT));
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle),
+                                 (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER));
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle),
+                                 (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT));
+
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_line_spacing_spin),
+                                   gl_prefs->default_text_line_spacing);
+
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->line_width_spin),
+                                   gl_prefs->default_line_width);
+        gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
+                gl_prefs->default_line_color);
+
+
+        gl_color_combo_set_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
+                                  gl_prefs->default_fill_color);
+
+
+       dialog->priv->stop_signals = FALSE;
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Update prefs from current state of locale page widgets.        */
 /*--------------------------------------------------------------------------*/
-static update_prefs_from_locale_page (glPrefsDialog *dlg)
+static void
+update_prefs_from_locale_page (glPrefsDialog *dialog)
 {
+       if (dialog->priv->stop_signals) return;
+
        if (gtk_toggle_button_get_active (
-                   GTK_TOGGLE_BUTTON(dlg->private->units_points_radio))) {
-               gl_prefs->units = GL_PREFS_UNITS_PTS;
+                   GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio)))
+        {
+               gl_prefs->units = LGL_UNITS_POINT;
        }
        if (gtk_toggle_button_get_active (
-                   GTK_TOGGLE_BUTTON(dlg->private->units_inches_radio))) {
-               gl_prefs->units = GL_PREFS_UNITS_INCHES;
+                   GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio)))
+        {
+               gl_prefs->units = LGL_UNITS_INCH;
        }
        if (gtk_toggle_button_get_active (
-                   GTK_TOGGLE_BUTTON(dlg->private->units_mm_radio))) {
-               gl_prefs->units = GL_PREFS_UNITS_MM;
+                   GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio)))
+        {
+               gl_prefs->units = LGL_UNITS_MM;
        }
 
        if (gtk_toggle_button_get_active (
-                   GTK_TOGGLE_BUTTON(dlg->private->page_size_us_letter_radio))) {
-               gl_prefs->default_page_size = US_LETTER;
+                   GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio)))
+        {
+               g_free (gl_prefs->default_page_size);
+               gl_prefs->default_page_size = g_strdup (US_LETTER_ID);
        }
        if (gtk_toggle_button_get_active (
-                   GTK_TOGGLE_BUTTON(dlg->private->page_size_a4_radio))) {
-               gl_prefs->default_page_size = A4;
+                   GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio)))
+        {
+               g_free (gl_prefs->default_page_size);
+               gl_prefs->default_page_size = g_strdup (A4_ID);
        }
 
-       gl_prefs_save_settings ();
+       gl_prefs_model_save_settings (gl_prefs);
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Update prefs from current state of object page widgets.        */
 /*--------------------------------------------------------------------------*/
-static update_prefs_from_object_page (glPrefsDialog *dlg)
+static void
+update_prefs_from_object_page (glPrefsDialog *dialog)
 {
-       gl_wdgt_text_props_get_params (GL_WDGT_TEXT_PROPS(dlg->private->text),
-                                      &gl_prefs->default_font_family,
-                                      &gl_prefs->default_font_size,
-                                      &gl_prefs->default_font_weight,
-                                      &gl_prefs->default_font_italic_flag,
-                                      &gl_prefs->default_text_color,
-                                      &gl_prefs->default_text_alignment);
-
-       gl_wdgt_line_get_params (GL_WDGT_LINE(dlg->private->line),
-                                &gl_prefs->default_line_width,
-                                &gl_prefs->default_line_color);
-
-       gl_wdgt_fill_get_params (GL_WDGT_FILL(dlg->private->fill),
-                                &gl_prefs->default_fill_color);
-
-       gl_prefs_save_settings ();
+       guint     color;
+       gboolean  is_default;
+
+       if (dialog->priv->stop_signals) return;
+
+        g_free (gl_prefs->default_font_family);
+        gl_prefs->default_font_family =
+               gl_font_combo_get_family (GL_FONT_COMBO (dialog->priv->text_family_combo));
+        gl_prefs->default_font_size =
+                gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_size_spin));
+
+        if (gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle)))
+        {
+                gl_prefs->default_font_weight = PANGO_WEIGHT_BOLD;
+        }
+        else
+        {
+                gl_prefs->default_font_weight = PANGO_WEIGHT_NORMAL;
+        }
+
+        gl_prefs->default_font_italic_flag =
+                gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+                                              (dialog->priv->text_italic_toggle));
+
+        color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->text_color_combo),
+                                          &is_default);
+        if (!is_default)
+        {
+                gl_prefs->default_text_color = color;
+        }
+
+        if (gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle)))
+        {
+                gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
+        }
+        else if (gtk_toggle_button_get_active
+                 (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle)))
+        {
+                gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT;
+        }
+        else if (gtk_toggle_button_get_active
+                 (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle)))
+        {
+                gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER;
+        }
+        else
+        {
+               /* Should not happen. */
+                gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT;
+        }
+                                                                                
+
+        gl_prefs->default_text_line_spacing =
+                gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_line_spacing_spin));
+
+        gl_prefs->default_line_width =
+                gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->line_width_spin));
+
+        color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->line_color_combo),
+                                          &is_default);
+        if (!is_default)
+        {
+                gl_prefs->default_line_color = color;
+        }
+
+
+        color = gl_color_combo_get_color (GL_COLOR_COMBO(dialog->priv->fill_color_combo),
+                                          &is_default);
+        if (!is_default)
+        {
+                gl_prefs->default_fill_color = color;
+        }
+
+       gl_prefs_model_save_settings (gl_prefs);
 }
 
 
-       
+
+/*
+ * Local Variables:       -- emacs
+ * mode: C                -- emacs
+ * c-basic-offset: 8      -- emacs
+ * tab-width: 8           -- emacs
+ * indent-tabs-mode: nil  -- emacs
+ * End:                   -- emacs
+ */