]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/object-editor.c
2009-09-01 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor.c
index ac4f08f5f7fa1f781e9b8729f33a4e856a223baf..54f6797a771454dab77fdf0a0ae2d16bf2e5e540 100644 (file)
 /*
- *  (GLABELS) Label and Business Card Creation program for GNOME
+ *  object-editor.c
+ *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
  *
- *  object-editor.c:  object properties editor module
+ *  This file is part of gLabels.
  *
- *  Copyright (C) 2003  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 "object-editor.h"
+
 #include <glib/gi18n.h>
-#include <glade/glade-xml.h>
+#include <gtk/gtkbuilder.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtknotebook.h>
+#include <gtk/gtkcombobox.h>
+#include <gtk/gtktogglebutton.h>
+
 #include <math.h>
 
-#include "object-editor.h"
 #include "prefs.h"
-#include "mygal/widget-color-combo.h"
+#include "color-combo.h"
 #include "color.h"
 #include "wdgt-chain-button.h"
+#include "wdgt-merge-menu.h"
 #include "marshal.h"
+#include "util.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 };
 
-static GtkVBoxClass *parent_class = NULL;
 
 /*===========================================*/
 /* Local function prototypes                 */
 /*===========================================*/
 
-static void gl_object_editor_class_init         (glObjectEditorClass  *klass);
-static void gl_object_editor_init               (glObjectEditor       *editor);
 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 prefs_changed_cb                    (glObjectEditor       *editor);
 
-\f
+static void label_changed_cb                    (glLabel              *label,
+                                                 glObjectEditor       *editor);
+
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-GType
-gl_object_editor_get_type (void)
-{
-       static GType type = 0;
-
-       if (!type)
-       {
-               static const GTypeInfo info =
-               {
-                       sizeof (glObjectEditorClass),
-                       NULL,           /* base_init */
-                       NULL,           /* base_finalize */
-                       (GClassInitFunc) gl_object_editor_class_init,
-                       NULL,           /* class_finalize */
-                       NULL,           /* class_data */
-                       sizeof (glObjectEditor),
-                       0,              /* n_preallocs */
-                       (GInstanceInitFunc) gl_object_editor_init,
-                       NULL
-               };
-
-               type = g_type_register_static (GTK_TYPE_VBOX,
-                                              "glObjectEditor", &info, 0);
-       }
-
-       return type;
-}
+G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX);
+
 
 static void
-gl_object_editor_class_init (glObjectEditorClass *klass)
+gl_object_editor_class_init (glObjectEditorClass *class)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GObjectClass *object_class = G_OBJECT_CLASS (class);
 
        gl_debug (DEBUG_EDITOR, "START");
        
-       parent_class = g_type_class_peek_parent (klass);
+       gl_object_editor_parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize = gl_object_editor_finalize;     
 
@@ -132,73 +117,88 @@ gl_object_editor_class_init (glObjectEditorClass *klass)
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 static void
 gl_object_editor_init (glObjectEditor *editor)
 {
+        static gchar *object_ids[] = { "editor_vbox",
+                                       "adjustment1",  "adjustment2",  "adjustment3",
+                                       "adjustment4",  "adjustment5",  "adjustment6",
+                                       "adjustment7",  "adjustment8",  "adjustment9",
+                                       "adjustment10", "adjustment11", "adjustment12",
+                                       "adjustment13",
+                                       NULL };
+        GError       *error = NULL;
+
        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_warning ("Could not open object-editor.glade, reinstall glabels!");
+        gtk_builder_add_objects_from_file (editor->priv->builder,
+                                           GLABELS_BUILDER_DIR "object-editor.builder",
+                                           object_ids,
+                                           &error);
+       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_util_get_builder_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));
 
        /* Hide all notebook pages to start with. */
        gtk_widget_hide_all (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)
 {
-       glObjectEditor* editor;
+       glObjectEditor* editor = GL_OBJECT_EDITOR (object);;
        
        gl_debug (DEBUG_EDITOR, "START");
        
        g_return_if_fail (object != NULL);
-       
-       editor = GL_OBJECT_EDITOR (object);
-
        g_return_if_fail (GL_IS_OBJECT_EDITOR (editor));
        g_return_if_fail (editor->priv != NULL);
 
-       g_free (editor->priv);
-
        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->builder);
+       g_free (editor->priv);
 
-       G_OBJECT_CLASS (parent_class)->finalize (object);
+       G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 /*****************************************************************************/
 /* NEW object editor.                                                      */
 /*****************************************************************************/
 GtkWidget*
 gl_object_editor_new (gchar                *image,
-                     gchar                *label,
+                     gchar                *title,
+                      glLabel              *label,
                      glObjectEditorOption  first_option, ...)
 {
        glObjectEditor *editor;
@@ -214,11 +214,11 @@ gl_object_editor_new (gchar                *image,
                                          GTK_ICON_SIZE_LARGE_TOOLBAR);
        }
 
-       if (label) {
+       if (title) {
                gchar *s;
 
                s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
-                                    label);
+                                    title);
                gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
                g_free (s);
 
@@ -226,10 +226,8 @@ gl_object_editor_new (gchar                *image,
                                          
        }
 
-       gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE);
-
        va_start (args, first_option);
-       gl_object_notebook_construct_valist (editor, first_option, args);
+       gl_object_notebook_construct_valist (editor, label, first_option, args);
        va_end (args);
 
        gl_debug (DEBUG_EDITOR, "END");
@@ -237,11 +235,13 @@ gl_object_editor_new (gchar                *image,
        return GTK_WIDGET(editor);
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct notebook.                                            */
 /*--------------------------------------------------------------------------*/
 static void
 gl_object_notebook_construct_valist (glObjectEditor       *editor,
+                                     glLabel              *label,
                                     glObjectEditorOption  first_option,
                                     va_list               args)
 {
@@ -250,6 +250,8 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
 
        gl_debug (DEBUG_EDITOR, "START");
 
+        editor->priv->label = label;
+
        option = first_option;
 
        for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
@@ -312,8 +314,13 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
                        pages++;
                        break;
 
+               case GL_OBJECT_EDITOR_SHADOW_PAGE:
+                       gl_object_editor_prepare_shadow_page (editor);
+                       pages++;
+                       break;
+
                default:
-                       g_warning ("option = %d", option);
+                       g_message ("option = %d", option);
                        g_assert_not_reached ();
                }
                
@@ -325,16 +332,29 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
        g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
                                  G_CALLBACK (prefs_changed_cb),
                                  editor);
+        if (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);
+        }
 
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE. Widget changed callback.  Emit our "changed" signal.            */
 /*--------------------------------------------------------------------------*/
 void
 gl_object_editor_changed_cb (glObjectEditor *editor)
 {
+        if (editor->priv->stop_signals) return;
+
        gl_debug (DEBUG_EDITOR, "START");
 
        /* Emit our "changed" signal */
@@ -343,12 +363,15 @@ gl_object_editor_changed_cb (glObjectEditor *editor)
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE. Widget size changed callback.  Emit our "size-changed" signal.  */
 /*--------------------------------------------------------------------------*/
 void
 gl_object_editor_size_changed_cb (glObjectEditor *editor)
 {
+        if (editor->priv->stop_signals) return;
+
        gl_debug (DEBUG_EDITOR, "START");
 
        /* Emit our "size_changed" signal */
@@ -357,6 +380,7 @@ gl_object_editor_size_changed_cb (glObjectEditor *editor)
        gl_debug (DEBUG_EDITOR, "END");
 }
 
+
 /*****************************************************************************/
 /* Set possible key names from merge object.                                 */
 /*****************************************************************************/
@@ -366,35 +390,32 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
 {
         GList     *keys;
        GtkWidget *combo;
+       GtkWidget *menu;
        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);
        }
  
-       if (editor->priv->text_color_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->text_color_key_combo, merge != NULL);
-       }
-       if (editor->priv->text_color_key_radio) {
+       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);
+                                                 
                }
-       }       
-       
+       }
+
        if (editor->priv->edit_insert_field_button) {
                gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
                                          merge != NULL);
@@ -442,193 +463,116 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
                                          (merge != NULL) && !fixed_flag);
        }
 
-       if (editor->priv->fill_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->fill_key_combo, merge != NULL);
-       }
-       if (editor->priv->fill_key_radio) {
+       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);
+                                                 
                }
        }
-       
-       if (editor->priv->line_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->line_key_combo, merge != NULL);
-       }
-       if (editor->priv->line_key_radio) {
+
+       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);
+                                                 
                }
        }
-       
-       if (editor->priv->bc_key_combo) {
-               gtk_widget_set_sensitive (editor->priv->bc_key_combo, merge != NULL);
-       }
-       if (editor->priv->bc_key_radio) {
+
+       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);
+                                                 
                }
-       }       
-       
-        keys = gl_merge_get_key_list (merge);
-        if ( keys != NULL ) {
+       }
 
-               combo = editor->priv->img_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
+       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);
+                                                 
                }
+       }
 
-               combo = editor->priv->edit_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+        keys = gl_merge_get_key_list (merge);
+        if ( keys == NULL ) {
+                keys = g_list_append (keys, g_strdup (""));
+       }
 
-               combo = editor->priv->data_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
-               
-               combo = editor->priv->fill_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->img_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
 
-               combo = editor->priv->text_color_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       menu = editor->priv->edit_insert_field_menu;
+       if (menu) {
+               gl_wdgt_merge_menu_set_fields (GL_WDGT_MERGE_MENU(menu), keys);
+       }
 
-               combo = editor->priv->line_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
-               
-               combo = editor->priv->bc_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->data_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
                
-                gl_merge_free_key_list (&keys);
-        } else {
-
-                keys = g_list_append (keys, "");
+       combo = editor->priv->fill_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
 
-               combo = editor->priv->img_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->text_color_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
 
-               combo = editor->priv->edit_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
-               
-               combo = editor->priv->data_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->line_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
                
-               combo = editor->priv->fill_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->bc_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
                
-               combo = editor->priv->text_color_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
+       combo = editor->priv->shadow_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
 
-               combo = editor->priv->line_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
-               
-               combo = editor->priv->bc_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
-               }
-               
-                g_list_free (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)
-{
-       GtkWidget  *color_combo;
-       ColorGroup *cg;
-       gchar      *cg_name;
-       guint       color;
-       GdkColor   *gdk_color;
-       gchar      *no_color;
-
-       switch (int1) {
-
-       case 2:
-               cg_name  = "text_color_group";
-               color    = gl_prefs->default_text_color;
-               no_color = _("Default");
-               break;
-
-       case 1:
-               cg_name  = "line_color_group";
-               color    = gl_prefs->default_line_color;
-               no_color = _("No line");
-               break;
-
-       case 0:
-       default:
-               cg_name  = "fill_color_group";
-               color    = gl_prefs->default_fill_color;
-               no_color = _("No fill");
-               break;
-
-       }
-
-       cg = color_group_fetch (cg_name, NULL);
-        gdk_color = gl_color_to_gdk_color (color);
-       color_combo = color_combo_new (NULL, no_color, gdk_color, cg);
-        g_free (gdk_color);
-
-       color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
-
-       return color_combo;
-}
-
-/*****************************************************************************/
-/* Construct chain button "Custom widget".                                   */
-/*****************************************************************************/
-GtkWidget *
-gl_object_editor_construct_chain_button (gchar *name,
-                                        gchar *string1,
-                                        gchar *string2,
-                                        gint   int1,
-                                        gint   int2)
-{
-       GtkWidget  *chain_button;
-
-       chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT);
-       gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE);
-
-       return chain_button;
-}
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE. Prefs changed callback.  Update units related items.            */
@@ -651,5 +595,49 @@ prefs_changed_cb (glObjectEditor *editor)
                position_prefs_changed_cb (editor);
        }
 
+       if (editor->priv->shadow_x_spin) {
+               shadow_prefs_changed_cb (editor);
+       }
+
        gl_debug (DEBUG_EDITOR, "END");
 }
+
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. label "changed" callback.                                        */
+/*---------------------------------------------------------------------------*/
+static void
+label_changed_cb (glLabel        *label,
+                  glObjectEditor *editor)
+{
+       gdouble   label_width, label_height;
+       glMerge  *merge;
+
+       gl_debug (DEBUG_EDITOR, "START");
+
+       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);
+
+       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
+ */