[glade/internal-children] Added support to define internal children in the catalog. Added initial support for GtkInfoBar



commit 29e4c623dc59a695ab733326650ea0bb6cb6b32f
Author: Juan Pablo Ugarte <juanpablougarte gmail com>
Date:   Fri Mar 4 20:53:52 2011 -0300

    Added support to define internal children in the catalog.
    Added initial support for GtkInfoBar

 gladeui/glade-project.c                 |    2 +-
 gladeui/glade-widget-adaptor.c          |  229 ++++++++++++++++++----
 gladeui/glade-widget-adaptor.h          |    2 +
 gladeui/glade-widget.c                  |   52 ++++-
 gladeui/glade-widget.h                  |    2 +
 gladeui/glade-xml-utils.h               |    2 +
 plugins/glade-catalog.dtd               |    6 +
 plugins/gtk+/Makefile.am                |    2 +
 plugins/gtk+/glade-gtk-action-widgets.c |  154 +++++++++------
 plugins/gtk+/glade-gtk.c                |  337 ++----------------------------
 plugins/gtk+/gtk+.xml.in                |   60 +++++-
 11 files changed, 418 insertions(+), 430 deletions(-)
---
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index e75855e..692096d 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -2726,7 +2726,7 @@ glade_project_add_object (GladeProject * project, GObject * object)
 
       g_free (name);
     }
-
+g_message ("%s %p %s", __func__, object, glade_widget_get_name (gwidget));
   glade_project_reserve_widget_name (project, gwidget, glade_widget_get_name (gwidget));
 
   glade_widget_set_project (gwidget, (gpointer) project);
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index f9a8aee..2d22789 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -64,43 +64,43 @@ struct _GladeWidgetAdaptorPrivate
 
   gchar       *name;                /* Name of the widget, for example GtkButton */
   gchar       *generic_name;        /* Used to generate names of new widgets, for
-				     * example "button" so that we generate button1,
-				     * button2, buttonX ..
-				     */
+                                     * example "button" so that we generate button1,
+                                     * button2, buttonX ..
+                                     */
   gchar       *icon_name;           /* icon name to use for widget class */
   gchar       *missing_icon;        /* the name of the missing icon if it was not found */
 
   gchar       *title;               /* Translated class name used in the UI */
   GList       *properties;          /* List of GladePropertyClass objects.
-				     * [see glade-property.h] this list contains
-				     * properties about the widget that we are going
-				     * to modify. Like "title", "label", "rows" .
-				     * Each property creates an input in the propety
-				     * editor.
-				     */
+                                     * [see glade-property.h] this list contains
+                                     * properties about the widget that we are going
+                                     * to modify. Like "title", "label", "rows" .
+                                     * Each property creates an input in the propety
+                                     * editor.
+                                     */
   GList       *packing_props;       /* List of GladePropertyClass objects that describe
-				     * properties for child objects packing definition -
-				     * note there may be more than one type of child supported
-				     * by a widget and thus they may have different sets
-				     * of properties for each type - this association is
-				     * managed on the GladePropertyClass proper.
-				     */
-  GList       *signals;              /* List of GladeSignalClass objects */
-  GList       *child_packings;       /* Default packing property values */
-  GList       *actions;              /* A list of GWActionClass */
-  GList       *packing_actions;      /* A list of GWActionClass for child objects */
-  gchar       *catalog;              /* The name of the widget catalog this class
-				      * was declared by.
-				      */
-  gchar       *book;                 /* DevHelp search namespace for this widget class
-				      */
-
-  GdkCursor   *cursor;                /* a cursor for inserting widgets */
-
-  gchar       *special_child_type;    /* Special case code for children that
-				       * are special children (like notebook tab 
-				       * widgets for example).
-				       */
+                                     * properties for child objects packing definition -
+                                     * note there may be more than one type of child supported
+                                     * by a widget and thus they may have different sets
+                                     * of properties for each type - this association is
+                                     * managed on the GladePropertyClass proper.
+                                     */
+  GList       *signals;             /* List of GladeSignalClass objects */
+  GList       *child_packings;      /* Default packing property values */
+  GList       *actions;             /* A list of GWActionClass */
+  GList       *packing_actions;     /* A list of GWActionClass for child objects */
+  GList       *internal_children;   /* A list of GladeInternalChild */
+  gchar       *catalog;             /* The name of the widget catalog this class
+		                        		     * was declared by.
+				                             */
+  gchar       *book;                /* DevHelp search namespace for this widget class */
+
+  GdkCursor   *cursor;              /* a cursor for inserting widgets */
+
+  gchar       *special_child_type;  /* Special case code for children that
+                        				     * are special children (like notebook tab 
+                        				     * widgets for example).
+                        				     */
 };
 
 struct _GladeChildPacking
@@ -116,6 +116,12 @@ struct _GladePackingDefault
   gchar *value;
 };
 
+struct _GladeInternalChild
+{
+  gchar *name;
+  gboolean anarchist;
+  GList *children;
+};
 
 enum
 {
@@ -133,6 +139,7 @@ enum
 
 typedef struct _GladeChildPacking GladeChildPacking;
 typedef struct _GladePackingDefault GladePackingDefault;
+typedef struct _GladeInternalChild GladeInternalChild;
 
 static GObjectClass *parent_class = NULL;
 static GHashTable *adaptor_hash = NULL;
@@ -277,6 +284,12 @@ glade_widget_adaptor_get_parent_adaptor (GladeWidgetAdaptor * adaptor)
   return glade_widget_adaptor_get_parent_adaptor_by_type (adaptor->priv->type);
 }
 
+gboolean
+glade_widget_adaptor_has_internal_children (GladeWidgetAdaptor *adaptor)
+{
+  return adaptor->priv->internal_children != NULL;
+}
+
 static gint
 gwa_signal_comp (gpointer a, gpointer b)
 {
@@ -525,6 +538,28 @@ gwa_inherit_signals (GladeWidgetAdaptor * adaptor)
     }
 }
 
+static GList *
+gwa_internal_children_clone (GList *children)
+{
+  GList *l, *retval = NULL;
+  
+  for (l = children; l; l = g_list_next (l))
+    {
+      GladeInternalChild *data = g_new0 (GladeInternalChild, 1);
+      GladeInternalChild *child = l->data;
+
+      data->name = g_strdup (child->name);
+      data->anarchist = child->anarchist;
+
+      retval = g_list_prepend (retval, data);
+
+      if (child->children)
+        data->children = gwa_internal_children_clone (child->children);
+    }
+
+  return retval;
+}
+
 static GObject *
 glade_widget_adaptor_constructor (GType type,
                                   guint n_construct_properties,
@@ -610,6 +645,12 @@ glade_widget_adaptor_constructor (GType type,
         }
     }
 
+  /* Copy parent internal children */
+  if (parent_adaptor && parent_adaptor->priv->internal_children)
+    {
+      adaptor->priv->internal_children = gwa_internal_children_clone (parent_adaptor->priv->internal_children);
+    }
+
   return ret_obj;
 }
 
@@ -631,6 +672,20 @@ gwa_child_packing_free (GladeChildPacking * packing)
 }
 
 static void
+gwa_glade_internal_child_free (GladeInternalChild *child)
+{
+  g_free (child->name);
+
+  if (child->children)
+    {
+      g_list_foreach (child->children, (GFunc) gwa_glade_internal_child_free, NULL);
+      g_list_free (child->children);
+    }
+  
+  g_free (child);
+}
+
+static void
 glade_widget_adaptor_finalize (GObject * object)
 {
   GladeWidgetAdaptor *adaptor = GLADE_WIDGET_ADAPTOR (object);
@@ -689,6 +744,13 @@ glade_widget_adaptor_finalize (GObject * object)
       g_list_free (adaptor->priv->packing_actions);
     }
 
+  if (adaptor->priv->internal_children)
+    {
+      g_list_foreach (adaptor->priv->internal_children,
+                      (GFunc) gwa_glade_internal_child_free, NULL);
+      g_list_free (adaptor->priv->internal_children);
+    }
+
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -812,6 +874,24 @@ glade_widget_adaptor_object_construct_object (GladeWidgetAdaptor * adaptor,
   return g_object_newv (adaptor->priv->type, n_parameters, parameters);
 }
 
+
+static GObject *
+glade_widget_adaptor_get_internal_child_impl (GladeWidgetAdaptor *adaptor,
+                                              GObject *object,
+                                              const gchar *name)
+{
+  static GtkBuilder *builder = NULL;
+  
+  g_message ("%s %d %p, %s", __func__, GTK_IS_BUILDABLE (object), object, name);
+  
+  g_return_val_if_fail (GTK_IS_BUILDABLE (object), NULL);
+
+  /* Dummy object just in case the interface use it for something */
+  if (builder == NULL) builder = gtk_builder_new ();
+  
+  return gtk_buildable_get_internal_child (GTK_BUILDABLE (object), builder, name);
+}
+
 static gboolean
 glade_widget_adaptor_object_add_verify (GladeWidgetAdaptor *adaptor,
 					GObject            *parent,
@@ -1219,7 +1299,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass * adaptor_class)
       glade_widget_adaptor_object_construct_object;
   adaptor_class->deep_post_create = NULL;
   adaptor_class->post_create = NULL;
-  adaptor_class->get_internal_child = NULL;
+  adaptor_class->get_internal_child = glade_widget_adaptor_get_internal_child_impl;
   adaptor_class->verify_property = NULL;
   adaptor_class->set_property = glade_widget_adaptor_object_set_property;
   adaptor_class->get_property = glade_widget_adaptor_object_get_property;
@@ -2184,6 +2264,38 @@ gwa_set_signals_from_node (GladeWidgetAdaptor *adaptor,
     }
 }
 
+static GList *
+gwa_internal_children_update_from_node (GList *internal_children, GladeXmlNode *node)
+{
+  GList *retval = internal_children;
+  GladeXmlNode *child, *children;
+  
+  for (child = glade_xml_node_get_children (node);
+       child; child = glade_xml_node_next (child))
+    {
+      GladeInternalChild *data;
+      gchar *name;
+
+      if (!glade_xml_node_verify (child, GLADE_XML_TAG_WIDGET))
+        continue;
+
+      if (!(name = glade_xml_get_property_string_required (child, GLADE_TAG_NAME, NULL)))
+        continue;
+
+      data = g_new0 (GladeInternalChild, 1);
+
+      data->name = name;
+      data->anarchist = glade_xml_get_boolean (child, GLADE_TAG_ANARCHIST, FALSE);
+
+      if ((children = glade_xml_search_child (child, GLADE_TAG_INTERNAL_CHILDREN)))
+        data->children = gwa_internal_children_update_from_node (data->children,children);
+      
+      retval = g_list_prepend (retval, data);
+    }
+  
+  return retval;
+}
+
 static gboolean
 gwa_extend_with_node (GladeWidgetAdaptor * adaptor,
                       GladeXmlNode * node,
@@ -2221,6 +2333,9 @@ gwa_extend_with_node (GladeWidgetAdaptor * adaptor,
        glade_xml_search_child (node, GLADE_TAG_PACKING_ACTIONS)) != NULL)
     gwa_action_update_from_node (adaptor, TRUE, child, domain, NULL);
 
+  if ((child = glade_xml_search_child (node, GLADE_TAG_INTERNAL_CHILDREN)))
+    adaptor->priv->internal_children = gwa_internal_children_update_from_node (adaptor->priv->internal_children, child);
+
   return TRUE;
 }
 
@@ -2934,6 +3049,43 @@ glade_widget_adaptor_construct_object (GladeWidgetAdaptor * adaptor,
                                                                      parameters);
 }
 
+static void
+gwa_internal_children_create (GladeWidgetAdaptor *adaptor,
+                              GObject *parent_object,
+                              GObject *object,
+                              GList *children,
+                              GladeCreateReason reason)
+{
+  gchar *parent_name = adaptor->priv->generic_name;
+  GladeWidget *gobject = glade_widget_get_from_gobject (object);
+  GList *l;
+
+  g_message ("%s", __func__);
+
+  for (l = children; l; l = g_list_next (l))
+    {
+      GladeInternalChild *internal = l->data;
+      GObject *child;
+
+      child = glade_widget_adaptor_get_internal_child (adaptor,
+                                                       parent_object,
+                                                       internal->name);
+      g_message ("%s child %s=%p", __func__, internal->name, child);
+      if (child)
+        {
+          glade_widget_adaptor_create_internal (gobject,
+                                                child,
+                                                internal->name, 
+                                                parent_name,
+                                                internal->anarchist, 
+                                                reason);
+
+          if (internal->children)
+            gwa_internal_children_create (adaptor, parent_object, child, internal->children, reason);
+        }
+    }
+}
+
 /**
  * glade_widget_adaptor_post_create:
  * @adaptor:   A #GladeWidgetAdaptor
@@ -2943,13 +3095,17 @@ glade_widget_adaptor_construct_object (GladeWidgetAdaptor * adaptor,
  * An adaptor function to be called after the object is created
  */
 void
-glade_widget_adaptor_post_create (GladeWidgetAdaptor * adaptor,
-                                  GObject * object, GladeCreateReason reason)
+glade_widget_adaptor_post_create (GladeWidgetAdaptor *adaptor,
+                                  GObject *object, GladeCreateReason reason)
 {
   g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor));
   g_return_if_fail (G_IS_OBJECT (object));
   g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (object), adaptor->priv->type));
-
+g_message ("%s start", __func__);
+  /* Create internal widgets */
+  if (adaptor->priv->internal_children)
+      gwa_internal_children_create (adaptor, object, object, adaptor->priv->internal_children, reason);
+  
   /* Run post_create in 2 stages, one that chains up and all class adaptors
    * in the hierarchy get a peek, another that is used to setup placeholders
    * and things that differ from the child/parent implementations
@@ -2957,11 +3113,12 @@ glade_widget_adaptor_post_create (GladeWidgetAdaptor * adaptor,
   if (GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->deep_post_create)
     GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->deep_post_create (adaptor, object,
                                                                 reason);
-
+  
   if (GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->post_create)
     GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->post_create (adaptor, object,
                                                            reason);
   /* XXX Dont complain here if no implementation is found */
+g_message ("%s end", __func__);
 }
 
 /**
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index 1997258..3e65d52 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -843,6 +843,8 @@ GladeSignalClass     *glade_widget_adaptor_get_signal_class   (GladeWidgetAdapto
 							       const gchar        *name);
 GladeWidgetAdaptor   *glade_widget_adaptor_get_parent_adaptor (GladeWidgetAdaptor *adaptor);
 
+gboolean              glade_widget_adaptor_has_internal_children (GladeWidgetAdaptor *adaptor);
+
 G_END_DECLS
 
 #endif /* _GLADE_WIDGET_ADAPTOR_H_ */
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index 30bfe1b..6bcb254 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -1140,6 +1140,9 @@ glade_widget_get_real_property (GObject * object,
       case PROP_VISIBLE:
         g_value_set_boolean (value, widget->priv->visible);
         break;
+      case PROP_REASON:
+        g_value_set_int (value, widget->priv->construct_reason);
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -1284,7 +1287,7 @@ glade_widget_class_init (GladeWidgetClass * klass)
                          GLADE_CREATE_USER,
                          GLADE_CREATE_REASONS - 1,
                          GLADE_CREATE_USER,
-                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
+                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
 
   g_object_class_install_property
       (object_class, PROP_TOPLEVEL_WIDTH,
@@ -1484,10 +1487,7 @@ glade_widget_get_internal_child (GladeWidget * parent, const gchar * internal)
 {
   while (parent)
     {
-      GladeWidgetAdaptorClass *adaptor_class =
-          GLADE_WIDGET_ADAPTOR_GET_CLASS (parent->priv->adaptor);
-
-      if (adaptor_class->get_internal_child)
+      if (glade_widget_adaptor_has_internal_children (parent->priv->adaptor))
         return glade_widget_adaptor_get_internal_child
             (parent->priv->adaptor, parent->priv->object, internal);
 
@@ -3474,6 +3474,45 @@ glade_widget_set_parent (GladeWidget * widget, GladeWidget * parent)
 }
 
 /**
+ * glade_widget_find_child:
+ * @widget: A #GladeWidget
+ * @name: child name
+ *
+ * Finds a child widget named @name.
+ *
+ * Returns: The child of widget or NULL if ti was not found
+ */
+GladeWidget *
+glade_widget_find_child (GladeWidget *widget, gchar *name)
+{
+  GList *adapter_children;
+  GladeWidget *real_child = NULL;
+  GList *node;
+
+  g_return_val_if_fail (GLADE_IS_WIDGET (widget), NULL);
+
+  adapter_children =
+      glade_widget_adaptor_get_children (glade_widget_get_adaptor (widget),
+                                         widget->priv->object);
+
+  for (node = adapter_children; node && !real_child; node = g_list_next (node))
+    {
+      GladeWidget *child = glade_widget_get_from_gobject (node->data);
+
+      if (child)
+        {
+          if (strcmp (child->priv->name, name) == 0)
+            real_child = child;
+          else
+            real_child = glade_widget_find_child (child, name);
+        }
+    }
+  g_list_free (adapter_children);
+
+  return real_child;
+}
+
+/**
  * glade_widget_get_children:
  * @widget: A #GladeWidget
  *
@@ -3511,7 +3550,6 @@ glade_widget_get_children (GladeWidget * widget)
   return g_list_reverse (real_children);
 }
 
-
 /**
  * glade_widget_get_toplevel:
  * @widget: A #GladeWidget
@@ -3767,7 +3805,7 @@ glade_widget_read (GladeProject * project,
               if (internal)
                 {
                   GObject *child_object =
-                      glade_widget_get_internal_child (parent, internal);
+                    glade_widget_get_internal_child (parent, internal);
 
                   if (!child_object)
                     {
diff --git a/gladeui/glade-widget.h b/gladeui/glade-widget.h
index 091a31d..d3ce6fc 100644
--- a/gladeui/glade-widget.h
+++ b/gladeui/glade-widget.h
@@ -384,6 +384,8 @@ void                    glade_widget_support_changed        (GladeWidget      *w
 
 GtkTreeModel           *glade_widget_get_signal_model       (GladeWidget      *widget);
 
+GladeWidget            *glade_widget_find_child             (GladeWidget *widget,
+                                                             gchar *name);
 
 G_END_DECLS
 
diff --git a/gladeui/glade-xml-utils.h b/gladeui/glade-xml-utils.h
index e08bd1b..c07da74 100644
--- a/gladeui/glade-xml-utils.h
+++ b/gladeui/glade-xml-utils.h
@@ -80,6 +80,8 @@ typedef struct _GladeProject        GladeProject;
 #define GLADE_TAG_BOOK                            "book"
 #define GLADE_TAG_SIGNALS                         "signals"
 #define GLADE_TAG_SIGNAL                          "signal"
+#define GLADE_TAG_INTERNAL_CHILDREN               "internal-children"
+#define GLADE_TAG_ANARCHIST                       "anarchist"
 #define GLADE_TAG_DEFAULT                         "default"
 #define GLADE_TAG_PARENTLESS_WIDGET               "parentless-widget"
 #define GLADE_TAG_DISABLED                        "disabled"
diff --git a/plugins/glade-catalog.dtd b/plugins/glade-catalog.dtd
index 5a77c3f..e072e5f 100644
--- a/plugins/glade-catalog.dtd
+++ b/plugins/glade-catalog.dtd
@@ -10,6 +10,7 @@
 <!ELEMENT glade-widget-class (post-create-function?,
 			      get-internal-child-function?,
 			      child-property-applies-function?,
+			      internal-children?,
 			      properties?,
 			      children?,
 			      packing-defaults?)>
@@ -40,6 +41,11 @@
 		   optional-default CDATA #IMPLIED
 		   translatable     CDATA #IMPLIED>
 
+<!ELEMENT internal-children (object+)>
+<!ELEMENT object (internal-children?)>
+<!ATTLIST object name      CDATA #REQUIRED
+                 anarchist CDATA #IMPLIED>
+
 <!ELEMENT set-function (#PCDATA)>
 <!ELEMENT get-function (#PCDATA)>
 <!ELEMENT spec (#PCDATA)>
diff --git a/plugins/gtk+/Makefile.am b/plugins/gtk+/Makefile.am
index 957163a..5810eea 100644
--- a/plugins/gtk+/Makefile.am
+++ b/plugins/gtk+/Makefile.am
@@ -44,6 +44,8 @@ libgladegtk_la_SOURCES = \
 	glade-string-list.c \
 	glade-gtk-table.c \
 	glade-gtk-grid.c \
+	glade-gtk-action-widgets.c \
+	glade-gtk-info-bar.c \
 	glade-gtk-marshallers.c
 
 libgladegtk_la_LDFLAGS     = -module -avoid-version $(AM_LDFLAGS)
diff --git a/plugins/gtk+/glade-gtk-action-widgets.c b/plugins/gtk+/glade-gtk-action-widgets.c
index c527b3b..2a9b3c6 100644
--- a/plugins/gtk+/glade-gtk-action-widgets.c
+++ b/plugins/gtk+/glade-gtk-action-widgets.c
@@ -1,15 +1,58 @@
-#define GLADE_TAG_ACTION_WIDGETS "action-widgets"
-#define GLADE_TAG_ACTION_WIDGET  "action-widget"
-#define GLADE_TAG_RESPONSE       "response"
-
+/*
+ * glade-gtk-action-widgets.c
+ *
+ * Copyright (C) 2008 - 2010 Tristan Van Berkom
+ *                      2011 Juan Pablo Ugarte
+ *
+ * Authors:
+ *   Tristan Van Berkom <tvb gnome org>
+ *   Juan Pablo Ugarte <juanpablougarte gmail com>
+ *
+ * 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.
+ *
+ */
+
+#include "glade-gtk-action-widgets.h"
+
+static GladeWidget *
+glade_gtk_action_widgets_get_area (GladeWidget *widget, gchar *action_area)
+{
+  GladeWidgetAdaptor *adaptor = glade_widget_get_adaptor (widget);
+  GObject *object;
+
+  object = glade_widget_adaptor_get_internal_child (adaptor, 
+                                                    glade_widget_get_object (widget),
+                                                    action_area);
+  
+  return (object) ? glade_widget_get_from_gobject (object) : NULL;
+}
 
 static void
-glade_gtk_dialog_read_responses (GladeWidget * widget,
-                                 GladeXmlNode * widgets_node)
+glade_gtk_action_widgets_read_responses (GladeWidget *widget,
+                                         GladeXmlNode *widgets_node,
+                                         gchar *action_container)
 {
+  GladeWidget *action_widget, *action_area;
   GladeXmlNode *node;
-  GladeWidget *action_widget;
 
+  if ((action_area = glade_gtk_action_widgets_get_area (widget, action_container)) == NULL)
+    {
+      g_warning ("%s: Could not find action widgets container [%s]", __func__, action_container);
+      return;
+    }
+  
   for (node = glade_xml_node_get_children (widgets_node);
        node; node = glade_xml_node_next (node))
     {
@@ -18,51 +61,38 @@ glade_gtk_dialog_read_responses (GladeWidget * widget,
       if (!glade_xml_node_verify (node, GLADE_TAG_ACTION_WIDGET))
         continue;
 
-      response =
-          glade_xml_get_property_string_required (node, GLADE_TAG_RESPONSE,
-                                                  NULL);
       widget_name = glade_xml_get_content (node);
-
-      if ((action_widget =
-           glade_project_get_widget_by_name (glade_widget_get_project (widget), 
-					     widget_name)) != NULL)
-        {
+      response = glade_xml_get_property_string_required (node,
+                                                         GLADE_TAG_RESPONSE,
+                                                         NULL);
+      
+      if ((action_widget = glade_widget_find_child (action_area, widget_name)))
           glade_widget_property_set (action_widget, "response-id",
                                      g_ascii_strtoll (response, NULL, 10));
-        }
 
       g_free (response);
       g_free (widget_name);
     }
 }
 
-void
-glade_gtk_dialog_read_child (GladeWidgetAdaptor * adaptor,
-                             GladeWidget * widget, GladeXmlNode * node)
-{
-  GladeXmlNode *widgets_node;
-
-  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->read_child (adaptor, widget, node);
-
-  node = glade_xml_node_get_parent (node);
-
-  if ((widgets_node =
-       glade_xml_search_child (node, GLADE_TAG_ACTION_WIDGETS)) != NULL)
-    glade_gtk_dialog_read_responses (widget, widgets_node);
-}
-
-
 static void
-glade_gtk_dialog_write_responses (GladeWidget * widget,
-                                  GladeXmlContext * context,
-                                  GladeXmlNode * node)
+glade_gtk_action_widgets_write_responses (GladeWidget *widget,
+                                          GladeXmlContext *context,
+                                          GladeXmlNode *node,
+                                          gchar *action_container)
 {
   GladeXmlNode *widget_node;
-  GtkDialog *dialog = GTK_DIALOG (glade_widget_get_object (widget));
-  GList *l, *action_widgets =
-      gtk_container_get_children (GTK_CONTAINER
-                                  (gtk_dialog_get_action_area (dialog)));
-
+  GList *l, *action_widgets;
+  GladeWidget *action_area;
+
+  if ((action_area = glade_gtk_action_widgets_get_area (widget, action_container)) == NULL)
+   {
+     g_warning ("%s: Could not find action widgets container [%s]", __func__, action_container);
+     return;
+   }
+  
+  action_widgets = glade_widget_get_children (action_area);
+    
   for (l = action_widgets; l; l = l->next)
     {
       GladeWidget *action_widget;
@@ -71,11 +101,11 @@ glade_gtk_dialog_write_responses (GladeWidget * widget,
 
       if ((action_widget = glade_widget_get_from_gobject (l->data)) == NULL)
         continue;
-
+      
       if ((property =
            glade_widget_get_property (action_widget, "response-id")) == NULL)
         continue;
-
+  g_message ("%s:%d", __func__, __LINE__);
       widget_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGET);
       glade_xml_node_append_child (node, widget_node);
 
@@ -93,29 +123,33 @@ glade_gtk_dialog_write_responses (GladeWidget * widget,
 }
 
 void
-glade_gtk_dialog_write_child (GladeWidgetAdaptor * adaptor,
-                              GladeWidget * widget,
-                              GladeXmlContext * context, GladeXmlNode * node)
+glade_gtk_action_widgets_read_child (GladeWidget *widget,
+                                     GladeXmlNode *node,
+                                     gchar *action_container)
 {
   GladeXmlNode *widgets_node;
-  GladeWidget *parent;
-  GladeProject *project;
 
-  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->write_child (adaptor, widget, context,
-                                                   node);
+  if ((widgets_node =
+       glade_xml_search_child (node, GLADE_TAG_ACTION_WIDGETS)) != NULL)
+    glade_gtk_action_widgets_read_responses (widget, widgets_node, action_container);
+}
+
+void
+glade_gtk_action_widgets_write_child (GladeWidget *widget,
+                                      GladeXmlContext *context,
+                                      GladeXmlNode *node,
+                                      gchar *action_container)
+{
+  GladeXmlNode *widgets_node;
 
-  parent  = glade_widget_get_parent (widget);
-  project = glade_widget_get_project (widget);
+  g_message ("%s:%d", __func__, __LINE__);
 
-  if (parent && GTK_IS_DIALOG (glade_widget_get_object (parent)))
-    {
-      widgets_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGETS);
+  widgets_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGETS);
 
-      glade_gtk_dialog_write_responses (parent, context, widgets_node);
+  glade_gtk_action_widgets_write_responses (widget, context, widgets_node, action_container);
 
-      if (!glade_xml_node_get_children (widgets_node))
-        glade_xml_node_delete (widgets_node);
-      else
-        glade_xml_node_append_child (node, widgets_node);
-    }
+  if (!glade_xml_node_get_children (widgets_node))
+    glade_xml_node_delete (widgets_node);
+  else
+    glade_xml_node_append_child (node, widgets_node);
 }
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index 5bd5011..8e6993c 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -43,6 +43,7 @@
 #include "glade-tool-item-group-editor.h"
 #include "glade-string-list.h"
 #include "glade-fixed.h"
+#include "glade-gtk-action-widgets.h"
 
 #include <gladeui/glade-editor-property.h>
 #include <gladeui/glade-base-editor.h>
@@ -1050,8 +1051,6 @@ glade_gtk_widget_action_submenu (GladeWidgetAdaptor * adaptor,
   return NULL;
 }
 
-
-
 /* ----------------------------- GtkContainer ------------------------------ */
 void
 glade_gtk_container_post_create (GladeWidgetAdaptor * adaptor,
@@ -1930,36 +1929,6 @@ glade_gtk_box_replace_child (GladeWidgetAdaptor * adaptor,
   g_object_unref (G_OBJECT (current));
 }
 
-
-GObject *
-glade_gtk_box_get_internal_child (GladeWidgetAdaptor * adaptor,
-                                  GObject * object, const gchar * name)
-{
-  GList *children, *l;
-  GObject *child = NULL;
-
-  g_return_val_if_fail (GTK_IS_BOX (object), NULL);
-
-  children = l = gtk_container_get_children (GTK_CONTAINER (object));
-
-  while (l)
-    {
-      GladeWidget *gw = glade_widget_get_from_gobject (l->data);
-
-      if (gw && glade_widget_get_internal (gw) && 
-	  strcmp (glade_widget_get_internal (gw), name) == 0)
-        {
-          child = G_OBJECT (l->data);
-          break;
-        }
-
-      l = l->next;
-    }
-  g_list_free (children);
-
-  return child;
-}
-
 static void
 glade_gtk_box_notebook_child_insert_remove_action (GladeWidgetAdaptor * adaptor,
                                                    GObject * container,
@@ -3898,21 +3867,20 @@ glade_gtk_file_chooser_forall (GtkWidget * widget, gpointer data)
 }
 
 void
-glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
-                              GObject * object, GladeCreateReason reason)
+glade_gtk_dialog_post_create (GladeWidgetAdaptor *adaptor,
+                              GObject *object, GladeCreateReason reason)
 {
-  GtkDialog *dialog = GTK_DIALOG (object);
   GladeWidget *widget;
-  GladeWidget *vbox_widget, *actionarea_widget, *colorsel, *fontsel;
-  GladeWidget *ok_button = NULL, *cancel_button = NULL,
-      *help_button = NULL, *apply_button = NULL;
+  GtkDialog *dialog;
 
-  g_return_if_fail (GTK_IS_DIALOG (dialog));
+  g_return_if_fail (GTK_IS_DIALOG (object));
 
-  widget = glade_widget_get_from_gobject (GTK_WIDGET (dialog));
+  widget = glade_widget_get_from_gobject (GTK_WIDGET (object));
   if (!widget)
     return;
-
+  
+  dialog = GTK_DIALOG (object);
+  
   if (reason == GLADE_CREATE_USER)
     {
       /* HIG complient border-width defaults on dialogs */
@@ -3921,28 +3889,8 @@ glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
 
   if (GTK_IS_COLOR_SELECTION_DIALOG (object))
     {
-      GtkWidget *child;
-
-      child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_OK);
-      ok_button = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (child), "ok_button", "colorsel", FALSE, reason);
-
-      child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_CANCEL);
-      cancel_button = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (child),
-           "cancel_button", "colorsel", FALSE, reason);
-
-      child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_HELP);
-      help_button = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (child), "help_button", "colorsel", FALSE, reason);
-
-      child =
-          gtk_color_selection_dialog_get_color_selection
-          (GTK_COLOR_SELECTION_DIALOG (dialog));
-      colorsel =
-          glade_widget_adaptor_create_internal (widget, G_OBJECT (child),
-                                                "color_selection", "colorsel",
-                                                FALSE, reason);
+      GtkWidget *child = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog));
+      GladeWidget *colorsel = glade_widget_get_from_gobject (child);
 
       /* Set this to 1 at load time, if there are any children then
        * size will adjust appropriately (otherwise the default "3" gets
@@ -3954,37 +3902,8 @@ glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
     }
   else if (GTK_IS_FONT_SELECTION_DIALOG (object))
     {
-      GtkWidget *child;
-
-      child =
-          gtk_font_selection_dialog_get_ok_button (GTK_FONT_SELECTION_DIALOG
-                                                   (dialog));
-      ok_button =
-          glade_widget_adaptor_create_internal (widget, G_OBJECT (child),
-                                                "ok_button", "fontsel", FALSE,
-                                                reason);
-
-      child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_APPLY);
-      apply_button = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (child), "apply_button", "fontsel", FALSE, reason);
-
-      child =
-          gtk_font_selection_dialog_get_cancel_button (GTK_FONT_SELECTION_DIALOG
-                                                       (dialog));
-      cancel_button =
-          glade_widget_adaptor_create_internal (widget, G_OBJECT (child),
-                                                "cancel_button", "fontsel",
-                                                FALSE, reason);
-
-#if GTK_CHECK_VERSION (2, 24, 0)
-      child = gtk_font_selection_dialog_get_font_selection
-          (GTK_FONT_SELECTION_DIALOG (dialog));
-#else
-      child = GTK_FONT_SELECTION_DIALOG (dialog)->fontsel;
-#endif
-      fontsel = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (child),
-           "font_selection", "fontsel", FALSE, reason);
+      GtkWidget *child = gtk_font_selection_dialog_get_cancel_button (GTK_FONT_SELECTION_DIALOG (dialog));
+      GladeWidget *fontsel = glade_widget_get_from_gobject (child);
 
       /* Set this to 1 at load time, if there are any children then
        * size will adjust appropriately (otherwise the default "3" gets
@@ -3995,6 +3914,12 @@ glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
     }
   else
     {
+      GladeWidget *vbox_widget, *actionarea_widget;
+
+      vbox_widget = glade_widget_get_from_gobject (gtk_dialog_get_content_area (dialog));
+      actionarea_widget = glade_widget_get_from_gobject (gtk_dialog_get_action_area (dialog));
+
+      g_message ("%s %p %p", __func__, actionarea_widget, gtk_dialog_get_action_area (dialog));
       /* We need to stop default emissions of "hierarchy-changed" and 
        * "screen-changed" of GtkFileChooserDefault to avoid an abort()
        * when doing a reparent.
@@ -4006,14 +3931,6 @@ glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
                               (gtk_dialog_get_content_area (dialog)),
                               glade_gtk_file_chooser_forall, NULL);
 
-      vbox_widget = glade_widget_adaptor_create_internal
-          (widget, G_OBJECT (gtk_dialog_get_content_area (dialog)),
-           "vbox", "dialog", FALSE, reason);
-
-      actionarea_widget = glade_widget_adaptor_create_internal
-          (vbox_widget, G_OBJECT (gtk_dialog_get_action_area (dialog)),
-           "action_area", "dialog", FALSE, reason);
-
       /* These properties are controlled by the GtkDialog style properties:
        * "content-area-border", "button-spacing" and "action-area-border",
        * so we must disable thier use.
@@ -4045,62 +3962,6 @@ glade_gtk_dialog_post_create (GladeWidgetAdaptor * adaptor,
     }
 }
 
-GtkWidget *
-glade_gtk_dialog_get_internal_child (GladeWidgetAdaptor * adaptor,
-                                     GtkDialog * dialog, const gchar * name)
-{
-  GtkWidget *child = NULL;
-
-  g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL);
-
-  if (GTK_IS_COLOR_SELECTION_DIALOG (dialog))
-    {
-      if (strcmp ("ok_button", name) == 0)
-        child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_OK);
-      else if (strcmp ("cancel_button", name) == 0)
-        child =
-            gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_CANCEL);
-      else if (strcmp ("help_button", name) == 0)
-        child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_HELP);
-      else if (strcmp ("color_selection", name) == 0)
-        child = gtk_color_selection_dialog_get_color_selection
-            (GTK_COLOR_SELECTION_DIALOG (dialog));
-    }
-  else if (GTK_IS_FONT_SELECTION_DIALOG (dialog))
-    {
-
-      if (strcmp ("ok_button", name) == 0)
-        child =
-            gtk_font_selection_dialog_get_ok_button (GTK_FONT_SELECTION_DIALOG
-                                                     (dialog));
-      else if (strcmp ("apply_button", name) == 0)
-        child = gtk_dialog_get_widget_for_response (dialog, GTK_RESPONSE_APPLY);
-      else if (strcmp ("cancel_button", name) == 0)
-        child = gtk_font_selection_dialog_get_cancel_button
-            (GTK_FONT_SELECTION_DIALOG (dialog));
-      else if (strcmp ("font_selection", name) == 0)
-        {
-#if GTK_CHECK_VERSION (2, 24, 0)
-          child = gtk_font_selection_dialog_get_font_selection
-              (GTK_FONT_SELECTION_DIALOG (dialog));
-#else
-          child = GTK_FONT_SELECTION_DIALOG (dialog)->fontsel;
-#endif
-        }
-    }
-  else
-    {
-      /* Default generic dialog handling
-       */
-      if (strcmp ("vbox", name) == 0)
-        child = gtk_dialog_get_content_area (dialog);
-      else if (strcmp ("action_area", name) == 0)
-        child = gtk_dialog_get_action_area (dialog);
-    }
-
-  return child;
-}
-
 GList *
 glade_gtk_dialog_get_children (GladeWidgetAdaptor * adaptor, GtkDialog * dialog)
 {
@@ -4166,99 +4027,15 @@ glade_gtk_dialog_get_children (GladeWidgetAdaptor * adaptor, GtkDialog * dialog)
   return list;
 }
 
-
-#define GLADE_TAG_ACTION_WIDGETS "action-widgets"
-#define GLADE_TAG_ACTION_WIDGET  "action-widget"
-#define GLADE_TAG_RESPONSE       "response"
-
-
-static void
-glade_gtk_dialog_read_responses (GladeWidget * widget,
-                                 GladeXmlNode * widgets_node)
-{
-  GladeXmlNode *node;
-  GladeWidget *action_widget;
-
-  for (node = glade_xml_node_get_children (widgets_node);
-       node; node = glade_xml_node_next (node))
-    {
-      gchar *widget_name, *response;
-
-      if (!glade_xml_node_verify (node, GLADE_TAG_ACTION_WIDGET))
-        continue;
-
-      response =
-          glade_xml_get_property_string_required (node, GLADE_TAG_RESPONSE,
-                                                  NULL);
-      widget_name = glade_xml_get_content (node);
-
-      if ((action_widget =
-           glade_project_get_widget_by_name (glade_widget_get_project (widget), 
-					     widget_name)) != NULL)
-        {
-          glade_widget_property_set (action_widget, "response-id",
-                                     g_ascii_strtoll (response, NULL, 10));
-        }
-
-      g_free (response);
-      g_free (widget_name);
-    }
-}
-
 void
 glade_gtk_dialog_read_child (GladeWidgetAdaptor * adaptor,
                              GladeWidget * widget, GladeXmlNode * node)
 {
-  GladeXmlNode *widgets_node;
-
   GWA_GET_CLASS (GTK_TYPE_CONTAINER)->read_child (adaptor, widget, node);
 
   node = glade_xml_node_get_parent (node);
 
-  if ((widgets_node =
-       glade_xml_search_child (node, GLADE_TAG_ACTION_WIDGETS)) != NULL)
-    glade_gtk_dialog_read_responses (widget, widgets_node);
-}
-
-
-static void
-glade_gtk_dialog_write_responses (GladeWidget * widget,
-                                  GladeXmlContext * context,
-                                  GladeXmlNode * node)
-{
-  GladeXmlNode *widget_node;
-  GtkDialog *dialog = GTK_DIALOG (glade_widget_get_object (widget));
-  GList *l, *action_widgets =
-      gtk_container_get_children (GTK_CONTAINER
-                                  (gtk_dialog_get_action_area (dialog)));
-
-  for (l = action_widgets; l; l = l->next)
-    {
-      GladeWidget *action_widget;
-      GladeProperty *property;
-      gchar *str;
-
-      if ((action_widget = glade_widget_get_from_gobject (l->data)) == NULL)
-        continue;
-
-      if ((property =
-           glade_widget_get_property (action_widget, "response-id")) == NULL)
-        continue;
-
-      widget_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGET);
-      glade_xml_node_append_child (node, widget_node);
-
-      str =
-          glade_property_class_make_string_from_gvalue (glade_property_get_class (property),
-                                                        glade_property_inline_value (property));
-
-      glade_xml_node_set_property_string (widget_node, GLADE_TAG_RESPONSE, str);
-      glade_xml_set_content (widget_node, glade_widget_get_name (action_widget));
-
-      g_free (str);
-    }
-
-  g_list_free (action_widgets);
+  glade_gtk_action_widgets_read_child (widget, node, "action_area");
 }
 
 void
@@ -4266,27 +4043,12 @@ glade_gtk_dialog_write_child (GladeWidgetAdaptor * adaptor,
                               GladeWidget * widget,
                               GladeXmlContext * context, GladeXmlNode * node)
 {
-  GladeXmlNode *widgets_node;
-  GladeWidget *parent;
-  GladeProject *project;
+  GladeWidget *parent = glade_widget_get_parent (widget);
 
-  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->write_child (adaptor, widget, context,
-                                                   node);
-
-  parent  = glade_widget_get_parent (widget);
-  project = glade_widget_get_project (widget);
+  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->write_child (adaptor, widget, context, node);
 
   if (parent && GTK_IS_DIALOG (glade_widget_get_object (parent)))
-    {
-      widgets_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGETS);
-
-      glade_gtk_dialog_write_responses (parent, context, widgets_node);
-
-      if (!glade_xml_node_get_children (widgets_node))
-        glade_xml_node_delete (widgets_node);
-      else
-        glade_xml_node_append_child (node, widgets_node);
-    }
+    glade_gtk_action_widgets_write_child (parent, context, node, "action_area");
 }
 
 /*--------------------------- GtkMessageDialog ---------------------------------*/
@@ -7917,23 +7679,6 @@ glade_gtk_text_view_set_property (GladeWidgetAdaptor * adaptor,
 
 /* ----------------------------- GtkComboBox ------------------------------ */
 void
-glade_gtk_combo_box_post_create (GladeWidgetAdaptor * adaptor,
-                                 GObject * object, GladeCreateReason reason)
-{
-  GladeWidget *widget = glade_widget_get_from_gobject (object);
-
-  if (gtk_combo_box_get_has_entry (GTK_COMBO_BOX (object)))
-    glade_widget_adaptor_create_internal
-        (widget, G_OBJECT (gtk_bin_get_child (GTK_BIN (object))),
-         "entry", "comboboxentry", FALSE, reason);
-
-  /* For some reason combos need a kick in the but in order to show
-   * up properly after loading. */
-  gtk_widget_hide (GTK_WIDGET (object));
-  gtk_widget_show (GTK_WIDGET (object));
-}
-
-void
 glade_gtk_combo_box_set_property (GladeWidgetAdaptor * adaptor,
                                   GObject * object,
                                   const gchar * id, const GValue * value)
@@ -7978,20 +7723,6 @@ glade_gtk_combo_box_get_children (GladeWidgetAdaptor * adaptor,
   return list;
 }
 
-GObject *
-glade_gtk_combo_box_get_internal_child (GladeWidgetAdaptor * adaptor,
-                                        GObject * object, const gchar * name)
-{
-  GObject *child = NULL;
-  g_return_val_if_fail (GTK_IS_COMBO_BOX (object), NULL);
-
-  if (gtk_combo_box_get_has_entry (GTK_COMBO_BOX (object)) &&
-      strcmp ("entry", name) == 0)
-    child = G_OBJECT (gtk_bin_get_child (GTK_BIN (object)));
-
-  return child;
-}
-
 /* ----------------------------- GtkComboBoxText ------------------------------ */
 #define GLADE_TAG_ITEMS  "items"
 #define GLADE_TAG_ITEM   "item"
@@ -10652,18 +10383,6 @@ glade_gtk_cell_layout_action_activate_as_widget (GladeWidgetAdaptor * adaptor,
 
 
 /*--------------------------- GtkTreeView ---------------------------------*/
-void
-glade_gtk_treeview_post_create (GladeWidgetAdaptor *adaptor,
-				GObject            *object, 
-				GladeCreateReason   reason)
-{
-  GladeWidget *widget = glade_widget_get_from_gobject (object);
-
-  glade_widget_adaptor_create_internal
-    (widget, G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (object))),
-     "selection", "treeview", FALSE, reason);
-}
-
 static void
 glade_gtk_treeview_launch_editor (GObject * treeview)
 {
@@ -10789,16 +10508,6 @@ glade_gtk_treeview_get_children (GladeWidgetAdaptor * adaptor,
   return children;
 }
 
-GObject *
-glade_gtk_treeview_get_internal_child (GladeWidgetAdaptor * adaptor,
-				       GtkTreeView *view, const gchar * name)
-{
-  if (strcmp (name, "selection") == 0)
-    return (GObject *)gtk_tree_view_get_selection (view);
-
-  return NULL;
-}
-
 /* XXX FIXME: We should hide the actual "fixed-height-mode" setting from
  * treeview editors and provide a custom control that sets all its columns
  * to fixed size and then control the column's sensitivity accordingly.
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index 93453ae..36e2ac7 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -288,7 +288,7 @@ embedded in another object</_tooltip>
       <child-set-property-function>glade_gtk_container_set_child_property</child-set-property-function>
       <child-get-property-function>glade_gtk_container_get_child_property</child-get-property-function>
       <get-children-function>glade_gtk_container_get_children</get-children-function>
-
+      
       <properties>
         <property id="border-width" common="True" weight="2.5"/>
         <property id="resize-mode" ignore="True" common="True" weight="4.7">
@@ -305,7 +305,6 @@ embedded in another object</_tooltip>
     <glade-widget-class name="GtkBox" generic-name="box" _title="Box">
       <create-widget-function>glade_gtk_create_fixed_widget</create-widget-function>
       <post-create-function>glade_gtk_box_post_create</post-create-function>
-      <get-internal-child-function>glade_gtk_box_get_internal_child</get-internal-child-function>
       <get-children-function>glade_gtk_box_get_children</get-children-function>
       <set-property-function>glade_gtk_box_set_property</set-property-function>
       <get-property-function>glade_gtk_box_get_property</get-property-function>
@@ -1212,13 +1211,11 @@ embedded in another object</_tooltip>
     </glade-widget-class>
 
     <glade-widget-class name="GtkComboBox" generic-name="combobox" _title="Combo Box">
-      <post-create-function>glade_gtk_combo_box_post_create</post-create-function>
       <set-property-function>glade_gtk_combo_box_set_property</set-property-function>
       <add-child-verify-function>glade_gtk_cell_layout_add_verify</add-child-verify-function>
       <add-child-function>glade_gtk_cell_layout_add_child</add-child-function>
       <remove-child-function>glade_gtk_cell_layout_remove_child</remove-child-function> 
       <get-children-function>glade_gtk_combo_box_get_children</get-children-function>
-      <get-internal-child-function>glade_gtk_combo_box_get_internal_child</get-internal-child-function>
       <read-child-function>glade_gtk_cell_layout_read_child</read-child-function>
       <write-child-function>glade_gtk_cell_layout_write_child</write-child-function>
       <action-activate-function>glade_gtk_cell_layout_action_activate_as_widget</action-activate-function>
@@ -1228,7 +1225,11 @@ embedded in another object</_tooltip>
       <actions>
         <action id="launch_editor" _name="Edit&#8230;" stock="gtk-edit" important="True"/>
       </actions>
-
+      
+      <internal-children>
+        <object name="entry"/>
+      </internal-children>
+      
       <signals>
 	<signal id="move-action" since="2.12"/>
 	<signal id="popdown" since="2.12"/>
@@ -1363,16 +1364,23 @@ embedded in another object</_tooltip>
     <glade-widget-class name="GtkDialog" generic-name="dialog" _title="Dialog Box" 
 			default-width="320" default-height="260">
       <post-create-function>glade_gtk_dialog_post_create</post-create-function>
-      <get-internal-child-function>glade_gtk_dialog_get_internal_child</get-internal-child-function>
       <get-children-function>glade_gtk_dialog_get_children</get-children-function>
       <read-child-function>glade_gtk_dialog_read_child</read-child-function>
       <write-child-function>glade_gtk_dialog_write_child</write-child-function>
 
+      <internal-children>
+        <object name="vbox">
+          <internal-children>
+            <object name="action_area"/>
+          </internal-children>
+        </object>
+      </internal-children>
+
       <properties>
-	<property id="default-width"  default="320" optional="True" optional-default="False"/>
-	<property id="default-height" default="260" optional="True" optional-default="False"/>
-	<property id="has-separator"  default="False"/>
-	<property id="type-hint" default="GDK_WINDOW_TYPE_HINT_DIALOG" save-always="True"/>
+        <property id="default-width"  default="320" optional="True" optional-default="False"/>
+        <property id="default-height" default="260" optional="True" optional-default="False"/>
+        <property id="has-separator"  default="False"/>
+        <property id="type-hint" default="GDK_WINDOW_TYPE_HINT_DIALOG" save-always="True"/>
       </properties>
 
     </glade-widget-class>
@@ -1759,6 +1767,18 @@ embedded in another object</_tooltip>
     </glade-widget-class>
     
     <glade-widget-class name="GtkDrawingArea" generic-name="drawingarea" _title="Drawing Area"/>
+    
+    <glade-widget-class name="GtkInfoBar" generic-name="infobar" _title="Info Bar">
+      <read-widget-function>glade_gtk_info_bar_read_child</read-widget-function>
+      <write-widget-function>glade_gtk_info_bar_write_child</write-widget-function>
+      <internal-children>
+        <object name="action_area"/>
+        <object name="content_area"/>
+      </internal-children>
+      <properties>
+        <property id="size" query="True" ignore="True" disabled="True"/>
+      </properties>
+    </glade-widget-class>
 
     <glade-widget-class name="GtkEventBox" generic-name="eventbox" _title="Event Box"/>
 
@@ -1850,6 +1870,12 @@ embedded in another object</_tooltip>
    </glade-widget-class>
 
     <glade-widget-class name="GtkColorSelectionDialog" generic-name="colorselectiondialog" _title="Color Selection Dialog">
+      <internal-children>
+        <object name="ok_button"/>
+        <object name="cancel_button"/>
+        <object name="help_button"/>
+        <object name="color_selection"/>
+      </internal-children>
       <properties>
         <property id="has-separator"  disabled="True"/>
       </properties>
@@ -1869,6 +1895,12 @@ embedded in another object</_tooltip>
     </glade-widget-class>
     
     <glade-widget-class name="GtkFontSelectionDialog" generic-name="fontselectiondialog" _title="Font Selection Dialog">
+      <internal-children>
+        <object name="ok_button"/>
+        <object name="apply_button"/>
+        <object name="cancel_button"/>
+        <object name="font_selection"/>
+      </internal-children>
       <properties>
         <property id="has-separator"  disabled="True"/>
       </properties>
@@ -2189,11 +2221,9 @@ embedded in another object</_tooltip>
 
 
     <glade-widget-class name="GtkTreeView" generic-name="treeview" _title="Tree View">
-      <post-create-function>glade_gtk_treeview_post_create</post-create-function>
       <child-set-property-function>glade_gtk_treeview_set_child_property</child-set-property-function>
       <child-get-property-function>glade_gtk_treeview_get_child_property</child-get-property-function>
       <get-children-function>glade_gtk_treeview_get_children</get-children-function>
-      <get-internal-child-function>glade_gtk_treeview_get_internal_child</get-internal-child-function>
       <add-child-function>glade_gtk_treeview_add_child</add-child-function>
       <replace-child-function>glade_gtk_treeview_replace_child</replace-child-function>
       <remove-child-function>glade_gtk_treeview_remove_child</remove-child-function>
@@ -2203,6 +2233,10 @@ embedded in another object</_tooltip>
       <actions>
         <action id="launch_editor" _name="Edit&#8230;" stock="gtk-edit" important="True"/>
       </actions>
+      
+      <internal-children>
+        <object name="selection"/>
+      </internal-children>
 
       <properties>
         <property id="level-indentation" since="2.12"/>
@@ -3681,6 +3715,8 @@ embedded in another object</_tooltip>
     <glade-widget-class-ref name="GtkSeparator"/>
     <glade-widget-class-ref name="GtkArrow"/>
     <glade-widget-class-ref name="GtkDrawingArea"/>
+    
+    <glade-widget-class-ref name="GtkInfoBar"/>
   </glade-widget-group>
 
   <glade-widget-group name="gtk-composite" _title="Composite Widgets">



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