[glade] Added new composite widget: GladePropertyLabel.



commit 985b42b5f3c368e501f68492de462c55f0a5e7ac
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Fri Apr 12 18:00:00 2013 +0900

    Added new composite widget: GladePropertyLabel.
    
    Now GladeEditorProperty creates a GladePropertyLabel on demand if
    needed, instead of implementing the label itself.
    
    This will allow custom property editors to use the property labels
    in the interface defined with GtkBuilder script.

 gladeui/Makefile.am                     |    5 +-
 gladeui/glade-editor-property.c         |  109 ++--------
 gladeui/glade-property-label.c          |  355 +++++++++++++++++++++++++++++++
 gladeui/glade-property-label.h          |   64 ++++++
 gladeui/glade-property-label.ui         |   44 ++++
 gladeui/gladeui-resources.gresource.xml |    1 +
 po/POTFILES.in                          |    1 +
 7 files changed, 490 insertions(+), 89 deletions(-)
---
diff --git a/gladeui/Makefile.am b/gladeui/Makefile.am
index 438dedb..14b925c 100644
--- a/gladeui/Makefile.am
+++ b/gladeui/Makefile.am
@@ -51,7 +51,8 @@ BUILT_SOURCES = \
        gladeui-resources.h
 
 UI_FILES = \
-       glade-project-properties.ui
+       glade-project-properties.ui \
+       glade-property-label.ui
 
 EXTRA_DIST = \
        $(UI_FILES)     \
@@ -72,6 +73,7 @@ libgladeui_2_la_SOURCES = \
        glade-widget.c \
        glade-property-class.c \
        glade-property.c \
+       glade-property-label.c \
        glade-signal-class.c \
        glade-signal.c \
        glade-widget-action.c \
@@ -139,6 +141,7 @@ libgladeuiinclude_HEADERS = \
        glade-widget-adaptor.h \
        glade-property.h \
        glade-property-class.h \
+       glade-property-label.h \
        glade-utils.h \
        glade-clipboard.h \
        glade-command.h \
diff --git a/gladeui/glade-editor-property.c b/gladeui/glade-editor-property.c
index 5956ecb..448c2d0 100644
--- a/gladeui/glade-editor-property.c
+++ b/gladeui/glade-editor-property.c
@@ -41,6 +41,7 @@
 #include "glade.h"
 #include "glade-widget.h"
 #include "glade-editor-property.h"
+#include "glade-property-label.h"
 #include "glade-property.h"
 #include "glade-command.h"
 #include "glade-project.h"
@@ -79,9 +80,7 @@ struct _GladeEditorPropertyPrivate
   GladePropertyClass *klass;          /* The property class this GladeEditorProperty was created for */
   GladeProperty      *property;       /* The currently loaded property */
 
-  GtkWidget          *item_label;     /* The property name portion of the eprop */
-  GtkWidget          *label;          /* The actual property name label */
-  GtkWidget          *warning;        /* Icon to show warnings */
+  GtkWidget          *item_label;     /* A GladePropertyLabel, if one was constructed */
   GtkWidget          *input;          /* Input part of property (need to set sensitivity seperately)  */
   GtkWidget          *check;          /* Check button for optional properties. */
 
@@ -89,7 +88,6 @@ struct _GladeEditorPropertyPrivate
   gulong              sensitive_id;   /* signal connection id for sensitivity changes    */
   gulong              changed_id;     /* signal connection id for value changes          */
   gulong              enabled_id;     /* signal connection id for enable/disable changes */
-  gulong              state_id;       /* signal connection id for state changes          */
        
   gboolean            loading;        /* True during glade_editor_property_load calls, this
                                       * is used to avoid feedback from input widgets.
@@ -159,6 +157,16 @@ glade_editor_property_get_item_label  (GladeEditorProperty *eprop)
 {
   g_return_val_if_fail (GLADE_IS_EDITOR_PROPERTY (eprop), NULL);
 
+  if (!eprop->priv->item_label)
+    {
+      eprop->priv->item_label = glade_property_label_new();
+
+      g_object_ref_sink (eprop->priv->item_label);
+
+      if (eprop->priv->property)
+       glade_property_label_set_property (GLADE_PROPERTY_LABEL (eprop), eprop->priv->property);
+    }
+
   return eprop->priv->item_label;
 }
 
@@ -201,8 +209,6 @@ glade_editor_property_tooltip_cb (GladeProperty *property,
     choice_tooltip = insensitive;
 
   gtk_widget_set_tooltip_text (eprop->priv->input, choice_tooltip);
-  gtk_widget_set_tooltip_text (eprop->priv->label, choice_tooltip);
-  gtk_widget_set_tooltip_text (eprop->priv->warning, support);
 }
 
 static void
@@ -219,9 +225,6 @@ glade_editor_property_sensitivity_cb (GladeProperty *property,
   gtk_widget_set_sensitive (priv->input,
                             sensitive && support_sensitive && property_enabled);
 
-  if (priv->item_label)
-    gtk_widget_set_sensitive (priv->item_label,
-                              sensitive && support_sensitive && property_enabled);
   if (priv->check)
     gtk_widget_set_sensitive (priv->check, sensitive && support_sensitive);
 }
@@ -237,40 +240,6 @@ glade_editor_property_value_changed_cb (GladeProperty *property,
 }
 
 static void
-glade_editor_property_fix_label (GladeEditorProperty *eprop)
-{
-  gchar *text = NULL;
-
-  if (!eprop->priv->property)
-    return;
-
-  /* refresh label */
-  if ((glade_property_get_state (eprop->priv->property) & GLADE_STATE_CHANGED) != 0)
-    text = g_strdup_printf ("<b>%s:</b>", glade_property_class_get_name (eprop->priv->klass));
-  else
-    text = g_strdup_printf ("%s:", glade_property_class_get_name (eprop->priv->klass));
-  gtk_label_set_markup (GTK_LABEL (eprop->priv->label), text);
-  g_free (text);
-
-  /* refresh icon */
-  if ((glade_property_get_state (eprop->priv->property) & GLADE_STATE_UNSUPPORTED) != 0)
-    gtk_widget_show (eprop->priv->warning);
-  else
-    gtk_widget_hide (eprop->priv->warning);
-
-  /* check sensitivity */
-  glade_editor_property_sensitivity_cb (eprop->priv->property, NULL, eprop);
-}
-
-static void
-glade_editor_property_state_cb (GladeProperty *property,
-                                GParamSpec *pspec,
-                                GladeEditorProperty *eprop)
-{
-  glade_editor_property_fix_label (eprop);
-}
-
-static void
 glade_editor_property_enabled_toggled_cb (GtkWidget *check,
                                           GladeEditorProperty *eprop)
 {
@@ -324,7 +293,6 @@ glade_editor_property_constructor (GType type,
 {
   GObject *obj;
   GladeEditorProperty *eprop;
-  GtkWidget *hbox;
 
   /* Invoke parent constructor (eprop->priv->klass should be resolved by this point) . */
   obj = G_OBJECT_CLASS (table_class)->constructor
@@ -348,35 +316,6 @@ glade_editor_property_constructor (GType type,
   eprop->priv->input = GLADE_EDITOR_PROPERTY_GET_CLASS (eprop)->create_input (eprop);
   gtk_widget_show (eprop->priv->input);
 
-  /* Create the warning icon */
-  eprop->priv->warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
-                                             GTK_ICON_SIZE_MENU);
-  gtk_widget_set_no_show_all (eprop->priv->warning, TRUE);
-
-  /* Create & setup label */
-  eprop->priv->item_label = gtk_event_box_new ();
-  eprop->priv->label = gtk_label_new (NULL);
-  gtk_event_box_set_visible_window (GTK_EVENT_BOX (eprop->priv->item_label), FALSE);
-
-  g_object_ref_sink (eprop->priv->item_label);
-
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-
-  gtk_label_set_line_wrap (GTK_LABEL (eprop->priv->label), TRUE);
-  gtk_label_set_width_chars (GTK_LABEL (eprop->priv->label), 10);
-  gtk_label_set_line_wrap_mode (GTK_LABEL (eprop->priv->label), PANGO_WRAP_WORD_CHAR);
-
-  gtk_misc_set_alignment (GTK_MISC (eprop->priv->label), 0.0, 0.5);
-
-  gtk_box_pack_start (GTK_BOX (hbox), eprop->priv->label, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (hbox), eprop->priv->warning, FALSE, FALSE, 0);
-  gtk_container_add (GTK_CONTAINER (eprop->priv->item_label), hbox);
-  gtk_widget_show_all (eprop->priv->item_label);
-
-  glade_editor_property_fix_label (eprop);
-
-  g_signal_connect (G_OBJECT (eprop->priv->item_label), "button-press-event",
-                    G_CALLBACK (glade_editor_property_button_pressed), eprop);
   g_signal_connect (G_OBJECT (eprop->priv->input), "button-press-event",
                     G_CALLBACK (glade_editor_property_button_pressed), eprop);
 
@@ -466,7 +405,6 @@ glade_eprop_property_finalized (GladeEditorProperty *eprop,
   eprop->priv->sensitive_id = 0;
   eprop->priv->changed_id = 0;
   eprop->priv->enabled_id = 0;
-  eprop->priv->state_id = 0;
   eprop->priv->property = NULL;
 
   glade_editor_property_load (eprop, NULL);
@@ -487,8 +425,6 @@ glade_editor_property_load_common (GladeEditorProperty *eprop,
         g_signal_handler_disconnect (eprop->priv->property, eprop->priv->sensitive_id);
       if (eprop->priv->changed_id > 0)
         g_signal_handler_disconnect (eprop->priv->property, eprop->priv->changed_id);
-      if (eprop->priv->state_id > 0)
-        g_signal_handler_disconnect (eprop->priv->property, eprop->priv->state_id);
       if (eprop->priv->enabled_id > 0)
         g_signal_handler_disconnect (eprop->priv->property, eprop->priv->enabled_id);
 
@@ -496,7 +432,6 @@ glade_editor_property_load_common (GladeEditorProperty *eprop,
       eprop->priv->sensitive_id = 0;
       eprop->priv->changed_id = 0;
       eprop->priv->enabled_id = 0;
-      eprop->priv->state_id = 0;
       eprop->priv->changed_blocked = FALSE;
 
       /* Unref it here */
@@ -542,11 +477,6 @@ glade_editor_property_load_common (GladeEditorProperty *eprop,
                             "notify::enabled",
                             G_CALLBACK (glade_editor_property_enabled_cb),
                             eprop);
-      eprop->priv->state_id =
-          g_signal_connect (G_OBJECT (eprop->priv->property),
-                            "notify::state",
-                            G_CALLBACK (glade_editor_property_state_cb), eprop);
-
 
       /* In query dialogs when the user hits cancel, 
        * these babies go away (so better stay protected).
@@ -568,10 +498,6 @@ glade_editor_property_load_common (GladeEditorProperty *eprop,
       /* Load initial sensitive state.
        */
       glade_editor_property_sensitivity_cb (property, NULL, eprop);
-
-      /* Load intial label state
-       */
-      glade_editor_property_state_cb (property, NULL, eprop);
     }
 }
 
@@ -3461,17 +3387,24 @@ glade_editor_property_load_by_widget (GladeEditorProperty *eprop,
 
       glade_editor_property_load (eprop, property);
 
+      if (eprop->priv->item_label)
+       glade_property_label_set_property (GLADE_PROPERTY_LABEL (eprop->priv->item_label), property);
+
       if (property)
         {
           g_assert (eprop->priv->klass == glade_property_get_class (property));
 
           gtk_widget_show (GTK_WIDGET (eprop));
-          gtk_widget_show (GTK_WIDGET (eprop->priv->item_label));
+
+         if (eprop->priv->item_label)
+           gtk_widget_show (eprop->priv->item_label);
         }
       else
         {
           gtk_widget_hide (GTK_WIDGET (eprop));
-          gtk_widget_hide (GTK_WIDGET (eprop->priv->item_label));
+
+         if (eprop->priv->item_label)
+           gtk_widget_hide (eprop->priv->item_label);
         }
     }
   else
diff --git a/gladeui/glade-property-label.c b/gladeui/glade-property-label.c
new file mode 100644
index 0000000..71c76f1
--- /dev/null
+++ b/gladeui/glade-property-label.c
@@ -0,0 +1,355 @@
+/*
+ * Copyright (C) 2013 Tristan Van Berkom.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Authors:
+ *   Tristan Van Berkom <tvb gnome org>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n-lib.h>
+
+#include "glade.h"
+#include "glade-widget.h"
+#include "glade-popup.h"
+#include "glade-property-label.h"
+
+/* GObjectClass */
+static void      glade_property_label_dispose           (GObject         *object);
+static void      glade_property_label_set_real_property (GObject         *object,
+                                                        guint            prop_id,
+                                                        const GValue    *value,
+                                                        GParamSpec      *pspec);
+static void      glade_property_label_get_real_property (GObject         *object,
+                                                        guint            prop_id,
+                                                        GValue          *value,
+                                                        GParamSpec      *pspec);
+
+/* GtkWidgetClass */
+static gint      glade_property_label_button_press      (GtkWidget       *widget,
+                                                        GdkEventButton  *event);
+
+struct _GladePropertyLabelPrivate
+{
+  GladeProperty *property;
+
+  GtkWidget     *warning;
+  GtkWidget     *label;
+
+  gulong         tooltip_id;   /* signal connection id for tooltip changes     */
+  gulong         state_id;     /* signal connection id for state changes       */
+  gulong         sensitive_id; /* signal connection id for sensitivity changes */
+  gulong         enabled_id;   /* signal connection id for property enabled changes */
+};
+
+enum {
+  PROP_0,
+  PROP_PROPERTY
+};
+
+G_DEFINE_TYPE (GladePropertyLabel, glade_property_label, GTK_TYPE_EVENT_BOX);
+
+static void
+glade_property_label_init (GladePropertyLabel *label)
+{
+  label->priv = 
+    G_TYPE_INSTANCE_GET_PRIVATE (label,
+                                GLADE_TYPE_PROPERTY_LABEL,
+                                GladePropertyLabelPrivate);
+  
+  gtk_widget_init_template (GTK_WIDGET (label));
+}
+
+static void
+glade_property_label_class_init (GladePropertyLabelClass *class)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+  
+  gobject_class->dispose = glade_property_label_dispose;
+  gobject_class->set_property = glade_property_label_set_real_property;
+  gobject_class->get_property = glade_property_label_get_real_property;
+
+  widget_class->button_press_event = glade_property_label_button_press;
+
+  /* Install a property, this is actually just a proxy for the internal GtkEntry text */
+  g_object_class_install_property (gobject_class,
+                                   PROP_PROPERTY,
+                                   g_param_spec_string ("property",
+                                                       _("Property"),
+                                                        _("The GladeProperty to display a label for"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+
+  /* Bind to template */
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladeui/glade-property-label.ui");
+  gtk_widget_class_bind_child (widget_class, GladePropertyLabelPrivate, label);
+  gtk_widget_class_bind_child (widget_class, GladePropertyLabelPrivate, warning);
+
+  g_type_class_add_private (gobject_class, sizeof (GladePropertyLabelPrivate));
+}
+
+
+/***********************************************************
+ *                     GObjectClass                        *
+ ***********************************************************/
+static void
+glade_property_label_dispose (GObject *object)
+{
+  glade_property_label_set_property (GLADE_PROPERTY_LABEL (object), NULL);
+
+  G_OBJECT_CLASS (glade_property_label_parent_class)->dispose (object);
+}
+
+static void
+glade_property_label_set_real_property (GObject         *object,
+                                       guint            prop_id,
+                                       const GValue    *value,
+                                       GParamSpec      *pspec)
+{
+  GladePropertyLabel *label = GLADE_PROPERTY_LABEL (object);
+
+  switch (prop_id)
+    {
+    case PROP_PROPERTY:
+      glade_property_label_set_property (label, g_value_get_object (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+glade_property_label_get_real_property (GObject         *object,
+                                       guint            prop_id,
+                                       GValue          *value,
+                                       GParamSpec      *pspec)
+{
+  GladePropertyLabel *label = GLADE_PROPERTY_LABEL (object);
+
+  switch (prop_id)
+    {
+    case PROP_PROPERTY:
+      g_value_set_object (value, glade_property_label_get_property (label));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+/***********************************************************
+ *                     GtkWidgetClass                      *
+ ***********************************************************/
+static gint
+glade_property_label_button_press (GtkWidget       *widget,
+                                  GdkEventButton  *event)
+{
+  GladePropertyLabel        *label = GLADE_PROPERTY_LABEL (widget);
+  GladePropertyLabelPrivate *priv = label->priv;
+
+  if (priv->property && glade_popup_is_popup_event (event))
+    {
+      glade_popup_property_pop (priv->property, event);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+/***********************************************************
+ *                        Callbacks                        *
+ ***********************************************************/
+static void
+glade_property_label_tooltip_cb (GladeProperty      *property,
+                                const gchar        *tooltip,
+                                const gchar        *insensitive,
+                                const gchar        *support,
+                                GladePropertyLabel *label)
+{
+  GladePropertyLabelPrivate *priv = label->priv;
+  const gchar *choice_tooltip;
+
+  if (glade_property_get_sensitive (property))
+    choice_tooltip = tooltip;
+  else
+    choice_tooltip = insensitive;
+
+  gtk_widget_set_tooltip_text (priv->label, choice_tooltip);
+  gtk_widget_set_tooltip_text (priv->warning, support);
+}
+
+static void
+glade_property_label_sensitivity_cb (GladeProperty      *property,
+                                    GParamSpec         *pspec,
+                                    GladePropertyLabel *label)
+{
+  GladePropertyLabelPrivate *priv = label->priv;
+  gboolean sensitive;
+
+  sensitive = glade_property_get_enabled (property);
+  sensitive = sensitive && glade_property_get_sensitive (priv->property);
+  sensitive = sensitive && (glade_property_get_state (priv->property) & GLADE_STATE_SUPPORT_DISABLED) == 0;
+
+  gtk_widget_set_sensitive (GTK_WIDGET (label), sensitive);
+}
+
+static void
+glade_property_label_state_cb (GladeProperty      *property,
+                              GParamSpec         *pspec,
+                              GladePropertyLabel *label)
+{
+  GladePropertyLabelPrivate *priv = label->priv;
+  GladePropertyClass *pclass;
+  gchar *text = NULL;
+
+  if (!priv->property)
+    return;
+
+  pclass = glade_property_get_class (priv->property);
+
+  /* refresh label */
+  if ((glade_property_get_state (priv->property) & GLADE_STATE_CHANGED) != 0)
+    text = g_strdup_printf ("<b>%s:</b>", glade_property_class_get_name (pclass));
+  else
+    text = g_strdup_printf ("%s:", glade_property_class_get_name (pclass));
+  gtk_label_set_markup (GTK_LABEL (priv->label), text);
+  g_free (text);
+
+  /* refresh icon */
+  if ((glade_property_get_state (priv->property) & GLADE_STATE_UNSUPPORTED) != 0)
+    gtk_widget_show (priv->warning);
+  else
+    gtk_widget_hide (priv->warning);
+}
+
+static void
+glade_property_label_property_finalized (GladePropertyLabel *label,
+                                        GladeProperty *where_property_was)
+{
+  /* Silent disconnect */
+  label->priv->property = NULL;
+  label->priv->tooltip_id = 0;
+  label->priv->state_id = 0;
+  label->priv->sensitive_id = 0;
+  label->priv->enabled_id = 0;
+}
+
+/***********************************************************
+ *                            API                          *
+ ***********************************************************/
+GtkWidget *
+glade_property_label_new (void)
+{
+  return g_object_new (GLADE_TYPE_PROPERTY_LABEL, NULL);
+}
+
+void
+glade_property_label_set_property (GladePropertyLabel    *label,
+                                  GladeProperty         *property)
+{
+  GladePropertyLabelPrivate *priv;
+
+  g_return_if_fail (GLADE_IS_PROPERTY_LABEL (label));
+  g_return_if_fail (property == NULL || GLADE_IS_PROPERTY (property));
+
+  priv = label->priv;
+
+  if (priv->property != property)
+    {
+
+      /* Disconnect last */
+      if (priv->property)
+       {
+         if (priv->tooltip_id > 0)
+           g_signal_handler_disconnect (priv->property, priv->tooltip_id);
+         if (priv->state_id > 0)
+           g_signal_handler_disconnect (priv->property, priv->state_id);
+         if (priv->sensitive_id > 0)
+           g_signal_handler_disconnect (priv->property, priv->sensitive_id);
+         if (priv->enabled_id > 0)
+           g_signal_handler_disconnect (priv->property, priv->enabled_id);
+
+         priv->tooltip_id = 0;
+         priv->state_id = 0;
+         priv->sensitive_id = 0;
+         priv->enabled_id = 0;
+
+         g_object_weak_unref (G_OBJECT (priv->property),
+                              (GWeakNotify) glade_property_label_property_finalized, label);
+       }
+
+      priv->property = property;
+
+      /* Connect new */
+      if (priv->property)
+       {
+         GladePropertyClass *pclass = glade_property_get_class (priv->property);
+
+         priv->tooltip_id =
+           g_signal_connect (G_OBJECT (priv->property),
+                             "tooltip-changed",
+                             G_CALLBACK (glade_property_label_tooltip_cb),
+                             label);
+         priv->sensitive_id =
+           g_signal_connect (G_OBJECT (priv->property),
+                             "notify::sensitive",
+                             G_CALLBACK (glade_property_label_sensitivity_cb),
+                             label);
+         priv->state_id =
+           g_signal_connect (G_OBJECT (priv->property),
+                             "notify::state",
+                             G_CALLBACK (glade_property_label_state_cb), label);
+         priv->enabled_id =
+           g_signal_connect (G_OBJECT (priv->property),
+                             "notify::enabled",
+                             G_CALLBACK (glade_property_label_sensitivity_cb),
+                             label);
+
+         g_object_weak_ref (G_OBJECT (priv->property),
+                            (GWeakNotify) glade_property_label_property_finalized, label);
+
+         /* Load initial tooltips
+          */
+         glade_property_label_tooltip_cb
+           (property, glade_property_class_get_tooltip (pclass),
+            glade_propert_get_insensitive_tooltip (property),
+            glade_property_get_support_warning (property), label);
+
+         /* Load initial sensitive state.
+          */
+         glade_property_label_sensitivity_cb (property, NULL, label);
+
+         /* Load intial label state
+          */
+         glade_property_label_state_cb (property, NULL, label);
+       }
+
+      g_object_notify (G_OBJECT (label), "property");
+    }
+}
+
+GladeProperty *
+glade_property_label_get_property (GladePropertyLabel *label)
+{
+  g_return_val_if_fail (GLADE_IS_PROPERTY_LABEL (label), NULL);
+
+  return label->priv->property;
+}
diff --git a/gladeui/glade-property-label.h b/gladeui/glade-property-label.h
new file mode 100644
index 0000000..dcadaed
--- /dev/null
+++ b/gladeui/glade-property-label.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 Tristan Van Berkom.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Authors:
+ *   Tristan Van Berkom <tvb gnome org>
+ */
+#ifndef __GLADE_PROPERTY_LABEL_H__
+#define __GLADE_PROPERTY_LABEL_H__
+
+#include <gtk/gtk.h>
+#include <gladeui/glade-xml-utils.h>
+#include <gladeui/glade-property-class.h>
+#include <gladeui/glade-property.h>
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_PROPERTY_LABEL            (glade_property_label_get_type ())
+#define GLADE_PROPERTY_LABEL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_PROPERTY_LABEL, 
GladePropertyLabel))
+#define GLADE_PROPERTY_LABEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_PROPERTY_LABEL, 
GladePropertyLabelClass))
+#define GLADE_IS_PROPERTY_LABEL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_PROPERTY_LABEL))
+#define GLADE_IS_PROPERTY_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_PROPERTY_LABEL))
+#define GLADE_PROPERTY_LABEL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_PROPERTY_LABEL, 
GladePropertyLabelClass))
+
+typedef struct _GladePropertyLabel             GladePropertyLabel;
+typedef struct _GladePropertyLabelClass        GladePropertyLabelClass;
+typedef struct _GladePropertyLabelPrivate      GladePropertyLabelPrivate;
+
+struct _GladePropertyLabel
+{
+  /*< private >*/
+  GtkEventBox box;
+
+  GladePropertyLabelPrivate *priv;
+};
+
+struct _GladePropertyLabelClass
+{
+  GtkEventBoxClass parent_class;
+};
+
+GType          glade_property_label_get_type          (void) G_GNUC_CONST;
+
+GtkWidget     *glade_property_label_new               (void);
+void           glade_property_label_set_property      (GladePropertyLabel *label,
+                                                      GladeProperty      *property);
+GladeProperty *glade_property_label_get_property      (GladePropertyLabel *label);
+
+G_END_DECLS
+
+#endif /* __GLADE_PROPERTY_LABEL_H__ */
diff --git a/gladeui/glade-property-label.ui b/gladeui/glade-property-label.ui
new file mode 100644
index 0000000..7bc149f
--- /dev/null
+++ b/gladeui/glade-property-label.ui
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="glade">
+  <!-- interface-requires gtk+ 3.8 -->
+  <template class="GladePropertyLabel" parent="GtkEventBox">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="visible_window">False</property>
+    <child>
+      <object class="GtkBox" id="box">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">4</property>
+        <child>
+          <object class="GtkLabel" id="label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="label">property name</property>
+            <property name="wrap">True</property>
+            <property name="width_chars">10</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkImage" id="warning">
+            <property name="can_focus">False</property>
+            <property name="no_show_all">True</property>
+            <property name="stock">gtk-dialog-warning</property>
+            <property name="icon_size">1</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/gladeui/gladeui-resources.gresource.xml b/gladeui/gladeui-resources.gresource.xml
index f975ad6..96a4b3d 100644
--- a/gladeui/gladeui-resources.gresource.xml
+++ b/gladeui/gladeui-resources.gresource.xml
@@ -2,5 +2,6 @@
 <gresources>
   <gresource prefix="/org/gnome/gladeui">
     <file compressed="true" preprocess="xml-stripblanks">glade-project-properties.ui</file>
+    <file compressed="true" preprocess="xml-stripblanks">glade-property-label.ui</file>
   </gresource>
 </gresources>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index d8d17b1..9903d88 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -36,6 +36,7 @@ gladeui/glade-project.c
 [type: gettext/glade]gladeui/glade-project-properties.ui
 gladeui/glade-property.c
 gladeui/glade-property-class.c
+[type: gettext/glade]gladeui/glade-property-label.ui
 gladeui/glade-signal.c
 gladeui/glade-signal-class.c
 gladeui/glade-signal-editor.c


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]