glade3 r1935 - in trunk: . gladeui plugins/gnome plugins/gtk+



Author: tvb
Date: Fri Sep 19 22:31:18 2008
New Revision: 1935
URL: http://svn.gnome.org/viewvc/glade3?rev=1935&view=rev

Log:

	Now we have a conversion routine that is run in the plugin to
	convert some data for one format to another (builder on the way...)
	In this patch we use it to handle GtkAdjustment property conversions.
	(NOTE: Completely undoable)
	
	* gladeui/glade-editor-property.c: Made adjustment eprop fallback on
	  object dialog in builder cases.

	* gladeui/glade-command.[ch]: Added glade_command_set_project_format()

	* gladeui/gldae-catalog.c, gladeui/glade-xml-utils.h: Added GladeProjectConvertFunc

	* plugins/gtk+/Makefile.am, plugins/gtk+/glade-convert.c,
	plugins/gtk+/gtk+.xml.in: New file to handle conversion routines, 
	added some objects.



Added:
   trunk/plugins/gtk+/glade-convert.c
Modified:
   trunk/ChangeLog
   trunk/TODO
   trunk/gladeui/glade-app.c
   trunk/gladeui/glade-app.h
   trunk/gladeui/glade-catalog.c
   trunk/gladeui/glade-catalog.h
   trunk/gladeui/glade-command.c
   trunk/gladeui/glade-command.h
   trunk/gladeui/glade-editor-property.c
   trunk/gladeui/glade-editor.c
   trunk/gladeui/glade-palette.c
   trunk/gladeui/glade-project.c
   trunk/gladeui/glade-project.h
   trunk/gladeui/glade-property-class.c
   trunk/gladeui/glade-property-class.h
   trunk/gladeui/glade-property.c
   trunk/gladeui/glade-widget-adaptor.c
   trunk/gladeui/glade-widget-adaptor.h
   trunk/gladeui/glade-widget.c
   trunk/gladeui/glade-xml-utils.h
   trunk/gladeui/glade.h
   trunk/plugins/gnome/glade-gnome.c
   trunk/plugins/gtk+/Makefile.am
   trunk/plugins/gtk+/glade-gtk.c
   trunk/plugins/gtk+/gtk+.xml.in

Modified: trunk/TODO
==============================================================================
--- trunk/TODO	(original)
+++ trunk/TODO	Fri Sep 19 22:31:18 2008
@@ -10,3 +10,12 @@
 Create Gtk+ Specialized widget group: http://bugzilla.gnome.org/show_bug.cgi?id=544845
 No way to add menus to toolbar: http://bugzilla.gnome.org/show_bug.cgi?id=429438
 GdkColor null values critical errors: http://bugzilla.gnome.org/show_bug.cgi?id=426345
+
+Need proper conversion routine:
+   currently adjustments are saved as data in libglade and as objects in builder,
+we need a conversion "routine" to be run, to create/remove the nescisary objects
+and modify the project as needed when converts take place - this should also help
+clean things up wrt the internal icon factory cache for pixbufs. 
+
+Its possible that as a result of project conversions, we will dump/lose our
+command history.

Modified: trunk/gladeui/glade-app.c
==============================================================================
--- trunk/gladeui/glade-app.c	(original)
+++ trunk/gladeui/glade-app.c	Fri Sep 19 22:31:18 2008
@@ -719,24 +719,37 @@
 	app->priv->window = window;
 }
 
-void
-glade_app_get_catalog_version (const gchar *name, gint *major, gint *minor)
+GladeCatalog *
+glade_app_get_catalog (const gchar *name)
 {
-	GladeApp *app = glade_app_get ();
-	GList    *list;
+	GladeApp     *app = glade_app_get ();
+	GList        *list;
+	GladeCatalog *catalog;
+
+	g_return_val_if_fail (name && name[0], NULL);
 
 	for (list = app->priv->catalogs; list; list = list->next)
 	{
-		GladeCatalog *catalog = list->data;
-		if (strcmp (glade_catalog_get_name (catalog), name))
-		{
-			if (major)
-				*major = glade_catalog_get_major_version (catalog);
-			if (minor)
-				*minor = glade_catalog_get_minor_version (catalog);
-			return;
-		}
+		catalog = list->data;
+		if (!strcmp (glade_catalog_get_name (catalog), name))
+			return catalog;
 	}
+	return NULL;
+}
+
+gboolean
+glade_app_get_catalog_version (const gchar *name, gint *major, gint *minor)
+{
+	GladeCatalog *catalog = glade_app_get_catalog (name);
+
+	g_return_val_if_fail (catalog != NULL, FALSE);
+
+	if (major)
+		*major = glade_catalog_get_major_version (catalog);
+	if (minor)
+		*minor = glade_catalog_get_minor_version (catalog);
+	
+	return TRUE;
 }
 
 GList *

Modified: trunk/gladeui/glade-app.h
==============================================================================
--- trunk/gladeui/glade-app.h	(original)
+++ trunk/gladeui/glade-app.h	Fri Sep 19 22:31:18 2008
@@ -26,6 +26,7 @@
 #include <gladeui/glade-editor.h>
 #include <gladeui/glade-palette.h>
 #include <gladeui/glade-clipboard.h>
+#include <gladeui/glade-catalog.h>
 
 G_BEGIN_DECLS
 
@@ -98,9 +99,11 @@
  
 GtkWidget*         glade_app_get_window (void);
 
-void               glade_app_get_catalog_version (const gchar *name, gint *major, gint *minor);
+gboolean           glade_app_get_catalog_version (const gchar *name, gint *major, gint *minor);
 
 GList             *glade_app_get_catalogs (void);
+
+GladeCatalog      *glade_app_get_catalog (const gchar *name);
  
 GladeEditor*       glade_app_get_editor (void);
  

Modified: trunk/gladeui/glade-catalog.c
==============================================================================
--- trunk/gladeui/glade-catalog.c	(original)
+++ trunk/gladeui/glade-catalog.c	Fri Sep 19 22:31:18 2008
@@ -33,8 +33,6 @@
 #include <glib.h>
 #include <glib/gi18n-lib.h>
 
-typedef void   (*GladeCatalogInitFunc) (const gchar *name);
-
 struct _GladeCatalog
 {
 	gint   major_version;    /* The catalog version               */
@@ -69,6 +67,8 @@
 	
 	gchar *init_function_name;/* Catalog's init function name */
 	GladeCatalogInitFunc init_function;
+
+	GladeProjectConvertFunc project_convert_function; /* pointer to module's project converter */
 };
 
 struct _GladeWidgetGroup
@@ -151,6 +151,7 @@
 	GladeXmlContext *context;
 	GladeXmlDoc     *doc;
 	GladeXmlNode    *root;
+	gchar           *str;
 
 	/* get the context & root node of the catalog file */
 	context = glade_xml_context_new_from_path (filename,
@@ -214,6 +215,11 @@
 	if (catalog->init_function_name)
 		catalog_get_function (catalog, catalog->init_function_name,
 				      (gpointer) &catalog->init_function);
+	
+	if ((str = glade_xml_get_value_string (root, GLADE_TAG_PROJECT_CONVERT_FUNCTION)) != NULL)
+	{
+		catalog_get_function (catalog, str, (gpointer) &catalog->project_convert_function);
+	}
 
 	return catalog;
 }
@@ -719,3 +725,28 @@
 }
 	
 
+
+/**
+ * glade_catalog_convert_project:
+ * @catalog: A #GladeCatalog
+ * @project: The #GladeProject to convert
+ * @new_format: The format to convert @project to
+ *
+ * Do any data changes needed to the project for the new
+ * format in an undoable way.
+ *
+ * Returns: FALSE if any errors occurred during the conversion.
+ */
+gboolean
+glade_catalog_convert_project (GladeCatalog     *catalog,
+			       GladeProject     *project,
+			       GladeProjectFormat  new_format)
+{
+	g_return_val_if_fail (GLADE_IS_CATALOG (catalog), FALSE);
+	g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE);
+
+	if (catalog->project_convert_function)
+		return catalog->project_convert_function (project, new_format);
+
+	return TRUE;
+}

Modified: trunk/gladeui/glade-catalog.h
==============================================================================
--- trunk/gladeui/glade-catalog.h	(original)
+++ trunk/gladeui/glade-catalog.h	Fri Sep 19 22:31:18 2008
@@ -23,6 +23,7 @@
 #define __GLADE_CATALOG_H__
 
 #include <glib.h>
+#include <gladeui/glade-xml-utils.h>
 
 G_BEGIN_DECLS
 
@@ -36,6 +37,33 @@
 typedef struct _GladeCatalog     GladeCatalog;
 typedef struct _GladeWidgetGroup GladeWidgetGroup;
 
+
+/**
+ * GladeCatalogInitFunc:
+ * @name: The name of the catalog
+ *
+ * Called once at glade startup time for every catalog, catalogs
+ * are initialized in order of dependancies.
+ */
+typedef void      (*GladeCatalogInitFunc)    (const gchar *name);
+
+/**
+ * GladeProjectConvertFunc:
+ * @project: A #GladeProject
+ * @new_format: The format to convert @project to
+ *
+ * Generally format transperency is implemented at load/save time,
+ * but if some objects need to be setup differently, or some new
+ * objects created (like real GtkAdjustment objects for old inline
+ * property values) this is the place to do those things, be careful
+ * to use the GladeCommand api because conversions are undoable.
+ *
+ * Returns: FALSE if any errors occurred during the conversion.
+ */
+typedef gboolean  (*GladeProjectConvertFunc) (GladeProject        *project, 
+					      GladeProjectFormat   new_format);
+
+
 typedef struct {
 	gint major;
 	gint minor;
@@ -68,6 +96,10 @@
 
 const GList  *glade_widget_group_get_adaptors       (GladeWidgetGroup *group);
 
+gboolean      glade_catalog_convert_project         (GladeCatalog     *catalog,
+						     GladeProject     *project,
+						     GladeProjectFormat  new_format);
+
 G_END_DECLS
 
 #endif /* __GLADE_CATALOG_H__ */

Modified: trunk/gladeui/glade-command.c
==============================================================================
--- trunk/gladeui/glade-command.c	(original)
+++ trunk/gladeui/glade-command.c	Fri Sep 19 22:31:18 2008
@@ -475,11 +475,19 @@
 			
 			for (list = cmd1->sdata; list; list = list->next)
 			{
+				GladeProject *project;
+				GladeProjectFormat fmt = GLADE_PROJECT_FORMAT_GTKBUILDER;
 				pdata1 = list->data;
+				
+				if (pdata1->property->widget)
+				{
+					project = glade_widget_get_project (pdata1->property->widget);
+					fmt     = glade_project_get_format (project);
+				}
 
 				if (glade_property_class_compare (pdata1->property->klass,
 								  pdata1->old_value,
-								  pdata1->new_value))
+								  pdata1->new_value, fmt))
 					return FALSE;
 			}
 			return TRUE;
@@ -568,7 +576,8 @@
 
 #define MAX_UNDO_MENU_ITEM_VALUE_LEN	10
 static gchar *
-glade_command_set_property_description (GladeCommandSetProperty *me)
+glade_command_set_property_description (GladeCommandSetProperty *me,
+					GladeProjectFormat       fmt)
 {
 	GCSetPropData   *sdata;
 	gchar *description = NULL;
@@ -583,7 +592,7 @@
 		sdata = me->sdata->data;
 		value_name = glade_widget_adaptor_string_from_value
 			(GLADE_WIDGET_ADAPTOR (sdata->property->klass->handle),
-			 sdata->property->klass, sdata->new_value);
+			 sdata->property->klass, sdata->new_value, fmt);
 
 		if (!value_name || strlen (value_name) > MAX_UNDO_MENU_ITEM_VALUE_LEN
 		    || strchr (value_name, '_')) {
@@ -627,7 +636,8 @@
 	me->sdata        = props;
 	cmd->description = NULL;
 
-	glade_command_push_group (glade_command_set_property_description (me));
+	glade_command_push_group (glade_command_set_property_description 
+				  (me, glade_project_get_format (project)));
 	glade_command_check_group (GLADE_COMMAND (me));
 
 	/* Push onto undo stack only if it executes successfully. */
@@ -2078,3 +2088,165 @@
 }
 
 
+
+
+/******************************************************************************
+ * 
+ * set project format
+ * 
+ * This command sets the format on the project.
+ * 
+ *****************************************************************************/
+
+typedef struct {
+	GladeCommand   parent;
+	GladeProject  *project;
+	GladeProjectFormat format;
+	GladeProjectFormat old_format;
+} GladeCommandSetFormat;
+
+
+GLADE_MAKE_COMMAND (GladeCommandSetFormat, glade_command_set_format);
+#define GLADE_COMMAND_SET_FORMAT_TYPE			(glade_command_set_format_get_type ())
+#define GLADE_COMMAND_SET_FORMAT(o)	  		(G_TYPE_CHECK_INSTANCE_CAST ((o), GLADE_COMMAND_SET_FORMAT_TYPE, GladeCommandSetFormat))
+#define GLADE_COMMAND_SET_FORMAT_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST ((k), GLADE_COMMAND_SET_FORMAT_TYPE, GladeCommandSetFormatClass))
+#define GLADE_IS_COMMAND_SET_FORMAT(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), GLADE_COMMAND_SET_FORMAT_TYPE))
+#define GLADE_IS_COMMAND_SET_FORMAT_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GLADE_COMMAND_SET_FORMAT_TYPE))
+
+static gboolean
+glade_command_set_format_execute(GladeCommand *cmd)
+{
+	GladeCommandSetFormat *me = (GladeCommandSetFormat *)cmd;
+	GladeProjectFormat fmt;
+
+	/* sanity check */
+	g_return_val_if_fail (me != NULL, TRUE);
+	g_return_val_if_fail (me->project != NULL, TRUE);
+
+	/* set the new format */
+	glade_project_set_format (me->project, me->format);
+
+	/* swap the current values with the old values to prepare for undo */
+	fmt            = me->format;
+	me->format     = me->old_format;
+	me->old_format = fmt;
+	
+	return TRUE;
+}
+
+static gboolean
+glade_command_set_format_undo(GladeCommand *cmd)
+{
+	return glade_command_set_format_execute(cmd);
+}
+
+static void
+glade_command_set_format_finalize(GObject *obj)
+{
+	GladeCommandSetFormat	*me;
+	
+	g_return_if_fail(GLADE_IS_COMMAND_SET_FORMAT(obj));
+	
+	glade_command_finalize(obj);
+}
+
+static gboolean
+glade_command_set_format_unifies (GladeCommand *this_cmd, GladeCommand *other_cmd)
+{
+	GladeCommandSetFormat *cmd1;
+	GladeCommandSetFormat *cmd2;
+
+	return FALSE;
+}
+
+static void
+glade_command_set_format_collapse (GladeCommand *this_cmd, GladeCommand *other_cmd)
+{
+	/* this command is the one that will be used for an undo of the sequence of like commands */
+	GladeCommandSetFormat *this = GLADE_COMMAND_SET_FORMAT (this_cmd);
+	
+	/* the other command contains the values that will be used for a redo */
+	GladeCommandSetFormat *other = GLADE_COMMAND_SET_FORMAT (other_cmd);
+
+	g_return_if_fail (GLADE_IS_COMMAND_SET_FORMAT (this_cmd) && GLADE_IS_COMMAND_SET_FORMAT (other_cmd));
+
+	/* no unify/collapse */
+}
+
+/**
+ * glade_command_set_project_format:
+ * @project: a #GladeProject
+ * @fmt: the #GladeProjectFormat
+ *
+ * Sets the format of the project.
+ */
+void
+glade_command_set_project_format (GladeProject        *project, 
+				  GladeProjectFormat   fmt)
+{
+	GladeCommandSetFormat *me;
+	GList *req_libs, *list;
+	gchar *cat_name;
+	GladeCatalog *catalog;
+	
+	g_return_if_fail (GLADE_IS_PROJECT (project));
+
+	if (glade_project_get_format (project) != fmt)
+	{
+		gchar *prj_name = glade_project_get_name (project);
+		gchar *desc = g_strdup_printf (_("Converting %s to %s format"),
+					       prj_name, 
+					       fmt == GLADE_PROJECT_FORMAT_LIBGLADE ? "libglade" : "Gtk+ Builder");
+		glade_command_push_group (desc);
+		g_free (desc);
+		g_free (prj_name);
+
+		/* load up the command */
+		me = g_object_new(GLADE_COMMAND_SET_FORMAT_TYPE, NULL);
+		me->project = project;
+		me->format = fmt;
+		me->old_format = glade_project_get_format (project);
+
+		GLADE_COMMAND(me)->description = g_strdup_printf("dummy string");
+	
+		glade_command_check_group(GLADE_COMMAND(me));
+
+		if ((req_libs = glade_project_required_libs (project)) != NULL)
+		{
+			for (list = req_libs; list; list = list->next)
+			{
+				cat_name = list->data;
+				catalog  = glade_app_get_catalog (cat_name);
+				
+				glade_catalog_convert_project (catalog, project, fmt);
+				
+				g_free (cat_name);
+			}
+			g_list_free (req_libs);
+		}
+		
+
+		/* execute the command and push it on the stack if successful 
+		 * this sets the actual format
+		 */
+		if (glade_command_set_format_execute(GLADE_COMMAND(me)))
+		{
+			glade_project_push_undo(glade_app_get_project(), GLADE_COMMAND(me));
+		}
+		else
+		{
+			g_object_unref(G_OBJECT(me));
+		}
+		
+		/* Emit "convert-finished" signal after setting the actual format */
+		g_signal_emit_by_name (project, "convert-finished");
+
+		glade_command_pop_group ();
+
+		glade_editor_refresh (glade_app_get_editor ());
+		
+		glade_project_verify_project_for_ui (project);
+	}
+}
+
+

Modified: trunk/gladeui/glade-command.h
==============================================================================
--- trunk/gladeui/glade-command.h	(original)
+++ trunk/gladeui/glade-command.h	Fri Sep 19 22:31:18 2008
@@ -85,6 +85,11 @@
 void           glade_command_collapse      (GladeCommand      *command,
 					    GladeCommand      *other);
 
+/************************** project *********************************/
+
+void           glade_command_set_project_format  (GladeProject       *project,
+						  GladeProjectFormat  fmt);
+
 /************************** properties *********************************/
 
 void           glade_command_set_property        (GladeProperty *property,     

Modified: trunk/gladeui/glade-editor-property.c
==============================================================================
--- trunk/gladeui/glade-editor-property.c	(original)
+++ trunk/gladeui/glade-editor-property.c	Fri Sep 19 22:31:18 2008
@@ -91,6 +91,9 @@
 glade_editor_property_commit (GladeEditorProperty *eprop,
 			      GValue              *value)
 {
+	GladeProject *project;
+	GladeProjectFormat fmt;
+	
 	g_return_if_fail (GLADE_IS_EDITOR_PROPERTY (eprop));
 
 	if (eprop->use_command == FALSE)
@@ -98,11 +101,14 @@
 	else
 		glade_command_set_property_value (eprop->property, value);
 
+	project = glade_widget_get_project (eprop->property->widget);
+	fmt     = glade_project_get_format (project);
+
 	/* If the value was denied by a verify function, we'll have to
 	 * reload the real value.
 	 */
 	if (glade_property_class_compare (eprop->property->klass,
-					  eprop->property->value, value) != 0)
+					  eprop->property->value, value, fmt) != 0)
 		GLADE_EDITOR_PROPERTY_GET_CLASS (eprop)->load (eprop, eprop->property);
 
 }
@@ -1233,6 +1239,7 @@
 static void
 glade_eprop_color_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
+	GladeProjectFormat fmt;
 	GladeEPropColor *eprop_color = GLADE_EPROP_COLOR (eprop);
 	GdkColor        *color;
 	gchar           *text;
@@ -1242,9 +1249,11 @@
 	
 	if (property)
 	{
+		fmt = glade_project_get_format (property->widget->project);
+
 		if ((text = glade_widget_adaptor_string_from_value
 		     (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
-		      eprop->klass, property->value)) != NULL)
+		      eprop->klass, property->value, fmt)) != NULL)
 		{
 			gtk_entry_set_text (GTK_ENTRY (eprop_color->entry), text);
 			g_free (text);
@@ -1549,6 +1558,7 @@
 static void
 glade_eprop_text_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
+	GladeProjectFormat fmt;
 	GladeEPropText *eprop_text = GLADE_EPROP_TEXT (eprop);
 
 	/* Chain up first */
@@ -1556,6 +1566,8 @@
 	
 	if (property == NULL) return;
 
+	fmt = glade_project_get_format (property->widget->project);
+
 	if (GTK_IS_ENTRY (eprop_text->text_entry))
 	{
 		GtkEntry *entry = GTK_ENTRY (eprop_text->text_entry);
@@ -1575,7 +1587,7 @@
 		{
 			gchar *text = glade_widget_adaptor_string_from_value
 				(GLADE_WIDGET_ADAPTOR (property->klass->handle),
-				 property->klass, property->value);
+				 property->klass, property->value, fmt);
 			gtk_text_buffer_set_text (buffer, text ? text : "", -1);
 			g_free (text);
 		}
@@ -2213,6 +2225,7 @@
 static void
 glade_eprop_resource_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
+	GladeProjectFormat fmt;
 	GladeEPropResource *eprop_resource = GLADE_EPROP_RESOURCE (eprop);
 	gchar *file;
 
@@ -2221,9 +2234,11 @@
 
 	if (property == NULL) return;
 
+	fmt = glade_project_get_format (property->widget->project);
+
 	file = glade_widget_adaptor_string_from_value
 		(GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
-		 eprop->klass, property->value);
+		 eprop->klass, property->value, fmt);
 	if (file)
 	{
 		gtk_entry_set_text (GTK_ENTRY (eprop_resource->entry), file);
@@ -2761,6 +2776,7 @@
 static void
 glade_eprop_object_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
+	GladeProjectFormat fmt;
 	GladeEPropObject *eprop_object = GLADE_EPROP_OBJECT (eprop);
 	gchar *obj_name;
 
@@ -2769,9 +2785,11 @@
 
 	if (property == NULL) return;
 
+	fmt = glade_project_get_format (property->widget->project);
+
 	if ((obj_name = glade_widget_adaptor_string_from_value
 	     (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
-	      eprop->klass, property->value)) != NULL)
+	      eprop->klass, property->value, fmt)) != NULL)
 	{
 		gtk_entry_set_text (GTK_ENTRY (eprop_object->entry), obj_name);
 		g_free (obj_name);
@@ -2832,6 +2850,7 @@
 static void
 glade_eprop_objects_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
+	GladeProjectFormat fmt;
 	GladeEPropObjects *eprop_objects = GLADE_EPROP_OBJECTS (eprop);
 	gchar *obj_name;
 
@@ -2840,9 +2859,11 @@
 
 	if (property == NULL) return;
 
+	fmt = glade_project_get_format (property->widget->project);
+
 	if ((obj_name = glade_widget_adaptor_string_from_value
 	     (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
-	      eprop->klass, property->value)) != NULL)
+	      eprop->klass, property->value, fmt)) != NULL)
 	{
 		gtk_entry_set_text (GTK_ENTRY (eprop_objects->entry), obj_name);
 		g_free (obj_name);
@@ -2992,6 +3013,11 @@
 typedef struct {
 	GladeEditorProperty parent_instance;
 
+	GtkWidget *notebook;
+
+	GtkWidget *libglade;
+	GtkWidget *entry;
+
 	GtkWidget *value, *lower, *upper, *step_increment, *page_increment, *page_size;
 	GtkAdjustment *value_adj;
 	struct
@@ -3062,6 +3088,7 @@
 glade_eprop_adjustment_load (GladeEditorProperty *eprop, GladeProperty *property)
 {
 	GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
+	GladeProjectFormat fmt;
 	GObject *object;
 	GtkAdjustment *adj;
 	
@@ -3070,46 +3097,76 @@
 
 	if (property == NULL) return;
 	
-	object = g_value_get_object (property->value);
-	if (object == NULL) return;
+	fmt = glade_project_get_format (property->widget->project);
 
-	adj = GTK_ADJUSTMENT (object);
-	
-	/* Keep track of external adjustment changes */
-	g_signal_connect (object, "value-changed",
-			  G_CALLBACK (glade_eprop_adj_value_changed),
-			  eprop);
+	if (fmt == GLADE_PROJECT_FORMAT_LIBGLADE)
+	{
+		object = g_value_get_object (property->value);
+		if (object == NULL) return;
+		
+		adj = GTK_ADJUSTMENT (object);
+		
+		/* Keep track of external adjustment changes */
+		g_signal_connect (object, "value-changed",
+				  G_CALLBACK (glade_eprop_adj_value_changed),
+				  eprop);
 	
-	/* Update adjustment's values */
-	eprop_adj->value_adj->lower = adj->lower;
-	eprop_adj->value_adj->upper = adj->upper;
-	eprop_adj->value_adj->step_increment = adj->step_increment;
-	eprop_adj->value_adj->page_increment = adj->page_increment;
-	eprop_adj->value_adj->page_size = adj->page_size;
-	
-	/* Block Handlers */
-	g_signal_handler_block (eprop_adj->value, eprop_adj->ids.value);
-	g_signal_handler_block (eprop_adj->lower, eprop_adj->ids.lower);
-	g_signal_handler_block (eprop_adj->upper, eprop_adj->ids.upper);
-	g_signal_handler_block (eprop_adj->step_increment, eprop_adj->ids.step_increment);
-	g_signal_handler_block (eprop_adj->page_increment, eprop_adj->ids.page_increment);
-	g_signal_handler_block (eprop_adj->page_size, eprop_adj->ids.page_size);
-	
-	/* Update spinbuttons values */
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->value), adj->value);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->lower), adj->lower);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->upper), adj->upper);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->step_increment), adj->step_increment);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_increment), adj->page_increment);
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_size), adj->page_size);
-	
-	/* Unblock Handlers */
-	g_signal_handler_unblock (eprop_adj->value, eprop_adj->ids.value);
-	g_signal_handler_unblock (eprop_adj->lower, eprop_adj->ids.lower);
-	g_signal_handler_unblock (eprop_adj->upper, eprop_adj->ids.upper);
-	g_signal_handler_unblock (eprop_adj->step_increment, eprop_adj->ids.step_increment);
-	g_signal_handler_unblock (eprop_adj->page_increment, eprop_adj->ids.page_increment);
-	g_signal_handler_unblock (eprop_adj->page_size, eprop_adj->ids.page_size);
+		/* Update adjustment's values */
+		eprop_adj->value_adj->lower = adj->lower;
+		eprop_adj->value_adj->upper = adj->upper;
+		eprop_adj->value_adj->step_increment = adj->step_increment;
+		eprop_adj->value_adj->page_increment = adj->page_increment;
+		eprop_adj->value_adj->page_size = adj->page_size;
+		
+		/* Block Handlers */
+		g_signal_handler_block (eprop_adj->value, eprop_adj->ids.value);
+		g_signal_handler_block (eprop_adj->lower, eprop_adj->ids.lower);
+		g_signal_handler_block (eprop_adj->upper, eprop_adj->ids.upper);
+		g_signal_handler_block (eprop_adj->step_increment, eprop_adj->ids.step_increment);
+		g_signal_handler_block (eprop_adj->page_increment, eprop_adj->ids.page_increment);
+		g_signal_handler_block (eprop_adj->page_size, eprop_adj->ids.page_size);
+		
+		/* Update spinbuttons values */
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->value), adj->value);
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->lower), adj->lower);
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->upper), adj->upper);
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->step_increment), adj->step_increment);
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_increment), adj->page_increment);
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_size), adj->page_size);
+		
+		/* Unblock Handlers */
+		g_signal_handler_unblock (eprop_adj->value, eprop_adj->ids.value);
+		g_signal_handler_unblock (eprop_adj->lower, eprop_adj->ids.lower);
+		g_signal_handler_unblock (eprop_adj->upper, eprop_adj->ids.upper);
+		g_signal_handler_unblock (eprop_adj->step_increment, eprop_adj->ids.step_increment);
+		g_signal_handler_unblock (eprop_adj->page_increment, eprop_adj->ids.page_increment);
+		g_signal_handler_unblock (eprop_adj->page_size, eprop_adj->ids.page_size);
+
+		gtk_notebook_set_page (GTK_NOTEBOOK (eprop_adj->notebook), 0);
+
+		gtk_widget_show (eprop_adj->libglade);
+	}
+	else
+	{
+		gchar *obj_name;
+
+		fmt = glade_project_get_format (property->widget->project);
+
+		if ((obj_name = glade_widget_adaptor_string_from_value
+		     (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
+		      eprop->klass, property->value, fmt)) != NULL)
+		{
+			gtk_entry_set_text (GTK_ENTRY (eprop_adj->entry), obj_name);
+			g_free (obj_name);
+		}
+		else
+			gtk_entry_set_text (GTK_ENTRY (eprop_adj->entry), "");
+
+		gtk_notebook_set_page (GTK_NOTEBOOK (eprop_adj->notebook), 1);
+		gtk_widget_hide (eprop_adj->libglade);
+	}
+
+	gtk_widget_queue_resize (eprop_adj->notebook);
 }
 
 static GtkAdjustment *
@@ -3184,7 +3241,7 @@
 }
 
 static GtkWidget *
-glade_eprop_adjustment_create_input (GladeEditorProperty *eprop)
+glade_eprop_adjustment_create_input_libglade (GladeEditorProperty *eprop)
 {
 	GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
 	GtkWidget *widget;
@@ -3250,6 +3307,50 @@
 	return widget;
 }
 
+static GtkWidget *
+glade_eprop_adjustment_create_input_builder (GladeEditorProperty *eprop)
+{
+	GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
+	GtkWidget        *hbox;
+	GtkWidget        *button;
+
+	hbox             = gtk_hbox_new (FALSE, 0);
+	eprop_adj->entry = gtk_entry_new ();
+	gtk_entry_set_editable (GTK_ENTRY (eprop_adj->entry), FALSE);
+	gtk_widget_show (eprop_adj->entry);
+	gtk_box_pack_start (GTK_BOX (hbox), eprop_adj->entry, TRUE, TRUE, 0);
+
+	button = gtk_button_new_with_label ("...");
+	gtk_widget_show (button);
+	gtk_box_pack_start (GTK_BOX (hbox), button,  FALSE, FALSE, 0);
+
+	g_signal_connect (G_OBJECT (button), "clicked",
+			  G_CALLBACK (glade_eprop_object_show_dialog),
+			  eprop);
+	return hbox;
+}
+
+static GtkWidget *
+glade_eprop_adjustment_create_input (GladeEditorProperty *eprop)
+{
+	GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
+	GtkWidget *builder;
+
+	eprop_adj->libglade = glade_eprop_adjustment_create_input_libglade (eprop);
+	builder = glade_eprop_adjustment_create_input_builder (eprop);
+
+	gtk_widget_show (eprop_adj->libglade);
+	gtk_widget_show (builder);
+	
+	eprop_adj->notebook = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (eprop_adj->notebook), FALSE);
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (eprop_adj->notebook), FALSE);
+
+	gtk_notebook_append_page (GTK_NOTEBOOK (eprop_adj->notebook), eprop_adj->libglade, NULL);
+	gtk_notebook_append_page (GTK_NOTEBOOK (eprop_adj->notebook), builder, NULL);
+	return eprop_adj->notebook;
+}
+
 
 /*******************************************************************************
                                      API

Modified: trunk/gladeui/glade-editor.c
==============================================================================
--- trunk/gladeui/glade-editor.c	(original)
+++ trunk/gladeui/glade-editor.c	Fri Sep 19 22:31:18 2008
@@ -1016,6 +1016,8 @@
 		g_signal_connect (G_OBJECT (widget), "notify::name",
 				  G_CALLBACK (glade_editor_update_widget_name_cb),
 				  editor);
+
+	gtk_container_check_resize (GTK_CONTAINER (editor));
 }
 
 /**

Modified: trunk/gladeui/glade-palette.c
==============================================================================
--- trunk/gladeui/glade-palette.c	(original)
+++ trunk/gladeui/glade-palette.c	Fri Sep 19 22:31:18 2008
@@ -397,9 +397,9 @@
 {
 	GladeWidget *widget;
 	
-	widget = glade_command_create (adaptor, NULL, NULL, glade_app_get_project ());
-	
-	glade_palette_deselect_current_item (palette, FALSE);
+	/* Dont deselect palette if create is canceled by user in query dialog */
+	if ((widget = glade_command_create (adaptor, NULL, NULL, glade_app_get_project ())) != NULL)
+		glade_palette_deselect_current_item (palette, FALSE);
 	
 	return widget;
 }

Modified: trunk/gladeui/glade-project.c
==============================================================================
--- trunk/gladeui/glade-project.c	(original)
+++ trunk/gladeui/glade-project.c	Fri Sep 19 22:31:18 2008
@@ -45,6 +45,7 @@
 #include "glade-catalog.h"
 
 #include "glade-project.h"
+#include "glade-command.h"
 
 #define GLADE_PROJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GLADE_TYPE_PROJECT, GladeProjectPrivate))
 
@@ -59,6 +60,7 @@
 	RESOURCE_REMOVED,
 	CHANGED,
 	PARSE_FINISHED,
+	CONVERT_FINISHED,
 	LAST_SIGNAL
 };
 
@@ -341,6 +343,8 @@
 		    (next_cmd->group_id == 0 || next_cmd->group_id != cmd->group_id))
 			break;
 	}
+
+	glade_editor_refresh (glade_app_get_editor ());
 }
 
 static void
@@ -362,6 +366,8 @@
 		    (next_cmd->group_id == 0 || next_cmd->group_id != cmd->group_id))
 			break;
 	}
+
+	glade_editor_refresh (glade_app_get_editor ());
 }
 
 static GladeCommand *
@@ -659,7 +665,14 @@
 	return ret;
 }
 
-static void
+
+/**
+ * glade_project_verify_project_for_ui:
+ * @project: A #GladeProject
+ * 
+ * Checks the project and updates warning strings in the UI
+ */
+void
 glade_project_verify_project_for_ui (GladeProject *project)
 {
 	GList *list;
@@ -951,6 +964,27 @@
 			      G_TYPE_NONE,
 			      0);
 
+	/**
+	 * GladeProject::convert-finished:
+	 * @gladeproject: the #GladeProject which received the signal.
+	 *
+	 * Emitted when @gladeproject format conversion has finished.
+	 *
+	 * NOTE: Some properties are internally handled differently
+	 * when the project is in a said format, this signal is fired after
+	 * the new format is in effect to allow the backend access to both
+	 * before and after.
+	 */
+	glade_project_signals[CONVERT_FINISHED] =
+		g_signal_new ("convert-finished",
+			      G_TYPE_FROM_CLASS (object_class),
+			      G_SIGNAL_RUN_FIRST,
+			      G_STRUCT_OFFSET (GladeProjectClass, parse_finished),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE,
+			      0);
+
 	g_object_class_install_property (object_class,
 					 PROP_MODIFIED,
 					 g_param_spec_boolean ("modified",
@@ -1049,7 +1083,8 @@
 		{
 			property = GLADE_PROPERTY (ll->data);
 
-			if (glade_property_class_is_object (property->klass) &&
+			if (glade_property_class_is_object (property->klass, 
+							    project->priv->format) &&
 			    (txt = g_object_get_data (G_OBJECT (property), 
 						      "glade-loaded-object")) != NULL)
 			{
@@ -1245,7 +1280,7 @@
 
 			if ((filename = glade_widget_adaptor_string_from_value
 			     (GLADE_WIDGET_ADAPTOR (property->klass->handle),
-			      property->klass, property->value)) != NULL)
+			      property->klass, property->value, project->priv->format)) != NULL)
 			{
 				icon_name = glade_util_filename_to_icon_name (filename);
 
@@ -1784,7 +1819,7 @@
 			
 			if ((resource = glade_widget_adaptor_string_from_value
 			     (GLADE_WIDGET_ADAPTOR (property->klass->handle),
-			      property->klass, &value)) != NULL)
+			      property->klass, &value, project->priv->format)) != NULL)
 			{
 				full_resource = glade_project_resource_fullpath
 					(prev_project ? prev_project : project, resource);
@@ -2349,7 +2384,14 @@
 	return project->priv->selection;
 }
 
-static GList *
+/**
+ * glade_project_required_libs:
+ * @project: a #GladeProject
+ *
+ * Returns: a #GList of allocated strings which are the names
+ * of the required catalogs for this project
+ */
+GList *
 glade_project_required_libs (GladeProject *project)
 {
 	GList       *required = NULL, *l, *ll;
@@ -3177,9 +3219,8 @@
 {
 	g_return_if_fail (GLADE_IS_PROJECT (project));
 
-	project->priv->format = format; 
-
-	glade_project_verify_project_for_ui (project);
+	if (project->priv->format != format)
+		project->priv->format = format; 
 }
 
 GladeProjectFormat
@@ -3191,19 +3232,18 @@
 }
 
 
-
 static void
 format_libglade_button_clicked (GtkWidget *widget,
 				GladeProject *project)
 {
-	glade_project_set_format (project, GLADE_PROJECT_FORMAT_LIBGLADE);
+	glade_command_set_project_format (project, GLADE_PROJECT_FORMAT_LIBGLADE);
 }
 
 static void
 format_builder_button_clicked (GtkWidget *widget,
 			       GladeProject *project)
 {
-	glade_project_set_format (project, GLADE_PROJECT_FORMAT_GTKBUILDER);
+	glade_command_set_project_format (project, GLADE_PROJECT_FORMAT_GTKBUILDER);
 }
 
 static void
@@ -3414,7 +3454,7 @@
 void
 glade_project_preferences (GladeProject *project)
 {
-	static GtkWidget *dialog = NULL;
+	GtkWidget *dialog = NULL;
 	GtkWidget *widget;
 	gchar     *title, *name;
 
@@ -3424,12 +3464,6 @@
 	name = glade_project_get_name (project);
 	title = g_strdup_printf ("%s preferences", name);
 
-	/* Could be the user switched projects, just
-	 * destroy and reopen.
-	 */
-	if (dialog)
-		gtk_widget_destroy (dialog);
-
 	dialog = gtk_dialog_new_with_buttons (title,
 					      GTK_WINDOW (glade_app_get_window ()),
 					      GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -3452,4 +3486,7 @@
 			  G_CALLBACK (gtk_widget_hide_on_delete), NULL);
 
 	gtk_window_present (GTK_WINDOW (dialog));
+
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
 }

Modified: trunk/gladeui/glade-project.h
==============================================================================
--- trunk/gladeui/glade-project.h	(original)
+++ trunk/gladeui/glade-project.h	Fri Sep 19 22:31:18 2008
@@ -5,6 +5,8 @@
 #include <gladeui/glade-widget.h>
 #include <gladeui/glade-command.h>
 #include <gladeui/glade-utils.h>
+#include <gladeui/glade-xml-utils.h>
+
 
 G_BEGIN_DECLS
 
@@ -18,13 +20,6 @@
 typedef struct _GladeProjectPrivate  GladeProjectPrivate;
 typedef struct _GladeProjectClass    GladeProjectClass;
 
-
-typedef enum
-{
-	GLADE_PROJECT_FORMAT_LIBGLADE,
-	GLADE_PROJECT_FORMAT_GTKBUILDER
-} GladeProjectFormat;
-
 typedef enum
 {
 	GLADE_SUPPORT_OK                   = 0x00,
@@ -186,9 +181,14 @@
 						    GladeWidgetAdaptor *adaptor,
 						    GladeSupportMask   *mask);
 
+void          glade_project_verify_project_for_ui (GladeProject  *project);
+
 gboolean      glade_project_is_loaded_factory_file (GladeProject       *project, 
 						    const gchar        *stock_id);
 
+GList        *glade_project_required_libs          (GladeProject  *project);
+
+
 G_END_DECLS
 
 #endif /* __GLADE_PROJECT_H__ */

Modified: trunk/gladeui/glade-property-class.c
==============================================================================
--- trunk/gladeui/glade-property-class.c	(original)
+++ trunk/gladeui/glade-property-class.c	Fri Sep 19 22:31:18 2008
@@ -306,19 +306,22 @@
 
 static gchar *
 glade_property_class_make_string_from_object (GladePropertyClass *property_class,
-					      GObject            *object)
+					      GObject            *object,
+					      GladeProjectFormat  fmt)
 {
 	GladeWidget *gwidget;
 	gchar       *string = NULL, *filename;
 
 	if (!object) return NULL;
 
+	/* XXX Are pixbufs handled the same in both formats ?? */
 	if (property_class->pspec->value_type == GDK_TYPE_PIXBUF)
 	{
 		if ((filename = g_object_get_data (object, "GladeFileName")) != NULL)
 			string = g_path_get_basename (filename);
 	}
-	else if (property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
+	else if (fmt == GLADE_PROJECT_FORMAT_LIBGLADE &&
+		 property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
 	{
 		GtkAdjustment *adj = GTK_ADJUSTMENT (object);
 		GString       *str = g_string_sized_new (G_ASCII_DTOSTR_BUF_SIZE * 6 + 6);
@@ -360,7 +363,8 @@
 
 static gchar *
 glade_property_class_make_string_from_objects (GladePropertyClass *property_class,
-					       GList              *objects)
+					       GList              *objects,
+					       GladeProjectFormat  fmt)
 {
 	GObject *object;
 	GList   *list;
@@ -371,7 +375,7 @@
 		object = list->data;
 
 		obj_str = glade_property_class_make_string_from_object 
-			(property_class, object);
+			(property_class, object, fmt);
 
 		if (string == NULL)
 			string = obj_str;
@@ -389,12 +393,14 @@
  * glade_property_class_make_string_from_gvalue:
  * @property_class: A #GladePropertyClass
  * @value: A #GValue
+ * @fmt: The #GladeProjectFormat the string should conform to
  *
  * Returns: A newly allocated string representation of @value
  */
 gchar *
 glade_property_class_make_string_from_gvalue (GladePropertyClass *property_class,
-					      const GValue *value)
+					      const GValue       *value,
+					      GladeProjectFormat  fmt)
 {
 	gchar    *string = NULL, **strv, str[G_ASCII_DTOSTR_BUF_SIZE];
 	GObject  *object;
@@ -497,13 +503,13 @@
 	{
 		object = g_value_get_object (value);
 		string = glade_property_class_make_string_from_object
-			(property_class, object);
+			(property_class, object, fmt);
 	}
 	else if (GLADE_IS_PARAM_SPEC_OBJECTS (property_class->pspec))
 	{
 		objects = g_value_get_boxed (value);
 		string = glade_property_class_make_string_from_objects
-			(property_class, objects);
+			(property_class, objects, fmt);
 	}
 	else
 		g_critical ("Unsupported pspec type %s (value -> string)",
@@ -659,7 +665,8 @@
  
 		g_free (fullpath);
 	}
-	if (property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
+	if (glade_project_get_format (project) == GLADE_PROJECT_FORMAT_LIBGLADE &&
+	    property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
 	{
 		gdouble value, lower, upper, step_increment, page_increment, page_size;
                 gchar *pstring = (gchar*) string;
@@ -1108,20 +1115,23 @@
 /**
  * glade_property_class_is_object:
  * @property_class: A #GladePropertyClass
+ * @fmt: the #GladeProjectFormat
  *
  *
  * Returns: whether or not this is an object property 
  * that refers to another object in this project.
  */
 gboolean
-glade_property_class_is_object (GladePropertyClass  *klass)
+glade_property_class_is_object (GladePropertyClass  *klass,
+				GladeProjectFormat   fmt)
 {
 	g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (klass), FALSE);
 
  	return (GLADE_IS_PARAM_SPEC_OBJECTS (klass->pspec) ||
 		(G_IS_PARAM_SPEC_OBJECT(klass->pspec) &&
 		 klass->pspec->value_type != GDK_TYPE_PIXBUF &&
-		 klass->pspec->value_type != GTK_TYPE_ADJUSTMENT));
+		 !(fmt == GLADE_PROJECT_FORMAT_LIBGLADE &&
+		   klass->pspec->value_type == GTK_TYPE_ADJUSTMENT)));
 }
 
 
@@ -1593,6 +1603,7 @@
  * @klass: a #GladePropertyClass
  * @value1: a GValue of correct type for @klass
  * @value2: a GValue of correct type for @klass
+ * @fmt: the #GladeProjectFormat to use
  *
  * Compares value1 with value2 according to @klass.
  *
@@ -1602,7 +1613,8 @@
 gint
 glade_property_class_compare (GladePropertyClass *klass,
 			      const GValue       *value1,
-			      const GValue       *value2)
+			      const GValue       *value2,
+			      GladeProjectFormat  fmt)
 {
 	gint retval;
 	
@@ -1613,8 +1625,8 @@
 	{
 		gchar *val1, *val2;
 		
-		val1 = glade_widget_adaptor_string_from_value (klass->handle, klass, value1);
-		val2 = glade_widget_adaptor_string_from_value (klass->handle, klass, value2);
+		val1 = glade_widget_adaptor_string_from_value (klass->handle, klass, value1, fmt);
+		val2 = glade_widget_adaptor_string_from_value (klass->handle, klass, value2, fmt);
 
 		if (val1 && val2)
 			retval = strcmp (val1, val2);

Modified: trunk/gladeui/glade-property-class.h
==============================================================================
--- trunk/gladeui/glade-property-class.h	(original)
+++ trunk/gladeui/glade-property-class.h	Fri Sep 19 22:31:18 2008
@@ -6,6 +6,8 @@
 #include <glib-object.h>
 #include <gtk/gtkadjustment.h>
 
+#include <gladeui/glade-xml-utils.h>
+
 G_BEGIN_DECLS
 
 /* The GladePropertyClass structure parameters of a GladeProperty.
@@ -177,14 +179,16 @@
 
 gboolean            glade_property_class_is_visible              (GladePropertyClass  *property_class);
 
-gboolean            glade_property_class_is_object               (GladePropertyClass  *property_class);
+gboolean            glade_property_class_is_object               (GladePropertyClass  *property_class,
+								  GladeProjectFormat   fmt);
 
 GValue             *glade_property_class_make_gvalue_from_string (GladePropertyClass  *property_class,
 								  const gchar         *string,
 								  GladeProject        *project);
 
 gchar              *glade_property_class_make_string_from_gvalue (GladePropertyClass  *property_class,
-								  const GValue        *value);
+								  const GValue        *value,
+								  GladeProjectFormat   fmt);
 
 GValue             *glade_property_class_make_gvalue_from_vl     (GladePropertyClass  *property_class,
 								  va_list              vl);
@@ -219,7 +223,8 @@
 
 gint                glade_property_class_compare                 (GladePropertyClass *klass,
 								  const GValue       *value1,
-								  const GValue       *value2);
+								  const GValue       *value2,
+								  GladeProjectFormat  fmt);
 
 G_END_DECLS
 

Modified: trunk/gladeui/glade-property.c
==============================================================================
--- trunk/gladeui/glade-property.c	(original)
+++ trunk/gladeui/glade-property.c	Fri Sep 19 22:31:18 2008
@@ -120,8 +120,16 @@
 glade_property_equals_value_impl (GladeProperty *property,
 				  const GValue  *value)
 {
-	return !glade_property_class_compare (property->klass,
-					      property->value, value);
+	GladeProject *project;
+	GladeProjectFormat fmt = GLADE_PROJECT_FORMAT_GTKBUILDER;
+	
+	if (property->widget)
+	{
+		project = glade_widget_get_project (property->widget);
+		fmt     = glade_project_get_format (project);
+	}
+
+	return !glade_property_class_compare (property->klass, property->value, value, fmt);
 }
 
 
@@ -252,7 +260,7 @@
 	{
 		gchar *str = glade_widget_adaptor_string_from_value
 			     (GLADE_WIDGET_ADAPTOR (property->klass->handle),
-			      property->klass, value);
+			      property->klass, value, fmt);
 		g_print ("Setting property %s on %s to %s\n",
 			 property->klass->id,
 			 property->widget ? property->widget->name : "unknown", str);
@@ -285,7 +293,8 @@
 	/* Add/Remove references from widget ref stacks here
 	 * (before assigning the value)
 	 */
-	if (property->widget && changed && glade_property_class_is_object (property->klass))
+	if (property->widget && changed && glade_property_class_is_object 
+	    (property->klass, glade_project_get_format (project)))
 		glade_property_update_prop_refs (property, property->value, value);
 
 
@@ -1045,7 +1054,7 @@
 
 		if (!strcmp (id, search_name))
 		{
-			if (property && glade_property_class_is_object (property->klass))
+			if (property && glade_property_class_is_object (property->klass, fmt))
 			{
 				/* we must synchronize this directly after loading this project
 				 * (i.e. lookup the actual objects after they've been parsed and
@@ -1165,7 +1174,7 @@
 	/* convert the value of this property to a string */
 	if (!(value = glade_widget_adaptor_string_from_value
 	     (GLADE_WIDGET_ADAPTOR (property->klass->handle),
-	      property->klass, property->value)))
+	      property->klass, property->value, fmt)))
 		/* make sure we keep the empty string, also... upcomming
 		 * funcs that may not like NULL.
 		 */

Modified: trunk/gladeui/glade-widget-adaptor.c
==============================================================================
--- trunk/gladeui/glade-widget-adaptor.c	(original)
+++ trunk/gladeui/glade-widget-adaptor.c	Fri Sep 19 22:31:18 2008
@@ -1131,9 +1131,10 @@
 static gchar *
 glade_widget_adaptor_object_string_from_value (GladeWidgetAdaptor *adaptor,
 					       GladePropertyClass *klass,
-					       const GValue       *value)
+					       const GValue       *value,
+					       GladeProjectFormat  fmt)
 {
-	return glade_property_class_make_string_from_gvalue (klass, value);
+	return glade_property_class_make_string_from_gvalue (klass, value, fmt);
 }
 
 /*******************************************************************************
@@ -3379,6 +3380,7 @@
  * @adaptor: A #GladeWidgetAdaptor
  * @klass: The #GladePropertyClass 
  * @value: The #GValue to convert to a string
+ * @fmt: The #GladeProjectFormat the string should conform to
  * 
  * For normal properties this is used to serialize
  * property values, for custom properties its still
@@ -3389,14 +3391,15 @@
 gchar *
 glade_widget_adaptor_string_from_value (GladeWidgetAdaptor *adaptor,
 					GladePropertyClass *klass,
-					const GValue       *value)
+					const GValue       *value,
+					GladeProjectFormat  fmt)
 {
 	g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
 	g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (klass), NULL);
 	g_return_val_if_fail (value != NULL, NULL);
 
 	return GLADE_WIDGET_ADAPTOR_GET_CLASS
-		(adaptor)->string_from_value (adaptor, klass, value);
+		(adaptor)->string_from_value (adaptor, klass, value, fmt);
 }
 
 

Modified: trunk/gladeui/glade-widget-adaptor.h
==============================================================================
--- trunk/gladeui/glade-widget-adaptor.h	(original)
+++ trunk/gladeui/glade-widget-adaptor.h	Fri Sep 19 22:31:18 2008
@@ -418,6 +418,7 @@
  * @adaptor: A #GladeWidgetAdaptor
  * @klass: The #GladePropertyClass 
  * @value: The #GValue to convert to a string
+ * @fmt: The #GladeProjectFormat the string should conform to
  * 
  * For normal properties this is used to serialize
  * property values, for custom properties its still
@@ -427,7 +428,8 @@
  */
 typedef gchar   *(* GladeStringFromValueFunc) (GladeWidgetAdaptor *adaptor,
 					       GladePropertyClass *klass,
-					       const GValue       *value);
+					       const GValue       *value,
+					       GladeProjectFormat  fmt);
 
 
 /* GladeSignalClass contains all the info we need for a given signal, such as
@@ -782,7 +784,8 @@
 
 gchar               *glade_widget_adaptor_string_from_value  (GladeWidgetAdaptor *adaptor,
 							      GladePropertyClass *klass,
-							      const GValue       *value);
+							      const GValue       *value,
+							      GladeProjectFormat  fmt);
 
 GladeSignalClass    *glade_widget_adaptor_get_signal_class   (GladeWidgetAdaptor *adaptor,
 							      const gchar        *name);

Modified: trunk/gladeui/glade-widget.c
==============================================================================
--- trunk/gladeui/glade-widget.c	(original)
+++ trunk/gladeui/glade-widget.c	Fri Sep 19 22:31:18 2008
@@ -2910,7 +2910,8 @@
 	if ((property = glade_widget_get_property (widget, id_property)) != NULL)
 		ret_string = glade_widget_adaptor_string_from_value
 			(GLADE_WIDGET_ADAPTOR (property->klass->handle),
-			 property->klass, value ? value : property->value);
+			 property->klass, value ? value : property->value,
+			 glade_project_get_format (widget->project));
 
 	return ret_string;
 }
@@ -2940,7 +2941,8 @@
 	if ((property = glade_widget_get_pack_property (widget, id_property)) != NULL)
 		ret_string = glade_widget_adaptor_string_from_value
 			(GLADE_WIDGET_ADAPTOR (property->klass->handle),
-			 property->klass, value ? value : property->value);
+			 property->klass, value ? value : property->value,
+			 glade_project_get_format (widget->project));
 
 	return ret_string;
 }

Modified: trunk/gladeui/glade-xml-utils.h
==============================================================================
--- trunk/gladeui/glade-xml-utils.h	(original)
+++ trunk/gladeui/glade-xml-utils.h	Fri Sep 19 22:31:18 2008
@@ -19,6 +19,22 @@
 typedef struct _GladeXmlNode    GladeXmlNode;
 typedef struct _GladeXmlDoc     GladeXmlDoc;
 
+/* FIXME: forward declarations to get around circular header dependencies.
+ */
+typedef struct _GladeWidget    GladeWidget;
+typedef struct _GladeProperty  GladeProperty;
+typedef struct _GladeProject   GladeProject;
+
+
+/* We define this here only because our headers need
+ * a good sorting
+ */
+typedef enum
+{
+	GLADE_PROJECT_FORMAT_LIBGLADE,
+	GLADE_PROJECT_FORMAT_GTKBUILDER
+} GladeProjectFormat;
+
 
 #define GLADE_XML_TAG_PROJECT(type) \
 	((type == GLADE_PROJECT_FORMAT_LIBGLADE) ? \
@@ -87,6 +103,7 @@
 #define GLADE_TAG_PARENTLESS_WIDGET               "parentless-widget"
 #define GLADE_TAG_DISABLED                        "disabled"
 #define GLADE_TAG_DEFAULT_PALETTE_STATE           "default-palette-state"
+#define GLADE_TAG_PROJECT_CONVERT_FUNCTION        "project-convert-function"
 #define GLADE_TAG_REPLACE_CHILD_FUNCTION          "replace-child-function"
 #define GLADE_TAG_DEEP_POST_CREATE_FUNCTION       "deep-post-create-function"
 #define GLADE_TAG_POST_CREATE_FUNCTION            "post-create-function"

Modified: trunk/gladeui/glade.h
==============================================================================
--- trunk/gladeui/glade.h	(original)
+++ trunk/gladeui/glade.h	Fri Sep 19 22:31:18 2008
@@ -22,12 +22,7 @@
 #ifndef __GLADE_H__
 #define __GLADE_H__
 
-/* FIXME: forward declarations to get around circular header dependencies.
- */
-typedef struct _GladeWidget    GladeWidget;
-typedef struct _GladeProperty  GladeProperty;
-typedef struct _GladeProject   GladeProject;
-
+#include <gladeui/glade-xml-utils.h>
 #include <gladeui/glade-widget-adaptor.h>
 #include <gladeui/glade-widget.h>
 #include <gladeui/glade-property-class.h>

Modified: trunk/plugins/gnome/glade-gnome.c
==============================================================================
--- trunk/plugins/gnome/glade-gnome.c	(original)
+++ trunk/plugins/gnome/glade-gnome.c	Fri Sep 19 22:31:18 2008
@@ -1352,8 +1352,11 @@
 	if (width && height)
 	{
 		GladeProperty *property = glade_widget_get_property (gp, "filename");
-		gchar *file = glade_property_class_make_string_from_gvalue
-					     (property->klass, property->value);
+		gchar *file = 
+			glade_property_class_make_string_from_gvalue
+			(property->klass, property->value,
+			 glade_project_get_format (gp->project));
+
 		if (file)
 		{
 			gnome_pixmap_load_file_at_size (GNOME_PIXMAP (object),

Modified: trunk/plugins/gtk+/Makefile.am
==============================================================================
--- trunk/plugins/gtk+/Makefile.am	(original)
+++ trunk/plugins/gtk+/Makefile.am	Fri Sep 19 22:31:18 2008
@@ -23,7 +23,7 @@
 	$(PLUGINS_WARN_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-accels.c glade-attributes.c glade-convert.c fixed-bg.xpm
 libgladegtk_la_LDFLAGS     = -module -avoid-version $(AM_LDFLAGS)
 libgladegtk_la_LIBADD      = $(libgladeui) $(GTK_LIBS)
 

Added: trunk/plugins/gtk+/glade-convert.c
==============================================================================
--- (empty file)
+++ trunk/plugins/gtk+/glade-convert.c	Fri Sep 19 22:31:18 2008
@@ -0,0 +1,210 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * glade-convert.c - Project format conversion routines
+ *
+ * Copyright (C) 2008 Tristan Van Berkom
+ *
+ * Author(s):
+ *      Tristan Van Berkom <tvb gnome org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
+
+#include "glade-gtk.h"
+#include <gladeui/glade.h>
+
+
+typedef struct {
+	GObject *adjustment;
+	GladeProperty *property;
+} AdjustmentData;
+
+typedef struct {
+	/* List of newly created objects to set */
+	GList *adjustments;
+
+} ConvertData;
+
+/*****************************************
+ *           Adjustments                 *
+ *****************************************/
+static void
+convert_adjustments_finished (GladeProject  *project,
+			      ConvertData   *data)
+{
+	GladeProjectFormat  new_format = glade_project_get_format (project);
+	GladeWidgetAdaptor *adaptor = glade_widget_adaptor_get_by_type (GTK_TYPE_ADJUSTMENT);
+	GladeWidget        *widget;
+	AdjustmentData     *adata; 
+	GList              *list;
+
+	for (list = data->adjustments; list; list = list->next)
+	{
+		adata = list->data;
+
+		if (new_format == GLADE_PROJECT_FORMAT_GTKBUILDER)
+		{
+			gdouble value, lower, upper, step_inc, page_inc, page_size;
+
+			g_object_get (adata->adjustment, 
+				      "value", &value,
+				      "lower", &lower,
+				      "upper", &upper,
+				      "step-increment", &step_inc,
+				      "page-increment", &page_inc,
+				      "page-size", &page_size,
+				      NULL);
+
+			/* Cant cancel an adjustment.... */
+			widget = glade_command_create (adaptor, NULL, NULL, glade_app_get_project ());
+
+			/* Initial properties on the new adjustment dont need command history */
+			glade_widget_property_set (widget, "value", value);
+			glade_widget_property_set (widget, "lower", lower);
+			glade_widget_property_set (widget, "upper", upper);
+			glade_widget_property_set (widget, "step-increment", step_inc);
+			glade_widget_property_set (widget, "page-increment", page_inc);
+			glade_widget_property_set (widget, "page-size", page_size);
+
+			/* hook up the new adjustment */
+			glade_command_set_property (adata->property, widget->object);
+
+			/* destroy the fabricated object */
+			gtk_object_destroy (GTK_OBJECT (adata->adjustment));
+		} 
+		else
+		{
+			/* Set the adjustment we created directly */
+			glade_command_set_property (adata->property, adata->adjustment);
+		}
+
+		g_free (adata);
+	}
+}
+
+static void
+convert_adjustment_properties (GList              *properties,
+			       GladeProjectFormat  new_format,
+			       ConvertData        *data)
+{
+	GladeWidget   *adj_widget;
+	GladeProperty *property;
+	GObject       *adjustment;
+	GList *list;
+	GList *delete = NULL;
+
+
+	for (list = properties; list; list = list->next)
+	{
+		property = list->data;
+		
+		if (property->klass->pspec->value_type == GTK_TYPE_ADJUSTMENT)
+		{
+			adjustment = NULL;
+			glade_property_get (property, &adjustment);
+			
+			if (adjustment)
+			{
+				/* Record an adjustment here to restore after the format switch */
+				gdouble value, lower, upper, step_inc, page_inc, page_size;
+				AdjustmentData *adata = g_new0 (AdjustmentData, 1);
+				
+				g_object_get (adjustment, 
+					      "value", &value,
+					      "lower", &lower,
+					      "upper", &upper,
+					      "step-increment", &step_inc,
+					      "page-increment", &page_inc,
+					      "page-size", &page_size,
+					      NULL);
+				
+				adata->property = property;
+				adata->adjustment = (GObject *)gtk_adjustment_new (value, lower, upper, 
+										   step_inc, page_inc, page_size);
+				data->adjustments = g_list_prepend (data->adjustments, adata);
+				
+				/* Delete trailing builder objects from project */
+				if (new_format == GLADE_PROJECT_FORMAT_LIBGLADE &&
+				    (adj_widget = glade_widget_get_from_gobject (adjustment)))
+				{
+					if (!g_list_find (delete, adj_widget))
+						delete = g_list_prepend (delete, adj_widget);
+				}
+			}
+		}
+	}
+	
+	if (delete)
+	{
+		glade_command_delete (delete);
+		g_list_free (delete);
+	}
+}
+
+static void
+convert_adjustments (GladeProject       *project,
+		     GladeProjectFormat  new_format,
+		     ConvertData        *data)
+{
+	GladeWidget   *widget;
+	const GList   *objects;
+
+	for (objects = glade_project_get_objects (project); objects; objects = objects->next)
+	{
+		widget = glade_widget_get_from_gobject (objects->data);
+
+		convert_adjustment_properties (widget->properties, new_format, data);
+		convert_adjustment_properties (widget->packing_properties, new_format, data);
+	}
+}
+
+
+/*****************************************
+ *           Main entry point            *
+ *****************************************/
+static void
+glade_gtk_project_convert_finished (GladeProject *project,
+				    ConvertData  *data)
+{
+	convert_adjustments_finished (project, data);
+
+	/* Once per conversion */
+	g_signal_handlers_disconnect_by_func (G_OBJECT (project),
+					      G_CALLBACK (glade_gtk_project_convert_finished), data);
+
+	g_free (data);
+}
+
+gboolean
+glade_gtk_project_convert (GladeProject *project,
+			   GladeProjectFormat new_format)
+{
+	ConvertData  *data = g_new0 (ConvertData, 1);
+
+	/* Convert GtkAdjustments ... */
+	convert_adjustments (project, new_format, data);
+
+	/* Clean up after the new_format is in effect */
+	g_signal_connect (G_OBJECT (project), "convert-finished",
+			  G_CALLBACK (glade_gtk_project_convert_finished), data);
+
+	return TRUE;
+}

Modified: trunk/plugins/gtk+/glade-gtk.c
==============================================================================
--- trunk/plugins/gtk+/glade-gtk.c	(original)
+++ trunk/plugins/gtk+/glade-gtk.c	Fri Sep 19 22:31:18 2008
@@ -300,7 +300,6 @@
 	NULL
 };
 
-
 static GdkModifierType
 glade_gtk_parse_modifiers (const gchar *string)
 {
@@ -760,7 +759,7 @@
 
 	if ((value = glade_widget_adaptor_string_from_value
 	     (GLADE_WIDGET_ADAPTOR (property->klass->handle),
-	      property->klass, property->value)) != NULL)
+	      property->klass, property->value, fmt)) != NULL)
 	{
 		if ((split = g_strsplit (value, GPC_OBJECT_DELIMITER, 0)) != NULL)
 		{
@@ -1053,7 +1052,8 @@
 gchar *
 glade_gtk_widget_string_from_value (GladeWidgetAdaptor *adaptor,
 				    GladePropertyClass *klass,
-				    const GValue       *value)
+				    const GValue       *value,
+				    GladeProjectFormat  fmt)
 {
 	if (GLADE_IS_PARAM_SPEC_ACCEL (klass->pspec))
 		return glade_accels_make_string (g_value_get_boxed (value));
@@ -1061,7 +1061,8 @@
 		return GWA_GET_CLASS 
 			(G_TYPE_OBJECT)->string_from_value (adaptor, 
 							    klass, 
-							    value);
+							    value,
+							    fmt);
 }
 
 static void
@@ -7355,7 +7356,8 @@
 gchar *
 glade_gtk_label_string_from_value (GladeWidgetAdaptor *adaptor,
 				   GladePropertyClass *klass,
-				   const GValue       *value)
+				   const GValue       *value,
+				   GladeProjectFormat  fmt)
 {
 	if (GLADE_IS_PARAM_SPEC_ATTRIBUTES (klass->pspec))
 	{
@@ -7380,7 +7382,8 @@
 		return GWA_GET_CLASS 
 			(GTK_TYPE_WIDGET)->string_from_value (adaptor, 
 							      klass, 
-							      value);
+							      value,
+							      fmt);
 }
 
 

Modified: trunk/plugins/gtk+/gtk+.xml.in
==============================================================================
--- trunk/plugins/gtk+/gtk+.xml.in	(original)
+++ trunk/plugins/gtk+/gtk+.xml.in	Fri Sep 19 22:31:18 2008
@@ -5,6 +5,7 @@
                library="gladegtk"
                domain="glade3"
                book="gtk">
+  <project-convert-function>glade_gtk_project_convert</project-convert-function>
   <glade-widget-classes>
 
     <glade-widget-class name="GtkWidget" _title="Widget" default-width="100" default-height="60">
@@ -1745,6 +1746,16 @@
 	</property>
       </properties>
     </glade-widget-class>
+
+
+    <glade-widget-class name="GtkSizeGroup" generic-name="sizegroup" _title="Size Group"/>
+    <glade-widget-class name="GtkTextBuffer" generic-name="textbuffer" _title="Text Buffer"/>
+    <glade-widget-class name="GtkTextTag" generic-name="texttag" _title="Text Tag"/>
+    <glade-widget-class name="GtkTextTagTable" generic-name="texttagtable" _title="Text Tag Table"/>
+
+    <glade-widget-class name="GtkFileFilter" generic-name="filefilter" _title="File Filter"/>
+    <glade-widget-class name="GtkAdjustment" generic-name="adjustment" _title="Adjustment"/>
+
   </glade-widget-classes>
   
   <glade-widget-group name="gtk-toplevels" _title="Toplevels">
@@ -1782,7 +1793,7 @@
     <glade-widget-class-ref name="GtkAlignment"/>
   </glade-widget-group>
 
-  <glade-widget-group name="gtk-control-display" _title="Control and Display">
+  <glade-widget-group name="gtk-control-display" title="Control and Display">
 
     <glade-widget-class-ref name="GtkButton"/>
     <glade-widget-class-ref name="GtkToggleButton"/>
@@ -1824,24 +1835,41 @@
     <glade-widget-class-ref name="GtkArrow"/>
     <glade-widget-class-ref name="GtkDrawingArea"/>
     
+    <glade-widget-class-ref name="GtkColorSelection"/>
+    <glade-widget-class-ref name="GtkFontSelection"/>
     <glade-widget-class-ref name="GtkRecentChooserWidget"/>
     <glade-widget-class-ref name="GtkFileChooserWidget"/>
   </glade-widget-group>
 
-  <glade-widget-group name="gtk-obsolete" _title="Gtk+ Obsolete">
+  <glade-widget-group name="gtk-objects" title="Objects">
+    <glade-widget-class-ref name="GtkSizeGroup"/>
+    <glade-widget-class-ref name="GtkTextBuffer"/>
+    <glade-widget-class-ref name="GtkTextTag"/>
+    <glade-widget-class-ref name="GtkTextTagTable"/>
 
-    <default-palette-state expanded="False" />
+    <glade-widget-class-ref name="GtkFileFilter"/>
+    <glade-widget-class-ref name="GtkAdjustment"/>
+  </glade-widget-group>
+
+  <glade-widget-group name="gtk-specialized" title="Specialized Widgets">
+
+    <default-palette-state expanded="False"/>
 
-    <glade-widget-class-ref name="GtkCombo"/>
-    <glade-widget-class-ref name="GtkOptionMenu"/>
     <glade-widget-class-ref name="GtkHRuler"/>
     <glade-widget-class-ref name="GtkVRuler"/>
-    <glade-widget-class-ref name="GtkList"/>
-    <glade-widget-class-ref name="GtkCList"/>
-    <glade-widget-class-ref name="GtkColorSelection"/>
-    <glade-widget-class-ref name="GtkFontSelection"/>
+
     <glade-widget-class-ref name="GtkCurve"/>
     <glade-widget-class-ref name="GtkGammaCurve"/>
+  </glade-widget-group>
+
+  <glade-widget-group name="gtk-obsolete" title="Gtk+ Obsolete">
+
+    <default-palette-state expanded="False"/>
+
+    <glade-widget-class-ref name="GtkCombo"/>
+    <glade-widget-class-ref name="GtkOptionMenu"/>
+    <glade-widget-class-ref name="GtkList"/>
+    <glade-widget-class-ref name="GtkCList"/>
     <glade-widget-class-ref name="GtkFileSelection"/>
     <glade-widget-class-ref name="Custom"/>
   </glade-widget-group>



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