[nautilus-actions] Cut/copy/paste actions



commit 18219f999fb6b02e5af5732919f60964bbc132d1
Author: Pierre Wieser <pwieser trychlos org>
Date:   Fri Sep 18 21:29:09 2009 +0200

    Cut/copy/paste actions

 ChangeLog                                |   55 +++++
 src/common/na-gconf-utils.c              |   36 +++
 src/common/na-iduplicable.h              |   14 ++
 src/common/na-obj-action.c               |   10 +-
 src/common/na-obj-menu.c                 |    1 +
 src/common/na-obj-profile.c              |    1 +
 src/common/na-object-api.h               |    3 +-
 src/common/na-object-class.h             |   11 +
 src/common/na-object-fn.h                |    1 +
 src/common/na-object-id.c                |    1 +
 src/common/na-object-item.c              |   12 +-
 src/common/na-object.c                   |   62 ++++++-
 src/nact/Makefile.am                     |    1 +
 src/nact/base-assistant.c                |   24 ++-
 src/nact/nact-assistant-export.ui        |  310 +++++++++++++++++++++++++++
 src/nact/nact-clipboard.c                |   24 ++-
 src/nact/nact-iactions-list.c            |  208 ++++++++++---------
 src/nact/nact-iactions-list.h            |    2 +-
 src/nact/nact-main-menubar.c             |   13 +-
 src/nact/nact-main-window.c              |    2 +
 src/nact/nact-tree-model.c               |  153 +++++++++-----
 src/nact/nact-tree-model.h               |    3 +-
 src/nact/nact-window.c                   |   60 ++++--
 src/nact/nact-window.h                   |    3 +-
 src/nact/nautilus-actions-config-tool.ui |  345 ++----------------------------
 25 files changed, 833 insertions(+), 522 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 27816c2..63e218f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,58 @@
+2009-09-18 Pierre Wieser <pwieser trychlos org>
+
+	* src/common/na-gconf-utils.c:
+	Add validity checks on public functions.
+	sync_gconf: New function.
+
+	* src/common/na-iduplicable.c:
+	* src/common/na-iduplicable.h:
+	Create new interface API get_childs() to let implementors recurse
+	into childs if any.
+
+	* src/common/na-object.c:
+	* src/common/na-object-class.h(get_childs): New virtual function.
+	Converts the interface API into a class virtual function.
+
+	* src/common/na-obj-action.c:
+	* src/common/na-obj-menu.c:
+	* src/common/na-obj-profile.c:
+	* src/common/na-object-id.c:
+	Do not implement get_childs() NAObject virtual function.
+
+	* src/common/na-object-item.c:
+	Implements get_childs() virtual function.
+	Use na_object_iduplicable_are_equal() instead of obsoleted public
+	na_object_are_equal() API.
+
+	* src/common/na-obj-action.c (is_valid):
+	Adds a check on profile existance.
+
+	* src/common/na-object.c:
+	* src/common/na-object-api.h (na_object_set_origin_rec):
+	* src/common/na-object-fn.h (na_object_iduplicable_set_origin_recurse):
+	New API. Let caller recursively set an origin on objects.
+
+	* src/nact/base-assistant.c:
+	Move GtkBuilder to private data structure to be able to unref it.
+
+	* src/nact/nact-clipboard.c:
+	* src/nact/nact-iactions-list.c:
+	* src/nact/nact-tree-model.c: Fix cut/copy/paste functions.
+	nact_tree_model_update_parent(): removed function.
+
+	* src/nact/nact-main-menubar.c (on_new_profile_activated): Fixed.
+
+	* src/nact/nact-window.c:
+	* src/nact/nact-window.h (nact_window_count_level_zero_items):
+	New	function.
+
+	* src/nact/nact-assistant-export.ui: New file (see #579345).
+
+	* src/nact/nautilus-actions-config-tool.ui:
+	Renumber items (see #579345).
+
+	* src/nact/Makefile.am: Updated accordingly.
+
 2009-09-17 Pierre Wieser <pwieser trychlos org>
 
 	* src/common/na-iio-provider.c
diff --git a/src/common/na-gconf-utils.c b/src/common/na-gconf-utils.c
index 0befb23..e3ac361 100644
--- a/src/common/na-gconf-utils.c
+++ b/src/common/na-gconf-utils.c
@@ -37,6 +37,8 @@
 #include "na-utils.h"
 #include "na-gconf-utils.h"
 
+static gboolean sync_gconf( GConfClient *gconf, gchar **message );
+
 /*
  * load the keys which are the subdirs of the given path
  * returns a list of keys as full path
@@ -262,6 +264,8 @@ na_gconf_utils_read_bool( GConfClient *gconf, const gchar *path, gboolean use_sc
 	GConfValue *value = NULL;
 	gboolean ret;
 
+	g_return_val_if_fail( GCONF_IS_CLIENT( gconf ), FALSE );
+
 	ret = default_value;
 
 	if( use_schema ){
@@ -299,6 +303,8 @@ na_gconf_utils_read_string_list( GConfClient *gconf, const gchar *path )
 	GError *error = NULL;
 	GSList *list_strings;
 
+	g_return_val_if_fail( GCONF_IS_CLIENT( gconf ), NULL );
+
 	list_strings = gconf_client_get_list( gconf, path, GCONF_VALUE_STRING, &error );
 
 	if( error ){
@@ -317,6 +323,8 @@ na_gconf_utils_write_bool( GConfClient *gconf, const gchar *path, gboolean value
 	gboolean ret = TRUE;
 	GError *error = NULL;
 
+	g_return_val_if_fail( GCONF_IS_CLIENT( gconf ), FALSE );
+
 	if( !gconf_client_set_bool( gconf, path, value, &error )){
 		if( message ){
 			*message = g_strdup( error->message );
@@ -336,6 +344,8 @@ na_gconf_utils_write_string( GConfClient *gconf, const gchar *path, const gchar
 	gboolean ret = TRUE;
 	GError *error = NULL;
 
+	g_return_val_if_fail( GCONF_IS_CLIENT( gconf ), FALSE );
+
 	if( !gconf_client_set_string( gconf, path, value, &error )){
 		if( message ){
 			*message = g_strdup( error->message );
@@ -355,6 +365,8 @@ na_gconf_utils_write_string_list( GConfClient *gconf, const gchar *path, GSList
 	gboolean ret = TRUE;
 	GError *error = NULL;
 
+	g_return_val_if_fail( GCONF_IS_CLIENT( gconf ), FALSE );
+
 	if( !gconf_client_set_list( gconf, path, GCONF_VALUE_STRING, value, &error )){
 		if( message ){
 			*message = g_strdup( error->message );
@@ -364,5 +376,29 @@ na_gconf_utils_write_string_list( GConfClient *gconf, const gchar *path, GSList
 		ret = FALSE;
 	}
 
+	if( ret ){
+		ret = sync_gconf( gconf, message );
+	}
+
+	return( ret );
+}
+
+static gboolean
+sync_gconf( GConfClient *gconf, gchar **message )
+{
+	static const gchar *thisfn = "na_gconf_utils_sync_gconf";
+	gboolean ret = TRUE;
+	GError *error = NULL;
+
+	gconf_client_suggest_sync( gconf, &error );
+	if( error ){
+		if( message ){
+			*message = g_strdup( error->message );
+		}
+		g_warning( "%s: error=%s", thisfn, error->message );
+		g_error_free( error );
+		ret = FALSE;
+	}
+
 	return( ret );
 }
diff --git a/src/common/na-iduplicable.h b/src/common/na-iduplicable.h
index 76fe5e7..ea638f5 100644
--- a/src/common/na-iduplicable.h
+++ b/src/common/na-iduplicable.h
@@ -44,6 +44,20 @@
  * As the reference count of the original object is not incremented
  * here, the caller has to garantee itself that the original object
  * will stay in life at least as long as the duplicated one.
+ *
+ * Modification status in Nautilus-Actions configuration tool.
+ *
+ * - Objects whose origin is NULL are considered as modified ; this is
+ *   in particular the case of new, pasted, imported and dropped
+ *   objects.
+ *
+ * - when a new object, whether is is really new or it has been pasted,
+ *   imported or dropped, is inserted somewhere in the tree, its
+ *   immediate parent is also marked as modified.
+ *
+ * - Check for edition status, which positions modification and validity
+ *   status, is not recursive ; it is the responsability of the
+ *   implementation to check for edition status of childs of object..
  */
 
 #include <glib-object.h>
diff --git a/src/common/na-obj-action.c b/src/common/na-obj-action.c
index 5f59982..937a626 100644
--- a/src/common/na-obj-action.c
+++ b/src/common/na-obj-action.c
@@ -164,6 +164,7 @@ class_init( NAObjectActionClass *klass )
 	naobject_class->copy = object_copy;
 	naobject_class->are_equal = object_are_equal;
 	naobject_class->is_valid = object_is_valid;
+	naobject_class->get_childs = NULL;
 }
 
 static void
@@ -570,7 +571,10 @@ object_are_equal( const NAObject *a, const NAObject *b )
 
 /*
  * a valid NAObjectAction requires a not null, not empty label
- * this is checked here as NAObject doesn't have this condition
+ * this is checked here as NAObjectId doesn't have this condition
+ *
+ * and at least one profile
+ * checked here because NAObjectItem doesn't have this condition
  */
 gboolean
 object_is_valid( const NAObject *action )
@@ -587,5 +591,9 @@ object_is_valid( const NAObject *action )
 		g_free( label );
 	}
 
+	if( is_valid ){
+		is_valid = ( na_object_get_items_count( action ) >= 1 );
+	}
+
 	return( is_valid );
 }
diff --git a/src/common/na-obj-menu.c b/src/common/na-obj-menu.c
index 07df11b..792de58 100644
--- a/src/common/na-obj-menu.c
+++ b/src/common/na-obj-menu.c
@@ -126,6 +126,7 @@ class_init( NAObjectMenuClass *klass )
 	NA_OBJECT_CLASS( klass )->copy = object_copy;
 	NA_OBJECT_CLASS( klass )->are_equal = object_are_equal;
 	NA_OBJECT_CLASS( klass )->is_valid = object_is_valid;
+	NA_OBJECT_CLASS( klass )->get_childs = NULL;
 }
 
 static void
diff --git a/src/common/na-obj-profile.c b/src/common/na-obj-profile.c
index 214fd68..14640ae 100644
--- a/src/common/na-obj-profile.c
+++ b/src/common/na-obj-profile.c
@@ -246,6 +246,7 @@ class_init( NAObjectProfileClass *klass )
 	NA_OBJECT_CLASS( klass )->copy = object_copy;
 	NA_OBJECT_CLASS( klass )->are_equal = object_are_equal;
 	NA_OBJECT_CLASS( klass )->is_valid = object_is_valid;
+	NA_OBJECT_CLASS( klass )->get_childs = NULL;
 }
 
 static void
diff --git a/src/common/na-object-api.h b/src/common/na-object-api.h
index 9eab881..9a20125 100644
--- a/src/common/na-object-api.h
+++ b/src/common/na-object-api.h
@@ -53,14 +53,13 @@ G_BEGIN_DECLS
 /* NAIDuplicable
  */
 #define na_object_duplicate( object )				na_object_iduplicable_duplicate( NA_OBJECT( object ))
-
 #define na_object_check_edition_status( object )	na_object_iduplicable_check_edition_status( NA_OBJECT( object ))
-#define na_object_are_equal( a, b )					na_object_iduplicable_are_equal( NA_OBJECT( a ), NA_OBJECT( b ))
 #define na_object_is_modified( object )				na_object_iduplicable_is_modified( NA_OBJECT( object ))
 #define na_object_is_valid( object )				na_object_iduplicable_is_valid( NA_OBJECT( object ))
 
 #define na_object_get_origin( object )				na_object_iduplicable_get_origin( NA_OBJECT( object ))
 #define na_object_set_origin( object, origin )		na_object_iduplicable_set_origin( NA_OBJECT( object ), NA_OBJECT( origin ))
+#define na_object_set_origin_rec( object, origin )	na_object_iduplicable_set_origin_recurse( NA_OBJECT( object ), NA_OBJECT( origin ))
 
 /* NAObjectId
  */
diff --git a/src/common/na-object-class.h b/src/common/na-object-class.h
index 78a48ee..e0abe1f 100644
--- a/src/common/na-object-class.h
+++ b/src/common/na-object-class.h
@@ -178,6 +178,17 @@ typedef struct {
 	 */
 	gboolean   ( *is_valid )        ( const NAObject *object );
 
+	/**
+	 * get_childs:
+	 * @object: the #NAObject object whose childs are to be retrieved.
+	 *
+	 * Returns: a list of childs of @object, or NULL.
+	 *
+	 * As the returned list will not be freed by the caller, the
+	 * implementation should really returns its own list of childs,
+	 * if any.
+	 */
+	GList *    ( *get_childs )      ( const NAObject *object );
 }
 	NAObjectClass;
 
diff --git a/src/common/na-object-fn.h b/src/common/na-object-fn.h
index b34f390..fd3d580 100644
--- a/src/common/na-object-fn.h
+++ b/src/common/na-object-fn.h
@@ -67,6 +67,7 @@ gboolean  na_object_iduplicable_is_valid( const NAObject *object );
 
 NAObject *na_object_iduplicable_get_origin( const NAObject *object );
 void      na_object_iduplicable_set_origin( NAObject *object, const NAObject *origin );
+void      na_object_iduplicable_set_origin_recurse( NAObject *object, const NAObject *origin );
 
 G_END_DECLS
 
diff --git a/src/common/na-object-id.c b/src/common/na-object-id.c
index 06a677b..5793ffe 100644
--- a/src/common/na-object-id.c
+++ b/src/common/na-object-id.c
@@ -161,6 +161,7 @@ class_init( NAObjectIdClass *klass )
 	naobject_class->copy = object_copy;
 	naobject_class->are_equal = object_are_equal;
 	naobject_class->is_valid = object_is_valid;
+	naobject_class->get_childs = NULL;
 
 	klass->new_id = NULL;
 }
diff --git a/src/common/na-object-item.c b/src/common/na-object-item.c
index 2a0cd4b..f474150 100644
--- a/src/common/na-object-item.c
+++ b/src/common/na-object-item.c
@@ -98,6 +98,7 @@ static void     object_ref( const NAObject *action );
 static void     object_copy( NAObject *target, const NAObject *source );
 static gboolean object_are_equal( const NAObject *a, const NAObject *b );
 static gboolean object_is_valid( const NAObject *object );
+static GList   *object_get_childs( const NAObject *object );
 
 static gchar   *object_id_new_id( const NAObjectId *object );
 
@@ -192,6 +193,7 @@ class_init( NAObjectItemClass *klass )
 	naobject_class->copy = object_copy;
 	naobject_class->are_equal = object_are_equal;
 	naobject_class->is_valid = object_is_valid;
+	naobject_class->get_childs = object_get_childs;
 
 	objectid_class = NA_OBJECT_ID_CLASS( klass );
 	objectid_class->new_id = object_id_new_id;
@@ -878,7 +880,7 @@ object_are_equal( const NAObject *a, const NAObject *b )
 			second_obj = NA_OBJECT( na_object_get_item( b, first_id ));
 			g_free( first_id );
 			if( second_obj ){
-				equal = na_object_are_equal( first_obj, second_obj );
+				equal = na_object_iduplicable_are_equal( first_obj, second_obj );
 			} else {
 				equal = FALSE;
 			}
@@ -892,7 +894,7 @@ object_are_equal( const NAObject *a, const NAObject *b )
 			first_obj = NA_OBJECT( na_object_get_item( a, second_id ));
 			g_free( second_id );
 			if( first_obj ){
-				equal = na_object_are_equal( first_obj, second_obj );
+				equal = na_object_iduplicable_are_equal( first_obj, second_obj );
 			} else {
 				equal = FALSE;
 			}
@@ -924,6 +926,12 @@ object_is_valid( const NAObject *object )
 	return( valid );
 }
 
+static GList *
+object_get_childs( const NAObject *object )
+{
+	return( NA_OBJECT_ITEM( object )->private->items );
+}
+
 static gchar *
 object_id_new_id( const NAObjectId *item )
 {
diff --git a/src/common/na-object.c b/src/common/na-object.c
index 69b159d..7197c42 100644
--- a/src/common/na-object.c
+++ b/src/common/na-object.c
@@ -83,6 +83,9 @@ static gboolean       do_is_valid( const NAObject *object );
 
 static void           do_copy( NAObject *target, const NAObject *source );
 
+static GList         *v_get_childs( const NAObject *object );
+static GList         *most_derived_get_childs( const NAObject *object );
+
 GType
 na_object_get_type( void )
 {
@@ -152,6 +155,7 @@ class_init( NAObjectClass *klass )
 	klass->copy = do_copy;
 	klass->are_equal = do_are_equal;
 	klass->is_valid = do_is_valid;
+	klass->get_childs = NULL;
 }
 
 static void
@@ -616,7 +620,8 @@ do_is_valid( const NAObject *object )
  * na_object_iduplicable_check_edition_status:
  * @object: the #NAObject object to be checked.
  *
- * Checks for the edition status of @object.
+ * Recursively checks for the edition status of @object and its childs
+ * (if any).
  *
  * Internally set some properties which may be requested later. This
  * two-steps check-request let us optimize some work in the UI.
@@ -630,10 +635,17 @@ do_is_valid( const NAObject *object )
 void
 na_object_iduplicable_check_edition_status( const NAObject *object )
 {
+	GList *childs, *ic;
+
 	g_return_if_fail( NA_IS_OBJECT( object ));
 	g_return_if_fail( !object->private->dispose_has_run );
 
 	na_iduplicable_check_edition_status( NA_IDUPLICABLE( object ));
+
+	childs = v_get_childs( object );
+	for( ic = childs ; ic ; ic = ic->next ){
+		na_iduplicable_check_edition_status( NA_IDUPLICABLE( ic->data ));
+	}
 }
 
 /**
@@ -711,3 +723,51 @@ na_object_iduplicable_set_origin( NAObject *object, const NAObject *origin )
 
 	na_iduplicable_set_origin( NA_IDUPLICABLE( object ), NA_IDUPLICABLE( origin ));
 }
+
+/**
+ * na_object_iduplicable_set_origin_recurse:
+ * @object: the #NAObject object whose origin is to be set.
+ * @origin: a #NAObject which will be set as the new origin of @object.
+ *
+ * Sets the new origin of @object, and of all its childs if any.
+ */
+void
+na_object_iduplicable_set_origin_recurse( NAObject *object, const NAObject *origin )
+{
+	GList *childs, *ic;
+
+	na_object_iduplicable_set_origin( object, origin );
+
+	childs = v_get_childs( object );
+
+	for( ic = childs ; ic ; ic = ic->next ){
+		na_object_iduplicable_set_origin_recurse( NA_OBJECT( ic->data ), origin );
+	}
+}
+
+static GList *
+v_get_childs( const NAObject *object ){
+
+	return( most_derived_get_childs( object ));
+}
+
+static GList *
+most_derived_get_childs( const NAObject *object )
+{
+	GList *childs;
+	GList *hierarchy, *ih;
+	gboolean found;
+
+	found = FALSE;
+	childs = NULL;
+	hierarchy = g_list_reverse( na_object_get_hierarchy( object ));
+
+	for( ih = hierarchy ; ih && !found ; ih = ih->next ){
+		if( NA_OBJECT_CLASS( ih->data )->get_childs ){
+			childs = NA_OBJECT_CLASS( ih->data )->get_childs( object );
+			found = TRUE;
+		}
+	}
+
+	return( childs );
+}
diff --git a/src/nact/Makefile.am b/src/nact/Makefile.am
index 4a34da7..3e18f5f 100644
--- a/src/nact/Makefile.am
+++ b/src/nact/Makefile.am
@@ -96,6 +96,7 @@ nautilus_actions_config_tool_LDADD = \
 
 pkgdata_DATA = \
 	nautilus-actions-config-tool.actions				\
+	nact-assistant-export.ui							\
 	nautilus-actions-config-tool.ui						\
 	$(NULL)
 
diff --git a/src/nact/base-assistant.c b/src/nact/base-assistant.c
index 3ed7663..4417226 100644
--- a/src/nact/base-assistant.c
+++ b/src/nact/base-assistant.c
@@ -48,12 +48,13 @@ struct BaseAssistantClassPrivate {
 /* private instance data
  */
 struct BaseAssistantPrivate {
-	gboolean dispose_has_run;
-	gboolean cancel_on_escape;
-	gboolean warn_on_escape;
-	gboolean warn_on_cancel;
-	gboolean apply_has_run;
-	gboolean escape_key_pressed;
+	gboolean    dispose_has_run;
+	GtkBuilder *builder;
+	gboolean    cancel_on_escape;
+	gboolean    warn_on_escape;
+	gboolean    warn_on_cancel;
+	gboolean    apply_has_run;
+	gboolean    escape_key_pressed;
 };
 
 /* instance properties
@@ -282,6 +283,8 @@ instance_dispose( GObject *window )
 
 		self->private->dispose_has_run = TRUE;
 
+		g_object_unref( self->private->builder );
+
 		/* chain up to the parent class */
 		if( G_OBJECT_CLASS( st_parent_class )->dispose ){
 			G_OBJECT_CLASS( st_parent_class )->dispose( window );
@@ -297,7 +300,7 @@ instance_finalize( GObject *window )
 
 	g_debug( "%s: window=%p", thisfn, ( void * ) window );
 	g_assert( BASE_IS_ASSISTANT( window ));
-	self = ( BaseAssistant * ) window;
+	self = BASE_ASSISTANT( window );
 
 	g_free( self->private );
 
@@ -317,22 +320,21 @@ instance_finalize( GObject *window )
 static GtkWindow *
 base_get_window( BaseWindow *window, const gchar *name )
 {
-	GtkBuilder *builder;
 	BaseApplication *appli;
 	gchar *fname;
 	GtkWindow *dialog;
 
-	builder = gtk_builder_new();
+	BASE_ASSISTANT( window )->private->builder = gtk_builder_new();
 
 	appli = base_window_get_application( window );
 
 	fname = base_application_get_ui_filename( appli );
 
-	gtk_builder_add_from_file( builder, fname, NULL );
+	gtk_builder_add_from_file( BASE_ASSISTANT( window )->private->builder, fname, NULL );
 
 	g_free( fname );
 
-	dialog = GTK_WINDOW( gtk_builder_get_object( builder, name ));
+	dialog = GTK_WINDOW( gtk_builder_get_object( BASE_ASSISTANT( window )->private->builder, name ));
 
 	return( dialog );
 }
diff --git a/src/nact/nact-assistant-export.ui b/src/nact/nact-assistant-export.ui
new file mode 100644
index 0000000..92a758f
--- /dev/null
+++ b/src/nact/nact-assistant-export.ui
@@ -0,0 +1,310 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 2.12 -->
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkAssistant" id="ExportAssistant">
+    <property name="events">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+    <property name="border_width">12</property>
+    <property name="title" translatable="yes">Exporting actions</property>
+    <property name="modal">True</property>
+    <child>
+      <object class="GtkLabel" id="label20">
+        <property name="visible">True</property>
+        <property name="label" translatable="yes">This assistant will guide you through the process of exporting actions.</property>
+      </object>
+      <packing>
+        <property name="page_type">intro</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHBox" id="hbox7">
+        <property name="visible">True</property>
+        <child>
+          <object class="GtkVBox" id="vbox16">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkLabel" id="ActionsListLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="xpad">4</property>
+                <property name="ypad">4</property>
+                <property name="label" translatable="yes">Actions _list :</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="ActionsList">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="headers_visible">False</property>
+                    <property name="rules_hint">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label2">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">Please select one or more actions
+to be exported.
+
+You may use Ctrl and Shift keys
+to extend a selection.</property>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="title">Selection of the exported actions</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHBox" id="hbox2">
+        <property name="visible">True</property>
+        <child>
+          <object class="GtkFileChooserWidget" id="ExportFolderChooser">
+            <property name="visible">True</property>
+            <property name="use_preview_label">False</property>
+            <property name="local_only">False</property>
+            <property name="preview_widget_active">False</property>
+            <property name="action">select-folder</property>
+          </object>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="title">Selection of the target folder</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="border_width">10</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkVBox" id="vbox2">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkRadioButton" id="ExportSchemaV1Button">
+                <property name="label" translatable="yes">Export as a GConf schema file with full key descriptions.</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox4">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkRadioButton" id="ExportHide1">
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">False</property>
+                    <property name="receives_default">False</property>
+                    <property name="focus_on_click">False</property>
+                    <property name="draw_indicator">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="padding">2</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="ExportSchemaV1Label">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">This used to be the historical export format.
+The exported file may later be imported via :
+- Import assistant of the Nautilus Actions Configuration Tool,
+- or via the gconftool-2 --import-schema-file command-line tool.</property>
+                  </object>
+                  <packing>
+                    <property name="padding">4</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox3">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkRadioButton" id="ExportSchemaV2Button">
+                <property name="label" translatable="yes">Export as a light GConf schema file.</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="xalign">0</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <property name="group">ExportSchemaV1Button</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox5">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkRadioButton" id="ExportHide2">
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">False</property>
+                    <property name="receives_default">False</property>
+                    <property name="focus_on_click">False</property>
+                    <property name="draw_indicator">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="padding">2</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="ExportSchemaV2Label">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">The exported file may later be imported via :
+- Import assistant of the Nautilus Actions Configuration Tool,
+- or via the gconftool-2 --import-schema-file command-line tool.</property>
+                  </object>
+                  <packing>
+                    <property name="padding">4</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox4">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkRadioButton" id="ExportGConfDumpButton">
+                <property name="label" translatable="yes">Export as a GConf dump file.</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="xalign">0</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <property name="group">ExportSchemaV1Button</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox6">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkRadioButton" id="ExportHide3">
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">False</property>
+                    <property name="receives_default">False</property>
+                    <property name="focus_on_click">False</property>
+                    <property name="draw_indicator">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="padding">2</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="ExportGConfDumpLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">This should be the preferred format for newly exported actions.
+The exported file may later be imported via :
+- Import assistant of the Nautilus Actions Configuration Tool,
+- or via the gconftool-2 --load command-line tool.</property>
+                  </object>
+                  <packing>
+                    <property name="padding">4</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="title">Select the export format</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkLabel" id="label3">
+        <property name="visible">True</property>
+        <property name="use_markup">True</property>
+      </object>
+      <packing>
+        <property name="page_type">confirm</property>
+        <property name="title">Summary</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkLabel" id="label4">
+        <property name="visible">True</property>
+        <property name="use_markup">True</property>
+      </object>
+      <packing>
+        <property name="page_type">summary</property>
+        <property name="title">Export is done</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/src/nact/nact-clipboard.c b/src/nact/nact-clipboard.c
index cd78ef6..439f527 100644
--- a/src/nact/nact-clipboard.c
+++ b/src/nact/nact-clipboard.c
@@ -45,6 +45,7 @@
 #include "nact-clipboard.h"
 
 #define NACT_CLIPBOARD_ATOM				gdk_atom_intern( "_NACT_CLIPBOARD", FALSE )
+#define NACT_CLIPBOARD_NACT_ATOM		gdk_atom_intern( "ClipboardNautilusActions", FALSE )
 
 #define CLIPBOARD_PROP_PRIMAY_USED		"nact-clipboard-primary-used"
 
@@ -229,23 +230,32 @@ nact_clipboard_get( void )
 	GtkSelectionData *selection;
 	NactClipboardData *data;
 	GList *items, *it;
+	NAObject *obj;
 
 	if( nact_clipboard_is_empty()){
 		return( NULL );
 	}
 
 	clipboard = get_clipboard();
-	selection = gtk_clipboard_wait_for_contents( clipboard, GDK_SELECTION_PRIMARY );
-	data = ( NactClipboardData * ) selection->data;
 
 	items = NULL;
-	for( it = data->items ; it ; it = it->next ){
-		items = g_list_prepend( items, na_object_duplicate( it->data ));
-	}
 
-	renumber_items( data->items );
+	selection = gtk_clipboard_wait_for_contents( clipboard, NACT_CLIPBOARD_NACT_ATOM );
+
+	if( selection ){
+		data = ( NactClipboardData * ) selection->data;
+
+		for( it = data->items ; it ; it = it->next ){
+			obj = na_object_duplicate( it->data );
+			na_object_set_origin_rec( obj, NULL );
+			items = g_list_prepend( items, obj );
+		}
+		items = g_list_reverse( items );
+
+		renumber_items( data->items );
+	}
 
-	return( g_list_reverse( items ));
+	return( items );
 }
 
 /**
diff --git a/src/nact/nact-iactions-list.c b/src/nact/nact-iactions-list.c
index 49af0cd..08f9d29 100644
--- a/src/nact/nact-iactions-list.c
+++ b/src/nact/nact-iactions-list.c
@@ -44,6 +44,7 @@
 #include "nact-application.h"
 #include "nact-main-tab.h"
 #include "nact-tree-model.h"
+#include "nact-window.h"
 #include "nact-iactions-list.h"
 
 /* private interface data
@@ -99,16 +100,17 @@ static void         interface_base_init( NactIActionsListInterface *klass );
 static void         interface_base_finalize( NactIActionsListInterface *klass );
 
 static void         free_items_callback( NactIActionsList *instance, GList *items );
+static void         do_insert_items( GtkTreeView *treeview, GtkTreeModel *model, GList *items, GtkTreePath *path, gint level, GList **parents );
+static GList       *do_insert_items_add_parent( GList *parents, GtkTreeView *treeview, GtkTreeModel *model, NAObject *parent );
 
 static void         display_label( GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, NactIActionsList *instance );
 static void         extend_selection_to_childs( NactIActionsList *instance, GtkTreeView *treeview, GtkTreeModel *model, GtkTreeIter *parent );
 static gboolean     filter_selection( GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, NactIActionsList *instance );
 static void         filter_selection_iter( GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, SelectionIter *str );
 static GtkTreeView *get_actions_list_treeview( NactIActionsList *instance );
-static gboolean     get_item( NactTreeModel *model, GtkTreePath *path, NAObject *object, GSList **items );
+static gboolean     get_item( NactTreeModel *model, GtkTreePath *path, NAObject *object, GList **items );
 static gboolean     have_dnd_mode( NactIActionsList *instance );
 static gboolean     have_filter_selection_mode( NactIActionsList *instance );
-static void         insert_item( NactIActionsList *instance, NAObject *item );
 static gboolean     is_modified_item( NactTreeModel *model, GtkTreePath *path, NAObject *object, GList **items );
 static gboolean     is_removing( NactIActionsList *instance );
 static void         iter_on_selection( NactIActionsList *instance, FnIterOnSelection fn_iter, gpointer user_data );
@@ -176,7 +178,7 @@ interface_base_init( NactIActionsListInterface *klass )
 		klass->private = g_new0( NactIActionsListInterfacePrivate, 1 );
 
 		/**
-		 * "nact-iactions-list-selection-changed":
+		 * nact-iactions-list-selection-changed:
 		 *
 		 * This signal is emitted each time the selection is changed in
 		 * the treeview.
@@ -198,7 +200,7 @@ interface_base_init( NactIActionsListInterface *klass )
 				G_TYPE_POINTER );
 
 		/**
-		 * "nact-iactions-list-item-updated":
+		 * nact-iactions-list-item-updated:
 		 *
 		 * This signal is emitted to inform all widgets that an item
 		 * has been updated.
@@ -483,55 +485,53 @@ nact_iactions_list_fill( NactIActionsList *instance, GList *items )
 }
 
 /**
- * nact_iactions_list_get_items_count:
+ * nact_iactions_list_get_items:
  * @window: this #NactIActionsList instance.
  *
- * Returns: the current count of items in the list, whether they are
- * currently visible or not.
+ * Returns: the current tree.
+ *
+ * The returned #GList content is owned by the underlying tree model,
+ * and should only be g_list_free() by the caller.
  */
-guint
-nact_iactions_list_get_items_count( NactIActionsList *instance )
+GList *
+nact_iactions_list_get_items( NactIActionsList *instance )
 {
+	GList *items = NULL;
 	GtkTreeView *treeview;
 	NactTreeModel *model;
 
-	g_return_val_if_fail( NACT_IS_IACTIONS_LIST( instance ), 0 );
+	g_return_val_if_fail( NACT_IS_IACTIONS_LIST( instance ), NULL );
 
 	treeview = get_actions_list_treeview( instance );
-
 	model = NACT_TREE_MODEL( gtk_tree_view_get_model( treeview ));
 
-	g_return_val_if_fail( NACT_IS_TREE_MODEL( model ), 0 );
+	nact_tree_model_iter( model, ( FnIterOnStore ) get_item, &items );
 
-	return( nact_tree_model_get_items_count( model ));
+	return( g_list_reverse( items ));
 }
 
 /**
- * nact_iactions_list_get_items:
+ * nact_iactions_list_get_items_count:
  * @window: this #NactIActionsList instance.
  *
- * Returns: the current tree.
- *
- * The returned #GSList content is owned by the underlying tree model,
- * and should only be g_slist_free() by the caller.
+ * Returns: the current count of items in the list, whether they are
+ * currently visible or not.
  */
-GSList *
-nact_iactions_list_get_items( NactIActionsList *instance )
+guint
+nact_iactions_list_get_items_count( NactIActionsList *instance )
 {
-	GSList *items = NULL;
 	GtkTreeView *treeview;
 	NactTreeModel *model;
 
-	g_return_val_if_fail( NACT_IS_IACTIONS_LIST( instance ), NULL );
+	g_return_val_if_fail( NACT_IS_IACTIONS_LIST( instance ), 0 );
 
 	treeview = get_actions_list_treeview( instance );
-	model = NACT_TREE_MODEL( gtk_tree_view_get_model( treeview ));
 
-	nact_tree_model_iter( model, ( FnIterOnStore ) get_item, &items );
+	model = NACT_TREE_MODEL( gtk_tree_view_get_model( treeview ));
 
-	/*g_debug( "nact_iactions_list_get_modified_items: count=%d", g_slist_length( items ));*/
+	g_return_val_if_fail( NACT_IS_TREE_MODEL( model ), 0 );
 
-	return( g_slist_reverse( items ));
+	return( nact_tree_model_get_items_count( model ));
 }
 
 /**
@@ -565,14 +565,14 @@ nact_iactions_list_get_modified_items( NactIActionsList *instance )
  * nact_iactions_list_get_selected_items:
  * @window: this #NactIActionsList instance.
  *
- * Returns: the currently selected rows.
+ * Returns: the currently selected rows as a list of #NAObjects.
  *
  * We acquire here a new reference on objects corresponding to actually
  * selected rows. It is supposed that their subitems are also concerned,
  * but this may be caller-dependant.
  *
  * The caller may safely call na_object_free_items() on the returned
- * list, or g_slist_free() if it wants keep the references somewhere.
+ * list, or g_list_free() if it wants keep the references somewhere.
  */
 GList *
 nact_iactions_list_get_selected_items( NactIActionsList *instance )
@@ -615,89 +615,110 @@ nact_iactions_list_get_selected_items( NactIActionsList *instance )
  *
  * If the @items list contains only profiles, they can only be inserted
  * into an action, and the profiles will eventually be renumbered.
- * The insertion position is current, or alpha-sorted, depending on
- *
- * If the list is not sorted, the new item is inserted just before the
- * current position.
  *
  * If new item is a #NAActionMenu or a #NAAction, it will be inserted
- * before the current action or menu.
- *
- * If new item is a #NAActionProfile, it will be inserted before the
- * current profile, or as a new profile at the beginning of the list
- * of profiles of the current action.
+ * before the current action or inside the current menu.
  */
 void
 nact_iactions_list_insert_items( NactIActionsList *instance, GList *items )
 {
+	static const gchar *thisfn = "nact_iactions_list_insert_items";
 	GtkTreeView *treeview;
-	GtkTreeSelection *selection;
 	GtkTreeModel *model;
+	GtkTreeSelection *selection;
 	GList *list_selected;
-	GtkTreePath *path = NULL;
-	NAObject *item;
-	NAObject *obj_selected = NULL;
-	GtkTreeIter iter;
+	GtkTreePath *insert_path;
+	GList *parents, *it;
+	gint level;
 
+	g_debug( "%s: instance=%p, items=%p (%d items)",
+			thisfn, ( void * ) instance, ( void * ) items, g_list_length( items ));
 	g_return_if_fail( NACT_IS_IACTIONS_LIST( instance ));
-	/*g_return_if_fail( NA_IS_OBJECT( item ));*/
-
-	item = NA_OBJECT( items->data );
-	if( FALSE ){
-		insert_item( instance, item );
-	}
+	g_return_if_fail( NACT_IS_WINDOW( instance ));
 
 	treeview = get_actions_list_treeview( instance );
 	model = gtk_tree_view_get_model( treeview );
 	g_return_if_fail( NACT_IS_TREE_MODEL( model ));
 
+	insert_path = NULL;
 	selection = gtk_tree_view_get_selection( treeview );
 	list_selected = gtk_tree_selection_get_selected_rows( selection, NULL );
-	gtk_tree_selection_unselect_all( selection );
-
-	/* a NAObjectItem (action or menu) is inserted just before the
-	 * beginning of the selection, at the same level that this beginning
-	 */
-	if( NA_IS_OBJECT_ITEM( item )){
-		if( g_list_length( list_selected )){
-			path = ( GtkTreePath * ) list_selected->data;
-			gtk_tree_model_get_iter( model, &iter, path );
-			gtk_tree_model_get( model, &iter, IACTIONS_LIST_NAOBJECT_COLUMN, &obj_selected, -1 );
-		}
+	if( g_list_length( list_selected )){
+		insert_path = gtk_tree_path_copy(( GtkTreePath * ) list_selected->data );
 	}
 
-	/* a NAObjectProfile is inserted just after the action if it has
-	 * only one profile (it is currently selected)
-	 * if current selection is a profile, then the insertion occurs
-	 * just before this profile
-	 */
-	if( NA_IS_OBJECT_PROFILE( item )){
-		g_return_if_fail( g_list_length( list_selected ));
-		path = ( GtkTreePath * ) list_selected->data;
-		gtk_tree_model_get_iter( model, &iter, path );
-		gtk_tree_model_get( model, &iter, IACTIONS_LIST_NAOBJECT_COLUMN, &obj_selected, -1 );
+	g_list_foreach( list_selected, ( GFunc ) gtk_tree_path_free, NULL );
+	g_list_free( list_selected );
+
+	parents = NULL;
+	level = 0;
+	do_insert_items( treeview, model, items, insert_path, level, &parents );
+
+	for( it = parents ; it ; it = it->next ){
+		na_object_check_edition_status( it->data );
 	}
 
-	nact_tree_model_insert_item( NACT_TREE_MODEL( model ), item, path, obj_selected, &iter );
+	gtk_tree_path_free( insert_path );
+	/*gtk_tree_selection_unselect_all( selection );*/
+	/*path = gtk_tree_model_get_path( model, &iter );
+	nact_iactions_list_select_row( instance, path );*/
+	/*gtk_tree_view_set_cursor_on_cell( treeview, path, NULL, NULL, FALSE );*/
+	/*gtk_tree_path_free( path );*/
+	/*gtk_tree_iter_free( iter_first );*/
+	gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( model ));
+}
 
-	if( NA_IS_OBJECT_PROFILE( item )){
-		na_object_dump( na_object_profile_get_action( NA_OBJECT_PROFILE( item )));
-	} else {
-		g_return_if_fail( NA_IS_OBJECT_ITEM( item ));
-		na_object_dump( NA_OBJECT( item ));
+static void
+do_insert_items( GtkTreeView *treeview, GtkTreeModel *model, GList *items, GtkTreePath *path, gint level, GList **parents )
+{
+	static const gchar *thisfn = "nact_iactions_list_do_insert_items";
+	guint nb_profiles, nb_actions, nb_menus;
+	GtkTreeIter iter;
+	GList *it;
+	GList *subitems;
+	GtkTreePath *newpath;
+	NAObject *obj_parent;
+	gchar *newpathstr;
+
+	nact_window_count_level_zero_items( items, &nb_actions, &nb_profiles, &nb_menus );
+
+	g_debug( "%s: level=%d, actions=%d, profiles=%d, menus=%d", thisfn, level, nb_actions, nb_profiles, nb_menus );
+	g_return_if_fail(( nb_profiles && !( nb_actions + nb_menus )) || ( !nb_profiles && ( nb_actions + nb_menus )));
+	/*g_return_if_fail(( nb_profiles && ( NA_IS_OBJECT_ACTION( obj_selected ) || NA_IS_OBJECT_PROFILE( obj_selected ))) || !nb_profiles );*/
+
+	for( it = items ; it ; it = it->next ){
+		nact_tree_model_insert( NACT_TREE_MODEL( model ), NA_OBJECT( it->data ), path, &iter, &obj_parent );
+		newpath = gtk_tree_model_get_path( model, &iter );
+		if( level == 0 ){
+			gtk_tree_view_expand_to_path( treeview, newpath );
+		}
+
+		*parents = do_insert_items_add_parent( *parents, treeview, model, obj_parent );
+
+		newpathstr = gtk_tree_path_to_string( newpath );
+		g_debug( "%s: newpath=%s", thisfn, newpathstr );
+		g_free( newpathstr );
+
+		if( NA_IS_OBJECT_ITEM( it->data )){
+			subitems = na_object_get_items( it->data );
+			do_insert_items( treeview, model, subitems, newpath, level+1, parents );
+			na_object_free_items( subitems );
+		}
+
+		gtk_tree_path_free( newpath );
 	}
+}
 
-	path = gtk_tree_model_get_path( model, &iter );
-	gtk_tree_view_expand_to_path( treeview, path );
-	gtk_tree_view_set_cursor_on_cell( treeview, path, NULL, NULL, FALSE );
-	gtk_tree_path_free( path );
+static GList *
+do_insert_items_add_parent( GList *parents, GtkTreeView *treeview, GtkTreeModel *model, NAObject *parent )
+{
+	g_return_val_if_fail( parent, NULL );
 
-	if( obj_selected ){
-		g_object_unref( obj_selected );
+	if( !g_list_find( parents, parent )){
+		parents = g_list_prepend( parents, parent );
 	}
 
-	g_list_foreach( list_selected, ( GFunc ) gtk_tree_path_free, NULL );
-	g_list_free( list_selected );
+	return( parents );
 }
 
 /*
@@ -715,6 +736,7 @@ nact_iactions_list_insert_items( NactIActionsList *instance, GList *items )
  * current profile, or as a new profile at the beginning of the list
  * of profiles of the current action.
  */
+#if 0
 static void
 insert_item( NactIActionsList *instance, NAObject *item )
 {
@@ -781,6 +803,7 @@ insert_item( NactIActionsList *instance, NAObject *item )
 	g_list_foreach( list_selected, ( GFunc ) gtk_tree_path_free, NULL );
 	g_list_free( list_selected );
 }
+#endif
 
 /**
  * nact_iactions_list_is_filling_list:
@@ -1082,7 +1105,7 @@ extend_selection_to_childs( NactIActionsList *instance, GtkTreeView *treeview, G
  * rationale: it is very difficult to copy anything in the clipboard,
  * and to hope that this will be easily copyable anywhere after.
  * We know how to insert profiles, or how to insert actions or menus,
- * but not how not where to insert e.g. a mix selection.
+ * but not how nor where to insert e.g. a mix selection.
  * So the selection allows :
  * - only profiles, maybe from different actions
  * - or only actions or menus.
@@ -1183,10 +1206,10 @@ get_actions_list_treeview( NactIActionsList *instance )
  * builds the tree
  */
 static gboolean
-get_item( NactTreeModel *model, GtkTreePath *path, NAObject *object, GSList **items )
+get_item( NactTreeModel *model, GtkTreePath *path, NAObject *object, GList **items )
 {
 	if( gtk_tree_path_get_depth( path ) == 1 ){
-		*items = g_slist_prepend( *items, object );
+		*items = g_list_prepend( *items, object );
 	}
 
 	/* don't stop iteration */
@@ -1323,21 +1346,12 @@ on_iactions_list_item_updated( NactIActionsList *instance, GSList *updated_items
 }
 
 /*
- * rewind all the parent hierarchy of each modified item to update its status
+ * an item has been updated in one of the tabs
+ * update the treeview to reflects its new edition status
  */
 static void
 on_iactions_list_item_updated_treeview( NactIActionsList *instance, GSList *updated_items )
 {
-	GtkTreeView *treeview;
-	NactTreeModel *model;
-	GSList *it;
-
-	treeview = get_actions_list_treeview( instance );
-	model = NACT_TREE_MODEL( gtk_tree_view_get_model( treeview ));
-
-	for( it = updated_items ; it ; it=it->next ){
-		nact_tree_model_update_parent( model, NA_OBJECT( it->data ));
-	}
 }
 
 /*
diff --git a/src/nact/nact-iactions-list.h b/src/nact/nact-iactions-list.h
index 33c52e0..3cf4ba3 100644
--- a/src/nact/nact-iactions-list.h
+++ b/src/nact/nact-iactions-list.h
@@ -78,8 +78,8 @@ void      nact_iactions_list_dispose( NactIActionsList *instance );
 
 void      nact_iactions_list_delete_selection( NactIActionsList *instance, GtkTreePath **path );
 void      nact_iactions_list_fill( NactIActionsList *instance, GList *items );
+GList    *nact_iactions_list_get_items( NactIActionsList *instance );
 guint     nact_iactions_list_get_items_count( NactIActionsList *instance );
-GSList   *nact_iactions_list_get_items( NactIActionsList *instance );
 GList    *nact_iactions_list_get_modified_items( NactIActionsList *instance );
 GList    *nact_iactions_list_get_selected_items( NactIActionsList *instance );
 void      nact_iactions_list_insert_items( NactIActionsList *instance, GList *items );
diff --git a/src/nact/nact-main-menubar.c b/src/nact/nact-main-menubar.c
index a42d074..630db6e 100644
--- a/src/nact/nact-main-menubar.c
+++ b/src/nact/nact-main-menubar.c
@@ -319,7 +319,8 @@ on_new_profile_activated( GtkAction *gtk_action, NactMainWindow *window )
 	profile = na_object_profile_new();
 
 	name = na_object_action_get_new_profile_name( action );
-	na_object_action_attach_profile( action, profile );
+	/*na_object_action_attach_profile( action, profile );*/
+	na_object_profile_set_action( profile, action );
 	na_object_set_id( profile, name );
 
 	items = g_list_prepend( items, profile );
@@ -336,8 +337,7 @@ on_new_profile_activated( GtkAction *gtk_action, NactMainWindow *window )
 static void
 on_save_activated( GtkAction *gtk_action, NactMainWindow *window )
 {
-	GSList *items;
-	GSList *it;
+	GList *items, *it;
 	NactApplication *application;
 	NAPivot *pivot;
 
@@ -358,12 +358,15 @@ on_save_activated( GtkAction *gtk_action, NactMainWindow *window )
 		save_object_item( window, pivot, NA_OBJECT_ITEM( it->data ));
 	}
 
-	g_slist_free( items );
+	/* doesn't unref object owned by the tree store
+	 */
+	g_list_free( items );
 
 	/* delete the removed actions
 	 */
 	nact_main_window_remove_deleted( window );
 
+	nact_main_menubar_refresh_actions_sensitivity( window );
 	na_ipivot_consumer_delay_notify( NA_IPIVOT_CONSUMER( window ));
 }
 
@@ -526,7 +529,7 @@ on_delete_activated( GtkAction *gtk_action, NactMainWindow *window )
 
 	/* do not unref selected items as the ref has been moved to main_deleted
 	 */
-	g_list_free( items );
+	/*g_list_free( items );*/
 }
 
 static void
diff --git a/src/nact/nact-main-window.c b/src/nact/nact-main-window.c
index a81fe99..601c13e 100644
--- a/src/nact/nact-main-window.c
+++ b/src/nact/nact-main-window.c
@@ -629,6 +629,7 @@ nact_main_window_move_to_deleted( NactMainWindow *window, GList *items )
 
 /**
  * nact_main_window_remove_deleted:
+ * @window: this #NactMainWindow instance.
  *
  * Removes the deleted items from the underlying I/O storage subsystem.
  */
@@ -662,6 +663,7 @@ actually_delete_item( NactMainWindow *window, NAObject *item, NAPivot *pivot )
 {
 	GList *items, *it;
 
+	g_debug( "actually_delete_item %p", ( void * ) item );
 	if( nact_window_delete_object_item( NACT_WINDOW( window ), NA_OBJECT_ITEM( item ))){
 
 		NAObject *origin = na_object_get_origin( item );
diff --git a/src/nact/nact-tree-model.c b/src/nact/nact-tree-model.c
index 521701e..bef29e9 100644
--- a/src/nact/nact-tree-model.c
+++ b/src/nact/nact-tree-model.c
@@ -156,9 +156,8 @@ static gboolean       dump_store( NactTreeModel *model, GtkTreePath *path, NAObj
 static void           fill_tree_store( GtkTreeStore *model, GtkTreeView *treeview, GList *items, gboolean only_actions, GtkTreeIter *parent );
 static void           iter_on_store( NactTreeModel *model, GtkTreeModel *store, GtkTreeIter *parent, FnIterOnStore fn, gpointer user_data );
 static gboolean       iter_on_store_item( NactTreeModel *model, GtkTreeModel *store, GtkTreeIter *iter, FnIterOnStore fn, gpointer user_data );
-static gboolean       search_for_object( NactTreeModel *model, GtkTreeModel *store, const NAObject *object, GtkTreeIter *iter );
-static gboolean       search_for_objet_iter( NactTreeModel *model, GtkTreePath *path, NAObject *object, ntmSearchStruct *ntm );
-static void           update_parent( GtkTreeModel *store, GtkTreeIter *iter );
+/*static gboolean       search_for_object( NactTreeModel *model, GtkTreeModel *store, const NAObject *object, GtkTreeIter *iter );
+static gboolean       search_for_objet_iter( NactTreeModel *model, GtkTreePath *path, NAObject *object, ntmSearchStruct *ntm );*/
 
 static gboolean       imulti_drag_source_row_draggable( EggTreeMultiDragSource *drag_source, GList *path_list );
 static gboolean       imulti_drag_source_drag_data_get( EggTreeMultiDragSource *drag_source, GdkDragContext *context, GtkSelectionData *selection_data, GList *path_list, guint info );
@@ -627,18 +626,109 @@ nact_tree_model_get_items_count( NactTreeModel *model )
 }
 
 /**
- * nact_tree_model_insert_item:
+ * nact_tree_model_insert:
  * @model: this #NactTreeModel instance.
- * @object: the #NAObject-derived object to be inserted.
+ * @object: a #NAObject-derived object to be inserted.
  * @path: the #GtkTreePath of the beginning of the current selection,
  * or NULL.
- * @selected: the first currently selected #NAObject if any, or NULL.
- * In other words, @selected is the item selected at @path.
- * @iter: a #GtkTreeIter which will be set to the new row.
+ * @iter: set to the new row
+ * @obj_parent: set to the parent or the object itself.
  *
- * Insert a new row at the given position.
+ * Insert new rows starting at the given position.
  */
 void
+nact_tree_model_insert( NactTreeModel *model, const NAObject *object, GtkTreePath *path, GtkTreeIter *iter, NAObject **obj_parent )
+{
+	static const gchar *thisfn = "nact_tree_model_insert";
+	gchar *path_str;
+	GtkTreeModel *store;
+	GtkTreeIter sibling;
+	GtkTreeIter *parent_iter;
+	GtkTreeIter select_iter;
+	GtkTreeIter store_iter;
+	NAObject *selected;
+	/*GtkTreeIter profile_iter;*/
+	/*GList *profiles;*/
+
+	path_str = path ? gtk_tree_path_to_string( path ) : NULL;
+	g_debug( "%s: model=%p, object=%p (%s), path=%p (%s), iter=%p",
+			thisfn, ( void * ) model,
+			( void * ) object, G_OBJECT_TYPE_NAME( object ),
+			( void * ) path, path_str,
+			( void * ) iter );
+	g_free( path_str );
+
+	g_return_if_fail( NACT_IS_TREE_MODEL( model ));
+	g_return_if_fail( NA_IS_OBJECT( object ));
+	g_return_if_fail( iter );
+
+	store = gtk_tree_model_filter_get_model( GTK_TREE_MODEL_FILTER( model ));
+	parent_iter = NULL;
+	*obj_parent = NA_OBJECT( object );
+
+	if( path ){
+		gtk_tree_model_get_iter( GTK_TREE_MODEL( model ), &select_iter, path );
+		gtk_tree_model_get( GTK_TREE_MODEL( model ), &select_iter, IACTIONS_LIST_NAOBJECT_COLUMN, &selected, -1 );
+
+		g_return_if_fail( selected );
+		g_return_if_fail( NA_IS_OBJECT( selected ));
+
+		if( NA_IS_OBJECT_ITEM( object )){
+			if( !NA_IS_OBJECT_ITEM( selected )){
+				gtk_tree_path_up( path );
+			}
+			gtk_tree_model_get_iter( store, &sibling, path );
+			if( NA_IS_OBJECT_MENU( selected )){
+				parent_iter = gtk_tree_iter_copy( &sibling );
+				na_object_insert_item( selected, object );
+				*obj_parent = selected;
+			}
+		}
+
+		if( NA_IS_OBJECT_PROFILE( object )){
+			if( NA_IS_OBJECT_ACTION( selected )){
+				/*g_debug( "nact_tree_model_insert_item: object_is_action_profile, selected_is_action" );*/
+				na_object_action_attach_profile( NA_OBJECT_ACTION( selected ), NA_OBJECT_PROFILE( object ));
+				gtk_tree_model_get_iter( store, &sibling, path );
+				parent_iter = gtk_tree_iter_copy( &sibling );
+				*obj_parent = selected;
+			} else {
+				g_return_if_fail( NA_IS_OBJECT_PROFILE( selected ));
+				*obj_parent = NA_OBJECT( na_object_profile_get_action( NA_OBJECT_PROFILE( object )));
+				gtk_tree_path_down( path );
+				gtk_tree_model_get_iter( store, &sibling, path );
+			}
+		}
+
+		g_object_unref( selected );
+
+	} else {
+		g_return_if_fail( NA_IS_OBJECT_ITEM( object ));
+	}
+
+	gtk_tree_store_insert_before( GTK_TREE_STORE( store ), &store_iter, parent_iter, parent_iter ? NULL : ( path ? &sibling : NULL ));
+	gtk_tree_store_set( GTK_TREE_STORE( store ), &store_iter, IACTIONS_LIST_NAOBJECT_COLUMN, object, -1 );
+	display_item( GTK_TREE_STORE( store ), model->private->treeview, &store_iter, object );
+
+	if( parent_iter ){
+		gtk_tree_iter_free( parent_iter );
+	}
+
+	/*if( NA_IS_OBJECT_ACTION( object )){
+		g_return_if_fail( na_object_get_items_count( object ) == 1 );
+		profiles = na_object_get_items( object );
+		append_item( GTK_TREE_STORE( store ), model->private->treeview, &store_iter, &profile_iter, NA_OBJECT( profiles->data ));
+		na_object_free_items( profiles );
+	}*/
+
+	/*nact_tree_model_update_parent( model, object );
+	gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( model ));*/
+
+	gtk_tree_model_filter_convert_child_iter_to_iter( GTK_TREE_MODEL_FILTER( model ), iter, &store_iter );
+}
+
+#if 0
+void
 nact_tree_model_insert_item( NactTreeModel *model, const NAObject *object, GtkTreePath *path, const NAObject *selected, GtkTreeIter *iter )
 {
 	static const gchar *thisfn = "nact_tree_model_insert_item";
@@ -709,6 +799,7 @@ nact_tree_model_insert_item( NactTreeModel *model, const NAObject *object, GtkTr
 	gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( model ));
 	gtk_tree_model_filter_convert_child_iter_to_iter( GTK_TREE_MODEL_FILTER( model ), iter, &store_iter );
 }
+#endif
 
 void
 nact_tree_model_iter( NactTreeModel *model, FnIterOnStore fn, gpointer user_data )
@@ -755,28 +846,6 @@ nact_tree_model_remove( NactTreeModel *model, GList *selected )
 	}
 }
 
-/**
- * Recursively update the parent hierarchy of this #NAObject
- * by setting their modified status to %TRUE.
- */
-void
-nact_tree_model_update_parent( NactTreeModel *model, const NAObject *object )
-{
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-
-	g_return_if_fail( NACT_IS_TREE_MODEL( model ));
-	g_return_if_fail( NA_IS_OBJECT( object ));
-
-	store = gtk_tree_model_filter_get_model( GTK_TREE_MODEL_FILTER( model ));
-
-	if( search_for_object( model, store, object, &iter )){
-		update_parent( store, &iter );
-	}
-
-	gtk_tree_model_filter_refilter( GTK_TREE_MODEL_FILTER( model ));
-}
-
 static void
 append_item( GtkTreeStore *model, GtkTreeView *treeview, GtkTreeIter *parent, GtkTreeIter *iter, const NAObject *object )
 {
@@ -857,7 +926,7 @@ iter_on_store_item( NactTreeModel *model, GtkTreeModel *store, GtkTreeIter *iter
 	return( stop );
 }
 
-static gboolean
+/*static gboolean
 search_for_object( NactTreeModel *model, GtkTreeModel *store, const NAObject *object, GtkTreeIter *result_iter )
 {
 	gboolean found = FALSE;
@@ -888,24 +957,10 @@ search_for_objet_iter( NactTreeModel *model, GtkTreePath *path, NAObject *object
 		if( gtk_tree_model_get_iter( ntm->store, ntm->iter, path )){
 			ntm->found = TRUE;
 		}
-	}
+	}*/
 	/* stop iteration when found */
-	return( ntm->found );
-}
-
-static void
-update_parent( GtkTreeModel *store, GtkTreeIter *iter )
-{
-	GtkTreeIter parent;
-	NAObject *object;
-
-	if( gtk_tree_model_iter_parent( store, &parent, iter )){
-		gtk_tree_model_get( store, &parent, IACTIONS_LIST_NAOBJECT_COLUMN, &object, -1 );
-		/*na_object_set_modified_status( object, TRUE );*/
-		g_object_unref( object );
-		update_parent( store, &parent );
-	}
-}
+	/*return( ntm->found );
+}*/
 
 /*
  * all rows are draggable
diff --git a/src/nact/nact-tree-model.h b/src/nact/nact-tree-model.h
index 29a04e8..5afd5dc 100644
--- a/src/nact/nact-tree-model.h
+++ b/src/nact/nact-tree-model.h
@@ -94,10 +94,9 @@ void    nact_tree_model_dispose( NactTreeModel *model );
 void    nact_tree_model_dump( NactTreeModel *model );
 void    nact_tree_model_fill( NactTreeModel *model, GList *items, gboolean only_actions);
 guint   nact_tree_model_get_items_count( NactTreeModel *model );
-void    nact_tree_model_insert_item( NactTreeModel *model, const NAObject *object, GtkTreePath *path, const NAObject *selected, GtkTreeIter *iter );
+void    nact_tree_model_insert( NactTreeModel *model, const NAObject *object, GtkTreePath *path, GtkTreeIter *iter, NAObject **parent );
 void    nact_tree_model_iter( NactTreeModel *model, FnIterOnStore fn, gpointer user_data );
 void    nact_tree_model_remove( NactTreeModel *model, GList *selected );
-void    nact_tree_model_update_parent( NactTreeModel *model, const NAObject *object );
 
 G_END_DECLS
 
diff --git a/src/nact/nact-window.c b/src/nact/nact-window.c
index 5405b1a..0698738 100644
--- a/src/nact/nact-window.c
+++ b/src/nact/nact-window.c
@@ -274,35 +274,59 @@ nact_window_delete_object_item( NactWindow *window, NAObjectItem *item )
  * @window: this #NactWindow-derived instance.
  * @items: full current tree of items in #NactIActionsList treeview.
  *
- * Writes as a GConf preference order and content of level zero items
- * if it has been modified.
+ * Writes as a GConf preference order and content of level zero items.
  */
 void
-nact_window_write_level_zero( NactWindow *window, GSList *items )
+nact_window_write_level_zero( NactWindow *window, GList *items )
 {
-	GSList *it;
-	gboolean modified;
+	static const gchar *thisfn = "nact_window_write_level_zero";
+	GList *it;
 	gchar *id;
 	GSList *content;
 	NactApplication *application;
 	NAPivot *pivot;
 
-	modified = FALSE;
-	for( it = items ; it && !modified ; it = it->next ){
-		modified = na_object_is_modified( it->data );
+	g_debug( "%s: window=%p, items=%p (%d items)", thisfn, ( void * ) window, ( void * ) items, g_list_length( items ));
+	g_return_if_fail( NACT_IS_WINDOW( window ));
+
+	content = NULL;
+	for( it = items ; it ; it = it->next ){
+		id = na_object_get_id( it->data );
+		content = g_slist_prepend( content, id );
 	}
+	content = g_slist_reverse( content );
+
+	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
+	pivot = nact_application_get_pivot( application );
+	na_iprefs_set_level_zero_items( NA_IPREFS( pivot ), content );
+
+	na_utils_free_string_list( content );
+}
 
-	if( modified ){
-		content = NULL;
-		for( it = items ; it && !modified ; it = it->next ){
-			id = na_object_get_id( it->data );
-			content = g_slist_prepend( content, id );
+/**
+ * nact_window_count_level_zero_items:
+ */
+void
+nact_window_count_level_zero_items( GList *items, guint *actions, guint *profiles, guint *menus )
+{
+	GList *it;
+
+	g_return_if_fail( actions );
+	g_return_if_fail( profiles );
+	g_return_if_fail( menus );
+
+	*actions = 0;
+	*profiles = 0;
+	*menus = 0;
+
+	for( it = items ; it ; it = it->next ){
+		if( NA_IS_OBJECT_ACTION( it->data )){
+			*actions += 1;
+		} else if( NA_IS_OBJECT_PROFILE( it->data )){
+			*profiles += 1;
+		} else if( NA_IS_OBJECT_MENU( it->data )){
+			*menus += 1;
 		}
-		content = g_slist_reverse( content );
-		application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
-		pivot = nact_application_get_pivot( application );
-		na_iprefs_set_level_zero_items( NA_IPREFS( pivot ), content );
-		na_utils_free_string_list( content );
 	}
 }
 
diff --git a/src/nact/nact-window.h b/src/nact/nact-window.h
index 36b50e6..0bd49bb 100644
--- a/src/nact/nact-window.h
+++ b/src/nact/nact-window.h
@@ -86,7 +86,8 @@ NAPivot *nact_window_get_pivot( NactWindow *window );
 gboolean nact_window_save_object_item( NactWindow *window, NAObjectItem *item );
 gboolean nact_window_delete_object_item( NactWindow *window, NAObjectItem *item );
 
-void     nact_window_write_level_zero( NactWindow *window, GSList *items );
+void     nact_window_write_level_zero( NactWindow *window, GList *items );
+void     nact_window_count_level_zero_items( GList *items, guint *actions, guint *profiles, guint *menus );
 
 gboolean nact_window_warn_count_modified( NactWindow *window, gint count );
 
diff --git a/src/nact/nautilus-actions-config-tool.ui b/src/nact/nautilus-actions-config-tool.ui
index 6d4e72d..bea6bb8 100644
--- a/src/nact/nautilus-actions-config-tool.ui
+++ b/src/nact/nautilus-actions-config-tool.ui
@@ -940,7 +940,7 @@ Defining several profiles lets you have several commands, each applying with a d
                       </packing>
                     </child>
                     <child type="tab">
-                      <object class="GtkLabel" id="label1">
+                      <object class="GtkLabel" id="label15">
                         <property name="visible">True</property>
                         <property name="tooltip_text" translatable="yes">This advanced tab lets you precisely choose on which schemes the selection will apply.</property>
                         <property name="label" translatable="yes">A_dvanced conditions</property>
@@ -1000,7 +1000,7 @@ Defining several profiles lets you have several commands, each applying with a d
     <property name="title" translatable="yes">Importing actions</property>
     <property name="modal">True</property>
     <child>
-      <object class="GtkLabel" id="label1">
+      <object class="GtkLabel" id="label3">
         <property name="visible">True</property>
         <property name="label" translatable="yes">This assistant will guide you through the process of importing actions.</property>
       </object>
@@ -1011,338 +1011,33 @@ Defining several profiles lets you have several commands, each applying with a d
     <child>
       <object class="GtkFileChooserWidget" id="filechooserwidget1">
         <property name="visible">True</property>
-        <property name="preview_widget_active">False</property>
         <property name="use_preview_label">False</property>
         <property name="local_only">False</property>
         <property name="select_multiple">True</property>
+        <property name="preview_widget_active">False</property>
       </object>
     </child>
     <child>
-      <object class="GtkLabel" id="label3">
-        <property name="visible">True</property>
-      </object>
-      <packing>
-        <property name="page_type">confirm</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkLabel" id="label2">
-        <property name="visible">True</property>
-      </object>
-      <packing>
-        <property name="page_type">summary</property>
-      </packing>
-    </child>
-  </object>
-  <object class="GtkAssistant" id="ExportAssistant">
-    <property name="events">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property>
-    <property name="border_width">12</property>
-    <property name="title" translatable="yes">Exporting actions</property>
-    <property name="modal">True</property>
-    <child>
-      <object class="GtkLabel" id="label1">
-        <property name="visible">True</property>
-        <property name="label" translatable="yes">This assistant will guide you through the process of exporting actions.</property>
-      </object>
-      <packing>
-        <property name="page_type">intro</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkHBox" id="hbox1">
-        <property name="visible">True</property>
-        <child>
-          <object class="GtkVBox" id="vbox5">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkLabel" id="ActionsListLabel">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="xpad">4</property>
-                <property name="ypad">4</property>
-                <property name="label" translatable="yes">Actions _list :</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkScrolledWindow" id="scrolledwindow1">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="hscrollbar_policy">automatic</property>
-                <property name="vscrollbar_policy">automatic</property>
-                <property name="shadow_type">in</property>
-                <child>
-                  <object class="GtkTreeView" id="ActionsList">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="headers_visible">False</property>
-                    <property name="rules_hint">True</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="label2">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Please select one or more actions
-to be exported.
-
-You may use Ctrl and Shift keys
-to extend a selection.</property>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title">Selection of the exported actions</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkHBox" id="hbox2">
-        <property name="visible">True</property>
-        <child>
-          <object class="GtkFileChooserWidget" id="ExportFolderChooser">
-            <property name="visible">True</property>
-            <property name="preview_widget_active">False</property>
-            <property name="use_preview_label">False</property>
-            <property name="local_only">False</property>
-            <property name="action">select-folder</property>
-          </object>
-          <packing>
-            <property name="position">0</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title">Selection of the target folder</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkVBox" id="vbox1">
-        <property name="visible">True</property>
-        <property name="border_width">10</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkVBox" id="vbox2">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkRadioButton" id="ExportSchemaV1Button">
-                <property name="label" translatable="yes">Export as a GConf schema file with full key descriptions.</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="active">True</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox4">
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkRadioButton" id="ExportHide1">
-                    <property name="sensitive">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="receives_default">False</property>
-                    <property name="focus_on_click">False</property>
-                    <property name="draw_indicator">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="padding">2</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="ExportSchemaV1Label">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">This used to be the historical export format.
-The exported file may later be imported via :
-- Import assistant of the Nautilus Actions Configuration Tool,
-- or via the gconftool-2 --import-schema-file command-line tool.</property>
-                  </object>
-                  <packing>
-                    <property name="padding">4</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkVBox" id="vbox3">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkRadioButton" id="ExportSchemaV2Button">
-                <property name="label" translatable="yes">Export as a light GConf schema file.</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="xalign">0</property>
-                <property name="active">True</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">ExportSchemaV1Button</property>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox5">
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkRadioButton" id="ExportHide2">
-                    <property name="sensitive">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="receives_default">False</property>
-                    <property name="focus_on_click">False</property>
-                    <property name="draw_indicator">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="padding">2</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="ExportSchemaV2Label">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">The exported file may later be imported via :
-- Import assistant of the Nautilus Actions Configuration Tool,
-- or via the gconftool-2 --import-schema-file command-line tool.</property>
-                  </object>
-                  <packing>
-                    <property name="padding">4</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkVBox" id="vbox4">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkRadioButton" id="ExportGConfDumpButton">
-                <property name="label" translatable="yes">Export as a GConf dump file.</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="xalign">0</property>
-                <property name="active">True</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">ExportSchemaV1Button</property>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox6">
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkRadioButton" id="ExportHide3">
-                    <property name="sensitive">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="receives_default">False</property>
-                    <property name="focus_on_click">False</property>
-                    <property name="draw_indicator">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="padding">2</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="ExportGConfDumpLabel">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">This should be the preferred format for newly exported actions.
-The exported file may later be imported via :
-- Import assistant of the Nautilus Actions Configuration Tool,
-- or via the gconftool-2 --load command-line tool.</property>
-                  </object>
-                  <packing>
-                    <property name="padding">4</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title">Select the export format</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkLabel" id="label3">
+      <object class="GtkLabel" id="label17">
         <property name="visible">True</property>
-        <property name="use_markup">True</property>
       </object>
       <packing>
         <property name="page_type">confirm</property>
-        <property name="title">Summary</property>
       </packing>
     </child>
     <child>
-      <object class="GtkLabel" id="label4">
+      <object class="GtkLabel" id="label18">
         <property name="visible">True</property>
-        <property name="use_markup">True</property>
       </object>
       <packing>
         <property name="page_type">summary</property>
-        <property name="title">Export is done</property>
       </packing>
     </child>
   </object>
   <object class="GtkWindow" id="LegendDialog">
     <property name="type_hint">dialog</property>
     <child>
-      <object class="GtkVBox" id="vbox11">
+      <object class="GtkVBox" id="vbox16">
         <property name="visible">True</property>
         <property name="border_width">12</property>
         <property name="spacing">6</property>
@@ -1391,14 +1086,14 @@ The exported file may later be imported via :
           </packing>
         </child>
         <child>
-          <object class="GtkTable" id="table1">
+          <object class="GtkTable" id="table5">
             <property name="visible">True</property>
             <property name="n_rows">11</property>
             <property name="n_columns">2</property>
             <property name="column_spacing">2</property>
             <property name="row_spacing">6</property>
             <child>
-              <object class="GtkLabel" id="label3">
+              <object class="GtkLabel" id="label20">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1410,7 +1105,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label4">
+              <object class="GtkLabel" id="label21">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1438,7 +1133,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label6">
+              <object class="GtkLabel" id="label22">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1452,7 +1147,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label7">
+              <object class="GtkLabel" id="label23">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1466,7 +1161,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label8">
+              <object class="GtkLabel" id="label33">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1494,7 +1189,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label10">
+              <object class="GtkLabel" id="label35">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1522,7 +1217,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label12">
+              <object class="GtkLabel" id="label36">
                 <property name="visible">True</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
@@ -1563,7 +1258,7 @@ The exported file may later be imported via :
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label19">
+              <object class="GtkLabel" id="label37">
                 <property name="visible">True</property>
                 <property name="xalign">0</property>
                 <property name="yalign">0</property>
@@ -1743,7 +1438,7 @@ The exported file may later be imported via :
                 <property name="visible">True</property>
                 <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkVBox" id="vbox2">
+                  <object class="GtkVBox" id="vbox17">
                     <property name="visible">True</property>
                     <property name="border_width">10</property>
                     <property name="orientation">vertical</property>
@@ -1841,16 +1536,16 @@ The exported file may later be imported via :
   </object>
   <object class="GtkSizeGroup" id="CommandLabelSizeGroup">
     <widgets>
-      <widget name="ProfileLabelLabel"/>
-      <widget name="CommandPathLabel"/>
-      <widget name="CommandParametersLabel"/>
       <widget name="CommandExamplePreLabel"/>
+      <widget name="CommandParametersLabel"/>
+      <widget name="CommandPathLabel"/>
+      <widget name="ProfileLabelLabel"/>
     </widgets>
   </object>
   <object class="GtkSizeGroup" id="CommandButtonSizeGroup">
     <widgets>
-      <widget name="CommandPathButton"/>
       <widget name="CommandLegendButton"/>
+      <widget name="CommandPathButton"/>
     </widgets>
   </object>
 </interface>



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