]> git.sur5r.net Git - glabels/blobdiff - src/object-editor.c
Imported Upstream version 3.0.0
[glabels] / src / object-editor.c
index 02a153d6b5f26e1bc782741d55f781e35e42dfe2..68cfa4930b9944c1d0c755704e9f14112aa7860a 100644 (file)
@@ -1,65 +1,65 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
-/**
- *  (GLABELS) Label and Business Card Creation program for GNOME
- *
- *  object-editor.c:  object properties editor module
+/*
+ *  object-editor.c
+ *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
  *
- *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
+ *  This file is part of gLabels.
  *
- *  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 "object-editor.h"
 
 #include <glib/gi18n.h>
-#include <glade/glade-xml.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtkcombobox.h>
-#include <gtk/gtktogglebutton.h>
-
+#include <gtk/gtk.h>
 #include <math.h>
 
 #include "prefs.h"
-#include "mygal/widget-color-combo.h"
+#include "color-combo.h"
 #include "color.h"
 #include "wdgt-chain-button.h"
+#include "field-button.h"
 #include "marshal.h"
-#include "util.h"
+#include "combo-util.h"
+#include "builder-util.h"
+#include "label-box.h"
+#include "label-ellipse.h"
+#include "label-line.h"
+#include "label-image.h"
+#include "label-text.h"
+#include "label-barcode.h"
 
 #include "object-editor-private.h"
 
 #include "debug.h"
 
+
 /*===========================================*/
 /* Private macros                            */
 /*===========================================*/
 
+
 /*===========================================*/
 /* Private data types                        */
 /*===========================================*/
 
-typedef void (*ChangedSignal) (GObject * object, gpointer data);
 
 /*===========================================*/
 /* Private globals                           */
 /*===========================================*/
 
-gint gl_object_editor_signals[LAST_SIGNAL] = { 0 };
 
 /*===========================================*/
 /* Local function prototypes                 */
@@ -67,21 +67,36 @@ gint gl_object_editor_signals[LAST_SIGNAL] = { 0 };
 
 static void gl_object_editor_finalize           (GObject              *object);
 
-static void gl_object_notebook_construct_valist (glObjectEditor       *editor,
-                                                 glLabel              *label,
-                                                glObjectEditorOption  first_option,
-                                                va_list               args);
+static void set_object                          (glObjectEditor       *editor,
+                                                 glLabelObject        *object);
 
 static void prefs_changed_cb                    (glObjectEditor       *editor);
 
 static void label_changed_cb                    (glLabel              *label,
                                                  glObjectEditor       *editor);
 
-\f
+static void selection_changed_cb                (glLabel              *label,
+                                                 glObjectEditor       *editor);
+
+static void merge_changed_cb                    (glLabel              *label,
+                                                 glObjectEditor       *editor);
+
+static void set_key_names                       (glObjectEditor       *editor,
+                                                 glMerge              *merge);
+
+static void object_changed_cb                   (glLabelObject        *object,
+                                                 glObjectEditor       *editor);
+
+static void object_moved_cb                     (glLabelObject        *object,
+                                                 glObjectEditor       *editor);
+
+
+
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX);
+G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX)
+
 
 static void
 gl_object_editor_class_init (glObjectEditorClass *class)
@@ -93,66 +108,72 @@ gl_object_editor_class_init (glObjectEditorClass *class)
        gl_object_editor_parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize = gl_object_editor_finalize;     
-
-       gl_object_editor_signals[CHANGED] =
-           g_signal_new ("changed",
-                         G_OBJECT_CLASS_TYPE(object_class),
-                         G_SIGNAL_RUN_LAST,
-                         G_STRUCT_OFFSET (glObjectEditorClass, changed),
-                         NULL, NULL,
-                         gl_marshal_VOID__VOID,
-                         G_TYPE_NONE, 0);
-
-       gl_object_editor_signals[SIZE_CHANGED] =
-           g_signal_new ("size_changed",
-                         G_OBJECT_CLASS_TYPE(object_class),
-                         G_SIGNAL_RUN_LAST,
-                         G_STRUCT_OFFSET (glObjectEditorClass, size_changed),
-                         NULL, NULL,
-                         gl_marshal_VOID__VOID,
-                         G_TYPE_NONE, 0);
-
-       gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 static void
 gl_object_editor_init (glObjectEditor *editor)
 {
+        gchar        *builder_filename;
+        static gchar *object_ids[] = { "editor_vbox",
+                                       "adjustment1",  "adjustment2",  "adjustment3",
+                                       "adjustment4",  "adjustment5",  "adjustment6",
+                                       "adjustment7",  "adjustment8",  "adjustment9",
+                                       "adjustment10", "adjustment11", "adjustment12",
+                                       "adjustment13", "page_sizegroup", "width_sizegroup",
+                                       NULL };
+        GError       *error = NULL;
+        gchar        *s;
+
        gl_debug (DEBUG_EDITOR, "START");
        
        editor->priv = g_new0 (glObjectEditorPrivate, 1);
 
-       editor->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "object-editor.glade",
-                                          "editor_vbox",
-                                          NULL);
+        editor->priv->builder = gtk_builder_new ();
 
-       if (!editor->priv->gui) {
-               g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!");
+        builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "object-editor.ui", NULL);
+        gtk_builder_add_objects_from_file (editor->priv->builder, builder_filename, object_ids, &error);
+        g_free (builder_filename);
+       if (error) {
+               g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
+                g_error_free (error);
                return;
        }
 
-       editor->priv->editor_vbox = glade_xml_get_widget (editor->priv->gui,
-                                                         "editor_vbox");
+        gl_builder_util_get_widgets (editor->priv->builder,
+                                     "editor_vbox", &editor->priv->editor_vbox,
+                                     "title_image", &editor->priv->title_image,
+                                     "title_label", &editor->priv->title_label,
+                                     "notebook",    &editor->priv->notebook,
+                                     NULL);
+
        gtk_box_pack_start (GTK_BOX(editor),
                            editor->priv->editor_vbox,
                            FALSE, FALSE, 0);
 
-       editor->priv->title_image = glade_xml_get_widget (editor->priv->gui,
-                                                         "title_image");
-       editor->priv->title_label = glade_xml_get_widget (editor->priv->gui,
-                                                         "title_label");
-       editor->priv->notebook    = glade_xml_get_widget (editor->priv->gui,
-                                                         "notebook");
-
        gtk_widget_show_all (GTK_WIDGET(editor));
 
+        gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
+                                      "glabels-object-properties",
+                                      GTK_ICON_SIZE_LARGE_TOOLBAR);
+
+        s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
+                             _("Object properties"));
+        gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
+        gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
+        g_free (s);
+
+        gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
+        gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
+
        /* Hide all notebook pages to start with. */
-       gtk_widget_hide_all (editor->priv->notebook);
+       gtk_widget_hide (editor->priv->notebook);
        gtk_widget_set_no_show_all (editor->priv->notebook, TRUE);
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 static void 
 gl_object_editor_finalize (GObject *object)
 {
@@ -166,10 +187,28 @@ gl_object_editor_finalize (GObject *object)
 
        g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
                                              prefs_changed_cb, editor);
-       g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
-                                             label_changed_cb, editor);
 
-        g_object_unref (editor->priv->gui);
+        if (editor->priv->label)
+        {
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
+                                                      label_changed_cb, editor);
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
+                                                      merge_changed_cb, editor);
+                g_object_unref (editor->priv->label);
+        }
+
+        if (editor->priv->object)
+        {
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
+                                                      object_changed_cb, editor);
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
+                                                      object_moved_cb, editor);
+                g_object_unref (editor->priv->object);
+        }
+
+        g_object_unref (editor->priv->builder);
+
+        g_free (editor->priv->current_backend_id);
        g_free (editor->priv);
 
        G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
@@ -177,517 +216,877 @@ gl_object_editor_finalize (GObject *object)
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 /*****************************************************************************/
-/* NEW object editor.                                                      */
+/* NEW object editor.                                                        */
 /*****************************************************************************/
 GtkWidget*
-gl_object_editor_new (gchar                *image,
-                     gchar                *title,
-                      glLabel              *label,
-                     glObjectEditorOption  first_option, ...)
+gl_object_editor_new (void)
 {
        glObjectEditor *editor;
-       va_list         args;
 
        gl_debug (DEBUG_EDITOR, "START");
 
        editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL));
 
-       if (image) {
-               gtk_image_set_from_stock (GTK_IMAGE(editor->priv->title_image),
-                                         image,
-                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
-       }
+        gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
+        gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
+
+        gl_object_editor_prepare_position_page (editor);
+        gl_object_editor_prepare_size_page (editor);
+        gl_object_editor_prepare_lsize_page (editor);
+        gl_object_editor_prepare_fill_page (editor);
+        gl_object_editor_prepare_line_page (editor);
+        gl_object_editor_prepare_image_page (editor);
+        gl_object_editor_prepare_text_page (editor);
+        gl_object_editor_prepare_edit_page (editor);
+        gl_object_editor_prepare_bc_page (editor);
+        gl_object_editor_prepare_data_page (editor);
+        gl_object_editor_prepare_shadow_page (editor);
+
+       g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
+                                 G_CALLBACK (prefs_changed_cb), editor);
+
+       gl_debug (DEBUG_EDITOR, "END");
+
+       return GTK_WIDGET(editor);
+}
+
+
+/*****************************************************************************/
+/* Set label.                                                                */
+/*****************************************************************************/
+void
+gl_object_editor_set_label (glObjectEditor  *editor,
+                            glLabel         *label)
+{
+       gl_debug (DEBUG_EDITOR, "START");
+
+        editor->priv->label = g_object_ref (label);
+
+        label_changed_cb (label, editor);
+        merge_changed_cb (label, editor);
 
-       if (title) {
-               gchar *s;
+       g_signal_connect (G_OBJECT(label), "selection_changed",
+                         G_CALLBACK(selection_changed_cb), editor);
+        g_signal_connect (G_OBJECT (label), "size_changed",
+                          G_CALLBACK (label_changed_cb), editor);
+        g_signal_connect (G_OBJECT (label), "merge_changed",
+                          G_CALLBACK (merge_changed_cb), editor);
+
+       gl_debug (DEBUG_EDITOR, "END");
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* Private. Set object.                                                     */
+/*--------------------------------------------------------------------------*/
+static void
+set_object (glObjectEditor  *editor,
+            glLabelObject   *object)
+{
+        gchar               *image;
+        gchar               *title;
+        gchar               *s;
+        GtkTextBuffer       *buffer;
+        gint                 old_page, new_page;
+
+       gl_debug (DEBUG_EDITOR, "START");
+
+        if ( editor->priv->object != NULL )
+        {
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
+                                                      object_changed_cb, editor);
+                g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
+                                                      object_moved_cb, editor);
+                g_object_unref (editor->priv->object);
+        }
+
+        if (object)
+        {
+                editor->priv->object = g_object_ref (object);
+
+                old_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook));
+
+                if (GL_IS_LABEL_BOX (object))
+                {
+                        image = "glabels-box";
+                        title = _("Box object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_show_all (editor->priv->size_page_vbox);
+                        gtk_widget_hide     (editor->priv->lsize_page_vbox);
+                        gtk_widget_show_all (editor->priv->fill_page_vbox);
+                        gtk_widget_show_all (editor->priv->line_page_vbox);
+                        gtk_widget_hide     (editor->priv->img_page_vbox);
+                        gtk_widget_hide     (editor->priv->text_page_vbox);
+                        gtk_widget_hide     (editor->priv->edit_page_vbox);
+                        gtk_widget_hide     (editor->priv->bc_page_vbox);
+                        gtk_widget_hide     (editor->priv->data_page_vbox);
+                        gtk_widget_show_all (editor->priv->shadow_page_vbox);
+
+                        gtk_widget_hide     (editor->priv->size_reset_image_button);
+                }
+                else if (GL_IS_LABEL_ELLIPSE (object))
+                {
+                        image = "glabels-ellipse";
+                        title = _("Ellipse object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_show_all (editor->priv->size_page_vbox);
+                        gtk_widget_hide     (editor->priv->lsize_page_vbox);
+                        gtk_widget_show_all (editor->priv->fill_page_vbox);
+                        gtk_widget_show_all (editor->priv->line_page_vbox);
+                        gtk_widget_hide     (editor->priv->img_page_vbox);
+                        gtk_widget_hide     (editor->priv->text_page_vbox);
+                        gtk_widget_hide     (editor->priv->edit_page_vbox);
+                        gtk_widget_hide     (editor->priv->bc_page_vbox);
+                        gtk_widget_hide     (editor->priv->data_page_vbox);
+                        gtk_widget_show_all (editor->priv->shadow_page_vbox);
+
+                        gtk_widget_hide     (editor->priv->size_reset_image_button);
+                }
+                else if (GL_IS_LABEL_LINE (object))
+                {
+                        image = "glabels-line";
+                        title = _("Line object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_hide     (editor->priv->size_page_vbox);
+                        gtk_widget_show_all (editor->priv->lsize_page_vbox);
+                        gtk_widget_hide     (editor->priv->fill_page_vbox);
+                        gtk_widget_show_all (editor->priv->line_page_vbox);
+                        gtk_widget_hide     (editor->priv->img_page_vbox);
+                        gtk_widget_hide     (editor->priv->text_page_vbox);
+                        gtk_widget_hide     (editor->priv->edit_page_vbox);
+                        gtk_widget_hide     (editor->priv->bc_page_vbox);
+                        gtk_widget_hide     (editor->priv->data_page_vbox);
+                        gtk_widget_show_all (editor->priv->shadow_page_vbox);
+                }
+                else if (GL_IS_LABEL_IMAGE (object))
+                {
+                        image = "glabels-image";
+                        title = _("Image object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_show_all (editor->priv->size_page_vbox);
+                        gtk_widget_hide     (editor->priv->lsize_page_vbox);
+                        gtk_widget_hide     (editor->priv->fill_page_vbox);
+                        gtk_widget_hide     (editor->priv->line_page_vbox);
+                        gtk_widget_show_all (editor->priv->img_page_vbox);
+                        gtk_widget_hide     (editor->priv->text_page_vbox);
+                        gtk_widget_hide     (editor->priv->edit_page_vbox);
+                        gtk_widget_hide     (editor->priv->bc_page_vbox);
+                        gtk_widget_hide     (editor->priv->data_page_vbox);
+                        gtk_widget_show_all (editor->priv->shadow_page_vbox);
+                }
+                else if (GL_IS_LABEL_TEXT (object))
+                {
+                        image = "glabels-text";
+                        title = _("Text object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_show_all (editor->priv->size_page_vbox);
+                        gtk_widget_hide     (editor->priv->lsize_page_vbox);
+                        gtk_widget_hide     (editor->priv->fill_page_vbox);
+                        gtk_widget_hide     (editor->priv->line_page_vbox);
+                        gtk_widget_hide     (editor->priv->img_page_vbox);
+                        gtk_widget_show_all (editor->priv->text_page_vbox);
+                        gtk_widget_show_all (editor->priv->edit_page_vbox);
+                        gtk_widget_hide     (editor->priv->bc_page_vbox);
+                        gtk_widget_hide     (editor->priv->data_page_vbox);
+                        gtk_widget_show_all (editor->priv->shadow_page_vbox);
+
+                        gtk_widget_hide     (editor->priv->size_reset_image_button);
+
+                        buffer = gl_label_text_get_buffer (GL_LABEL_TEXT(object));
+                        gl_object_editor_set_text_buffer (editor, buffer);
+                }
+                else if (GL_IS_LABEL_BARCODE (object))
+                {
+                        image = "glabels-barcode";
+                        title = _("Barcode object properties");
+
+                        gtk_widget_show_all (editor->priv->pos_page_vbox);
+                        gtk_widget_show_all (editor->priv->size_page_vbox);
+                        gtk_widget_hide     (editor->priv->lsize_page_vbox);
+                        gtk_widget_hide     (editor->priv->fill_page_vbox);
+                        gtk_widget_hide     (editor->priv->line_page_vbox);
+                        gtk_widget_hide     (editor->priv->img_page_vbox);
+                        gtk_widget_hide     (editor->priv->text_page_vbox);
+                        gtk_widget_hide     (editor->priv->edit_page_vbox);
+                        gtk_widget_show_all (editor->priv->bc_page_vbox);
+                        gtk_widget_show_all (editor->priv->data_page_vbox);
+                        gtk_widget_hide     (editor->priv->shadow_page_vbox);
+
+                        gtk_widget_hide     (editor->priv->size_reset_image_button);
+                }
+
+                gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
+                                              image,
+                                              GTK_ICON_SIZE_LARGE_TOOLBAR);
 
                s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
                                     title);
                gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
+               gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
                g_free (s);
 
+                gtk_widget_set_sensitive (editor->priv->title_image, TRUE);
+                gtk_widget_set_sensitive (editor->priv->title_label, TRUE);
+
+                gtk_widget_show (editor->priv->notebook);
+
+                /* if the old active page is no longer visible, set to 1st visible page. */
+                new_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook));
+                if ( old_page != new_page )
+                {
+                        /* Trick: try in reverse order, only the last visible attempt will stick. */
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 5);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 4);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 3);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 2);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 1);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 0);
+                }
+
+                object_moved_cb (object, editor);
+                object_changed_cb (object, editor);
+
+                g_signal_connect (G_OBJECT (object), "changed",
+                                  G_CALLBACK (object_changed_cb), editor);
+                g_signal_connect (G_OBJECT (object), "moved",
+                                  G_CALLBACK (object_moved_cb), editor);
+        }
+        else
+        {
+                editor->priv->object = NULL;
+
+                gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
+                                              "glabels-object-properties",
+                                              GTK_ICON_SIZE_LARGE_TOOLBAR);
+
+               s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
+                                    _("Object properties"));
+               gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
                gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
-                                         
-       }
+               g_free (s);
 
-       gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE);
+                gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
+                gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
 
-       va_start (args, first_option);
-       gl_object_notebook_construct_valist (editor, label, first_option, args);
-       va_end (args);
+                gtk_widget_hide (editor->priv->notebook);
+        }
 
        gl_debug (DEBUG_EDITOR, "END");
-
-       return GTK_WIDGET(editor);
 }
 
+
 /*--------------------------------------------------------------------------*/
-/* PRIVATE.  Construct notebook.                                            */
+/* PRIVATE. Prefs changed callback.  Update units related items.            */
 /*--------------------------------------------------------------------------*/
 static void
-gl_object_notebook_construct_valist (glObjectEditor       *editor,
-                                     glLabel              *label,
-                                    glObjectEditorOption  first_option,
-                                    va_list               args)
+prefs_changed_cb (glObjectEditor *editor)
 {
-       glObjectEditorOption option;
-       gint pages = 0;
 
        gl_debug (DEBUG_EDITOR, "START");
 
-        editor->priv->label = label;
-
-       option = first_option;
-
-       for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
-
-               switch (option) {
-
-               case GL_OBJECT_EDITOR_EMPTY:
-                       gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
-                       gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
-                       break;
-
-               case GL_OBJECT_EDITOR_POSITION_PAGE:
-                       gl_object_editor_prepare_position_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_SIZE_PAGE:
-               case GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE:
-                       gl_object_editor_prepare_size_page (editor, option);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_SIZE_LINE_PAGE:
-                       gl_object_editor_prepare_lsize_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_FILL_PAGE:
-                       gl_object_editor_prepare_fill_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_LINE_PAGE:
-                       gl_object_editor_prepare_line_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_IMAGE_PAGE:
-                       gl_object_editor_prepare_image_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_TEXT_PAGE:
-                       gl_object_editor_prepare_text_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_EDIT_PAGE:
-                       gl_object_editor_prepare_edit_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_BC_PAGE:
-                       gl_object_editor_prepare_bc_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_DATA_PAGE:
-                       gl_object_editor_prepare_data_page (editor);
-                       pages++;
-                       break;
-
-               case GL_OBJECT_EDITOR_SHADOW_PAGE:
-                       gl_object_editor_prepare_shadow_page (editor);
-                       pages++;
-                       break;
-
-               default:
-                       g_message ("option = %d", option);
-                       g_assert_not_reached ();
-               }
+       if (editor->priv->lsize_r_spin) {
+               lsize_prefs_changed_cb (editor);
+       }
                
+       if (editor->priv->size_w_spin) {
+               size_prefs_changed_cb (editor);
        }
-       if (pages) {
-               gtk_widget_show (editor->priv->notebook);
+               
+       if (editor->priv->pos_x_spin) {
+               position_prefs_changed_cb (editor);
        }
 
-       g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
-                                 G_CALLBACK (prefs_changed_cb),
-                                 editor);
-        if (label)
+       if (editor->priv->shadow_x_spin) {
+               shadow_prefs_changed_cb (editor);
+       }
+
+       gl_debug (DEBUG_EDITOR, "END");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE.  Label "selection state changed" callback.                       */
+/*---------------------------------------------------------------------------*/
+static void 
+selection_changed_cb (glLabel        *label,
+                     glObjectEditor *editor)
+{
+        glLabelObject *object;
+
+       gl_debug (DEBUG_EDITOR, "START");
+
+       g_return_if_fail (label && GL_IS_LABEL (label));
+       g_return_if_fail (editor && GL_IS_OBJECT_EDITOR (editor));
+
+       if (!gl_label_is_selection_atomic (label))
         {
-                label_changed_cb (label, editor);
-                g_signal_connect (G_OBJECT (label), "size_changed",
-                                  G_CALLBACK (label_changed_cb),
-                                  editor);
-                g_signal_connect (G_OBJECT (label), "merge_changed",
-                                  G_CALLBACK (label_changed_cb),
-                                  editor);
-        }
+                set_object (editor, NULL);
+       }
+        else
+        {
+                object = gl_label_get_1st_selected_object (label);
+                set_object (editor, object);
+       }
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Widget changed callback.  Emit our "changed" signal.            */
-/*--------------------------------------------------------------------------*/
-void
-gl_object_editor_changed_cb (glObjectEditor *editor)
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. label "size_changed" callback.                                   */
+/*---------------------------------------------------------------------------*/
+static void
+label_changed_cb (glLabel        *label,
+                  glObjectEditor *editor)
 {
-        if (editor->priv->stop_signals) return;
+       gdouble   label_width, label_height;
 
        gl_debug (DEBUG_EDITOR, "START");
 
-       /* Emit our "changed" signal */
-       g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
+       gl_label_get_size (label, &label_width, &label_height);
+       gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
+                                          label_width, label_height);
+       gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
+                                      label_width, label_height);
+       gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor),
+                                      label_width, label_height);
+       gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor),
+                                               label_width, label_height);
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Widget size changed callback.  Emit our "size-changed" signal.  */
-/*--------------------------------------------------------------------------*/
-void
-gl_object_editor_size_changed_cb (glObjectEditor *editor)
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. label "merge_changed" callback.                                  */
+/*---------------------------------------------------------------------------*/
+static void
+merge_changed_cb (glLabel        *label,
+                  glObjectEditor *editor)
 {
-        if (editor->priv->stop_signals) return;
+       glMerge  *merge;
 
        gl_debug (DEBUG_EDITOR, "START");
 
-       /* Emit our "size_changed" signal */
-       g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0);
+       merge = gl_label_get_merge (label);
+       set_key_names (editor, merge);
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*****************************************************************************/
-/* Set possible key names from merge object.                                 */
-/*****************************************************************************/
-void
-gl_object_editor_set_key_names (glObjectEditor      *editor,
-                               glMerge             *merge)
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Load up possible key names from merge into various widgets.      */
+/*---------------------------------------------------------------------------*/
+static void
+set_key_names (glObjectEditor      *editor,
+               glMerge             *merge)
 {
         GList     *keys;
-       GtkWidget *combo;
+       GtkWidget *button;
        gboolean   fixed_flag;
        gboolean   state;
  
         gl_debug (DEBUG_EDITOR, "START");
 
-       if (editor->priv->edit_key_label) {
-               gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL);
-       }
-       if (editor->priv->edit_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL);
-       }
-       if (editor->priv->text_auto_shrink_check) {
-               gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
-                                         merge != NULL);
-       }
+        gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
+                                  merge != NULL);
  
-       if (editor->priv->text_page_vbox) {
-               gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
-                       gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE);
-                       gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE);
-               } else {
-                       state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio));
-                       gtk_widget_set_sensitive (editor->priv->text_color_combo, !state);
-                       gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state);
-                                                 
-               }
+        gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
+        if (merge == NULL)
+        {
+                gtk_toggle_button_set_active (
+                        GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
+                gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE);
+                gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE);
+        }
+        else
+        {
+                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio));
+                gtk_widget_set_sensitive (editor->priv->text_color_combo, !state);
+                gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state);
        }
 
-       if (editor->priv->edit_insert_field_button) {
-               gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
-                                         merge != NULL);
-       }
+        gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
+                                  merge != NULL);
 
-       if (editor->priv->img_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
-       }
+        gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
  
-       if (editor->priv->img_key_radio) {
-               gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), TRUE);
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->img_file_radio),
+                                      merge == NULL);
 
-       if (editor->priv->data_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
-       }
+        gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
  
-       if (editor->priv->data_key_radio) {
-               gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE);
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio),
+                                      merge == NULL);
        
        fixed_flag = editor->priv->data_format_fixed_flag;
-       if (editor->priv->data_format_label) {
-               gtk_widget_set_sensitive (editor->priv->data_format_label,
-                                         (merge != NULL));
-       }
-       if (editor->priv->data_ex_label) {
-               gtk_widget_set_sensitive (editor->priv->data_ex_label,
-                                         (merge != NULL));
-       }
-       if (editor->priv->data_digits_label) {
-               gtk_widget_set_sensitive (editor->priv->data_digits_label,
-                                         (merge != NULL) && !fixed_flag);
-       }
-       if (editor->priv->data_digits_spin) {
-               gtk_widget_set_sensitive (editor->priv->data_digits_spin,
-                                         (merge != NULL) && !fixed_flag);
-       }
-
-       if (editor->priv->fill_page_vbox) {
-               gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
-                       gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE);
-                       gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE);
-               } else {
-                       state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio));
-                       gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state);
-                       gtk_widget_set_sensitive (editor->priv->fill_key_combo, state);
-                                                 
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->data_format_label, merge != NULL);
+        gtk_widget_set_sensitive (editor->priv->data_ex_label, merge != NULL);
+        gtk_widget_set_sensitive (editor->priv->data_digits_label,
+                                  (merge != NULL) && !fixed_flag);
+        gtk_widget_set_sensitive (editor->priv->data_digits_spin,
+                                  (merge != NULL) && !fixed_flag);
+
+        gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
+        if (merge == NULL)
+        {
+                gtk_toggle_button_set_active (
+                        GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
+                gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE);
+                gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE);
+        }
+        else
+        {
+                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio));
+                gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state);
+                gtk_widget_set_sensitive (editor->priv->fill_key_combo, state);
+        }
 
-       if (editor->priv->line_page_vbox) {
-               gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
-                       gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE);
-                       gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE);
-               } else {
-                       state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio));
-                       gtk_widget_set_sensitive (editor->priv->line_color_combo, !state);
-                       gtk_widget_set_sensitive (editor->priv->line_key_combo, state);
-                                                 
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
+        if (merge == NULL)
+        {
+                gtk_toggle_button_set_active (
+                        GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
+                gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE);
+                gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE);
+        }
+        else
+        {
+                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio));
+                gtk_widget_set_sensitive (editor->priv->line_color_combo, !state);
+                gtk_widget_set_sensitive (editor->priv->line_key_combo, state);
+        }
 
-       if (editor->priv->bc_page_vbox) {
-               gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
-                       gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
-                       gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
-               } else {
-                       state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio));
-                       gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state);
-                       gtk_widget_set_sensitive (editor->priv->bc_key_combo, state);
-                                                 
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
+        if (merge == NULL)
+        {
+                gtk_toggle_button_set_active (
+                        GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
+                gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
+                gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
+        }
+        else
+        {
+                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio));
+                gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state);
+                gtk_widget_set_sensitive (editor->priv->bc_key_combo, state);
+        }
 
-       if (editor->priv->shadow_page_vbox) {
-               gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
-               if (merge == NULL) {
-                       gtk_toggle_button_set_active (
-                               GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE);
-                       gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE);
-                       gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE);
-               } else {
-                       state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio));
-                       gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state);
-                       gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state);
-                                                 
-               }
-       }
+        gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
+        if (merge == NULL)
+        {
+                gtk_toggle_button_set_active (
+                        GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE);
+                gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE);
+                gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE);
+        }
+        else
+        {
+                state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio));
+                gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state);
+                gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state);
+        }
 
         keys = gl_merge_get_key_list (merge);
         if ( keys == NULL ) {
                 keys = g_list_append (keys, g_strdup (""));
        }
 
-       combo = editor->priv->img_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->img_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
 
-       combo = editor->priv->edit_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->edit_insert_field_button;
+        gl_field_button_set_keys (GL_FIELD_BUTTON(button), keys);
 
-       combo = editor->priv->data_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->data_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
                
-       combo = editor->priv->fill_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->fill_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
 
-       combo = editor->priv->text_color_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->text_color_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
 
-       combo = editor->priv->line_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->line_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
                
-       combo = editor->priv->bc_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->bc_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
                
-       combo = editor->priv->shadow_key_combo;
-       if (combo) {
-               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
-       }
+       button = editor->priv->shadow_key_combo;
+        gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
 
        gl_merge_free_key_list (&keys);
  
         gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*****************************************************************************/
-/* Construct color combo "Custom widget".                                    */
-/*****************************************************************************/
-GtkWidget *
-gl_object_editor_construct_color_combo (gchar *name,
-                                       gchar *string1,
-                                       gchar *string2,
-                                       gint   int1,
-                                       gint   int2)
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. object "changed" callback.                                       */
+/*---------------------------------------------------------------------------*/
+static void
+object_changed_cb (glLabelObject  *object,
+                   glObjectEditor *editor)
 {
-       GtkWidget  *color_combo;
-       ColorGroup *cg;
-       gchar      *cg_name;
-       GdkColor   *gdk_color;
-       gchar      *no_color;
-
-       switch (int1) {
-
-       case 3:
-               cg_name  = "shadow_color_group";
-                gdk_color = gl_color_to_gdk_color (GL_COLOR_SHADOW_DEFAULT);
-               no_color = _("Default");
-               break;
-
-       case 2:
-               cg_name  = "text_color_group";
-                gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color);
-               no_color = _("Default");
-               break;
-
-       case 1:
-               cg_name  = "line_color_group";
-                gdk_color = NULL;
-               no_color = _("No line");
-               break;
-
-       case 0:
-       default:
-               cg_name  = "fill_color_group";
-                gdk_color = NULL;
-               no_color = _("No fill");
-               break;
+        gdouble              w, h;
+        glColorNode         *line_color_node;
+        gdouble              line_width;
+        glColorNode         *fill_color_node;
+        gchar               *font_family;
+        gdouble              font_size;
+        PangoWeight          font_weight;
+        gboolean             font_italic_flag;
+        glColorNode         *text_color_node;
+        PangoAlignment       align;
+        gdouble              text_line_spacing;
+        gboolean             auto_shrink;
+        gdouble              image_w, image_h;
+        glTextNode          *filename;
+        glTextNode          *bc_data;
+        glLabelBarcodeStyle *bc_style;
+        gboolean             shadow_state;
+        gdouble              shadow_x, shadow_y;
+        glColorNode         *shadow_color_node;
+        gdouble              shadow_opacity;
+        glLabel             *label;
+        glMerge             *merge;
+
+        gl_debug (DEBUG_EDITOR, "BEGIN");
+
+
+        label = gl_label_object_get_parent (object);
+        merge = gl_label_get_merge (label);
+
+
+        if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
+        {
 
-       }
+                gl_label_object_get_size (object, &w, &h);
+                fill_color_node   = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object));
+                line_color_node   = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
+                line_width        = gl_label_object_get_line_width (GL_LABEL_OBJECT(object));
+
+                gl_object_editor_set_size (editor, w, h);
+                gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node);
+                gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node);
+                gl_object_editor_set_line_width (editor, line_width);
+
+                gl_color_node_free (&fill_color_node);
+                gl_color_node_free (&line_color_node);
+
+        }
+        else if ( GL_IS_LABEL_LINE (object) )
+        {
+
+                gl_label_object_get_size (object, &w, &h);
+                line_color_node   = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
+                line_width        = gl_label_object_get_line_width (GL_LABEL_OBJECT(object));
+
+                gl_object_editor_set_lsize (editor, w, h);
+                gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node);
+                gl_object_editor_set_line_width (editor, line_width);
+
+                gl_color_node_free (&line_color_node);
+
+        }
+        else if ( GL_IS_LABEL_IMAGE (object) )
+        {
+
+                gl_label_object_get_size (object, &w, &h);
+                filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object));
+
+                gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h);
+
+                gl_object_editor_set_size (editor, w, h);
+                gl_object_editor_set_base_size (editor, image_w, image_h);
+                gl_object_editor_set_image (editor, (merge != NULL), filename);
+
+                gl_text_node_free (&filename);
+
+        }
+        else if ( GL_IS_LABEL_TEXT (object) )
+        {
+
+                gl_label_object_get_size (object, &w, &h);
+                font_family       = gl_label_object_get_font_family (object);
+                font_size         = gl_label_object_get_font_size (object);
+                font_weight       = gl_label_object_get_font_weight (object);
+                font_italic_flag  = gl_label_object_get_font_italic_flag (object);
+                text_color_node   = gl_label_object_get_text_color (object);
+                align             = gl_label_object_get_text_alignment (object);
+                text_line_spacing = gl_label_object_get_text_line_spacing (object);
+                auto_shrink       = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object));
+
+                gl_object_editor_set_size (editor, w, h);
+                gl_object_editor_set_font_family (editor, font_family);
+                gl_object_editor_set_font_size (editor, font_size);
+                gl_object_editor_set_font_weight (editor, font_weight);
+                gl_object_editor_set_font_italic_flag (editor, font_italic_flag);
+                gl_object_editor_set_text_color (editor, (merge != NULL), text_color_node);
+                gl_object_editor_set_text_alignment (editor, align);
+                gl_object_editor_set_text_line_spacing (editor, text_line_spacing);
+                gl_object_editor_set_text_auto_shrink (editor, auto_shrink);
+
+                gl_color_node_free (&text_color_node);
+                g_free (font_family);
+
+        }
+        else if ( GL_IS_LABEL_BARCODE (object) )
+        {
+
+                gl_label_object_get_size (object, &w, &h);
+                bc_data  = gl_label_barcode_get_data (GL_LABEL_BARCODE(object));
+                bc_style = gl_label_barcode_get_style (GL_LABEL_BARCODE(object));
+                line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
 
-       cg = color_group_fetch (cg_name, NULL);
-       color_combo = color_combo_new (NULL, no_color, gdk_color, cg);
-        g_free (gdk_color);
+                gl_object_editor_set_size (editor, w, h);
+                gl_object_editor_set_data (editor, (merge != NULL), bc_data);
+                gl_object_editor_set_bc_style (editor, bc_style);
+                gl_object_editor_set_bc_color (editor, (merge != NULL), line_color_node);
+
+                gl_text_node_free (&bc_data);
+                gl_label_barcode_style_free (bc_style);
+
+        }
 
-       color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
 
-       return color_combo;
+        shadow_state      = gl_label_object_get_shadow_state (object);
+        gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y);
+        shadow_color_node = gl_label_object_get_shadow_color (object);
+        shadow_opacity    = gl_label_object_get_shadow_opacity (object);
+
+        gl_object_editor_set_shadow_state (editor, shadow_state);
+        gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y);
+        gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node);
+        gl_object_editor_set_shadow_opacity (editor, shadow_opacity);
+
+        gl_color_node_free (&shadow_color_node);
+
+
+        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*****************************************************************************/
-/* Construct chain button "Custom widget".                                   */
-/*****************************************************************************/
-GtkWidget *
-gl_object_editor_construct_chain_button (gchar *name,
-                                        gchar *string1,
-                                        gchar *string2,
-                                        gint   int1,
-                                        gint   int2)
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. object "moved" callback.                                         */
+/*---------------------------------------------------------------------------*/
+static void
+object_moved_cb (glLabelObject  *object,
+                 glObjectEditor *editor)
 {
-       GtkWidget  *chain_button;
+        gdouble              x, y;
 
-       chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT);
-       gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE);
+        gl_debug (DEBUG_EDITOR, "BEGIN");
 
-       return chain_button;
+        gl_label_object_get_position (object, &x, &y);
+        gl_object_editor_set_position (editor, x, y);
+
+        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Prefs changed callback.  Update units related items.            */
-/*--------------------------------------------------------------------------*/
-static void
-prefs_changed_cb (glObjectEditor *editor)
+
+/*****************************************************************************/
+/* Object editor "changed" callback.                                         */
+/*****************************************************************************/
+void
+gl_object_editor_changed_cb (glObjectEditor *editor)
 {
+        glLabelObject       *object = editor->priv->object;
+        gdouble              x, y;
+        glColorNode         *line_color_node;
+        gdouble              line_width;
+        glColorNode         *fill_color_node;
+        gchar               *font_family;
+        gdouble              font_size;
+        PangoWeight          font_weight;
+        gboolean             font_italic_flag;
+        glColorNode         *text_color_node;
+        PangoAlignment       align;
+        gdouble              text_line_spacing;
+        gboolean             auto_shrink;
+        glTextNode          *filename;
+        gdouble              w, h;
+        gdouble              image_w, image_h;
+        gdouble              new_w, new_h;
+        glTextNode          *bc_data;
+        glLabelBarcodeStyle *bc_style;
+        gboolean             shadow_state;
+        gdouble              shadow_x, shadow_y;
+        glColorNode         *shadow_color_node;
+        gdouble              shadow_opacity;
+
+        gl_debug (DEBUG_EDITOR, "BEGIN");
+
+
+        g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor);
+        g_signal_handlers_block_by_func (G_OBJECT (object), object_moved_cb, editor);
+
+
+        gl_object_editor_get_position (editor, &x, &y);
+        gl_label_object_set_position (object, x, y, TRUE);
+
+
+        if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
+        {
 
-       gl_debug (DEBUG_EDITOR, "START");
+                fill_color_node   = gl_object_editor_get_fill_color (editor);
+                line_color_node   = gl_object_editor_get_line_color (editor);
+                line_width        = gl_object_editor_get_line_width (editor);
 
-       if (editor->priv->lsize_r_spin) {
-               lsize_prefs_changed_cb (editor);
-       }
-               
-       if (editor->priv->size_w_spin) {
-               size_prefs_changed_cb (editor);
-       }
-               
-       if (editor->priv->pos_x_spin) {
-               position_prefs_changed_cb (editor);
-       }
+                gl_label_object_set_fill_color (object, fill_color_node, TRUE);
+                gl_label_object_set_line_color (object, line_color_node, TRUE);
+                gl_label_object_set_line_width (object, line_width, TRUE);
 
-       if (editor->priv->shadow_x_spin) {
-               shadow_prefs_changed_cb (editor);
-       }
+                gl_color_node_free (&fill_color_node);
+                gl_color_node_free (&line_color_node);
 
-       gl_debug (DEBUG_EDITOR, "END");
+        }
+        else if (GL_IS_LABEL_LINE (object))
+        {
+
+                line_color_node   = gl_object_editor_get_line_color (editor);
+                line_width        = gl_object_editor_get_line_width (editor);
+
+                gl_label_object_set_line_color (object, line_color_node, TRUE);
+                gl_label_object_set_line_width (object, line_width, TRUE);
+
+                gl_color_node_free (&line_color_node);
+
+        }
+        else if ( GL_IS_LABEL_IMAGE (object) )
+        {
+
+                filename = gl_object_editor_get_image (editor);
+
+                gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename, TRUE);
+
+                /* Setting filename may have modified the size. */
+                gl_object_editor_get_size (editor, &w, &h);
+                gl_label_object_get_size (object, &new_w, &new_h);
+                if ( (new_w != w) || (new_h != h) )
+                {
+                        gl_object_editor_set_size (editor, new_w, new_h);
+                }
+
+                /* It may also have a new base size. */
+                gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h);
+                gl_object_editor_set_base_size (editor, image_w, image_h);
+
+                gl_text_node_free (&filename);
+
+        }
+        else if (GL_IS_LABEL_TEXT (object))
+        {
+
+                font_family       = gl_object_editor_get_font_family (editor);
+                font_size         = gl_object_editor_get_font_size (editor);
+                font_weight       = gl_object_editor_get_font_weight (editor);
+                font_italic_flag  = gl_object_editor_get_font_italic_flag (editor);
+                text_color_node   = gl_object_editor_get_text_color (editor);
+                align             = gl_object_editor_get_text_alignment (editor);
+                text_line_spacing = gl_object_editor_get_text_line_spacing (editor);
+                auto_shrink       = gl_object_editor_get_text_auto_shrink (editor);
+
+                gl_label_object_set_font_family (object, font_family, TRUE);
+                gl_label_object_set_font_size (object, font_size, TRUE);
+                gl_label_object_set_font_weight (object, font_weight, TRUE);
+                gl_label_object_set_font_italic_flag (object, font_italic_flag, TRUE);
+                gl_label_object_set_text_color (object, text_color_node, TRUE);
+                gl_label_object_set_text_alignment (object, align, TRUE);
+                gl_label_object_set_text_line_spacing (object, text_line_spacing, TRUE);
+                gl_label_text_set_auto_shrink (GL_LABEL_TEXT (object), auto_shrink, TRUE);
+
+                gl_color_node_free (&text_color_node);
+                g_free (font_family);
+
+        }
+        else if (GL_IS_LABEL_BARCODE (object))
+        {
+
+                line_color_node = gl_object_editor_get_bc_color (editor);
+                bc_data  = gl_object_editor_get_data (editor);
+                bc_style = gl_object_editor_get_bc_style (editor);
+
+                gl_label_object_set_line_color (object, line_color_node, TRUE);
+                gl_label_barcode_set_data (GL_LABEL_BARCODE(object), bc_data, TRUE);
+                gl_label_barcode_set_style (GL_LABEL_BARCODE(object), bc_style, TRUE);
+
+                gl_color_node_free (&line_color_node);
+                gl_text_node_free (&bc_data);
+                gl_label_barcode_style_free (bc_style);
+
+        }
+
+
+        shadow_state      = gl_object_editor_get_shadow_state (editor);
+        gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y);
+        shadow_color_node = gl_object_editor_get_shadow_color (editor);
+        shadow_opacity    = gl_object_editor_get_shadow_opacity (editor);
+
+        gl_label_object_set_shadow_state (object, shadow_state, TRUE);
+        gl_label_object_set_shadow_offset (object, shadow_x, shadow_y, TRUE);
+        gl_label_object_set_shadow_color (object, shadow_color_node, TRUE);
+        gl_label_object_set_shadow_opacity (object, shadow_opacity, TRUE);
+
+        gl_color_node_free (&shadow_color_node);
+
+
+        g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor);
+        g_signal_handlers_unblock_by_func (G_OBJECT (object), object_moved_cb, editor);
+
+        gl_debug (DEBUG_EDITOR, "END");
 }
 
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. label "changed" callback.                                        */
-/*---------------------------------------------------------------------------*/
-static void
-label_changed_cb (glLabel        *label,
-                  glObjectEditor *editor)
+
+/*****************************************************************************/
+/* Object editor "size_changed" callback.                                    */
+/*****************************************************************************/
+void
+gl_object_editor_size_changed_cb (glObjectEditor *editor)
 {
-       gdouble   label_width, label_height;
-       glMerge  *merge;
+        glLabelObject     *object = editor->priv->object;
+        gdouble            w, h;
 
-       gl_debug (DEBUG_EDITOR, "START");
+        gl_debug (DEBUG_EDITOR, "BEGIN");
 
-       gl_label_get_size (label, &label_width, &label_height);
-       gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
-                                          label_width, label_height);
-       gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
-                                      label_width, label_height);
-       gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor),
-                                      label_width, label_height);
-       gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor),
-                                               label_width, label_height);
-       
-       merge = gl_label_get_merge (label);
-       gl_object_editor_set_key_names (editor, merge);
+        g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor);
 
-       gl_debug (DEBUG_EDITOR, "END");
+
+        if ( GL_IS_LABEL_LINE (object) )
+        {
+                gl_object_editor_get_lsize (editor, &w, &h);
+        }
+        else
+        {
+                gl_object_editor_get_size (editor, &w, &h);
+        }
+
+        gl_label_object_set_size (object, w, h, TRUE);
+
+
+        g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor);
+
+        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
+
+/*
+ * Local Variables:       -- emacs
+ * mode: C                -- emacs
+ * c-basic-offset: 8      -- emacs
+ * tab-width: 8           -- emacs
+ * indent-tabs-mode: nil  -- emacs
+ * End:                   -- emacs
+ */