[glade3] * plugins/Makefile.am, plugins/glade-tool-item-group-editor.[ch], plugins/gtk+.xml.in, plugins/gla



commit 9b36d1c040b090159edd4fd5bf04f0e85d20e05d
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Sun Jan 9 00:18:23 2011 +0900

    	* plugins/Makefile.am, plugins/glade-tool-item-group-editor.[ch], plugins/gtk+.xml.in,
    	plugins/glade-gtk.c: Added support for editing GtkToolPalette.

 ChangeLog                                   |    3 +
 plugins/gtk+/Makefile.am                    |    6 +-
 plugins/gtk+/glade-gtk.c                    |  354 +++++++++++++++++++++++++--
 plugins/gtk+/glade-tool-item-group-editor.c |  290 ++++++++++++++++++++++
 plugins/gtk+/glade-tool-item-group-editor.h |   65 +++++
 plugins/gtk+/gtk+.xml.in                    |   70 +++++-
 6 files changed, 759 insertions(+), 29 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 460d3fc..88af9b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -23,6 +23,9 @@
 
 	* gladeui/glade-command.c: Ensure that menus can be added to menutoolbuttons.
 
+	* plugins/Makefile.am, plugins/glade-tool-item-group-editor.[ch], plugins/gtk+.xml.in,
+	plugins/glade-gtk.c: Added support for editing GtkToolPalette.
+
 2011-01-07  Emilio Pozuelo Monfort <pochu27 gmail com>
 
 	* configure.ac: Bump the minimum GTK+ version to 2.99.0.
diff --git a/plugins/gtk+/Makefile.am b/plugins/gtk+/Makefile.am
index 3dc1cab..394d213 100644
--- a/plugins/gtk+/Makefile.am
+++ b/plugins/gtk+/Makefile.am
@@ -20,12 +20,12 @@ libgladegtk_la_CPPFLAGS =   \
 
 libgladegtk_la_CFLAGS = $(AM_CFLAGS)
 
-libgladegtk_la_SOURCES     = glade-gtk.c glade-accels.c glade-attributes.c fixed-bg.xpm \
+libgladegtk_la_SOURCES     = glade-gtk.c glade-fixed.c glade-accels.c glade-attributes.c fixed-bg.xpm \
 	glade-column-types.c  glade-model-data.c glade-text-button.c \
 	glade-icon-sources.c glade-button-editor.c glade-tool-button-editor.c glade-image-editor.c \
 	glade-image-item-editor.c glade-icon-factory-editor.c glade-store-editor.c glade-label-editor.c \
 	glade-cell-renderer-editor.c glade-treeview-editor.c glade-entry-editor.c glade-activatable-editor.c \
-	glade-fixed.c
+	glade-tool-item-group-editor.c
 
 libgladegtk_la_LDFLAGS     = -module -avoid-version $(AM_LDFLAGS)
 libgladegtk_la_LIBADD      = $(libgladeui) $(GTK_LIBS)
@@ -35,7 +35,7 @@ libgladegtkinclude_HEADERS = glade-gtk.h glade-accels.h glade-attributes.h glade
 	glade-text-button.h glade-icon-sources.h glade-button-editor.h \
 	glade-tool-button-editor.h glade-image-editor.h glade-image-item-editor.h glade-icon-factory-editor.h \
 	glade-store-editor.h glade-label-editor.h glade-cell-renderer-editor.h glade-treeview-editor.h \
-	glade-entry-editor.h glade-activatable-editor.h glade-fixed.h
+	glade-entry-editor.h glade-activatable-editor.h glade-fixed.h glade-tool-item-group-editor.h
 
 
 if PLATFORM_WIN32
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index db2d450..e29c1fd 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -42,6 +42,7 @@
 #include "glade-treeview-editor.h"
 #include "glade-entry-editor.h"
 #include "glade-activatable-editor.h"
+#include "glade-tool-item-group-editor.h"
 #include "glade-fixed.h"
 
 #include <gladeui/glade-editor-property.h>
@@ -6132,6 +6133,8 @@ glade_gtk_menu_shell_tool_item_get_display_name (GladeBaseEditor * editor,
       if (name == NULL || strlen (name) == 0)
         glade_widget_property_get (gchild, "stock-id", &name);
     }
+  else if (GTK_IS_TOOL_ITEM_GROUP (child))
+    glade_widget_property_get (gchild, "label", &name);
   else
     name = _("<custom>");
 
@@ -6148,13 +6151,13 @@ glade_gtk_menu_shell_item_get_parent (GladeWidget * gparent, GObject * parent)
   else if (GTK_IS_MENU_ITEM (parent))
     submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (parent));
 
-  if (submenu)
+  if (submenu && glade_widget_get_from_gobject (submenu))
     gparent = glade_widget_get_from_gobject (submenu);
   else
     gparent =
-        glade_command_create (glade_widget_adaptor_get_by_type (GTK_TYPE_MENU),
-                              gparent, NULL,
-                              glade_widget_get_project (gparent));
+      glade_command_create (glade_widget_adaptor_get_by_type (GTK_TYPE_MENU),
+			    gparent, NULL,
+			    glade_widget_get_project (gparent));
 
   return gparent;
 }
@@ -6179,7 +6182,8 @@ glade_gtk_menu_shell_build_child (GladeBaseEditor * editor,
                                     gparent, NULL,
                                     glade_widget_get_project (gparent));
 
-  if (type != GTK_TYPE_SEPARATOR_MENU_ITEM)
+  if (type != GTK_TYPE_SEPARATOR_MENU_ITEM &&
+      type != GTK_TYPE_SEPARATOR_TOOL_ITEM)
     {
       glade_widget_property_set (gitem_new, "label",
                                  glade_widget_get_name (gitem_new));
@@ -6233,17 +6237,32 @@ glade_gtk_menu_shell_move_child (GladeBaseEditor * editor,
       GTK_IS_SEPARATOR_TOOL_ITEM (parent))
     return FALSE;
 
-  if (GTK_IS_MENU_ITEM (child) && GTK_IS_TOOLBAR (parent))
-    return FALSE;
+  /* Moving a menu item child */
+  if (GTK_IS_MENU_ITEM (child))
+    {
+      if (GTK_IS_TOOLBAR (parent))         return FALSE;
+      if (GTK_IS_TOOL_ITEM_GROUP (parent)) return FALSE;
+      if (GTK_IS_TOOL_PALETTE (parent))    return FALSE;
 
-  if (GTK_IS_TOOL_ITEM (child) &&
-      (GTK_IS_MENU (parent) || GTK_IS_MENU_BAR (parent) ||
-       GTK_IS_MENU_ITEM (parent)))
-    return FALSE;
+      if (GTK_IS_TOOL_ITEM (parent) && !GTK_IS_MENU_TOOL_BUTTON (parent))
+	return FALSE;
+    }
 
-  if (GTK_IS_TOOL_ITEM (parent) &&
-      (!GTK_IS_MENU_TOOL_BUTTON (parent) || !GTK_IS_MENU_ITEM (child)))
-    return FALSE;
+  /* Moving a toolitem child */
+  if (GTK_IS_TOOL_ITEM (child))
+    {
+      if (GTK_IS_MENU (parent))         return FALSE;
+      if (GTK_IS_MENU_BAR (parent))     return FALSE;
+      if (GTK_IS_MENU_ITEM (parent))    return FALSE;
+      if (GTK_IS_TOOL_PALETTE (parent)) return FALSE;
+      if (GTK_IS_TOOL_ITEM (parent))    return FALSE;
+    }
+
+  /* Moving a toolitem group */
+  if (GTK_IS_TOOL_ITEM_GROUP (child))
+    {
+      if (!GTK_IS_TOOL_PALETTE (parent)) return FALSE;
+    }
 
   if (GTK_IS_MENU_ITEM (parent) || GTK_IS_MENU_TOOL_BUTTON (parent))
     gparent = glade_gtk_menu_shell_item_get_parent (gparent, parent);
@@ -6312,8 +6331,10 @@ static void
 glade_gtk_toolbar_child_selected (GladeBaseEditor * editor,
                                   GladeWidget * gchild, gpointer data)
 {
-  GObject *child = glade_widget_get_object (gchild);
-  GType type = G_OBJECT_TYPE (child);
+  GladeWidget *gparent = glade_widget_get_parent (gchild);
+  GObject     *parent  = glade_widget_get_object (gparent);
+  GObject     *child = glade_widget_get_object (gchild);
+  GType        type = G_OBJECT_TYPE (child);
 
   glade_base_editor_add_label (editor, _("Tool Item"));
 
@@ -6330,9 +6351,31 @@ glade_gtk_toolbar_child_selected (GladeBaseEditor * editor,
     return;
 
   glade_base_editor_add_label (editor, _("Packing"));
-  glade_base_editor_add_properties (editor, gchild, TRUE,
-                                    "expand", "homogeneous", NULL);
+  if (GTK_IS_TOOLBAR (parent))
+    glade_base_editor_add_properties (editor, gchild, TRUE,
+				      "expand", "homogeneous", NULL);
+  else if (GTK_IS_TOOL_ITEM_GROUP (parent))
+    glade_base_editor_add_properties (editor, gchild, TRUE,
+				      "expand", "fill", "homogeneous", "new-row", NULL);
+}
+
+static void
+glade_gtk_tool_palette_child_selected (GladeBaseEditor * editor,
+				       GladeWidget * gchild, gpointer data)
+{
+  glade_base_editor_add_label (editor, _("Tool Item Group"));
 
+  glade_base_editor_add_default_properties (editor, gchild);
+
+  glade_base_editor_add_label (editor, _("Properties"));
+  glade_base_editor_add_properties (editor, gchild, FALSE, 
+				    "tooltip-text",
+				    NULL);
+  glade_base_editor_add_editable (editor, gchild, GLADE_PAGE_GENERAL);
+
+  glade_base_editor_add_label (editor, _("Packing"));
+  glade_base_editor_add_properties (editor, gchild, TRUE,
+                                    "exclusive", "expand", NULL);
 }
 
 static void
@@ -6348,6 +6391,14 @@ glade_gtk_menu_shell_tool_item_child_selected (GladeBaseEditor * editor,
       glade_gtk_toolbar_child_selected (editor, gchild, data);
       return;
     }
+
+  if (GTK_IS_TOOL_ITEM_GROUP (child))
+    {
+      glade_gtk_tool_palette_child_selected (editor, gchild, data);
+      return;
+    }
+
+
   glade_base_editor_add_label (editor, _("Menu Item"));
 
   glade_base_editor_add_default_properties (editor, gchild);
@@ -7262,7 +7313,268 @@ glade_gtk_toolbar_action_activate (GladeWidgetAdaptor * adaptor,
 
 
 /* ----------------------------- GtkToolPalette ------------------------------ */
+void
+glade_gtk_tool_palette_get_child_property (GladeWidgetAdaptor * adaptor,
+                                      GObject * container,
+                                      GObject * child,
+                                      const gchar * property_name,
+                                      GValue * value)
+{
+  g_return_if_fail (GTK_IS_TOOL_PALETTE (container));
+  if (GTK_IS_TOOL_ITEM_GROUP (child) == FALSE)
+    return;
+
+  if (strcmp (property_name, "position") == 0)
+    {
+      g_value_set_int (value,
+                       gtk_tool_palette_get_group_position (GTK_TOOL_PALETTE (container),
+							    GTK_TOOL_ITEM_GROUP (child)));
+    }
+  else
+    {                           /* Chain Up */
+      GWA_GET_CLASS
+          (GTK_TYPE_CONTAINER)->child_get_property (adaptor,
+                                                    container, child,
+                                                    property_name, value);
+    }
+}
 
+void
+glade_gtk_tool_palette_set_child_property (GladeWidgetAdaptor * adaptor,
+					   GObject * container,
+					   GObject * child,
+					   const gchar * property_name,
+					   GValue * value)
+{
+  g_return_if_fail (GTK_IS_TOOL_PALETTE (container));
+  g_return_if_fail (GTK_IS_TOOL_ITEM_GROUP (child));
+
+  g_return_if_fail (property_name != NULL || value != NULL);
+
+  if (strcmp (property_name, "position") == 0)
+    {
+      GtkToolPalette *palette = GTK_TOOL_PALETTE (container);
+      GList *children;
+      gint position, size;
+
+      children = glade_util_container_get_all_children (GTK_CONTAINER (palette));
+      size = g_list_length (children);
+      g_list_free (children);
+
+      position = g_value_get_int (value);
+
+      if (position >= size)
+        position = size - 1;
+
+      gtk_tool_palette_set_group_position (palette, GTK_TOOL_ITEM_GROUP (child), position);
+    }
+  else
+    /* Chain Up */
+    GWA_GET_CLASS
+        (GTK_TYPE_CONTAINER)->child_set_property (adaptor,
+                                                  container, child,
+                                                  property_name, value);
+}
+
+void
+glade_gtk_tool_palette_add_child (GladeWidgetAdaptor * adaptor,
+				  GObject * object, GObject * child)
+{
+  GtkToolPalette *palette;
+  GtkToolItemGroup *group;
+
+  g_return_if_fail (GTK_IS_TOOL_PALETTE (object));
+  g_return_if_fail (GTK_IS_TOOL_ITEM_GROUP (child));
+
+  palette = GTK_TOOL_PALETTE (object);
+  group   = GTK_TOOL_ITEM_GROUP (child);
+
+  gtk_container_add (GTK_CONTAINER (palette), GTK_WIDGET (group));
+
+  if (glade_util_object_is_loading (object))
+    {
+      GladeWidget *gchild = glade_widget_get_from_gobject (child);
+
+      /* Packing props arent around when parenting during a glade_widget_dup() */
+      if (gchild && glade_widget_get_packing_properties (gchild))
+	glade_widget_pack_property_set (gchild, "position",
+					gtk_tool_palette_get_group_position (palette, group));
+    }
+}
+
+void
+glade_gtk_tool_palette_remove_child (GladeWidgetAdaptor * adaptor,
+				     GObject * object, GObject * child)
+{
+  gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
+}
+
+static void
+glade_gtk_tool_palette_launch_editor (GladeWidgetAdaptor * adaptor,
+				      GObject * palette)
+{
+  GladeBaseEditor *editor;
+  GtkWidget *window;
+
+  /* Editor */
+  editor = glade_base_editor_new (palette, NULL,
+				  _("Group"), GTK_TYPE_TOOL_ITEM_GROUP,
+				  NULL);
+
+  glade_base_editor_append_types (editor, GTK_TYPE_TOOL_ITEM_GROUP,
+                                  _("Button"), GTK_TYPE_TOOL_BUTTON,
+                                  _("Toggle"), GTK_TYPE_TOGGLE_TOOL_BUTTON,
+                                  _("Radio"), GTK_TYPE_RADIO_TOOL_BUTTON,
+                                  _("Menu"), GTK_TYPE_MENU_TOOL_BUTTON,
+                                  _("Custom"), GTK_TYPE_TOOL_ITEM,
+                                  _("Separator"), GTK_TYPE_SEPARATOR_TOOL_ITEM,
+                                  NULL);
+
+  glade_base_editor_append_types (editor, GTK_TYPE_MENU_TOOL_BUTTON,
+                                  _("Normal"), GTK_TYPE_MENU_ITEM,
+                                  _("Image"), GTK_TYPE_IMAGE_MENU_ITEM,
+                                  _("Check"), GTK_TYPE_CHECK_MENU_ITEM,
+                                  _("Radio"), GTK_TYPE_RADIO_MENU_ITEM,
+                                  _("Separator"), GTK_TYPE_SEPARATOR_MENU_ITEM,
+                                  NULL);
+
+  glade_base_editor_append_types (editor, GTK_TYPE_MENU_ITEM,
+                                  _("Normal"), GTK_TYPE_MENU_ITEM,
+                                  _("Image"), GTK_TYPE_IMAGE_MENU_ITEM,
+                                  _("Check"), GTK_TYPE_CHECK_MENU_ITEM,
+                                  _("Radio"), GTK_TYPE_RADIO_MENU_ITEM,
+                                  _("Separator"), GTK_TYPE_SEPARATOR_MENU_ITEM,
+                                  NULL);
+
+  g_signal_connect (editor, "get-display-name",
+                    G_CALLBACK (glade_gtk_menu_shell_tool_item_get_display_name), NULL);
+  g_signal_connect (editor, "child-selected",
+                    G_CALLBACK (glade_gtk_menu_shell_tool_item_child_selected),
+                    NULL);
+  g_signal_connect (editor, "change-type",
+                    G_CALLBACK (glade_gtk_menu_shell_change_type), NULL);
+  g_signal_connect (editor, "build-child",
+                    G_CALLBACK (glade_gtk_menu_shell_build_child), NULL);
+  g_signal_connect (editor, "delete-child",
+                    G_CALLBACK (glade_gtk_menu_shell_delete_child), NULL);
+  g_signal_connect (editor, "move-child",
+                    G_CALLBACK (glade_gtk_menu_shell_move_child), NULL);
+
+  gtk_widget_show (GTK_WIDGET (editor));
+
+  window =
+      glade_base_editor_pack_new_window (editor, _("Tool Palette Editor"), NULL);
+  gtk_widget_show (window);
+}
+
+void
+glade_gtk_tool_palette_action_activate (GladeWidgetAdaptor * adaptor,
+					GObject * object, const gchar * action_path)
+{
+  if (strcmp (action_path, "launch_editor") == 0)
+    {
+      glade_gtk_tool_palette_launch_editor (adaptor, object);
+    }
+  else
+    GWA_GET_CLASS (GTK_TYPE_CONTAINER)->action_activate (adaptor,
+                                                         object, action_path);
+}
+
+/* ----------------------------- GtkToolItemGroup ------------------------------ */
+void
+glade_gtk_tool_item_group_add_child (GladeWidgetAdaptor * adaptor,
+				     GObject * object, GObject * child)
+{
+  gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child));
+}
+
+void
+glade_gtk_tool_item_group_remove_child (GladeWidgetAdaptor * adaptor,
+				     GObject * object, GObject * child)
+{
+  gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
+}
+
+static void
+glade_gtk_tool_item_group_parse_finished (GladeProject * project,
+					  GladeWidget * widget)
+{
+  GtkWidget *label_widget = NULL;
+
+  glade_widget_property_get (widget, "label-widget", &label_widget);
+
+  if (label_widget)
+    glade_widget_property_set (widget, "custom-label", TRUE);
+  else
+    glade_widget_property_set (widget, "custom-label", FALSE);
+}
+
+void
+glade_gtk_tool_item_group_read_widget (GladeWidgetAdaptor * adaptor,
+				       GladeWidget * widget, GladeXmlNode * node)
+{
+  if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
+    return;
+
+  /* First chain up and read in all the normal properties.. */
+  GWA_GET_CLASS (GTK_TYPE_TOOL_ITEM)->read_widget (adaptor, widget, node);
+
+  /* Run this after the load so that icon-widget is resolved. */
+  g_signal_connect (glade_widget_get_project (widget),
+                    "parse-finished",
+                    G_CALLBACK (glade_gtk_tool_item_group_parse_finished), widget);
+}
+
+static void
+glade_gtk_tool_item_group_set_custom_label (GObject * object, const GValue * value)
+{
+  GladeWidget *gbutton;
+
+  gbutton = glade_widget_get_from_gobject (object);
+
+  glade_widget_property_set_sensitive (gbutton, "label", FALSE,
+                                       NOT_SELECTED_MSG);
+  glade_widget_property_set_sensitive (gbutton, "label-widget", FALSE,
+                                       NOT_SELECTED_MSG);
+
+  if (g_value_get_boolean (value))
+    glade_widget_property_set_sensitive (gbutton, "label-widget", TRUE, NULL);
+  else
+    glade_widget_property_set_sensitive (gbutton, "label", TRUE, NULL);
+}
+
+void
+glade_gtk_tool_item_group_set_property (GladeWidgetAdaptor * adaptor,
+                                        GObject * object,
+                                        const gchar * id, const GValue * value)
+{
+  if (!strcmp (id, "custom-label"))
+    glade_gtk_tool_item_group_set_custom_label (object, value);
+  else if (!strcmp (id, "label-widget"))
+    {
+      if (g_value_get_object (value) != NULL)
+	gtk_tool_item_group_set_label_widget (GTK_TOOL_ITEM_GROUP (object),
+					      (GtkWidget *)g_value_get_object (value));
+    }
+  else
+    GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id, value);
+}
+
+GladeEditable *
+glade_gtk_tool_item_group_create_editable (GladeWidgetAdaptor * adaptor,
+                                           GladeEditorPageType type)
+{
+  GladeEditable *editable;
+
+  /* Get base editable */
+  editable =
+      GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type);
+
+  if (type == GLADE_PAGE_GENERAL)
+    return (GladeEditable *) glade_tool_item_group_editor_new (adaptor, editable);
+
+  return editable;
+}
 
 /* ----------------------------- GtkToolItem ------------------------------ */
 GObject *
@@ -7529,10 +7841,8 @@ glade_gtk_menu_tool_button_add_child (GladeWidgetAdaptor * adaptor,
                                       GObject * object, GObject * child)
 {
   if (GTK_IS_MENU (child))
-    {
-      gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (object),
-                                     GTK_WIDGET (child));
-    }
+    gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (object),
+				   GTK_WIDGET (child));
   else
     GWA_GET_CLASS (GTK_TYPE_TOOL_BUTTON)->add (adaptor, object, child);
 }
diff --git a/plugins/gtk+/glade-tool-item-group-editor.c b/plugins/gtk+/glade-tool-item-group-editor.c
new file mode 100644
index 0000000..c39a6ea
--- /dev/null
+++ b/plugins/gtk+/glade-tool-item-group-editor.c
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2010 Openismus GmbH
+ *
+ * This library is free software; you can redistribute it and/or 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 <tristanvb openismus com>
+ */
+
+#include <config.h>
+#include <gladeui/glade.h>
+#include <glib/gi18n-lib.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "glade-tool-item-group-editor.h"
+
+
+static void glade_tool_item_group_editor_finalize (GObject * object);
+
+static void glade_tool_item_group_editor_editable_init (GladeEditableIface * iface);
+
+static void glade_tool_item_group_editor_grab_focus (GtkWidget * widget);
+
+
+static GladeEditableIface *parent_editable_iface;
+
+G_DEFINE_TYPE_WITH_CODE (GladeToolItemGroupEditor, glade_tool_item_group_editor, GTK_TYPE_VBOX,
+                         G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
+                                                glade_tool_item_group_editor_editable_init));
+
+
+static void
+glade_tool_item_group_editor_class_init (GladeToolItemGroupEditorClass * klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->finalize = glade_tool_item_group_editor_finalize;
+  widget_class->grab_focus = glade_tool_item_group_editor_grab_focus;
+}
+
+static void
+glade_tool_item_group_editor_init (GladeToolItemGroupEditor * self)
+{
+}
+
+static void
+glade_tool_item_group_editor_load (GladeEditable * editable, GladeWidget * widget)
+{
+  GladeToolItemGroupEditor *group_editor = GLADE_TOOL_ITEM_GROUP_EDITOR (editable);
+  gboolean custom_label = FALSE;
+  GList *l;
+
+  /* Chain up to default implementation */
+  parent_editable_iface->load (editable, widget);
+
+  group_editor->loading = TRUE;
+
+  /* Mark our widget... */
+  group_editor->loaded_widget = widget;
+
+  /* load the embedded editable... */
+  if (group_editor->embed)
+    glade_editable_load (GLADE_EDITABLE (group_editor->embed), widget);
+
+  for (l = group_editor->properties; l; l = l->next)
+    glade_editor_property_load_by_widget (GLADE_EDITOR_PROPERTY (l->data),
+                                          widget);
+
+
+  if (widget)
+    {
+      glade_widget_property_get (widget, "custom-label", &custom_label);
+
+      if (custom_label)
+        gtk_toggle_button_set_active
+            (GTK_TOGGLE_BUTTON (group_editor->label_widget_radio), TRUE);
+      else
+        gtk_toggle_button_set_active
+            (GTK_TOGGLE_BUTTON (group_editor->label_radio), TRUE);
+    }
+
+  group_editor->loading = FALSE;
+}
+
+static void
+glade_tool_item_group_editor_set_show_name (GladeEditable * editable, gboolean show_name)
+{
+  GladeToolItemGroupEditor *group_editor = GLADE_TOOL_ITEM_GROUP_EDITOR (editable);
+
+  glade_editable_set_show_name (GLADE_EDITABLE (group_editor->embed),
+                                show_name);
+}
+
+static void
+glade_tool_item_group_editor_editable_init (GladeEditableIface * iface)
+{
+  parent_editable_iface = g_type_default_interface_peek (GLADE_TYPE_EDITABLE);
+
+  iface->load = glade_tool_item_group_editor_load;
+  iface->set_show_name = glade_tool_item_group_editor_set_show_name;
+}
+
+static void
+glade_tool_item_group_editor_finalize (GObject * object)
+{
+  GladeToolItemGroupEditor *group_editor = GLADE_TOOL_ITEM_GROUP_EDITOR (object);
+
+  if (group_editor->properties)
+    g_list_free (group_editor->properties);
+  group_editor->properties = NULL;
+  group_editor->embed = NULL;
+
+  glade_editable_load (GLADE_EDITABLE (object), NULL);
+
+  G_OBJECT_CLASS (glade_tool_item_group_editor_parent_class)->finalize (object);
+}
+
+static void
+glade_tool_item_group_editor_grab_focus (GtkWidget * widget)
+{
+  GladeToolItemGroupEditor *group_editor = GLADE_TOOL_ITEM_GROUP_EDITOR (widget);
+
+  gtk_widget_grab_focus (group_editor->embed);
+}
+
+
+static void
+label_toggled (GtkWidget * widget,
+	       GladeToolItemGroupEditor *group_editor)
+{
+  GladeProperty *property;
+  GValue value = { 0, };
+
+  if (group_editor->loading || !group_editor->loaded_widget)
+    return;
+
+  if (!gtk_toggle_button_get_active
+      (GTK_TOGGLE_BUTTON (group_editor->label_radio)))
+    return;
+
+  glade_editable_block (GLADE_EDITABLE (group_editor));
+
+  glade_command_push_group (_("Setting %s to use standard label text"),
+                            glade_widget_get_name (group_editor->loaded_widget));
+
+  property =
+      glade_widget_get_property (group_editor->loaded_widget, "label-widget");
+  glade_command_set_property (property, NULL);
+
+  property = glade_widget_get_property (group_editor->loaded_widget, "label");
+  glade_property_get_default (property, &value);
+  glade_command_set_property_value (property, &value);
+  g_value_unset (&value);
+  property =
+      glade_widget_get_property (group_editor->loaded_widget, "custom-label");
+  glade_command_set_property (property, FALSE);
+
+  glade_command_pop_group ();
+
+  glade_editable_unblock (GLADE_EDITABLE (group_editor));
+
+  /* reload buttons and sensitivity and stuff... */
+  glade_editable_load (GLADE_EDITABLE (group_editor), group_editor->loaded_widget);
+}
+
+static void
+label_widget_toggled (GtkWidget * widget, GladeToolItemGroupEditor * group_editor)
+{
+  GladeProperty *property;
+
+  if (group_editor->loading || !group_editor->loaded_widget)
+    return;
+
+  if (!gtk_toggle_button_get_active
+      (GTK_TOGGLE_BUTTON (group_editor->label_widget_radio)))
+    return;
+
+  glade_editable_block (GLADE_EDITABLE (group_editor));
+
+  glade_command_push_group (_("Setting %s to use a custom label widget"),
+                            glade_widget_get_name (group_editor->loaded_widget));
+
+  property = glade_widget_get_property (group_editor->loaded_widget, "label");
+  glade_command_set_property (property, NULL);
+  property =
+      glade_widget_get_property (group_editor->loaded_widget, "custom-label");
+  glade_command_set_property (property, TRUE);
+
+  glade_command_pop_group ();
+
+  glade_editable_unblock (GLADE_EDITABLE (group_editor));
+
+  /* reload buttons and sensitivity and stuff... */
+  glade_editable_load (GLADE_EDITABLE (group_editor), group_editor->loaded_widget);
+}
+
+static void
+table_attach (GtkWidget * table, GtkWidget * child, gint pos, gint row)
+{
+  gtk_grid_attach (GTK_GRID (table), child, pos, row, 1, 1);
+
+  if (pos)
+    gtk_widget_set_hexpand (child, TRUE);
+}
+
+GtkWidget *
+glade_tool_item_group_editor_new (GladeWidgetAdaptor *adaptor, 
+				  GladeEditable      *embed)
+{
+  GladeToolItemGroupEditor *group_editor;
+  GladeEditorProperty *eprop;
+  GtkWidget *table, *frame, *label, *hbox;
+  gchar *str;
+  gint row = 0;
+
+  g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+  g_return_val_if_fail (GLADE_IS_EDITABLE (embed), NULL);
+
+  group_editor = g_object_new (GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR, NULL);
+  group_editor->embed = GTK_WIDGET (embed);
+
+  /* Pack the parent on top... */
+  gtk_box_pack_start (GTK_BOX (group_editor), GTK_WIDGET (embed), FALSE, FALSE, 0);
+
+  str = g_strdup_printf ("<b>%s</b>", _("Group Header"));
+  label = gtk_label_new (str);
+  gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+  g_free (str);
+  frame = gtk_frame_new (NULL);
+  gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+  gtk_box_pack_start (GTK_BOX (group_editor), frame, FALSE, FALSE, 0);
+
+  table = gtk_grid_new ();
+  gtk_widget_set_margin_top (table, 6);
+  gtk_widget_set_margin_left (table, 12);
+  gtk_orientable_set_orientation (GTK_ORIENTABLE (table),
+                                  GTK_ORIENTATION_VERTICAL);
+  gtk_grid_set_row_spacing (GTK_GRID (table), 4);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+
+  /* label */
+  eprop =
+      glade_widget_adaptor_create_eprop_by_name (adaptor, "label", FALSE,
+                                                 TRUE);
+  hbox = gtk_hbox_new (FALSE, 0);
+  group_editor->label_radio = gtk_radio_button_new (NULL);
+  gtk_box_pack_start (GTK_BOX (hbox), group_editor->label_radio, FALSE, FALSE,
+                      2);
+  gtk_box_pack_start (GTK_BOX (hbox), glade_editor_property_get_item_label (eprop), TRUE, TRUE, 2);
+  table_attach (table, hbox, 0, row);
+  table_attach (table, GTK_WIDGET (eprop), 1, row++);
+  group_editor->properties = g_list_prepend (group_editor->properties, eprop);
+
+  /* label-widget ... */
+  eprop =
+      glade_widget_adaptor_create_eprop_by_name (adaptor, "label-widget",
+                                                 FALSE, TRUE);
+  hbox = gtk_hbox_new (FALSE, 0);
+  group_editor->label_widget_radio = gtk_radio_button_new_from_widget
+      (GTK_RADIO_BUTTON (group_editor->label_radio));
+  gtk_box_pack_start (GTK_BOX (hbox), group_editor->label_widget_radio, FALSE,
+                      FALSE, 2);
+  gtk_box_pack_start (GTK_BOX (hbox), glade_editor_property_get_item_label (eprop), TRUE, TRUE, 2);
+  table_attach (table, hbox, 0, row);
+  table_attach (table, GTK_WIDGET (eprop), 1, row++);
+  group_editor->properties = g_list_prepend (group_editor->properties, eprop);
+
+  g_signal_connect (G_OBJECT (group_editor->label_widget_radio), "toggled",
+                    G_CALLBACK (label_widget_toggled), group_editor);
+  g_signal_connect (G_OBJECT (group_editor->label_radio), "toggled",
+                    G_CALLBACK (label_toggled), group_editor);
+
+  gtk_widget_show_all (GTK_WIDGET (group_editor));
+
+  return GTK_WIDGET (group_editor);
+}
diff --git a/plugins/gtk+/glade-tool-item-group-editor.h b/plugins/gtk+/glade-tool-item-group-editor.h
new file mode 100644
index 0000000..cc0f925
--- /dev/null
+++ b/plugins/gtk+/glade-tool-item-group-editor.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2008 Tristan Van Berkom.
+ *
+ * This library is free software; you can redistribute it and/or 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_TOOL_ITEM_GROUP_EDITOR_H_
+#define _GLADE_TOOL_ITEM_GROUP_EDITOR_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR	            (glade_tool_item_group_editor_get_type ())
+#define GLADE_TOOL_ITEM_GROUP_EDITOR(obj)		    (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR, GladeToolItemGroupEditor))
+#define GLADE_TOOL_ITEM_GROUP_EDITOR_CLASS(klass)	    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR, GladeToolItemGroupEditorClass))
+#define GLADE_IS_TOOL_ITEM_GROUP_EDITOR(obj)	    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR))
+#define GLADE_IS_TOOL_ITEM_GROUP_EDITOR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR))
+#define GLADE_TOOL_ITEM_GROUP_EDITOR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_TOOL_ITEM_GROUP_EDITOR, GladeToolItemGroupEditorClass))
+
+typedef struct _GladeToolItemGroupEditor        GladeToolItemGroupEditor;
+typedef struct _GladeToolItemGroupEditorClass   GladeToolItemGroupEditorClass;
+
+struct _GladeToolItemGroupEditor
+{
+	GtkVBox  parent;
+
+	GladeWidget *loaded_widget; /* A handy pointer to the loaded widget ... */
+
+	GtkWidget *embed;
+
+	GtkWidget *label_radio;         /* Set the label directly */
+	GtkWidget *label_widget_radio;  /* Use the custom label widget */
+
+	GList *properties;         /* A list of eprops to update at load() time */
+
+	gboolean loading;          /* Loading flag for loading widgets in the editor */
+};
+
+struct _GladeToolItemGroupEditorClass
+{
+	GtkVBoxClass parent;
+};
+
+GType            glade_tool_item_group_editor_get_type (void) G_GNUC_CONST;
+GtkWidget       *glade_tool_item_group_editor_new      (GladeWidgetAdaptor *adaptor,
+							GladeEditable      *editable);
+
+G_END_DECLS
+
+#endif  /* _GLADE_TOOL_ITEM_GROUP_EDITOR_H_ */
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index a521a7d..2e3a6a0 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -626,6 +626,66 @@ embedded in another object</_tooltip>
       </packing-defaults>
     </glade-widget-class>
     
+    <glade-widget-class name="GtkToolPalette" generic-name="toolpalette" _title="Tool Palette" 
+			use-placeholders="False" since="2.20">
+      <post-create-function>glade_gtk_toolbar_post_create</post-create-function>
+      <add-child-function>glade_gtk_tool_palette_add_child</add-child-function>
+      <remove-child-function>glade_gtk_tool_palette_remove_child</remove-child-function>
+      <child-set-property-function>glade_gtk_tool_palette_set_child_property</child-set-property-function>
+      <child-get-property-function>glade_gtk_tool_palette_get_child_property</child-get-property-function>
+      <action-activate-function>glade_gtk_tool_palette_action_activate</action-activate-function>
+
+      <actions>
+        <action id="launch_editor" _name="Edit&#8230;" stock="gtk-edit" important="True"/>
+      </actions>
+      <properties>
+      	<property id="icon-size-set" disabled="True"/>
+      	<property id="toolbar-style" save-always="True" optional="True" optional-default="False" weight="0.4"/>
+      	<property id="icon-size" optional="True" optional-default="False" weight="0.5"/>
+      </properties>
+
+      <packing-properties>
+        <property id="position" _name="Position" default="-1" save="False">
+	  <parameter-spec>
+	    <type>GParamInt</type>
+	    <min>-1</min>
+	  </parameter-spec>
+          <_tooltip>The position of the tool item group in the palette</_tooltip>
+        </property>
+	<property id="expand" transfer-on-paste="True" save-always="True"/>
+        <property id="exclusive" transfer-on-paste="True"/>
+      </packing-properties>
+    </glade-widget-class>
+
+    <glade-widget-class name="GtkToolItemGroup" generic-name="toolitemgroup" _title="Tool Item Group" 
+			use-placeholders="False" since="2.20">
+      <post-create-function>empty</post-create-function>
+      <set-property-function>glade_gtk_tool_item_group_set_property</set-property-function>
+      <add-child-function>glade_gtk_tool_item_group_add_child</add-child-function>
+      <remove-child-function>glade_gtk_tool_item_group_remove_child</remove-child-function>
+      <create-editable-function>glade_gtk_tool_item_group_create_editable</create-editable-function>
+      <read-widget-function>glade_gtk_tool_item_group_read_widget</read-widget-function>
+
+      <properties>
+        <property id="label" translatable="True" default="toolitemgroup" custom-layout="True"/>
+	<property id="label-widget" parentless-widget="True" create-type="GtkLabel" custom-layout="True"/>
+
+	<!-- Virtual label type property -->
+        <property id="custom-label" visible="False" save="False">
+	  <parameter-spec>
+	    <type>GParamBoolean</type>
+	  </parameter-spec>
+        </property>
+      </properties>
+
+      <packing-properties>
+	<property id="expand" transfer-on-paste="True"/>
+        <property id="fill" transfer-on-paste="True"/>
+        <property id="row-new" transfer-on-paste="True"/>
+        <property id="homogeneous" transfer-on-paste="True"/>
+      </packing-properties>
+    </glade-widget-class>
+
     <glade-widget-class name="GtkToolItem" generic-name="toolitem" title="GtkToolItem">
       <post-create-function>glade_gtk_tool_item_post_create</post-create-function>
       <constructor-function>glade_gtk_tool_item_constructor</constructor-function>
@@ -640,9 +700,9 @@ embedded in another object</_tooltip>
       </properties>
 
     </glade-widget-class>
-    
-    <glade-widget-class name="GtkSeparatorToolItem" generic-name="separatortoolitem" _title="Separator Tool Item"/>
-	
+
+    <glade-widget-class name="GtkSeparatorToolItem" generic-name="separatortoolitem" 
+			_title="Separator Tool Item"/>
 
     <glade-widget-class name="GtkToolButton" generic-name="toolbutton" _title="Tool Button">
       <create-editable-function>glade_gtk_tool_button_create_editable</create-editable-function>
@@ -677,7 +737,8 @@ embedded in another object</_tooltip>
     
     <glade-widget-class name="GtkRadioToolButton" generic-name="radiotoolbutton" _title="Radio Tool Button"/>
     
-    <glade-widget-class name="GtkMenuToolButton" generic-name="menutoolbutton" _title="Menu Tool Button">
+    <glade-widget-class name="GtkMenuToolButton" generic-name="menutoolbutton" use-placeholders="False"
+			_title="Menu Tool Button">
       <add-child-function>glade_gtk_menu_tool_button_add_child</add-child-function>
       <remove-child-function>glade_gtk_menu_tool_button_remove_child</remove-child-function>
       <get-children-function>glade_gtk_menu_tool_button_get_children</get-children-function>
@@ -3269,6 +3330,7 @@ embedded in another object</_tooltip>
     <glade-widget-class-ref name="GtkAspectFrame"/>
     <glade-widget-class-ref name="GtkMenuBar"/>
     <glade-widget-class-ref name="GtkToolbar"/>
+    <glade-widget-class-ref name="GtkToolPalette"/>
     <glade-widget-class-ref name="GtkPaned"/>
     <glade-widget-class-ref name="GtkHPaned"/>
     <glade-widget-class-ref name="GtkVPaned"/>



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