glade3 r2084 - trunk/plugins/gtk+



Author: tvb
Date: Thu Jan 15 02:19:41 2009
New Revision: 2084
URL: http://svn.gnome.org/viewvc/glade3?rev=2084&view=rev

Log:

	* plugins/gtk+/Makefile.am, plugins/gtk+/gtk+.xml.in, 
	plugins/gtk+/glade-entry-editor.[ch]: Added new editor
	for GtkEntry with radio buttons for its mutually exclusive
	icon properties.



Added:
   trunk/plugins/gtk+/glade-entry-editor.c
   trunk/plugins/gtk+/glade-entry-editor.h
Modified:
   trunk/plugins/gtk+/Makefile.am
   trunk/plugins/gtk+/glade-gtk.c
   trunk/plugins/gtk+/gtk+.xml.in

Modified: trunk/plugins/gtk+/Makefile.am
==============================================================================
--- trunk/plugins/gtk+/Makefile.am	(original)
+++ trunk/plugins/gtk+/Makefile.am	Thu Jan 15 02:19:41 2009
@@ -27,7 +27,7 @@
 	glade-column-types.c  glade-model-data.c glade-text-button.c glade-cell-renderer-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-cell-renderer-editor.c glade-treeview-editor.c glade-entry-editor.c
 
 libgladegtk_la_LDFLAGS     = -module -avoid-version $(AM_LDFLAGS)
 libgladegtk_la_LIBADD      = $(libgladeui) $(GTK_LIBS)
@@ -36,7 +36,7 @@
 libgladegtkinclude_HEADERS = glade-gtk.h glade-accels.h glade-attributes.h glade-column-types.h glade-model-data.h \
 	glade-text-button.h glade-cell-renderer-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-store-editor.h glade-label-editor.h glade-cell-renderer-editor.h glade-treeview-editor.h glade-entry-editor.h
 
 if PLATFORM_WIN32
 libgladegtk_la_LDFLAGS += -no-undefined

Added: trunk/plugins/gtk+/glade-entry-editor.c
==============================================================================
--- (empty file)
+++ trunk/plugins/gtk+/glade-entry-editor.c	Thu Jan 15 02:19:41 2009
@@ -0,0 +1,622 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * 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>
+ */
+
+#include <config.h>
+#include <gladeui/glade.h>
+#include <glib/gi18n-lib.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "glade-entry-editor.h"
+#include "glade-image-editor.h" // For GladeImageEditMode
+
+
+static void glade_entry_editor_finalize        (GObject              *object);
+
+static void glade_entry_editor_editable_init   (GladeEditableIface *iface);
+
+static void glade_entry_editor_grab_focus      (GtkWidget            *widget);
+
+
+G_DEFINE_TYPE_WITH_CODE (GladeEntryEditor, glade_entry_editor, GTK_TYPE_VBOX,
+                         G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
+                                                glade_entry_editor_editable_init));
+
+
+static void
+glade_entry_editor_class_init (GladeEntryEditorClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+	object_class->finalize     = glade_entry_editor_finalize;
+	widget_class->grab_focus   = glade_entry_editor_grab_focus;
+}
+
+static void
+glade_entry_editor_init (GladeEntryEditor *self)
+{
+}
+
+static void
+project_changed (GladeProject      *project,
+		 GladeCommand      *command,
+		 gboolean           execute,
+		 GladeEntryEditor *entry_editor)
+{
+	if (entry_editor->modifying ||
+	    !GTK_WIDGET_MAPPED (entry_editor))
+		return;
+
+	/* Reload on all commands */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), entry_editor->loaded_widget);
+}
+
+
+static void
+project_finalized (GladeEntryEditor *entry_editor,
+		   GladeProject       *where_project_was)
+{
+	entry_editor->loaded_widget = NULL;
+
+	glade_editable_load (GLADE_EDITABLE (entry_editor), NULL);
+}
+
+static void
+glade_entry_editor_load (GladeEditable *editable,
+			  GladeWidget   *widget)
+{
+	GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (editable);
+	GladeWidget       *gchild = NULL;
+	GtkWidget         *child, *entry;
+	gboolean           use_stock = FALSE;
+	GladeImageEditMode icon_mode;
+	GList *l;
+
+	entry_editor->loading = TRUE;
+
+	/* Since we watch the project*/
+	if (entry_editor->loaded_widget)
+	{
+		/* watch custom-child and use-stock properties here for reloads !!! */
+
+		g_signal_handlers_disconnect_by_func (G_OBJECT (entry_editor->loaded_widget->project),
+						      G_CALLBACK (project_changed), entry_editor);
+
+		/* The widget could die unexpectedly... */
+		g_object_weak_unref (G_OBJECT (entry_editor->loaded_widget->project),
+				     (GWeakNotify)project_finalized,
+				     entry_editor);
+	}
+
+	/* Mark our widget... */
+	entry_editor->loaded_widget = widget;
+
+	if (entry_editor->loaded_widget)
+	{
+		/* This fires for undo/redo */
+		g_signal_connect (G_OBJECT (entry_editor->loaded_widget->project), "changed",
+				  G_CALLBACK (project_changed), entry_editor);
+
+		/* The widget/project could die unexpectedly... */
+		g_object_weak_ref (G_OBJECT (entry_editor->loaded_widget->project),
+				   (GWeakNotify)project_finalized,
+				   entry_editor);
+	}
+
+	/* load the embedded editable... */
+	if (entry_editor->embed)
+		glade_editable_load (GLADE_EDITABLE (entry_editor->embed), widget);
+
+	for (l = entry_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, "primary-icon-mode", &icon_mode);
+		
+		switch (icon_mode)
+		{
+		case GLADE_IMAGE_MODE_STOCK:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_stock_radio), TRUE);
+			break;
+		case GLADE_IMAGE_MODE_ICON:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_icon_name_radio), TRUE);
+			break;
+		case GLADE_IMAGE_MODE_FILENAME:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_pixbuf_radio), TRUE);
+			break;
+		default:
+			break;
+		}
+
+		glade_widget_property_get (widget, "secondary-icon-mode", &icon_mode);
+		
+		switch (icon_mode)
+		{
+		case GLADE_IMAGE_MODE_STOCK:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_stock_radio), TRUE);
+			break;
+		case GLADE_IMAGE_MODE_ICON:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_icon_name_radio), TRUE);
+			break;
+		case GLADE_IMAGE_MODE_FILENAME:
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_pixbuf_radio), TRUE);
+			break;
+		default:
+			break;
+		}
+	}
+	entry_editor->loading = FALSE;
+}
+
+static void
+glade_entry_editor_set_show_name (GladeEditable *editable,
+				   gboolean       show_name)
+{
+	GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (editable);
+
+	glade_editable_set_show_name (GLADE_EDITABLE (entry_editor->embed), show_name);
+}
+
+static void
+glade_entry_editor_editable_init (GladeEditableIface *iface)
+{
+	iface->load = glade_entry_editor_load;
+	iface->set_show_name = glade_entry_editor_set_show_name;
+}
+
+static void
+glade_entry_editor_finalize (GObject *object)
+{
+	GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (object);
+
+	if (entry_editor->properties)
+		g_list_free (entry_editor->properties);
+	entry_editor->properties = NULL;
+	entry_editor->embed      = NULL;
+
+	glade_editable_load (GLADE_EDITABLE (object), NULL);
+
+	G_OBJECT_CLASS (glade_entry_editor_parent_class)->finalize (object);
+}
+
+static void
+glade_entry_editor_grab_focus (GtkWidget *widget)
+{
+	GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (widget);
+
+	gtk_widget_grab_focus (entry_editor->embed);
+}
+
+
+#define ICON_MODE_NAME(primary)   ((primary) ? "primary-icon-mode" : "secondary-icon-mode")
+#define PIXBUF_NAME(primary)      ((primary) ? "pixbuf-primary"    : "pixbuf-secondary")
+#define ICON_NAME_NAME(primary)   ((primary) ? "icon-name-primary" : "icon-name-secondary")
+#define STOCK_NAME(primary)       ((primary) ? "stock-primary"     : "stock-secondary")
+
+static void
+set_stock_mode (GladeEntryEditor *entry_editor, gboolean primary)
+{
+	GladeProperty     *property;
+	GValue             value = { 0, };
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, ICON_NAME_NAME (primary));
+	glade_command_set_property (property, NULL);
+	property = glade_widget_get_property (entry_editor->loaded_widget, PIXBUF_NAME (primary));
+	glade_command_set_property (property, NULL);
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary));
+	glade_property_get_default (property, &value);
+	glade_command_set_property_value (property, &value);
+	g_value_unset (&value);
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary));
+	glade_command_set_property (property, GLADE_IMAGE_MODE_STOCK);
+}
+
+static void
+set_icon_name_mode (GladeEntryEditor *entry_editor, gboolean primary)
+{
+	GladeProperty     *property;
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary));
+	glade_command_set_property (property, NULL);
+	property = glade_widget_get_property (entry_editor->loaded_widget, PIXBUF_NAME (primary));
+	glade_command_set_property (property, NULL);
+	property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary));
+	glade_command_set_property (property, GLADE_IMAGE_MODE_ICON);
+}
+
+static void
+set_pixbuf_mode (GladeEntryEditor *entry_editor, gboolean primary)
+{
+	GladeProperty     *property;
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary));
+	glade_command_set_property (property, NULL);
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, ICON_NAME_NAME (primary));
+	glade_command_set_property (property, NULL);
+
+	property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary));
+	glade_command_set_property (property, GLADE_IMAGE_MODE_FILENAME);
+}
+
+static void
+primary_stock_toggled (GtkWidget        *widget,
+		       GladeEntryEditor *entry_editor)
+{
+
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_stock_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a primary icon from stock"), entry_editor->loaded_widget->name);
+	set_stock_mode (entry_editor, TRUE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+
+static void
+primary_icon_name_toggled (GtkWidget        *widget,
+			   GladeEntryEditor *entry_editor)
+{
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_icon_name_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a primary icon from the icon theme"), entry_editor->loaded_widget->name);
+	set_icon_name_mode (entry_editor, TRUE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+static void
+primary_pixbuf_toggled (GtkWidget        *widget,
+			GladeEntryEditor *entry_editor)
+{
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_pixbuf_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a primary icon from filename"), entry_editor->loaded_widget->name);
+	set_pixbuf_mode (entry_editor, TRUE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+
+static void
+secondary_stock_toggled (GtkWidget        *widget,
+		       GladeEntryEditor *entry_editor)
+{
+
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_stock_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a secondary icon from stock"), entry_editor->loaded_widget->name);
+	set_stock_mode (entry_editor, FALSE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+
+static void
+secondary_icon_name_toggled (GtkWidget        *widget,
+			   GladeEntryEditor *entry_editor)
+{
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_icon_name_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a secondary icon from the icon theme"), entry_editor->loaded_widget->name);
+	set_icon_name_mode (entry_editor, FALSE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+static void
+secondary_pixbuf_toggled (GtkWidget        *widget,
+			GladeEntryEditor *entry_editor)
+{
+	if (entry_editor->loading || !entry_editor->loaded_widget)
+		return;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_pixbuf_radio)))
+		return;
+
+	entry_editor->modifying = TRUE;
+
+	glade_command_push_group (_("Setting %s to use a secondary icon from filename"), entry_editor->loaded_widget->name);
+	set_pixbuf_mode (entry_editor, FALSE);
+	glade_command_pop_group ();
+
+	entry_editor->modifying = FALSE;
+
+	/* reload buttons and sensitivity and stuff... */
+	glade_editable_load (GLADE_EDITABLE (entry_editor), 
+			     entry_editor->loaded_widget);
+}
+
+static void
+table_attach (GtkWidget *table, 
+	      GtkWidget *child, 
+	      gint pos, gint row,
+	      GtkSizeGroup *group)
+{
+	gtk_table_attach (GTK_TABLE (table), child,
+			  pos, pos+1, row, row +1,
+			  pos ? 0 : GTK_EXPAND | GTK_FILL,
+			  GTK_EXPAND | GTK_FILL,
+			  3, 1);
+
+	if (pos)
+		gtk_size_group_add_widget (group, child);
+}
+
+
+GtkWidget *
+glade_entry_editor_new (GladeWidgetAdaptor *adaptor,
+			 GladeEditable      *embed)
+{
+	GladeEntryEditor    *entry_editor;
+	GladeEditorProperty *eprop;
+	GtkWidget           *table, *frame, *alignment, *label, *hbox;
+	GtkSizeGroup        *group;
+	gchar               *str;
+
+	g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+	g_return_val_if_fail (GLADE_IS_EDITABLE (embed), NULL);
+
+	entry_editor = g_object_new (GLADE_TYPE_ENTRY_EDITOR, NULL);
+	entry_editor->embed = GTK_WIDGET (embed);
+
+	/* Pack the parent on top... */
+	gtk_box_pack_start (GTK_BOX (entry_editor), GTK_WIDGET (embed), FALSE, FALSE, 0);
+
+	/* Progress... */
+	str = g_strdup_printf ("<b>%s</b>", _("Progress"));
+	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 (entry_editor), frame, FALSE, FALSE, 8);
+
+	alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F);
+	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0);
+	gtk_container_add (GTK_CONTAINER (frame), alignment);
+
+	table = gtk_table_new (0, 0, FALSE);
+	gtk_container_add (GTK_CONTAINER (alignment), table);
+
+	group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+	/* Fraction */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "progress-fraction", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 0, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 0, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	/* Pulse */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "progress-pulse-step", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 1, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 1, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	g_object_unref (group);
+
+	/* Primary icon... */
+	str = g_strdup_printf ("<b>%s</b>", _("Primary icon"));
+	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 (entry_editor), frame, FALSE, FALSE, 8);
+
+	alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F);
+	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0);
+	gtk_container_add (GTK_CONTAINER (frame), alignment);
+
+	table = gtk_table_new (0, 0, FALSE);
+	gtk_container_add (GTK_CONTAINER (alignment), table);
+
+	group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+	/* Pixbuf */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "pixbuf-primary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->primary_pixbuf_radio = gtk_radio_button_new (NULL);
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_pixbuf_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 0, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 0, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	/* Stock */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "stock-primary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->primary_stock_radio = gtk_radio_button_new_from_widget
+	  (GTK_RADIO_BUTTON (entry_editor->primary_pixbuf_radio));
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_stock_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 1, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 1, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	/* Icon name */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "icon-name-primary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->primary_icon_name_radio = gtk_radio_button_new_from_widget
+	  (GTK_RADIO_BUTTON (entry_editor->primary_pixbuf_radio));
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_icon_name_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 2, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 2, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "activatable-primary", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 3, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 3, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "sensitive-primary", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 4, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 4, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	g_object_unref (group);
+
+	/* Secondary icon... */
+	str = g_strdup_printf ("<b>%s</b>", _("Secondary icon"));
+	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 (entry_editor), frame, FALSE, FALSE, 8);
+
+	alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F);
+	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0);
+	gtk_container_add (GTK_CONTAINER (frame), alignment);
+
+	table = gtk_table_new (0, 0, FALSE);
+	gtk_container_add (GTK_CONTAINER (alignment), table);
+
+	group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+	/* Pixbuf */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "pixbuf-secondary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->secondary_pixbuf_radio = gtk_radio_button_new (NULL);
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_pixbuf_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 0, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 0, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	/* Stock */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "stock-secondary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->secondary_stock_radio = gtk_radio_button_new_from_widget
+	  (GTK_RADIO_BUTTON (entry_editor->secondary_pixbuf_radio));
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_stock_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 1, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 1, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	/* Icon name */
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "icon-name-secondary", FALSE, TRUE);
+	hbox  = gtk_hbox_new (FALSE, 0);
+	entry_editor->secondary_icon_name_radio = gtk_radio_button_new_from_widget
+	  (GTK_RADIO_BUTTON (entry_editor->secondary_pixbuf_radio));
+	gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_icon_name_radio, FALSE, FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2);
+	table_attach (table, hbox, 0, 2, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 2, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "activatable-secondary", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 3, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 3, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "sensitive-secondary", FALSE, TRUE);
+	table_attach (table, eprop->item_label, 0, 4, group);
+	table_attach (table, GTK_WIDGET (eprop), 1, 4, group);
+	entry_editor->properties = g_list_prepend (entry_editor->properties, eprop);
+
+	g_object_unref (group);
+
+	gtk_widget_show_all (GTK_WIDGET (entry_editor));
+
+
+	/* Connect radio button signals... */
+	g_signal_connect (G_OBJECT (entry_editor->primary_stock_radio), "toggled",
+			  G_CALLBACK (primary_stock_toggled), entry_editor);
+	g_signal_connect (G_OBJECT (entry_editor->primary_icon_name_radio), "toggled",
+			  G_CALLBACK (primary_icon_name_toggled), entry_editor);
+	g_signal_connect (G_OBJECT (entry_editor->primary_pixbuf_radio), "toggled",
+			  G_CALLBACK (primary_pixbuf_toggled), entry_editor);
+
+	g_signal_connect (G_OBJECT (entry_editor->secondary_stock_radio), "toggled",
+			  G_CALLBACK (secondary_stock_toggled), entry_editor);
+	g_signal_connect (G_OBJECT (entry_editor->secondary_icon_name_radio), "toggled",
+			  G_CALLBACK (secondary_icon_name_toggled), entry_editor);
+	g_signal_connect (G_OBJECT (entry_editor->secondary_pixbuf_radio), "toggled",
+			  G_CALLBACK (secondary_pixbuf_toggled), entry_editor);
+
+	return GTK_WIDGET (entry_editor);
+}

Added: trunk/plugins/gtk+/glade-entry-editor.h
==============================================================================
--- (empty file)
+++ trunk/plugins/gtk+/glade-entry-editor.h	Thu Jan 15 02:19:41 2009
@@ -0,0 +1,72 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * 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_ENTRY_EDITOR_H_
+#define _GLADE_ENTRY_EDITOR_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_ENTRY_EDITOR	            (glade_entry_editor_get_type ())
+#define GLADE_ENTRY_EDITOR(obj)		    (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditor))
+#define GLADE_ENTRY_EDITOR_CLASS(klass)	    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditorClass))
+#define GLADE_IS_ENTRY_EDITOR(obj)	    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_ENTRY_EDITOR))
+#define GLADE_IS_ENTRY_EDITOR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_ENTRY_EDITOR))
+#define GLADE_ENTRY_EDITOR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditorClass))
+
+typedef struct _GladeEntryEditor        GladeEntryEditor;
+typedef struct _GladeEntryEditorClass   GladeEntryEditorClass;
+
+struct _GladeEntryEditor
+{
+	GtkVBox  parent;
+
+	GladeWidget *loaded_widget; /* A handy pointer to the loaded widget ... */
+
+	GtkWidget *embed;
+
+	GtkWidget *primary_pixbuf_radio;
+	GtkWidget *primary_stock_radio;
+	GtkWidget *primary_icon_name_radio;
+
+	GtkWidget *secondary_pixbuf_radio;
+	GtkWidget *secondary_stock_radio;
+	GtkWidget *secondary_icon_name_radio;
+
+	GList     *properties;
+
+	gboolean loading;
+	gboolean modifying;
+};
+
+struct _GladeEntryEditorClass
+{
+	GtkVBoxClass parent;
+};
+
+GType            glade_entry_editor_get_type (void) G_GNUC_CONST;
+GtkWidget       *glade_entry_editor_new      (GladeWidgetAdaptor *adaptor,
+					      GladeEditable      *editable);
+
+G_END_DECLS
+
+#endif  /* _GLADE_ENTRY_EDITOR_H_ */

Modified: trunk/plugins/gtk+/glade-gtk.c
==============================================================================
--- trunk/plugins/gtk+/glade-gtk.c	(original)
+++ trunk/plugins/gtk+/glade-gtk.c	Thu Jan 15 02:19:41 2009
@@ -41,6 +41,7 @@
 #include "glade-label-editor.h"
 #include "glade-cell-renderer-editor.h"
 #include "glade-treeview-editor.h"
+#include "glade-entry-editor.h"
 
 #include <gladeui/glade-editor-property.h>
 #include <gladeui/glade-base-editor.h>
@@ -2205,6 +2206,8 @@
 	GladeWidget  *gchild;
 	GladeWidget  *gbox;
 
+	g_object_ref (G_OBJECT (current));
+
 	GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor,
 							   container,
 							   current,
@@ -2219,6 +2222,8 @@
 	gbox = glade_widget_get_from_gobject (container);
 	fix_response_id_on_child (gbox, current, FALSE);
 	fix_response_id_on_child (gbox, new_widget, TRUE);
+
+	g_object_unref (G_OBJECT (current));
 }
 
 
@@ -4714,6 +4719,127 @@
 			  G_CALLBACK (glade_gtk_entry_changed), gentry);
 }
 
+GladeEditable *
+glade_gtk_entry_create_editable (GladeWidgetAdaptor  *adaptor,
+				 GladeEditorPageType  type)
+{
+	GladeEditable *editable;
+
+	/* Get base editable */
+	editable = GWA_GET_CLASS (GTK_TYPE_WIDGET)->create_editable (adaptor, type);
+
+	if (type == GLADE_PAGE_GENERAL)
+		return (GladeEditable *)glade_entry_editor_new (adaptor, editable);
+
+	return editable;
+}
+
+
+void
+glade_gtk_entry_set_property (GladeWidgetAdaptor *adaptor,
+			      GObject            *object, 
+			      const gchar        *id,
+			      const GValue       *value)
+{
+	GladeImageEditMode mode;
+	GladeWidget *gwidget = glade_widget_get_from_gobject (object);
+
+	if (!strcmp (id, "primary-icon-mode"))
+	{
+		mode = g_value_get_int (value);
+
+		glade_widget_property_set_sensitive (gwidget, "stock-primary", FALSE, NOT_SELECTED_MSG);
+		glade_widget_property_set_sensitive (gwidget, "icon-name-primary", FALSE, NOT_SELECTED_MSG);
+		glade_widget_property_set_sensitive (gwidget, "pixbuf-primary", FALSE, NOT_SELECTED_MSG);
+
+		switch (mode) {
+		case GLADE_IMAGE_MODE_STOCK:
+			glade_widget_property_set_sensitive (gwidget, "stock-primary", TRUE, NULL);
+			break;
+		case GLADE_IMAGE_MODE_ICON:	
+			glade_widget_property_set_sensitive (gwidget, "icon-name-primary", TRUE, NULL);
+			break;
+		case GLADE_IMAGE_MODE_FILENAME: 
+			glade_widget_property_set_sensitive (gwidget, "pixbuf-primary", TRUE, NULL);
+			break;
+		}
+	}
+	else if (!strcmp (id, "secondary-icon-mode"))
+	{
+		mode = g_value_get_int (value);
+
+		glade_widget_property_set_sensitive (gwidget, "stock-secondary", FALSE, NOT_SELECTED_MSG);
+		glade_widget_property_set_sensitive (gwidget, "icon-name-secondary", FALSE, NOT_SELECTED_MSG);
+		glade_widget_property_set_sensitive (gwidget, "pixbuf-secondary", FALSE, NOT_SELECTED_MSG);
+
+		switch (mode) {
+		case GLADE_IMAGE_MODE_STOCK:
+			glade_widget_property_set_sensitive (gwidget, "stock-secondary", TRUE, NULL);
+			break;
+		case GLADE_IMAGE_MODE_ICON:	
+			glade_widget_property_set_sensitive (gwidget, "icon-name-secondary", TRUE, NULL);
+			break;
+		case GLADE_IMAGE_MODE_FILENAME: 
+			glade_widget_property_set_sensitive (gwidget, "pixbuf-secondary", TRUE, NULL);
+			break;
+		}
+	}
+	else
+		GWA_GET_CLASS (GTK_TYPE_WIDGET)->set_property (adaptor, object, id, value);
+}
+
+void
+glade_gtk_entry_read_widget (GladeWidgetAdaptor *adaptor,
+			     GladeWidget        *widget,
+			     GladeXmlNode       *node)
+{
+	GladeProperty *property;
+
+	if (!glade_xml_node_verify 
+	    (node, GLADE_XML_TAG_WIDGET (glade_project_get_format (widget->project))))
+		return;
+
+	/* First chain up and read in all the normal properties.. */
+        GWA_GET_CLASS (GTK_TYPE_WIDGET)->read_widget (adaptor, widget, node);
+	
+	if (glade_widget_property_original_default (widget, "icon-name-primary") == FALSE)
+	{
+		property = glade_widget_get_property (widget, "icon-name-primary");
+		glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_ICON);
+	}
+	else if (glade_widget_property_original_default (widget, "pixbuf-primary") == FALSE)
+	{
+		property = glade_widget_get_property (widget, "pixbuf-primary");
+		glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_FILENAME);
+	}
+	else/*  if (glade_widget_property_original_default (widget, "stock") == FALSE) */
+	{
+		property = glade_widget_get_property (widget, "stock-primary");
+		glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_STOCK);
+	}
+
+	glade_property_sync (property);
+
+	if (glade_widget_property_original_default (widget, "icon-name-secondary") == FALSE)
+	{
+		property = glade_widget_get_property (widget, "icon-name-secondary");
+		glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_ICON);
+	}
+	else if (glade_widget_property_original_default (widget, "pixbuf-secondary") == FALSE)
+	{
+		property = glade_widget_get_property (widget, "pixbuf-secondary");
+		glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_FILENAME);
+	}
+	else/*  if (glade_widget_property_original_default (widget, "stock") == FALSE) */
+	{
+		property = glade_widget_get_property (widget, "stock-secondary");
+		glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_STOCK);
+	}
+
+	glade_property_sync (property);
+}
+
+
 /* ----------------------------- GtkFixed/GtkLayout ------------------------------ */
 static void
 glade_gtk_fixed_layout_finalize(GdkPixmap *backing)
@@ -5731,8 +5857,6 @@
 	}
 
 	glade_property_sync (property);
-
-
 }
 
 

Modified: trunk/plugins/gtk+/gtk+.xml.in
==============================================================================
--- trunk/plugins/gtk+/gtk+.xml.in	(original)
+++ trunk/plugins/gtk+/gtk+.xml.in	Thu Jan 15 02:19:41 2009
@@ -784,11 +784,41 @@
 
     <glade-widget-class name="GtkEntry" generic-name="entry" _title="Text Entry">
       <post-create-function>glade_gtk_entry_post_create</post-create-function>
+      <create-editable-function>glade_gtk_entry_create_editable</create-editable-function>
+      <set-property-function>glade_gtk_entry_set_property</set-property-function>
+      <read-widget-function>glade_gtk_entry_read_widget</read-widget-function>
       <properties>
 	<property id="text" translatable="True"/>
         <property id="inner-border" since="2.10"/>
         <property id="truncate-multiline" since="2.10"/>
 	<property id="shadow-type" since="2.12"/>
+	<property id="gicon-primary" disabled="True"/>
+	<property id="gicon-secondary" disabled="True"/>
+	<property id="stock-primary" since="2.16" custom-layout="True" stock-icon="True"/>
+	<property id="stock-secondary" since="2.16" custom-layout="True" stock-icon="True"/>
+	<property id="pixbuf-primary" since="2.16" custom-layout="True"/>
+	<property id="pixbuf-secondary" since="2.16" custom-layout="True"/>
+	<property id="icon-name-primary" since="2.16" custom-layout="True" themed-icon="True"/>
+	<property id="icon-name-secondary" since="2.16" custom-layout="True" themed-icon="True"/>
+	<property id="activatable-primary" since="2.16" custom-layout="True"/>
+	<property id="activatable-secondary" since="2.16" custom-layout="True"/>
+	<property id="sensitive-primary" since="2.16" custom-layout="True"/>
+	<property id="sensitive-secondary" since="2.16" custom-layout="True"/>
+	<property id="progress-fraction" since="2.16" custom-layout="True"/>
+	<property id="progress-pulse-step" since="2.16" custom-layout="True"/>
+
+	<!-- Virtual icon edit mode properties -->
+        <property id="primary-icon-mode" visible="False" save="False">
+	  <parameter-spec>
+	    <type>GParamInt</type>
+	  </parameter-spec>
+        </property>
+        <property id="secondary-icon-mode" visible="False" save="False">
+	  <parameter-spec>
+	    <type>GParamInt</type>
+	  </parameter-spec>
+        </property>
+
 	<!-- Atk activate property -->
 	<property id="atk-activate" _name="Activate" ignore="True" atk-property="True" save="False">
 	  <parameter-spec>



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