]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/object-editor.c
2008-10-12 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor.c
index d35aae7684aa15f2464535abdfe5ecf79a44dd67..ddaf6f90126a86ee549ae78cea064fc6dba9e565 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/* -*- 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
  */
 #include <config.h>
 
-#include <gnome.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 <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"
 
@@ -52,62 +62,36 @@ typedef void (*ChangedSignal) (GObject * object, gpointer data);
 
 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);
 
+static void label_changed_cb                    (glLabel              *label,
+                                                 glObjectEditor       *editor);
+
 \f
 /*****************************************************************************/
 /* 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;     
 
@@ -144,7 +128,7 @@ gl_object_editor_init (glObjectEditor *editor)
                                           NULL);
 
        if (!editor->priv->gui) {
-               g_warning ("Could not open object-editor.glade, reinstall glabels!");
+               g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!");
                return;
        }
 
@@ -165,6 +149,7 @@ gl_object_editor_init (glObjectEditor *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");
 }
@@ -172,23 +157,23 @@ gl_object_editor_init (glObjectEditor *editor)
 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_CLASS (parent_class)->finalize (object);
+        g_object_unref (editor->priv->gui);
+       g_free (editor->priv);
+
+       G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
 
        gl_debug (DEBUG_EDITOR, "END");
 }
@@ -198,7 +183,8 @@ gl_object_editor_finalize (GObject *object)
 /*****************************************************************************/
 GtkWidget*
 gl_object_editor_new (gchar                *image,
-                     gchar                *label,
+                     gchar                *title,
+                      glLabel              *label,
                      glObjectEditorOption  first_option, ...)
 {
        glObjectEditor *editor;
@@ -214,11 +200,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);
 
@@ -229,7 +215,7 @@ 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");
@@ -242,6 +228,7 @@ gl_object_editor_new (gchar                *image,
 /*--------------------------------------------------------------------------*/
 static void
 gl_object_notebook_construct_valist (glObjectEditor       *editor,
+                                     glLabel              *label,
                                     glObjectEditorOption  first_option,
                                     va_list               args)
 {
@@ -250,6 +237,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 +301,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,6 +319,16 @@ 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");
 }
@@ -335,6 +339,8 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
 void
 gl_object_editor_changed_cb (glObjectEditor *editor)
 {
+        if (editor->priv->stop_signals) return;
+
        gl_debug (DEBUG_EDITOR, "START");
 
        /* Emit our "changed" signal */
@@ -349,6 +355,8 @@ gl_object_editor_changed_cb (glObjectEditor *editor)
 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 */
@@ -366,23 +374,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_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);
@@ -411,7 +428,7 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
                                GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE);
                }
        }
+       
        fixed_flag = editor->priv->data_format_fixed_flag;
        if (editor->priv->data_format_label) {
                gtk_widget_set_sensitive (editor->priv->data_format_label,
@@ -429,47 +446,113 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
                gtk_widget_set_sensitive (editor->priv->data_digits_spin,
                                          (merge != NULL) && !fixed_flag);
        }
-        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->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_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);
+                                                 
                }
+       }
 
-               combo = editor->priv->edit_key_combo;
-               if (combo) {
-                       gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
+       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);
+                                                 
                }
+       }
 
-               combo = editor->priv->data_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);
+                                                 
                }
+       }
 
-                gl_merge_free_key_list (&keys);
-        } else {
+        keys = gl_merge_get_key_list (merge);
+        if ( keys == NULL ) {
+                keys = g_list_append (keys, g_strdup (""));
+       }
 
-                keys = g_list_append (keys, "");
+       combo = editor->priv->img_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);
-               }
+       menu = editor->priv->edit_insert_field_menu;
+       if (menu) {
+               gl_wdgt_merge_menu_set_fields (GL_WDGT_MERGE_MENU(menu), 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) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
+               
+       combo = editor->priv->fill_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
 
-               combo = editor->priv->data_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);
+       }
 
-                g_list_free (keys);
-        }
+       combo = editor->priv->line_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
+               
+       combo = editor->priv->bc_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
+               
+       combo = editor->priv->shadow_key_combo;
+       if (combo) {
+               gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+       }
+
+       gl_merge_free_key_list (&keys);
  
         gl_debug (DEBUG_EDITOR, "END");
 }
@@ -485,41 +568,37 @@ gl_object_editor_construct_color_combo (gchar *name,
                                        gint   int2)
 {
        GtkWidget  *color_combo;
-       ColorGroup *cg;
-       gchar      *cg_name;
        guint       color;
-       GdkColor   *gdk_color;
        gchar      *no_color;
 
        switch (int1) {
 
+       case 3:
+               color    = GL_COLOR_SHADOW_DEFAULT;
+               no_color = _("Default");
+               break;
+
        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 = gl_color_combo_new (NULL, no_color, color, color);
 
-       color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
+       gl_color_combo_set_relief (GL_COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
 
        return color_combo;
 }
@@ -563,6 +642,38 @@ 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");
 }