[nautilus-actions] Manage locked and mandatory preferences



commit 3381255179f8bce958a9827b5ae573401b1298bf
Author: Pierre Wieser <pwieser trychlos org>
Date:   Wed Jan 19 00:21:34 2011 +0100

    Manage locked and mandatory preferences

 ChangeLog                          |   31 ++
 src/core/na-export-format.c        |    5 +-
 src/core/na-importer-ask.c         |    4 +-
 src/core/na-importer.c             |    4 +-
 src/core/na-io-provider.c          |   51 ++-
 src/core/na-iprefs.c               |   18 +-
 src/core/na-iprefs.h               |    6 +-
 src/core/na-settings.c             |  103 +++---
 src/nact/nact-assistant-export.c   |   38 ++-
 src/nact/nact-assistant-import.c   |    2 +-
 src/nact/nact-clipboard.c          |   22 +-
 src/nact/nact-export-ask.c         |  118 ++++--
 src/nact/nact-export-ask.h         |    2 +-
 src/nact/nact-export-format.c      |  171 +++++--
 src/nact/nact-export-format.h      |   13 +-
 src/nact/nact-gtk-utils.c          |  166 ++++++--
 src/nact/nact-gtk-utils.h          |   15 +-
 src/nact/nact-ienvironment-tab.c   |   26 +-
 src/nact/nact-iexecution-tab.c     |   25 +-
 src/nact/nact-main-window.c        |    2 +-
 src/nact/nact-preferences-editor.c |  876 +++++++++++++++++++++++++-----------
 src/nact/nact-preferences.ui       |   23 +-
 src/nact/nact-tree-model-dnd.c     |    2 +-
 src/nact/nact-tree-model.c         |    2 +-
 24 files changed, 1223 insertions(+), 502 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 40042ff..e065cdd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,37 @@
 
 	* NEWS: Update before release.
 
+2011-01-18 Pierre Wieser <pwieser trychlos org>
+
+	* src/core/na-export-format.c (na_export_format_get_description):
+	* src/core/na-importer-ask.c (na_importer_ask_user):
+	* src/core/na-importer.c (import_from_uri):
+	* src/core/na-io-provider.c (na_io_provider_get_name):
+	* src/core/na-iprefs.c:
+	* src/core/na-iprefs.h (na_iprefs_get_import_mode,
+	na_iprefs_get_order_mode, na_iprefs_get_export_format):
+	* src/core/na-settings.c:
+	* src/nact/nact-assistant-export.c (on_initial_load_dialog):
+	* nact/nact-assistant-import.c (runtime_init_duplicates):
+	* src/nact/nact-clipboard.c (export_row_object):
+	* src/nact/nact-export-ask.c:
+	* nact/nact-export-format.c:
+	* src/nact/nact-export-format.h(nact_export_format_init_display):
+	* src/nact/nact-gtk-utils.c:
+	* src/nact/nact-gtk-utils.h (nact_gtk_utils_radio_set_initial_state,
+	nact_gtk_utils_radio_reset_initial_state,
+	nact_gtk_utils_toggle_set_initial_state,
+	nact_gtk_utils_toggle_reset_initial_state):
+	* src/nact/nact-ienvironment-tab.c
+	(on_tab_updatable_selection_changed):
+	* src/nact/nact-iexecution-tab.c (on_tab_updatable_selection_changed):
+	* src/nact/nact-main-window.c (on_base_runtime_init_toplevel):
+	* src/nact/nact-preferences-editor.c:
+	* src/nact/nact-preferences.ui:
+	* src/nact/nact-tree-model-dnd.c (drop_uri_list):
+	* src/nact/nact-tree-model.c (tree_model_new):
+	Manage locked and mandatory preferences.
+
 	* src/core/na-boxed.c (na_boxed_new_from_string_with_sep):
 	Do not eat last character.
 
diff --git a/src/core/na-export-format.c b/src/core/na-export-format.c
index c3b59dc..bec2ffe 100644
--- a/src/core/na-export-format.c
+++ b/src/core/na-export-format.c
@@ -292,7 +292,10 @@ na_export_format_get_description( const NAExportFormat *format )
  * na_export_format_get_exporter:
  * @format: this #NAExportFormat object.
  *
- * Returns: a pointer to the #NAIExporter which providers this format.
+ * Returns: a pointer to the #NAIExporter which provides this format.
+ *
+ * The pointer is owned by NAEportFormat class, and should not be released
+ * by the caller.
  */
 NAIExporter *
 na_export_format_get_exporter( const NAExportFormat *format )
diff --git a/src/core/na-importer-ask.c b/src/core/na-importer-ask.c
index 8220820..e62d067 100644
--- a/src/core/na-importer-ask.c
+++ b/src/core/na-importer-ask.c
@@ -251,7 +251,7 @@ na_importer_ask_user( const NAObjectItem *importing, const NAObjectItem *existin
 		dialog->private->importing = ( NAObjectItem * ) importing;
 		dialog->private->existing = ( NAObjectItem * ) existing;
 		dialog->private->parms = parms;
-		dialog->private->mode = na_iprefs_get_import_mode( parms->pivot, NA_IPREFS_IMPORT_ASK_USER_LAST_MODE );
+		dialog->private->mode = na_iprefs_get_import_mode( parms->pivot, NA_IPREFS_IMPORT_ASK_USER_LAST_MODE, NULL );
 
 		init_dialog( dialog );
 		/* toplevel is modal, not dialog
@@ -391,7 +391,7 @@ get_selected_mode( NAImporterAsk *editor )
 
 	button = na_gtk_utils_search_for_child_widget( GTK_CONTAINER( editor->private->toplevel ), "AskKeepChoiceButton" );
 	keep = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( na_pivot_get_settings( editor->private->parms->pivot ), NA_IPREFS_IMPORT_MODE_KEEP_LAST_CHOICE, keep );
+	na_settings_set_boolean( na_pivot_get_settings( editor->private->parms->pivot ), NA_IPREFS_IMPORT_ASK_USER_KEEP_LAST_CHOICE, keep );
 }
 
 /*
diff --git a/src/core/na-importer.c b/src/core/na-importer.c
index 44240a4..f5a58c0 100644
--- a/src/core/na-importer.c
+++ b/src/core/na-importer.c
@@ -151,7 +151,7 @@ import_from_uri( const NAPivot *pivot, GList *modules, NAImporterParms *parms, c
 	ask_parms.parent = parms->parent;
 	ask_parms.uri = ( gchar * ) uri;
 	ask_parms.count = g_list_length( parms->results );
-	ask_parms.keep_choice = na_settings_get_boolean( na_pivot_get_settings( pivot ), NA_IPREFS_IMPORT_MODE_KEEP_LAST_CHOICE, NULL, NULL );
+	ask_parms.keep_choice = na_settings_get_boolean( na_pivot_get_settings( pivot ), NA_IPREFS_IMPORT_ASK_USER_KEEP_LAST_CHOICE, NULL, NULL );
 	ask_parms.pivot = pivot;
 
 	memset( &provider_parms, '\0', sizeof( NAIImporterImportFromUriParms ));
@@ -229,7 +229,7 @@ ask_user_for_mode( const NAObjectItem *importing, const NAObjectItem *existing,
 		mode = na_importer_ask_user( importing, existing, parms );
 
 	} else {
-		mode = na_iprefs_get_import_mode( parms->pivot, NA_IPREFS_IMPORT_ASK_USER_LAST_MODE );
+		mode = na_iprefs_get_import_mode( parms->pivot, NA_IPREFS_IMPORT_ASK_USER_LAST_MODE, NULL );
 	}
 
 	return( mode );
diff --git a/src/core/na-io-provider.c b/src/core/na-io-provider.c
index 13edbca..a7389c0 100644
--- a/src/core/na-io-provider.c
+++ b/src/core/na-io-provider.c
@@ -86,6 +86,7 @@ static GList        *io_providers_list_add_from_plugins( const NAPivot *pivot, G
 static GList        *io_providers_list_add_from_prefs( const NAPivot *pivot, GList *objects_list );
 static GList        *io_providers_list_add_from_write_order( const NAPivot *pivot, GList *objects_list );
 static GList        *io_providers_list_append_object( const NAPivot *pivot, GList *list, NAIIOProvider *module, const gchar *id );
+static void          io_providers_list_set_module( const NAPivot *pivot, NAIOProvider *provider_object, NAIIOProvider *provider_module );
 static gboolean      is_really_writable( const NAIOProvider *provider, const NAPivot *pivot );
 static GList        *load_items_filter_unwanted_items( const NAPivot *pivot, GList *merged, guint loadable_set );
 static GList        *load_items_filter_unwanted_items_rec( GList *merged, guint loadable_set );
@@ -451,14 +452,15 @@ na_io_provider_get_name( const NAIOProvider *provider )
 	g_return_val_if_fail( NA_IS_IO_PROVIDER( provider ), name );
 
 	if( !provider->private->dispose_has_run ){
-
-		if( NA_IIO_PROVIDER_GET_INTERFACE( provider->private->provider )->get_name ){
-			g_free( name );
-			name = NULL;
-			name = NA_IIO_PROVIDER_GET_INTERFACE( provider->private->provider )->get_name( provider->private->provider );
-			if( !name ){
-				g_warning( "%s: NAIIOProvider %s get_name() interface returns NULL", thisfn, provider->private->id );
-				name = g_strdup( "" );
+		if( na_io_provider_is_available( provider ) &&
+			NA_IIO_PROVIDER_GET_INTERFACE( provider->private->provider )->get_name ){
+
+				g_free( name );
+				name = NULL;
+				name = NA_IIO_PROVIDER_GET_INTERFACE( provider->private->provider )->get_name( provider->private->provider );
+				if( !name ){
+					g_warning( "%s: NAIIOProvider %s get_name() interface returns NULL", thisfn, provider->private->id );
+					name = g_strdup( "" );
 			}
 
 		} else {
@@ -703,7 +705,7 @@ na_io_provider_load_items( const NAPivot *pivot, guint loadable_set, GSList **me
 
 	/* sort the hierarchy according to preferences
 	 */
-	order_mode = na_iprefs_get_order_mode( pivot );
+	order_mode = na_iprefs_get_order_mode( pivot, NULL );
 	switch( order_mode ){
 		case IPREFS_ORDER_ALPHA_ASCENDING:
 			hierarchy = load_items_hierarchy_sort( pivot, hierarchy, ( GCompareFunc ) na_object_id_sort_alpha_asc );
@@ -757,20 +759,21 @@ dump_providers_list( GList *providers )
 
 /*
  * allocate a new NAIOProvider object for the specified module and id
+ *
+ * id is mandatory here
+ * module may be NULL
  */
 static NAIOProvider *
 io_provider_new( const NAPivot *pivot, NAIIOProvider *module, const gchar *id )
 {
 	NAIOProvider *object;
 
+	g_return_val_if_fail( id && strlen( id ), NULL );
+
 	object = g_object_new( NA_IO_PROVIDER_TYPE, IO_PROVIDER_PROP_ID, id, NULL );
 
 	if( module ){
-		object->private->provider = g_object_ref( module );
-		object->private->item_changed_handler =
-				g_signal_connect(
-						module, IO_PROVIDER_SIGNAL_ITEM_CHANGED,
-						( GCallback ) na_pivot_on_item_changed_handler, ( gpointer ) pivot );
+		io_providers_list_set_module( pivot, object, module );
 	}
 
 	return( object );
@@ -834,12 +837,13 @@ io_providers_list_add_from_prefs( const NAPivot *pivot, GList *objects_list )
 	GSList *io_providers, *it;
 
 	merged = objects_list;
-
 	io_providers = na_iprefs_get_io_providers( pivot );
+
 	for( it = io_providers ; it ; it = it->next ){
 		id = ( const gchar * ) it->data;
 		merged = io_providers_list_append_object( pivot, merged, NULL, id );
 	}
+
 	na_core_utils_slist_free( io_providers );
 
 	return( merged );
@@ -847,7 +851,7 @@ io_providers_list_add_from_prefs( const NAPivot *pivot, GList *objects_list )
 
 /*
  * adding from write-order means we only create NAIOProvider objects
- * without having any ref to the underlying NAIIOProvider if it exists
+ * without having any pointer to the underlying NAIIOProvider (if it exists)
  */
 static GList *
 io_providers_list_add_from_write_order( const NAPivot *pivot, GList *objects_list )
@@ -865,6 +869,7 @@ io_providers_list_add_from_write_order( const NAPivot *pivot, GList *objects_lis
 		id = ( const gchar * ) it->data;
 		merged = io_providers_list_append_object( pivot, merged, NULL, id );
 	}
+
 	na_core_utils_slist_free( io_providers );
 
 	return( merged );
@@ -887,13 +892,23 @@ io_providers_list_append_object( const NAPivot *pivot, GList *list, NAIIOProvide
 		object = io_provider_new( pivot, module, id );
 		merged = g_list_append( merged, object );
 
-	} else if( !object->private->provider && module ){
-		object->private->provider = module;
+	} else if( module && !object->private->provider ){
+		io_providers_list_set_module( pivot, object, module );
 	}
 
 	return( merged );
 }
 
+static void
+io_providers_list_set_module( const NAPivot *pivot, NAIOProvider *provider_object, NAIIOProvider *provider_module )
+{
+	provider_object->private->provider = g_object_ref( provider_module );
+	provider_object->private->item_changed_handler =
+			g_signal_connect(
+					provider_module, IO_PROVIDER_SIGNAL_ITEM_CHANGED,
+					( GCallback ) na_pivot_on_item_changed_handler, ( gpointer ) pivot );
+}
+
 /*
  * is_really_writable:
  * @provider: the #NAIOProvider provider.
diff --git a/src/core/na-iprefs.c b/src/core/na-iprefs.c
index 42e9f25..b1572fb 100644
--- a/src/core/na-iprefs.c
+++ b/src/core/na-iprefs.c
@@ -83,6 +83,8 @@ static guint        enum_map_id_from_string( const EnumMap *map, const gchar *st
  * na_iprefs_get_import_mode:
  * @pivot: the #NAPivot application object.
  * @pref: name of the import key to be readen.
+ * @mandatory: if not %NULL, a pointer to a boolean which will receive the
+ *  mandatory property.
  *
  * This preference defines what to do when an imported item has the same
  * identifier that an already existing one. Default value is defined in
@@ -91,14 +93,14 @@ static guint        enum_map_id_from_string( const EnumMap *map, const gchar *st
  * Returns: the import mode currently set.
  */
 guint
-na_iprefs_get_import_mode( const NAPivot *pivot, const gchar *pref )
+na_iprefs_get_import_mode( const NAPivot *pivot, const gchar *pref, gboolean *mandatory )
 {
 	gchar *import_mode_str;
 	guint import_mode;
 	NASettings *settings;
 
 	settings = na_pivot_get_settings( pivot );
-	import_mode_str = na_settings_get_string( settings, pref, NULL, NULL );
+	import_mode_str = na_settings_get_string( settings, pref, NULL, mandatory );
 	import_mode = enum_map_id_from_string( st_import_mode, import_mode_str );
 	g_free( import_mode_str );
 
@@ -127,18 +129,20 @@ na_iprefs_set_import_mode( const NAPivot *pivot, const gchar *pref, guint mode )
 /*
  * na_iprefs_get_order_mode:
  * @pivot: the #NAPivot application object.
+ * @mandatory: if not %NULL, a pointer to a boolean which will receive the
+ *  mandatory property.
  *
  * Returns: the order mode currently set.
  */
 guint
-na_iprefs_get_order_mode( const NAPivot *pivot )
+na_iprefs_get_order_mode( const NAPivot *pivot, gboolean *mandatory )
 {
 	gchar *order_mode_str;
 	guint order_mode;
 	NASettings *settings;
 
 	settings = na_pivot_get_settings( pivot );
-	order_mode_str = na_settings_get_string( settings, NA_IPREFS_ITEMS_LIST_ORDER_MODE, NULL, NULL );
+	order_mode_str = na_settings_get_string( settings, NA_IPREFS_ITEMS_LIST_ORDER_MODE, NULL, mandatory );
 	order_mode = enum_map_id_from_string( st_order_mode, order_mode_str );
 	g_free( order_mode_str );
 
@@ -168,6 +172,8 @@ na_iprefs_set_order_mode( const NAPivot *pivot, guint mode )
  * na_iprefs_get_export_format:
  * @pivot: the #NAPivot application object.
  * @name: name of the export format key to be readen
+ * @mandatory: if not %NULL, a pointer to a boolean which will receive the
+ *  mandatory property.
  *
  * Used to default to export as a GConfEntry.
  * Starting with 3.1.0, defaults to Desktop1 (see. core/na-settings.h)
@@ -175,7 +181,7 @@ na_iprefs_set_order_mode( const NAPivot *pivot, guint mode )
  * Returns: the export format currently set as a #GQuark.
  */
 GQuark
-na_iprefs_get_export_format( const NAPivot *pivot, const gchar *name )
+na_iprefs_get_export_format( const NAPivot *pivot, const gchar *name, gboolean *mandatory )
 {
 	GQuark export_format;
 	NASettings *settings;
@@ -184,7 +190,7 @@ na_iprefs_get_export_format( const NAPivot *pivot, const gchar *name )
 	export_format = g_quark_from_static_string( NA_IPREFS_DEFAULT_EXPORT_FORMAT );
 
 	settings = na_pivot_get_settings( pivot );
-	format_str = na_settings_get_string( settings, name, NULL, NULL );
+	format_str = na_settings_get_string( settings, name, NULL, mandatory );
 
 	if( format_str ){
 		export_format = g_quark_from_string( format_str );
diff --git a/src/core/na-iprefs.h b/src/core/na-iprefs.h
index 6c1772e..5fee930 100644
--- a/src/core/na-iprefs.h
+++ b/src/core/na-iprefs.h
@@ -52,13 +52,13 @@ enum {
 	IPREFS_ORDER_MANUAL
 };
 
-guint    na_iprefs_get_import_mode       ( const NAPivot *pivot, const gchar *pref );
+guint    na_iprefs_get_import_mode       ( const NAPivot *pivot, const gchar *pref, gboolean *mandatory );
 void     na_iprefs_set_import_mode       ( const NAPivot *pivot, const gchar *pref, guint mode );
 
-guint    na_iprefs_get_order_mode        ( const NAPivot *pivot );
+guint    na_iprefs_get_order_mode        ( const NAPivot *pivot, gboolean *mandatory );
 void     na_iprefs_set_order_mode        ( const NAPivot *pivot, guint mode );
 
-GQuark   na_iprefs_get_export_format     ( const NAPivot *pivot, const gchar *pref );
+GQuark   na_iprefs_get_export_format     ( const NAPivot *pivot, const gchar *pref, gboolean *mandatory );
 void     na_iprefs_set_export_format     ( const NAPivot *pivot, const gchar *pref, GQuark format );
 
 GSList  *na_iprefs_get_io_providers      ( const NAPivot * );
diff --git a/src/core/na-settings.c b/src/core/na-settings.c
index c5c6f20..cbb5bda 100644
--- a/src/core/na-settings.c
+++ b/src/core/na-settings.c
@@ -111,57 +111,58 @@ typedef struct {
 	KeyDef;
 
 static const KeyDef st_def_keys[] = {
-	{ NA_IPREFS_ADMIN_PREFERENCES_LOCKED,      GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_ADMIN_IO_PROVIDERS_LOCKED,     GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_ASSISTANT_ESC_CONFIRM,         GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_ASSISTANT_ESC_QUIT,            GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_CAPABILITY_ADD_CAPABILITY_WSP, GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_COMMAND_CHOOSER_WSP,           GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_COMMAND_CHOOSER_URI,           GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
-	{ NA_IPREFS_COMMAND_LEGEND_WSP,            GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_WORKING_DIR_WSP,               GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_WORKING_DIR_URI,               GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
-	{ NA_IPREFS_SHOW_IF_RUNNING_WSP,           GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_SHOW_IF_RUNNING_URI,           GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
-	{ NA_IPREFS_TRY_EXEC_WSP,                  GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_TRY_EXEC_URI,                  GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
-	{ NA_IPREFS_EXPORT_ASK_USER_WSP,           GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT,   GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_EXPORT_FORMAT },
-	{ NA_IPREFS_EXPORT_ASSISTANT_WSP,          GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_EXPORT_ASSISTANT_URI,          GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///tmp" },
-	{ NA_IPREFS_EXPORT_PREFERRED_FORMAT,       GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_EXPORT_FORMAT },
-	{ NA_IPREFS_FOLDER_CHOOSER_WSP,            GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_FOLDER_CHOOSER_URI,            GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
-	{ NA_IPREFS_IMPORT_ASK_USER_WSP,           GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_IMPORT_ASK_USER_LAST_MODE,     GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_IMPORT_MODE },
-	{ NA_IPREFS_IMPORT_ASSISTANT_WSP,          GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_IMPORT_ASSISTANT_URI,          GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///tmp" },
-	{ NA_IPREFS_IMPORT_MODE_KEEP_LAST_CHOICE,  GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_IMPORT_PREFERRED_MODE,         GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_IMPORT_MODE },
-	{ NA_IPREFS_IO_PROVIDERS_WRITE_ORDER,      GROUP_NACT,    NA_BOXED_TYPE_STRING_LIST, "" },
-	{ NA_IPREFS_ICON_CHOOSER_URI,              GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
-	{ NA_IPREFS_ICON_CHOOSER_PANED,            GROUP_NACT,    NA_BOXED_TYPE_UINT,        "200" },
-	{ NA_IPREFS_ICON_CHOOSER_WSP,              GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_ITEMS_ADD_ABOUT_ITEM,          GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_ITEMS_CREATE_ROOT_MENU,        GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_ITEMS_LEVEL_ZERO_ORDER,        GROUP_RUNTIME, NA_BOXED_TYPE_STRING_LIST, "" },
-	{ NA_IPREFS_ITEMS_LIST_ORDER_MODE,         GROUP_RUNTIME, NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_LIST_ORDER_MODE },
-	{ NA_IPREFS_MAIN_PANED,                    GROUP_NACT,    NA_BOXED_TYPE_UINT,        "200" },
-	{ NA_IPREFS_MAIN_SAVE_AUTO,                GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_MAIN_SAVE_PERIOD,              GROUP_NACT,    NA_BOXED_TYPE_UINT,        "5" },
-	{ NA_IPREFS_MAIN_TOOLBAR_EDIT_DISPLAY,     GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_MAIN_TOOLBAR_FILE_DISPLAY,     GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_MAIN_TOOLBAR_HELP_DISPLAY,     GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
-	{ NA_IPREFS_MAIN_TOOLBAR_TOOLS_DISPLAY,    GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_MAIN_WINDOW_WSP,               GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_PREFERENCES_WSP,               GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_RELABEL_DUPLICATE_ACTION,      GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_RELABEL_DUPLICATE_MENU,        GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_RELABEL_DUPLICATE_PROFILE,     GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
-	{ NA_IPREFS_SCHEME_ADD_SCHEME_WSP,         GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
-	{ NA_IPREFS_SCHEME_DEFAULT_LIST,           GROUP_NACT,    NA_BOXED_TYPE_STRING_LIST, "" },
-	{ NA_IPREFS_IO_PROVIDER_READABLE,          NA_IPREFS_IO_PROVIDER_GROUP, NA_BOXED_TYPE_BOOLEAN, "true" },
-	{ NA_IPREFS_IO_PROVIDER_WRITABLE,          NA_IPREFS_IO_PROVIDER_GROUP, NA_BOXED_TYPE_BOOLEAN, "true" },
+	{ NA_IPREFS_ADMIN_PREFERENCES_LOCKED,         GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_ADMIN_IO_PROVIDERS_LOCKED,        GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_ASSISTANT_ESC_CONFIRM,            GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_ASSISTANT_ESC_QUIT,               GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_CAPABILITY_ADD_CAPABILITY_WSP,    GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_COMMAND_CHOOSER_WSP,              GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_COMMAND_CHOOSER_URI,              GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
+	{ NA_IPREFS_COMMAND_LEGEND_WSP,               GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_WORKING_DIR_WSP,                  GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_WORKING_DIR_URI,                  GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
+	{ NA_IPREFS_SHOW_IF_RUNNING_WSP,              GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_SHOW_IF_RUNNING_URI,              GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
+	{ NA_IPREFS_TRY_EXEC_WSP,                     GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_TRY_EXEC_URI,                     GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///bin" },
+	{ NA_IPREFS_EXPORT_ASK_USER_WSP,              GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT,      GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_EXPORT_FORMAT },
+	{ NA_IPREFS_EXPORT_ASK_USER_KEEP_LAST_CHOICE, GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_EXPORT_ASSISTANT_WSP,             GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_EXPORT_ASSISTANT_URI,             GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///tmp" },
+	{ NA_IPREFS_EXPORT_PREFERRED_FORMAT,          GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_EXPORT_FORMAT },
+	{ NA_IPREFS_FOLDER_CHOOSER_WSP,               GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_FOLDER_CHOOSER_URI,               GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
+	{ NA_IPREFS_IMPORT_ASK_USER_WSP,              GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_IMPORT_ASK_USER_LAST_MODE,        GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_IMPORT_MODE },
+	{ NA_IPREFS_IMPORT_ASSISTANT_WSP,             GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_IMPORT_ASSISTANT_URI,             GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///tmp" },
+	{ NA_IPREFS_IMPORT_ASK_USER_KEEP_LAST_CHOICE, GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_IMPORT_PREFERRED_MODE,            GROUP_NACT,    NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_IMPORT_MODE },
+	{ NA_IPREFS_IO_PROVIDERS_WRITE_ORDER,         GROUP_NACT,    NA_BOXED_TYPE_STRING_LIST, "" },
+	{ NA_IPREFS_ICON_CHOOSER_URI,                 GROUP_NACT,    NA_BOXED_TYPE_STRING,      "file:///" },
+	{ NA_IPREFS_ICON_CHOOSER_PANED,               GROUP_NACT,    NA_BOXED_TYPE_UINT,        "200" },
+	{ NA_IPREFS_ICON_CHOOSER_WSP,                 GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_ITEMS_ADD_ABOUT_ITEM,             GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_ITEMS_CREATE_ROOT_MENU,           GROUP_RUNTIME, NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_ITEMS_LEVEL_ZERO_ORDER,           GROUP_RUNTIME, NA_BOXED_TYPE_STRING_LIST, "" },
+	{ NA_IPREFS_ITEMS_LIST_ORDER_MODE,            GROUP_RUNTIME, NA_BOXED_TYPE_STRING,      NA_IPREFS_DEFAULT_LIST_ORDER_MODE },
+	{ NA_IPREFS_MAIN_PANED,                       GROUP_NACT,    NA_BOXED_TYPE_UINT,        "200" },
+	{ NA_IPREFS_MAIN_SAVE_AUTO,                   GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_MAIN_SAVE_PERIOD,                 GROUP_NACT,    NA_BOXED_TYPE_UINT,        "5" },
+	{ NA_IPREFS_MAIN_TOOLBAR_EDIT_DISPLAY,        GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_MAIN_TOOLBAR_FILE_DISPLAY,        GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_MAIN_TOOLBAR_HELP_DISPLAY,        GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "true" },
+	{ NA_IPREFS_MAIN_TOOLBAR_TOOLS_DISPLAY,       GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_MAIN_WINDOW_WSP,                  GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_PREFERENCES_WSP,                  GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_RELABEL_DUPLICATE_ACTION,         GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_RELABEL_DUPLICATE_MENU,           GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_RELABEL_DUPLICATE_PROFILE,        GROUP_NACT,    NA_BOXED_TYPE_BOOLEAN,     "false" },
+	{ NA_IPREFS_SCHEME_ADD_SCHEME_WSP,            GROUP_NACT,    NA_BOXED_TYPE_UINT_LIST,   "" },
+	{ NA_IPREFS_SCHEME_DEFAULT_LIST,              GROUP_NACT,    NA_BOXED_TYPE_STRING_LIST, "" },
+	{ NA_IPREFS_IO_PROVIDER_READABLE,             NA_IPREFS_IO_PROVIDER_GROUP, NA_BOXED_TYPE_BOOLEAN, "true" },
+	{ NA_IPREFS_IO_PROVIDER_WRITABLE,             NA_IPREFS_IO_PROVIDER_GROUP, NA_BOXED_TYPE_BOOLEAN, "true" },
 	{ 0 }
 };
 
diff --git a/src/nact/nact-assistant-export.c b/src/nact/nact-assistant-export.c
index dd1658b..d3318ad 100644
--- a/src/nact/nact-assistant-export.c
+++ b/src/nact/nact-assistant-export.c
@@ -81,6 +81,7 @@ struct NactAssistantExportClassPrivate {
  */
 struct NactAssistantExportPrivate {
 	gboolean  dispose_has_run;
+	gboolean  preferences_locked;
 	gchar    *uri;
 	GList    *results;
 };
@@ -350,10 +351,19 @@ on_initial_load_dialog( NactAssistantExport *dialog, gpointer user_data )
 	NAUpdater *updater;
 	NASettings *settings;
 	gboolean esc_quit, esc_confirm;
+	gboolean are_locked, mandatory;
 
-	g_debug( "%s: dialog=%p, user_data=%p", thisfn, ( void * ) dialog, ( void * ) user_data );
 	g_return_if_fail( NACT_IS_ASSISTANT_EXPORT( dialog ));
 
+	g_debug( "%s: dialog=%p, user_data=%p", thisfn, ( void * ) dialog, ( void * ) user_data );
+
+	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( dialog )));
+	updater = nact_application_get_updater( application );
+	settings = na_pivot_get_settings( NA_PIVOT( updater ));
+
+	are_locked = na_settings_get_boolean( settings, NA_IPREFS_ADMIN_PREFERENCES_LOCKED, NULL, &mandatory );
+	dialog->private->preferences_locked = are_locked && mandatory;
+
 	assistant = GTK_ASSISTANT( base_window_get_toplevel( BASE_WINDOW( dialog )));
 
 	assist_initial_load_intro( dialog, assistant );
@@ -363,10 +373,6 @@ on_initial_load_dialog( NactAssistantExport *dialog, gpointer user_data )
 	assist_initial_load_confirm( dialog, assistant );
 	assist_initial_load_exportdone( dialog, assistant );
 
-	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( dialog )));
-	updater = nact_application_get_updater( application );
-	settings = na_pivot_get_settings( NA_PIVOT( updater ));
-
 	esc_quit = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_QUIT, NULL, NULL );
 	base_assistant_set_cancel_on_esc( BASE_ASSISTANT( dialog ), esc_quit );
 	esc_confirm = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_CONFIRM, NULL, NULL );
@@ -599,7 +605,8 @@ assist_initial_load_format( NactAssistantExport *window, GtkAssistant *assistant
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
 	updater = nact_application_get_updater( application );
 	container = base_window_get_widget( BASE_WINDOW( window ), "AssistantExportFormatVBox" );
-	nact_export_format_init_display( NA_PIVOT( updater ), container, EXPORT_FORMAT_DISPLAY_ASSISTANT );
+	nact_export_format_init_display( container,
+			NA_PIVOT( updater ), EXPORT_FORMAT_DISPLAY_ASSISTANT, !window->private->preferences_locked );
 }
 
 static void
@@ -610,13 +617,14 @@ assist_runtime_init_format( NactAssistantExport *window, GtkAssistant *assistant
 	GQuark format;
 	NactApplication *application;
 	NAUpdater *updater;
+	gboolean mandatory;
 
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
 	updater = nact_application_get_updater( application );
-	format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT );
+	format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, &mandatory );
 
 	container = base_window_get_widget( BASE_WINDOW( window ), "AssistantExportFormatVBox" );
-	nact_export_format_select( container, format );
+	nact_export_format_select( container, !mandatory, format );
 
 	content = gtk_assistant_get_nth_page( assistant, ASSIST_PAGE_FORMAT_SELECTION );
 	gtk_assistant_set_page_complete( assistant, content, TRUE );
@@ -749,16 +757,20 @@ assistant_apply( BaseAssistant *wnd, GtkAssistant *assistant )
 	ExportStruct *str;
 	NactApplication *application;
 	NAUpdater *updater;
+	gboolean first;
+
+	g_return_if_fail( NACT_IS_ASSISTANT_EXPORT( wnd ));
 
 	g_debug( "%s: window=%p, assistant=%p", thisfn, ( void * ) wnd, ( void * ) assistant );
-	g_assert( NACT_IS_ASSISTANT_EXPORT( wnd ));
+
 	window = NACT_ASSISTANT_EXPORT( wnd );
 
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
 	updater = nact_application_get_updater( application );
 	actions = nact_iactions_list_bis_get_selected_items( NACT_IACTIONS_LIST( window ));
+	first = TRUE;
 
-	g_assert( window->private->uri && strlen( window->private->uri ));
+	g_return_if_fail( window->private->uri && strlen( window->private->uri ));
 
 	for( ia = actions ; ia ; ia = ia->next ){
 		str = g_new0( ExportStruct, 1 );
@@ -766,10 +778,10 @@ assistant_apply( BaseAssistant *wnd, GtkAssistant *assistant )
 
 		str->item = NA_OBJECT_ITEM( na_object_get_origin( NA_IDUPLICABLE( ia->data )));
 
-		str->format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT );
+		str->format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, NULL );
 
 		if( str->format == IPREFS_EXPORT_FORMAT_ASK ){
-			str->format = nact_export_ask_user( BASE_WINDOW( wnd ), str->item );
+			str->format = nact_export_ask_user( BASE_WINDOW( wnd ), str->item, first );
 
 			if( str->format == IPREFS_EXPORT_NO_EXPORT ){
 				str->msg = g_slist_append( NULL, g_strdup( _( "Export canceled due to user action." )));
@@ -779,6 +791,8 @@ assistant_apply( BaseAssistant *wnd, GtkAssistant *assistant )
 		if( str->format != IPREFS_EXPORT_NO_EXPORT ){
 			str->fname = na_exporter_to_file( NA_PIVOT( updater ), str->item, window->private->uri, str->format, &str->msg );
 		}
+
+		first = FALSE;
 	}
 
 	na_object_unref_selected_items( actions );
diff --git a/src/nact/nact-assistant-import.c b/src/nact/nact-assistant-import.c
index e922b57..697350a 100644
--- a/src/nact/nact-assistant-import.c
+++ b/src/nact/nact-assistant-import.c
@@ -484,7 +484,7 @@ runtime_init_duplicates( NactAssistantImport *window, GtkAssistant *assistant )
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( window )));
 	updater = nact_application_get_updater( application );
 
-	mode = na_iprefs_get_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE );
+	mode = na_iprefs_get_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE, NULL );
 	set_import_mode( window, mode );
 
 	page = gtk_assistant_get_nth_page( assistant, ASSIST_PAGE_DUPLICATES );
diff --git a/src/nact/nact-clipboard.c b/src/nact/nact-clipboard.c
index 0eb2972..613fe9d 100644
--- a/src/nact/nact-clipboard.c
+++ b/src/nact/nact-clipboard.c
@@ -115,7 +115,7 @@ static void   get_from_dnd_clipboard_callback( GtkClipboard *clipboard, GtkSelec
 static void   clear_dnd_clipboard_callback( GtkClipboard *clipboard, NactClipboardDndData *data );
 static gchar *export_rows( NactClipboard *clipboard, GList *rows, const gchar *dest_folder );
 static gchar *export_objects( NactClipboard *clipboard, GList *objects );
-static gchar *export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest_folder, GList **exported );
+static gchar *export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest_folder, GList **exported, gboolean first );
 
 static void   get_from_primary_clipboard_callback( GtkClipboard *gtk_clipboard, GtkSelectionData *selection_data, guint info, NactClipboard *clipboard );
 static void   clear_primary_clipboard( NactClipboard *clipboard );
@@ -512,7 +512,9 @@ export_rows( NactClipboard *clipboard, GList *rows, const gchar *dest_folder )
 	GtkTreeIter iter;
 	NAObject *object;
 	gchar *buffer;
+	gboolean first;
 
+	first = TRUE;
 	buffer = NULL;
 	exported = NULL;
 	data = g_string_new( "" );
@@ -524,13 +526,14 @@ export_rows( NactClipboard *clipboard, GList *rows, const gchar *dest_folder )
 			gtk_tree_model_get_iter( model, &iter, path );
 			gtk_tree_path_free( path );
 			gtk_tree_model_get( model, &iter, IACTIONS_LIST_NAOBJECT_COLUMN, &object, -1 );
-			buffer = export_row_object( clipboard, object, dest_folder, &exported );
+			buffer = export_row_object( clipboard, object, dest_folder, &exported, first );
 			if( buffer && strlen( buffer )){
 				data = g_string_append( data, buffer );
 				g_free( buffer );
 			}
 			g_object_unref( object );
 		}
+		first = FALSE;
 	}
 
 	g_list_free( exported );
@@ -545,19 +548,22 @@ export_objects( NactClipboard *clipboard, GList *objects )
 	GList *exported;
 	GList *iobj;
 	NAObject *object;
+	gboolean first;
 
+	first = TRUE;
 	buffer = NULL;
 	exported = NULL;
 	data = g_string_new( "" );
 
 	for( iobj = objects ; iobj ; iobj = iobj->next ){
 		object = NA_OBJECT( iobj->data );
-		buffer = export_row_object( clipboard, object, NULL, &exported );
+		buffer = export_row_object( clipboard, object, NULL, &exported, first );
 		if( buffer && strlen( buffer )){
 			data = g_string_append( data, buffer );
 			g_free( buffer );
 		}
 		g_object_unref( object );
+		first = FALSE;
 	}
 
 	g_list_free( exported );
@@ -569,7 +575,7 @@ export_objects( NactClipboard *clipboard, GList *objects )
  * else export to a new file in the target directory
  */
 static gchar *
-export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest_folder, GList **exported )
+export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest_folder, GList **exported, gboolean first )
 {
 	GList *subitems, *isub;
 	NactApplication *application;
@@ -588,11 +594,12 @@ export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest
 		subitems = na_object_get_items( object );
 
 		for( isub = subitems ; isub ; isub = isub->next ){
-			buffer = export_row_object( clipboard, isub->data, dest_folder, exported );
+			buffer = export_row_object( clipboard, isub->data, dest_folder, exported, first );
 			if( buffer && strlen( buffer )){
 				data = g_string_append( data, buffer );
 				g_free( buffer );
 			}
+			first = FALSE;
 		}
 	}
 
@@ -609,14 +616,13 @@ export_row_object( NactClipboard *clipboard, NAObject *object, const gchar *dest
 	if( index == -1 ){
 
 		*exported = g_list_prepend( *exported, ( gpointer ) action );
-		format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT );
+		format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, NULL );
 
 		if( format == IPREFS_EXPORT_FORMAT_ASK ){
-			format = nact_export_ask_user( clipboard->private->window, NA_OBJECT_ITEM( action ));
+			format = nact_export_ask_user( clipboard->private->window, NA_OBJECT_ITEM( action ), first );
 		}
 
 		if( format != IPREFS_EXPORT_NO_EXPORT ){
-
 			if( dest_folder ){
 				fname = na_exporter_to_file( NA_PIVOT( updater ), NA_OBJECT_ITEM( action), dest_folder, format, &msgs );
 				g_free( fname );
diff --git a/src/nact/nact-export-ask.c b/src/nact/nact-export-ask.c
index bb27c37..2824d04 100644
--- a/src/nact/nact-export-ask.c
+++ b/src/nact/nact-export-ask.c
@@ -42,6 +42,7 @@
 #include "nact-application.h"
 #include "nact-export-format.h"
 #include "nact-export-ask.h"
+#include "nact-gtk-utils.h"
 
 /* private class data
  */
@@ -54,8 +55,12 @@ struct NactExportAskClassPrivate {
 struct NactExportAskPrivate {
 	gboolean      dispose_has_run;
 	BaseWindow   *parent;
+	gboolean      preferences_locked;
 	NAObjectItem *item;
 	GQuark        format;
+	gboolean      format_mandatory;
+	gboolean      keep_last_choice;
+	gboolean      keep_last_choice_mandatory;
 };
 
 static BaseDialogClass *st_parent_class = NULL;
@@ -74,6 +79,7 @@ static gchar   *base_get_ui_filename( const BaseWindow *dialog );
 static void     on_base_initial_load_dialog( NactExportAsk *editor, gpointer user_data );
 static void     on_base_runtime_init_dialog( NactExportAsk *editor, gpointer user_data );
 static void     on_base_all_widgets_showed( NactExportAsk *editor, gpointer user_data );
+static void     keep_choice_on_toggled( GtkToggleButton *button, NactExportAsk *editor );
 static void     on_cancel_clicked( GtkButton *button, NactExportAsk *editor );
 static void     on_ok_clicked( GtkButton *button, NactExportAsk *editor );
 static GQuark   get_export_format( NactExportAsk *editor );
@@ -146,9 +152,11 @@ instance_init( GTypeInstance *instance, gpointer klass )
 	static const gchar *thisfn = "nact_export_ask_instance_init";
 	NactExportAsk *self;
 
+	g_return_if_fail( NACT_IS_EXPORT_ASK( instance ));
+
 	g_debug( "%s: instance=%p (%s), klass=%p",
 			thisfn, ( void * ) instance, G_OBJECT_TYPE_NAME( instance ), ( void * ) klass );
-	g_return_if_fail( NACT_IS_EXPORT_ASK( instance ));
+
 	self = NACT_EXPORT_ASK( instance );
 
 	self->private = g_new0( NactExportAskPrivate, 1 );
@@ -180,12 +188,14 @@ instance_dispose( GObject *dialog )
 	static const gchar *thisfn = "nact_export_ask_instance_dispose";
 	NactExportAsk *self;
 
-	g_debug( "%s: dialog=%p (%s)", thisfn, ( void * ) dialog, G_OBJECT_TYPE_NAME( dialog ));
 	g_return_if_fail( NACT_IS_EXPORT_ASK( dialog ));
+
 	self = NACT_EXPORT_ASK( dialog );
 
 	if( !self->private->dispose_has_run ){
 
+		g_debug( "%s: dialog=%p (%s)", thisfn, ( void * ) dialog, G_OBJECT_TYPE_NAME( dialog ));
+
 		self->private->dispose_has_run = TRUE;
 
 		/* chain up to the parent class */
@@ -201,8 +211,10 @@ instance_finalize( GObject *dialog )
 	static const gchar *thisfn = "nact_export_ask_instance_finalize";
 	NactExportAsk *self;
 
-	g_debug( "%s: dialog=%p", thisfn, ( void * ) dialog );
 	g_return_if_fail( NACT_IS_EXPORT_ASK( dialog ));
+
+	g_debug( "%s: dialog=%p (%s)", thisfn, ( void * ) dialog, G_OBJECT_TYPE_NAME( dialog ));
+
 	self = NACT_EXPORT_ASK( dialog );
 
 	g_free( self->private );
@@ -225,6 +237,10 @@ export_ask_new( BaseWindow *parent )
 /**
  * nact_export_ask_run:
  * @parent: the NactAssistant parent of this dialog.
+ * @item: the NAObjectItem to be exported.
+ * @first: whether this is the first call of a serie.
+ *  On a first call, the user is really asked for his choice.
+ *  The next times, the 'keep-last-choice' flag will be considered.
  *
  * Initializes and runs the dialog.
  *
@@ -234,43 +250,59 @@ export_ask_new( BaseWindow *parent )
  *
  * Returns: the mode choosen by the user as a #GQuark which identifies
  * the export mode.
- * The function defaults to returning IPREFS_EXPORT_NO_EXPORT.
+ * The function defaults to returning NA_IPREFS_DEFAULT_EXPORT_FORMAT.
  *
  * When the user selects 'Keep same choice without asking me', this choice
  * becomes his new preferred export format.
  */
 GQuark
-nact_export_ask_user( BaseWindow *parent, NAObjectItem *item )
+nact_export_ask_user( BaseWindow *parent, NAObjectItem *item, gboolean first )
 {
 	static const gchar *thisfn = "nact_export_ask_run";
 	NactExportAsk *editor;
 	NactApplication *application;
 	NAUpdater *updater;
+	NASettings *settings;
+	gboolean are_locked, mandatory;
+	gboolean keep, keep_mandatory;
 
-	GQuark format = ( GQuark ) IPREFS_EXPORT_NO_EXPORT;
+	GQuark format = g_quark_from_static_string( NA_IPREFS_DEFAULT_EXPORT_FORMAT );
 
 	g_return_val_if_fail( BASE_IS_WINDOW( parent ), format );
 
-	g_debug( "%s: parent=%p", thisfn, ( void * ) parent );
+	g_debug( "%s: parent=%p, item=%p (%s), first=%s",
+			thisfn, ( void * ) parent, ( void * ) item, G_OBJECT_TYPE_NAME( item ), first ? "True":"False" );
 
 	application = NACT_APPLICATION( base_window_get_application( parent ));
 	updater = nact_application_get_updater( application );
+	settings = na_pivot_get_settings( NA_PIVOT( updater ));
+
+	format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT, &mandatory );
+	keep = na_settings_get_boolean( settings, NA_IPREFS_EXPORT_ASK_USER_KEEP_LAST_CHOICE, NULL, &keep_mandatory );
+
+	if( first || !keep ){
 
-	editor = export_ask_new( parent );
+		editor = export_ask_new( parent );
 
-	editor->private->parent = parent;
-	editor->private->item = item;
-	editor->private->format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT );
+		editor->private->format = format;
+		editor->private->format_mandatory = mandatory;
+		editor->private->keep_last_choice = keep;
+		editor->private->keep_last_choice_mandatory = keep_mandatory;
 
-	if( base_window_run( BASE_WINDOW( editor ))){
+		editor->private->parent = parent;
+		editor->private->item = item;
 
-		if( editor->private->format ){
-			format = editor->private->format;
-			na_iprefs_set_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT, format );
+		are_locked = na_settings_get_boolean( settings, NA_IPREFS_ADMIN_PREFERENCES_LOCKED, NULL, &mandatory );
+		editor->private->preferences_locked = are_locked && mandatory;
+
+		if( base_window_run( BASE_WINDOW( editor ))){
+			if( editor->private->format ){
+				format = editor->private->format;
+			}
 		}
-	}
 
-	g_object_unref( editor );
+		g_object_unref( editor );
+	}
 
 	return( format );
 }
@@ -307,7 +339,7 @@ on_base_initial_load_dialog( NactExportAsk *editor, gpointer user_data )
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
 	updater = nact_application_get_updater( application );
 	container = base_window_get_widget( BASE_WINDOW( editor ), "ExportFormatAskVBox" );
-	nact_export_format_init_display( NA_PIVOT( updater ), container, EXPORT_FORMAT_DISPLAY_ASK );
+	nact_export_format_init_display( container, NA_PIVOT( updater ), EXPORT_FORMAT_DISPLAY_ASK, !editor->private->preferences_locked );
 }
 
 static void
@@ -317,7 +349,6 @@ on_base_runtime_init_dialog( NactExportAsk *editor, gpointer user_data )
 	GtkWidget *container;
 	gchar *item_label, *label;
 	GtkWidget *widget;
-	GtkWidget *button;
 
 	g_debug( "%s: editor=%p, user_data=%p", thisfn, ( void * ) editor, ( void * ) user_data );
 	g_return_if_fail( NACT_IS_EXPORT_ASK( editor ));
@@ -337,11 +368,13 @@ on_base_runtime_init_dialog( NactExportAsk *editor, gpointer user_data )
 	g_free( label );
 	g_free( item_label );
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AskKeepChoiceButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), FALSE );
-
 	container = base_window_get_widget( BASE_WINDOW( editor ), "ExportFormatAskVBox" );
-	nact_export_format_select( container, editor->private->format );
+	nact_export_format_select( container, !editor->private->format_mandatory, editor->private->format );
+
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"AskKeepChoiceButton", G_CALLBACK( keep_choice_on_toggled ),
+			editor->private->keep_last_choice,
+			!editor->private->keep_last_choice_mandatory, !editor->private->preferences_locked );
 
 	base_window_signal_connect_by_name(
 			BASE_WINDOW( editor ),
@@ -366,6 +399,21 @@ on_base_all_widgets_showed( NactExportAsk *editor, gpointer user_data )
 }
 
 static void
+keep_choice_on_toggled( GtkToggleButton *button, NactExportAsk *editor )
+{
+	gboolean editable;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->keep_last_choice = gtk_toggle_button_get_active( button );
+
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
+}
+
+static void
 on_cancel_clicked( GtkButton *button, NactExportAsk *editor )
 {
 	GtkWindow *toplevel = base_window_get_toplevel( BASE_WINDOW( editor ));
@@ -379,16 +427,27 @@ on_ok_clicked( GtkButton *button, NactExportAsk *editor )
 	gtk_dialog_response( GTK_DIALOG( toplevel ), GTK_RESPONSE_OK );
 }
 
+/*
+ * we have come here because preferred_export_format was 'Ask'
+ * in all cases, the chosen format is kept in 'ask_user_last_chosen_format'
+ * and so this will be the default format which will be proposed the next
+ * time we come here
+ * if the 'remember_my_choice' is cheecked, then we do not even ask the user
+ * but returns as soon as we enter
+ *
+ * not overrinding the preferred export format (i.e. letting it to 'Ask')
+ * let the user go back in ask dialog box the next time he will have some
+ * files to export
+ */
 static GQuark
 get_export_format( NactExportAsk *editor )
 {
 	GtkWidget *container;
 	NAExportFormat *format;
 	GQuark format_quark;
-	GtkWidget *button;
-	gboolean keep;
 	NactApplication *application;
 	NAUpdater *updater;
+	NASettings *settings;
 
 	container = base_window_get_widget( BASE_WINDOW( editor ), "ExportFormatAskVBox" );
 	format = nact_export_format_get_selected( container );
@@ -396,13 +455,14 @@ get_export_format( NactExportAsk *editor )
 
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
 	updater = nact_application_get_updater( application );
+	settings = na_pivot_get_settings( NA_PIVOT( updater ));
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AskKeepChoiceButton" );
-	keep = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	if( keep ){
-		na_iprefs_set_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, format_quark );
+	if( !editor->private->keep_last_choice_mandatory ){
+		na_settings_set_boolean( settings, NA_IPREFS_EXPORT_ASK_USER_KEEP_LAST_CHOICE, editor->private->keep_last_choice );
 	}
 
+	na_iprefs_set_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_ASK_USER_LAST_FORMAT, format_quark );
+
 	return( format_quark );
 }
 
diff --git a/src/nact/nact-export-ask.h b/src/nact/nact-export-ask.h
index 5e6f80d..defe161 100644
--- a/src/nact/nact-export-ask.h
+++ b/src/nact/nact-export-ask.h
@@ -72,7 +72,7 @@ typedef struct {
 
 GType  nact_export_ask_get_type( void );
 
-GQuark nact_export_ask_user( BaseWindow *window, NAObjectItem *item );
+GQuark nact_export_ask_user( BaseWindow *window, NAObjectItem *item, gboolean first );
 
 G_END_DECLS
 
diff --git a/src/nact/nact-export-format.c b/src/nact/nact-export-format.c
index 19b8d64..8887494 100644
--- a/src/nact/nact-export-format.c
+++ b/src/nact/nact-export-format.c
@@ -38,53 +38,65 @@
 #include <core/na-export-format.h>
 
 #include "nact-export-format.h"
+#include "nact-gtk-utils.h"
 
-#define EXPORT_FORMAT_PROP_OBJECT		"nact-export-format-prop-object"
-#define EXPORT_FORMAT_PROP_BUTTON		"nact-export-format-prop-button"
+typedef struct {
+	GtkWidget      *container_vbox;
+	GtkRadioButton *button;
+	NAExportFormat *format;
+	gulong          handler;	/* 'toggled' signal handler id */
+}
+	VBoxData;
+
+#define EXPORT_FORMAT_PROP_CONTAINER_FORMAT		"nact-export-format-prop-container-format"
+#define EXPORT_FORMAT_PROP_CONTAINER_EDITABLE	"nact-export-format-prop-container-editable"
+#define EXPORT_FORMAT_PROP_CONTAINER_SENSITIVE	"nact-export-format-prop-container-sensitive"
+#define EXPORT_FORMAT_PROP_VBOX_DATA			"nact-export-format-prop-vbox-data"
 
 #define ASKME_LABEL						N_( "_Ask me" )
 #define ASKME_DESCRIPTION				N_( "You will be asked for the format to choose each time an item is about to be exported." )
 
 static const NAIExporterFormat st_ask_str = { "Ask", ASKME_LABEL, ASKME_DESCRIPTION };
 
-static void draw_in_vbox( const NAExportFormat *format, GtkWidget *vbox, guint mode, gint id );
-static void format_weak_notify( NAExportFormat *format, GObject *vbox );
+static void draw_in_vbox( GtkWidget *container_vbox, const NAExportFormat *format, guint mode, gint id );
+static void format_weak_notify( VBoxData *vbox_data, GObject *vbox );
 static void select_default_iter( GtkWidget *widget, void *quark_ptr );
+static void export_format_on_toggled( GtkToggleButton *toggle_button, VBoxData *vbox_data );
 static void get_selected_iter( GtkWidget *widget, NAExportFormat **format );
 
 /**
  * nact_export_format_init_display:
+ * @container_vbox: the #GtkVBox container in which the display must be drawn.
  * @pivot: the #NAPivot instance.
- * @vbox: the #GtkVBox in which the display must be drawn.
  * @mode: the type of the display.
+ * @sensitive: whether the whole radio button group is sensitive.
  *
  * Displays the available export formats in the VBox.
- * Should only be called once per dialog box instance.
+ *
+ * Should only be called once per dialog box instance (e.g. on initial load
+ * of the GtkWindow).
  */
 void
-nact_export_format_init_display( const NAPivot *pivot, GtkWidget *vbox, guint mode )
+nact_export_format_init_display( GtkWidget *container_vbox, const NAPivot *pivot, guint mode, gboolean sensitive )
 {
 	static const gchar *thisfn = "nact_export_format_init_display";
 	GList *formats, *ifmt;
 	NAExportFormat *format;
 
+	g_debug( "%s: container_vbox=%p, pivot=%p, mode=%u, sensitive=%s",
+			thisfn, ( void * ) container_vbox, ( void * ) pivot, mode,
+			sensitive ? "True":"False" );
+
 	formats = na_exporter_get_formats( pivot );
 
 	for( ifmt = formats ; ifmt ; ifmt = ifmt->next ){
-		draw_in_vbox( NA_EXPORT_FORMAT( ifmt->data ), vbox, mode, -1 );
+		draw_in_vbox( container_vbox, NA_EXPORT_FORMAT( ifmt->data ), mode, -1 );
 	}
 
 	na_exporter_free_formats( formats );
 
 	switch( mode ){
 
-		case EXPORT_FORMAT_DISPLAY_PREFERENCES:
-		case EXPORT_FORMAT_DISPLAY_ASSISTANT:
-			format = na_export_format_new( &st_ask_str, NULL );
-			draw_in_vbox( format, vbox, mode, IPREFS_EXPORT_FORMAT_ASK );
-			g_object_unref( format );
-			break;
-
 		/* this is the mode to be used when we are about to export an item
 		 * and the user preference is 'Ask me'; obviously, we don't propose
 		 * here to ask him another time :)
@@ -92,20 +104,30 @@ nact_export_format_init_display( const NAPivot *pivot, GtkWidget *vbox, guint mo
 		case EXPORT_FORMAT_DISPLAY_ASK:
 			break;
 
+		case EXPORT_FORMAT_DISPLAY_PREFERENCES:
+		case EXPORT_FORMAT_DISPLAY_ASSISTANT:
+			format = na_export_format_new( &st_ask_str, NULL );
+			draw_in_vbox( container_vbox, format, mode, IPREFS_EXPORT_FORMAT_ASK );
+			g_object_unref( format );
+			break;
+
 		default:
 			g_warning( "%s: mode=%d: unknown mode", thisfn, mode );
 	}
+
+	g_object_set_data( G_OBJECT( container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_FORMAT, GUINT_TO_POINTER( 0 ));
+	g_object_set_data( G_OBJECT( container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_SENSITIVE, GUINT_TO_POINTER( sensitive ));
 }
 
 /*
- * container
- *  +- vbox
- *  |   +- radio button
- *  |   +- hbox
- *  |   |   +- description
+ * container_box
+ *  +- vbox                 new
+ *  |   +- radio button     new
+ *  |   +- hbox             new
+ *  |   |   +- description  new
  */
 static void
-draw_in_vbox( const NAExportFormat *format, GtkWidget *container, guint mode, gint id )
+draw_in_vbox( GtkWidget *container_vbox, const NAExportFormat *format, guint mode, gint id )
 {
 	static GtkRadioButton *first_button = NULL;
 	GtkVBox *vbox;
@@ -115,9 +137,10 @@ draw_in_vbox( const NAExportFormat *format, GtkWidget *container, guint mode, gi
 	guint size, spacing;
 	gchar *markup, *label;
 	GtkLabel *desc_label;
+	VBoxData *vbox_data;
 
 	vbox = GTK_VBOX( gtk_vbox_new( FALSE, 0 ));
-	gtk_box_pack_start( GTK_BOX( container ), GTK_WIDGET( vbox ), FALSE, TRUE, 0 );
+	gtk_box_pack_start( GTK_BOX( container_vbox ), GTK_WIDGET( vbox ), FALSE, TRUE, 0 );
 	description = na_export_format_get_description( format );
 	g_object_set( G_OBJECT( vbox ), "tooltip-text", description, NULL );
 	g_object_set( G_OBJECT( vbox ), "spacing", 6, NULL );
@@ -149,7 +172,7 @@ draw_in_vbox( const NAExportFormat *format, GtkWidget *container, guint mode, gi
 			label = na_export_format_get_label( format );
 			markup = g_markup_printf_escaped( "<b>%s</b>", label );
 			gtk_label_set_markup( radio_label, markup );
-			gtk_container_add( GTK_CONTAINER( button ), GTK_WIDGET( radio_label ));
+			gtk_container_vbox_add( GTK_CONTAINER( button ), GTK_WIDGET( radio_label ));
 			break;*/
 	}
 
@@ -171,9 +194,13 @@ draw_in_vbox( const NAExportFormat *format, GtkWidget *container, guint mode, gi
 			break;
 	}
 
-	g_object_set_data( G_OBJECT( vbox ), EXPORT_FORMAT_PROP_BUTTON, button );
-	g_object_set_data( G_OBJECT( vbox ), EXPORT_FORMAT_PROP_OBJECT, g_object_ref(( gpointer ) format ));
-	g_object_weak_ref( G_OBJECT( vbox ), ( GWeakNotify ) format_weak_notify, ( gpointer ) format );
+	vbox_data = g_new0( VBoxData, 1 );
+	vbox_data->container_vbox = container_vbox;
+	vbox_data->button = button;
+	vbox_data->format = g_object_ref(( gpointer ) format );
+
+	g_object_set_data( G_OBJECT( vbox ), EXPORT_FORMAT_PROP_VBOX_DATA, vbox_data );
+	g_object_weak_ref( G_OBJECT( vbox ), ( GWeakNotify ) format_weak_notify, ( gpointer ) vbox_data );
 
 	g_free( markup );
 	g_free( label );
@@ -181,51 +208,97 @@ draw_in_vbox( const NAExportFormat *format, GtkWidget *container, guint mode, gi
 }
 
 static void
-format_weak_notify( NAExportFormat *format, GObject *vbox )
+format_weak_notify( VBoxData *vbox_data, GObject *vbox )
 {
 	static const gchar *thisfn = "nact_export_format_weak_notify";
 
-	g_debug( "%s: format=%p (%s), vbox=%p",
-			thisfn, ( void * ) format, G_OBJECT_TYPE_NAME( format ), ( void * ) vbox );
+	g_debug( "%s: vbox_data=%p, vbox=%p", thisfn, ( void * ) vbox_data, ( void * ) vbox );
+
+	g_signal_handler_disconnect( vbox_data->button, vbox_data->handler );
 
-	g_object_unref( format );
+	g_object_unref( vbox_data->format );
+
+	g_free( vbox_data );
 }
 
 /**
  * nact_export_format_select:
- * @container: the #GtkVBox in which the display has been drawn.
+ * @container_vbox: the #GtkVBox in which the display has been drawn.
+ * @editable: whether the whole radio button group is activatable.
  * @format: the #GQuark which must be used as a default value.
  *
  * Select the default value.
+ *
+ * This is to be ran from runtime initialization dialog.
+ *
+ * Data for each format has been set on the new embedding vbox, previously
+ * created in nact_export_format_init_display(). We are iterating on these
+ * vbox to setup the initially active radio button.
  */
 void
-nact_export_format_select( const GtkWidget *container, GQuark format )
+nact_export_format_select( const GtkWidget *container_vbox, gboolean editable, GQuark format )
 {
-	void *quark_ptr;
+	g_object_set_data( G_OBJECT( container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_EDITABLE, GUINT_TO_POINTER( editable ));
+	g_object_set_data( G_OBJECT( container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_FORMAT, GUINT_TO_POINTER( format ));
 
-	quark_ptr = GUINT_TO_POINTER( format );
-	gtk_container_foreach( GTK_CONTAINER( container ), ( GtkCallback ) select_default_iter, quark_ptr );
+	gtk_container_foreach( GTK_CONTAINER( container_vbox ), ( GtkCallback ) select_default_iter, GUINT_TO_POINTER( format ));
 }
 
 static void
-select_default_iter( GtkWidget *widget, void *quark_ptr )
+select_default_iter( GtkWidget *vbox, void *quark_ptr )
 {
-	NAExportFormat *format;
+	VBoxData *vbox_data;
 	GQuark format_quark;
 	GtkRadioButton *button;
+	gboolean editable, sensitive;
+
+	vbox_data = ( VBoxData * )
+			g_object_get_data( G_OBJECT( vbox ), EXPORT_FORMAT_PROP_VBOX_DATA );
 
+	editable = ( gboolean ) GPOINTER_TO_UINT(
+			g_object_get_data( G_OBJECT( vbox_data->container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_EDITABLE ));
+
+	sensitive = ( gboolean ) GPOINTER_TO_UINT(
+			g_object_get_data( G_OBJECT( vbox_data->container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_SENSITIVE ));
+
+	vbox_data->handler = g_signal_connect( G_OBJECT( vbox_data->button ), "toggled", G_CALLBACK( export_format_on_toggled ), vbox_data );
+
+	button = NULL;
 	format_quark = ( GQuark ) GPOINTER_TO_UINT( quark_ptr );
-	format = NA_EXPORT_FORMAT( g_object_get_data( G_OBJECT( widget ), EXPORT_FORMAT_PROP_OBJECT ));
 
-	if( na_export_format_get_quark( format ) == format_quark ){
-		button = GTK_RADIO_BUTTON( g_object_get_data( G_OBJECT( widget ), EXPORT_FORMAT_PROP_BUTTON ));
-		gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), TRUE );
+	if( na_export_format_get_quark( vbox_data->format ) == format_quark ){
+		button = vbox_data->button;
+	}
+
+	if( button ){
+		nact_gtk_utils_radio_set_initial_state( button,
+				G_CALLBACK( export_format_on_toggled ), vbox_data, editable, sensitive );
+	}
+}
+
+static void
+export_format_on_toggled( GtkToggleButton *toggle_button, VBoxData *vbox_data )
+{
+	gboolean editable, active;
+	GQuark format;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT(
+			g_object_get_data( G_OBJECT( vbox_data->container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_EDITABLE ));
+
+	if( editable ){
+		active = gtk_toggle_button_get_active( toggle_button );
+		if( active ){
+			format = na_export_format_get_quark( vbox_data->format );
+			g_object_set_data( G_OBJECT( vbox_data->container_vbox ), EXPORT_FORMAT_PROP_CONTAINER_FORMAT, GUINT_TO_POINTER( format ));
+		}
+	} else {
+		nact_gtk_utils_radio_reset_initial_state( GTK_RADIO_BUTTON( toggle_button ), NULL );
 	}
 }
 
 /**
  * nact_export_format_get_selected:
- * @container: the #GtkVBox in which the display has been drawn.
+ * @container_vbox: the #GtkVBox in which the display has been drawn.
  *
  * Returns: the currently selected value, as a #NAExportFormat object.
  *
@@ -233,26 +306,26 @@ select_default_iter( GtkWidget *widget, void *quark_ptr )
  * should not be released by the caller.
  */
 NAExportFormat *
-nact_export_format_get_selected( const GtkWidget *container )
+nact_export_format_get_selected( const GtkWidget *container_vbox )
 {
 	NAExportFormat *format;
 
 	format = NULL;
-	gtk_container_foreach( GTK_CONTAINER( container ), ( GtkCallback ) get_selected_iter, &format );
+	gtk_container_foreach( GTK_CONTAINER( container_vbox ), ( GtkCallback ) get_selected_iter, &format );
 	g_debug( "nact_export_format_get_selected: format=%p", ( void * ) format );
 
 	return( format );
 }
 
 static void
-get_selected_iter( GtkWidget *widget, NAExportFormat **format )
+get_selected_iter( GtkWidget *vbox, NAExportFormat **format )
 {
-	GtkRadioButton *button;
+	VBoxData *vbox_data;
 
 	if( !( *format  )){
-		button = GTK_RADIO_BUTTON( g_object_get_data( G_OBJECT( widget ), EXPORT_FORMAT_PROP_BUTTON ));
-		if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-			*format = NA_EXPORT_FORMAT( g_object_get_data( G_OBJECT( widget ), EXPORT_FORMAT_PROP_OBJECT ));
+		vbox_data = ( VBoxData * ) g_object_get_data( G_OBJECT( vbox ), EXPORT_FORMAT_PROP_VBOX_DATA );
+		if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( vbox_data->button ))){
+			*format = vbox_data->format;
 		}
 	}
 }
diff --git a/src/nact/nact-export-format.h b/src/nact/nact-export-format.h
index 521360a..cc31127 100644
--- a/src/nact/nact-export-format.h
+++ b/src/nact/nact-export-format.h
@@ -67,9 +67,16 @@ enum {
 	EXPORT_FORMAT_DISPLAY_PREFERENCES,
 };
 
-void            nact_export_format_init_display( const NAPivot *pivot, GtkWidget *container, guint mode );
-void            nact_export_format_select( const GtkWidget *container, GQuark format );
-NAExportFormat *nact_export_format_get_selected( const GtkWidget *container );
+void            nact_export_format_init_display(
+						GtkWidget *container_vbox,
+						const NAPivot *pivot, guint mode, gboolean sensitive );
+
+void            nact_export_format_select      (
+						const GtkWidget *container_vbox,
+						gboolean editable, GQuark format );
+
+NAExportFormat *nact_export_format_get_selected(
+						const GtkWidget *container_vbox );
 
 G_END_DECLS
 
diff --git a/src/nact/nact-gtk-utils.c b/src/nact/nact-gtk-utils.c
index a9b4b4e..94b027a 100644
--- a/src/nact/nact-gtk-utils.c
+++ b/src/nact/nact-gtk-utils.c
@@ -42,6 +42,10 @@
 #include "nact-gtk-utils.h"
 #include "nact-application.h"
 
+#define NACT_PROP_TOGGLE_BUTTON				"nact-prop-toggle-button"
+#define NACT_PROP_TOGGLE_HANDLER			"nact-prop-toggle-handler"
+#define NACT_PROP_TOGGLE_USER_DATA			"nact-prop-toggle-user-data"
+
 #define DEFAULT_WIDTH		22
 #define DEFAULT_HEIGHT		22
 
@@ -114,61 +118,165 @@ nact_gtk_utils_set_editable( GObject *widget, gboolean editable )
 }
 
 /**
- * nact_gtk_utils_set_initial_state:
- * @button: the #GtkToggleButton activated as initial state.
- * @func: the corresponding on_toggled function.
+ * nact_gtk_utils_radio_set_initial_state:
+ * @button: the #GtkRadioButton button which is initially active.
+ * @handler: the corresponding "toggled" handler.
+ * @user_data: the user data associated to the handler.
+ * @editable: whether this radio button group is editable.
+ * @sensitive: whether this radio button group is sensitive.
+ *
+ * This function should be called for the button which is initially active
+ * inside of a radio button group when the radio group may happen to not be
+ * editable.
+ * This function should be called only once for the radio button group.
  *
- * Record on each #GtkRadioButton of the same group the characteristics
- * of those which is activated as the initial state. This is useful to handle
- * read-only radio-button.
+ * It does the following operations:
+ * - set the button as active
+ * - set other buttons of the radio button group as inactive
+ * - set all buttons of radio button group as @editable
  *
- * As a side-effect, this initial button is set as active here.
+ * The initially active @button, along with its @handler, are recorded
+ * as properties of the radio button group (actually as properties of each
+ * radio button of the group), so that they can later be used to reset the
+ * initial state.
  */
 void
-nact_gtk_utils_set_initial_state( GtkToggleButton *button, GCallback func )
+nact_gtk_utils_radio_set_initial_state( GtkRadioButton *button,
+		GCallback handler, void *user_data, gboolean editable, gboolean sensitive )
 {
 	GSList *group, *ig;
 	GtkRadioButton *other;
 
-	group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( button ));
+	group = gtk_radio_button_get_group( button );
+
 	for( ig = group ; ig ; ig = ig->next ){
 		other = GTK_RADIO_BUTTON( ig->data );
-		g_object_set_data( G_OBJECT( other ), "nact-initial-state-button", button );
-		g_object_set_data( G_OBJECT( other ), "nact-initial-state-func", func );
+		g_object_set_data( G_OBJECT( other ), NACT_PROP_TOGGLE_BUTTON, button );
+		g_object_set_data( G_OBJECT( other ), NACT_PROP_TOGGLE_HANDLER, handler );
+		g_object_set_data( G_OBJECT( other ), NACT_PROP_TOGGLE_USER_DATA, user_data );
+		g_object_set_data( G_OBJECT( other ), NACT_PROP_TOGGLE_EDITABLE, GUINT_TO_POINTER( editable ));
+		nact_gtk_utils_set_editable( G_OBJECT( other ), editable );
+		gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( other ), FALSE );
+		gtk_widget_set_sensitive( GTK_WIDGET( other ), sensitive );
 	}
 
-	gtk_toggle_button_set_active( button, TRUE );
+	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), TRUE );
 }
 
 /**
- * nact_gtk_utils_reset_initials:
- * @button: the #GtkToggleButton being toggled.
- * @func: the corresponding on_toggled function.
- * @data: data associated with the @func callback.
- * @active: wheter @button is currently being tried to get activated.
+ * nact_gtk_utils_radio_reset_initial_state:
+ * @button: the #GtkRadioButton being toggled.
+ * @handler: the corresponding "toggled" handler.
+ * @data: data associated with the @handler callback.
  *
  * When clicking on a read-only radio button, this function ensures that
- * the radio button is not modified. This function should be called only
- * when the control is read-only (not editable).
+ * the radio button is not modified. It may be called whether the radio
+ * button group is editable or not (does nothing if group is actually
+ * editable).
  */
 void
-nact_gtk_utils_reset_initial_state( GtkToggleButton *button, GCallback func, void *data, gboolean active )
+nact_gtk_utils_radio_reset_initial_state( GtkRadioButton *button, GCallback handler )
 {
 	GtkToggleButton *initial_button;
-	GCallback initial_func;
+	GCallback initial_handler;
+	gboolean active;
+	gboolean editable;
+	gpointer user_data;
+
+	active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
 
-	if( active ){
-		initial_button = GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( button ), "nact-initial-state-button" ));
-		initial_func = G_CALLBACK( g_object_get_data( G_OBJECT( button ), "nact-initial-state-func" ));
+	if( active && !editable ){
+		initial_button = GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_BUTTON ));
+		initial_handler = G_CALLBACK( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_HANDLER ));
+		user_data = g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_USER_DATA );
 
-		g_signal_handlers_block_by_func(( gpointer ) button, func, data );
-		g_signal_handlers_block_by_func(( gpointer ) initial_button, initial_func, data );
+		if( handler ){
+			g_signal_handlers_block_by_func(( gpointer ) button, handler, user_data );
+		}
+		g_signal_handlers_block_by_func(( gpointer ) initial_button, initial_handler, user_data );
 
-		gtk_toggle_button_set_active( button, FALSE );
+		gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), FALSE );
 		gtk_toggle_button_set_active( initial_button, TRUE );
 
-		g_signal_handlers_unblock_by_func(( gpointer ) initial_button, initial_func, data );
-		g_signal_handlers_unblock_by_func(( gpointer ) button, func, data );
+		g_signal_handlers_unblock_by_func(( gpointer ) initial_button, initial_handler, user_data );
+		if( handler ){
+			g_signal_handlers_unblock_by_func(( gpointer ) button, handler, user_data );
+		}
+	}
+}
+
+/**
+ * nact_gtk_utils_toggle_set_initial_state:
+ * @button: the #GtkToggleButton button.
+ * @handler: the corresponding "toggled" handler.
+ * @window: the toplevel #BaseWindow which embeds the button;
+ *  it will be passed as user_data when connecting the signal.
+ * @active: whether the check button is initially active (checked).
+ * @editable: whether this radio button group is editable.
+ * @sensitive: whether this radio button group is sensitive.
+ *
+ * This function should be called for a check button which may happen to be
+ * read-only..
+ *
+ * It does the following operations:
+ * - connect the 'toggled' handler to the button
+ * - set the button as active or inactive depending of @active
+ * - set the button as editable or not depending of @editable
+ * - set the button as sensitive or not depending of @sensitive
+ * - explictely triggers the 'toggled' handler
+ */
+void
+nact_gtk_utils_toggle_set_initial_state( BaseWindow *window,
+		const gchar *button_name, GCallback handler,
+		gboolean active, gboolean editable, gboolean sensitive )
+{
+	typedef void ( *toggle_handler )( GtkToggleButton *, BaseWindow * );
+	GtkToggleButton *button;
+
+	button = GTK_TOGGLE_BUTTON( base_window_get_widget( window, button_name ));
+
+	if( button ){
+		base_window_signal_connect( window, G_OBJECT( button ), "toggled", handler );
+
+		g_object_set_data( G_OBJECT( button ), NACT_PROP_TOGGLE_HANDLER, handler );
+		g_object_set_data( G_OBJECT( button ), NACT_PROP_TOGGLE_USER_DATA, window );
+		g_object_set_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE, GUINT_TO_POINTER( editable ));
+
+		nact_gtk_utils_set_editable( G_OBJECT( button ), editable );
+		gtk_widget_set_sensitive( GTK_WIDGET( button ), sensitive );
+		gtk_toggle_button_set_active( button, active );
+
+		( *( toggle_handler ) handler )( button, window );
+	}
+}
+
+/**
+ * nact_gtk_utils_toggle_reset_initial_state:
+ * @button: the #GtkToggleButton check button.
+ *
+ * When clicking on a read-only check button, this function ensures that
+ * the check button is not modified. It may be called whether the button
+ * is editable or not (does nothing if button is actually editable).
+ */
+void
+nact_gtk_utils_toggle_reset_initial_state( GtkToggleButton *button )
+{
+	gboolean editable;
+	GCallback handler;
+	gpointer user_data;
+	gboolean active;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( !editable ){
+		active = gtk_toggle_button_get_active( button );
+		handler = G_CALLBACK( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_HANDLER ));
+		user_data = g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_USER_DATA );
+
+		g_signal_handlers_block_by_func(( gpointer ) button, handler, user_data );
+		gtk_toggle_button_set_active( button, !active );
+		g_signal_handlers_unblock_by_func(( gpointer ) button, handler, user_data );
 	}
 }
 
diff --git a/src/nact/nact-gtk-utils.h b/src/nact/nact-gtk-utils.h
index 4ed749d..29f95c4 100644
--- a/src/nact/nact-gtk-utils.h
+++ b/src/nact/nact-gtk-utils.h
@@ -43,10 +43,21 @@
 
 G_BEGIN_DECLS
 
+#define NACT_PROP_TOGGLE_EDITABLE			"nact-prop-toggle-editable"
+
 void       nact_gtk_utils_set_editable( GObject *widget, gboolean editable );
 
-void       nact_gtk_utils_set_initial_state  ( GtkToggleButton *button, GCallback func );
-void       nact_gtk_utils_reset_initial_state( GtkToggleButton *button, GCallback func, void *data, gboolean active );
+void       nact_gtk_utils_radio_set_initial_state  ( GtkRadioButton *button,
+				GCallback toggled_handler, void *user_data,
+				gboolean editable, gboolean sensitive );
+
+void       nact_gtk_utils_radio_reset_initial_state( GtkRadioButton *button, GCallback toggled_handler );
+
+void       nact_gtk_utils_toggle_set_initial_state  ( BaseWindow *window,
+				const gchar *button_name, GCallback toggled_handler,
+				gboolean active, gboolean editable, gboolean sensitive );
+
+void       nact_gtk_utils_toggle_reset_initial_state( GtkToggleButton *button );
 
 /* image utilities
  */
diff --git a/src/nact/nact-ienvironment-tab.c b/src/nact/nact-ienvironment-tab.c
index e77416a..23f5ed6 100644
--- a/src/nact/nact-ienvironment-tab.c
+++ b/src/nact/nact-ienvironment-tab.c
@@ -444,31 +444,32 @@ on_tab_updatable_selection_changed( NactIEnvironmentTab *instance, gint count_se
 		raz_desktop_listview( instance );
 
 		always_button = base_window_get_widget( BASE_WINDOW( instance ), "ShowAlwaysButton" );
-		nact_gtk_utils_set_editable( G_OBJECT( always_button ), editable );
-
 		show_button = base_window_get_widget( BASE_WINDOW( instance ), "OnlyShowButton" );
-		nact_gtk_utils_set_editable( G_OBJECT( show_button ), editable );
-
 		notshow_button = base_window_get_widget( BASE_WINDOW( instance ), "DoNotShowButton" );
-		nact_gtk_utils_set_editable( G_OBJECT( notshow_button ), editable );
 
 		desktops = context ? na_object_get_only_show_in( context ) : NULL;
 		listview = GTK_TREE_VIEW( base_window_get_widget( BASE_WINDOW( instance ), "EnvironmentsDesktopTreeView" ));
 		gtk_toggle_button_set_inconsistent( GTK_TOGGLE_BUTTON( always_button ), context == NULL );
 
 		if( desktops && g_slist_length( desktops )){
-			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( show_button ), G_CALLBACK( on_only_show_toggled ));
+			nact_gtk_utils_radio_set_initial_state(
+					GTK_RADIO_BUTTON( show_button ),
+					G_CALLBACK( on_only_show_toggled ), instance, editable, ( context == NULL ));
 			gtk_widget_set_sensitive( GTK_WIDGET( listview ), TRUE );
 
 		} else {
 			desktops = context ? na_object_get_not_show_in( context ) : NULL;
 
 			if( desktops && g_slist_length( desktops )){
-				nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( notshow_button ), G_CALLBACK( on_do_not_show_toggled ));
+				nact_gtk_utils_radio_set_initial_state(
+						GTK_RADIO_BUTTON( notshow_button ),
+						G_CALLBACK( on_do_not_show_toggled ), instance, editable, ( context == NULL ));
 				gtk_widget_set_sensitive( GTK_WIDGET( listview ), TRUE );
 
 			} else {
-				nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( always_button ), G_CALLBACK( on_show_always_toggled ));
+				nact_gtk_utils_radio_set_initial_state(
+						GTK_RADIO_BUTTON( always_button ),
+						G_CALLBACK( on_show_always_toggled ), instance, editable, ( context == NULL ));
 				gtk_widget_set_sensitive( GTK_WIDGET( listview ), FALSE );
 				desktops = NULL;
 			}
@@ -597,7 +598,8 @@ on_show_always_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *ins
 			}
 
 		} else {
-			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_show_always_toggled ), instance, active );
+			nact_gtk_utils_radio_reset_initial_state(
+					GTK_RADIO_BUTTON( toggle_button ), G_CALLBACK( on_show_always_toggled ));
 		}
 	}
 }
@@ -635,7 +637,8 @@ on_only_show_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *insta
 			}
 
 		} else {
-			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_only_show_toggled ), instance, active );
+			nact_gtk_utils_radio_reset_initial_state(
+					GTK_RADIO_BUTTON( toggle_button ), G_CALLBACK( on_only_show_toggled ));
 		}
 	}
 }
@@ -673,7 +676,8 @@ on_do_not_show_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *ins
 			}
 
 		} else {
-			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_do_not_show_toggled ), instance, active );
+			nact_gtk_utils_radio_reset_initial_state(
+					GTK_RADIO_BUTTON( toggle_button ), G_CALLBACK( on_do_not_show_toggled ));
 		}
 	}
 }
diff --git a/src/nact/nact-iexecution-tab.c b/src/nact/nact-iexecution-tab.c
index e282cb0..880df96 100644
--- a/src/nact/nact-iexecution-tab.c
+++ b/src/nact/nact-iexecution-tab.c
@@ -293,31 +293,32 @@ on_tab_updatable_selection_changed( NactIExecutionTab *instance, gint count_sele
 		st_on_selection_change = TRUE;
 
 		normal_toggle = base_window_get_widget( BASE_WINDOW( instance ), "ExecutionModeNormal" );
-		nact_gtk_utils_set_editable( G_OBJECT( normal_toggle ), editable );
-
 		terminal_toggle = base_window_get_widget( BASE_WINDOW( instance ), "ExecutionModeTerminal" );
-		nact_gtk_utils_set_editable( G_OBJECT( terminal_toggle ), editable );
-
 		embedded_toggle = base_window_get_widget( BASE_WINDOW( instance ), "ExecutionModeEmbedded" );
-		nact_gtk_utils_set_editable( G_OBJECT( embedded_toggle ), editable );
-
 		display_toggle = base_window_get_widget( BASE_WINDOW( instance ), "ExecutionModeDisplayOutput" );
-		nact_gtk_utils_set_editable( G_OBJECT( display_toggle ), editable );
 
 		mode = profile ? na_object_get_execution_mode( profile ) : g_strdup( "Normal" );
 		gtk_toggle_button_set_inconsistent( GTK_TOGGLE_BUTTON( normal_toggle ), profile == NULL );
 
 		if( !strcmp( mode, "Normal" )){
-			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( normal_toggle ), G_CALLBACK( on_normal_mode_toggled ));
+			nact_gtk_utils_radio_set_initial_state(
+					GTK_RADIO_BUTTON( normal_toggle ),
+					G_CALLBACK( on_normal_mode_toggled ), instance, editable, ( profile == NULL ));
 
 		} else if( !strcmp( mode, "Terminal" )){
-			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( terminal_toggle ), G_CALLBACK( on_terminal_mode_toggled ));
+			nact_gtk_utils_radio_set_initial_state(
+					GTK_RADIO_BUTTON( terminal_toggle ),
+					G_CALLBACK( on_terminal_mode_toggled ), instance, editable, ( profile == NULL ));
 
 		} else if( !strcmp( mode, "Embedded" )){
-			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( embedded_toggle ), G_CALLBACK( on_embedded_mode_toggled ));
+			nact_gtk_utils_radio_set_initial_state(
+					GTK_RADIO_BUTTON( embedded_toggle ),
+					G_CALLBACK( on_embedded_mode_toggled ), instance, editable, ( profile == NULL ));
 
 		} else if( !strcmp( mode, "DisplayOutput" )){
-			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( display_toggle ), G_CALLBACK( on_display_mode_toggled ));
+			nact_gtk_utils_radio_set_initial_state(
+					GTK_RADIO_BUTTON( display_toggle ),
+					G_CALLBACK( on_display_mode_toggled ), instance, editable, ( profile == NULL ));
 
 		} else {
 			g_warning( "%s: unable to setup execution mode '%s'", thisfn, mode );
@@ -402,7 +403,7 @@ execution_mode_toggle( NactIExecutionTab *instance, GtkToggleButton *toggle_butt
 			}
 
 		} else {
-			nact_gtk_utils_reset_initial_state( toggle_button, cb, instance, active );
+			nact_gtk_utils_radio_reset_initial_state( GTK_RADIO_BUTTON( toggle_button ), cb );
 		}
 	}
 }
diff --git a/src/nact/nact-main-window.c b/src/nact/nact-main-window.c
index 876df5c..81f4fcc 100644
--- a/src/nact/nact-main-window.c
+++ b/src/nact/nact-main-window.c
@@ -1208,7 +1208,7 @@ on_base_runtime_init_toplevel( NactMainWindow *window, gpointer user_data )
 
 		nact_main_menubar_runtime_init( window );
 
-		order_mode = na_iprefs_get_order_mode( NA_PIVOT( updater ));
+		order_mode = na_iprefs_get_order_mode( NA_PIVOT( updater ), NULL );
 		ipivot_consumer_on_display_order_changed( NA_IPIVOT_CONSUMER( window ), order_mode );
 
 		/* fill the IActionsList at last so that all signals are connected
diff --git a/src/nact/nact-preferences-editor.c b/src/nact/nact-preferences-editor.c
index d56aad9..226dfe1 100644
--- a/src/nact/nact-preferences-editor.c
+++ b/src/nact/nact-preferences-editor.c
@@ -38,6 +38,7 @@
 
 #include "nact-application.h"
 #include "nact-export-format.h"
+#include "nact-gtk-utils.h"
 #include "nact-schemes-list.h"
 #include "nact-providers-list.h"
 #include "nact-preferences-editor.h"
@@ -51,7 +52,42 @@ struct NactPreferencesEditorClassPrivate {
 /* private instance data
  */
 struct NactPreferencesEditorPrivate {
-	gboolean     dispose_has_run;
+	gboolean dispose_has_run;
+	gboolean preferences_locked;
+
+	/* first tab: runtime preferences */
+	guint    order_mode;
+	gboolean order_mode_mandatory;
+	gboolean root_menu;
+	gboolean root_menu_mandatory;
+	gboolean about_item;
+	gboolean about_item_mandatory;
+
+	/* second tab: ui preferences */
+	gboolean relabel_menu;
+	gboolean relabel_menu_mandatory;
+	gboolean relabel_action;
+	gboolean relabel_action_mandatory;
+	gboolean relabel_profile;
+	gboolean relabel_profile_mandatory;
+	gboolean esc_quit;
+	gboolean esc_quit_mandatory;
+	gboolean esc_confirm;
+	gboolean esc_confirm_mandatory;
+	gboolean auto_save;
+	gboolean auto_save_mandatory;
+	guint    auto_save_period;
+	gboolean auto_save_period_mandatory;
+
+	/* third tab: import mode */
+	guint    import_mode;
+	gboolean import_mode_mandatory;
+
+	/* fourth tab: export format */
+	gboolean export_format_mandatory;
+
+	/* fifth tab: default list of available schemes */
+	/* sixth tab: i/o providers */
 };
 
 static GObjectClass *st_parent_class = NULL;
@@ -71,13 +107,36 @@ static gchar   *base_get_ui_filename( const BaseWindow *dialog );
 static void     on_base_initial_load_dialog( NactPreferencesEditor *editor, gpointer user_data );
 static void     on_base_runtime_init_dialog( NactPreferencesEditor *editor, gpointer user_data );
 static void     on_base_all_widgets_showed( NactPreferencesEditor *editor, gpointer user_data );
-static void     on_esc_quit_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
-static void     esc_quit_activated( NactPreferencesEditor *editor, gboolean esc_quit_active );
-static void     on_auto_save_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
-static void     auto_save_activated( NactPreferencesEditor *editor, gboolean auto_save_active );
+static void     order_mode_setup( NactPreferencesEditor *editor, NAPivot *pivot );
+static void     order_mode_on_alpha_asc_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     order_mode_on_alpha_desc_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     order_mode_on_manual_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     order_mode_on_toggled( NactPreferencesEditor *editor, GtkToggleButton *togglebutton, GCallback cb, guint order_mode );
+static void     root_menu_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     root_menu_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     about_item_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     about_item_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     relabel_menu_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     relabel_menu_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     relabel_action_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     relabel_action_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     relabel_profile_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     relabel_profile_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     esc_quit_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     esc_quit_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     esc_confirm_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     esc_confirm_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     auto_save_setup( NactPreferencesEditor *editor, NASettings *settings );
+static void     auto_save_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor );
+static void     auto_save_period_on_change_value( GtkSpinButton *spinbutton, NactPreferencesEditor *editor );
+static void     import_mode_setup( NactPreferencesEditor *editor, NAPivot *pivot );
+static void     import_mode_on_ask_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     import_mode_on_override_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     import_mode_on_renumber_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     import_mode_on_noimport_toggled( GtkToggleButton *togglebutton, NactPreferencesEditor *editor );
+static void     import_mode_on_toggled( NactPreferencesEditor *editor, GtkToggleButton *togglebutton, GCallback cb, guint import_mode );
 static void     on_cancel_clicked( GtkButton *button, NactPreferencesEditor *editor );
 static void     on_ok_clicked( GtkButton *button, NactPreferencesEditor *editor );
-static void     enable_order_mode_buttons( NactPreferencesEditor *editor );
 static void     save_preferences( NactPreferencesEditor *editor );
 
 static gboolean base_dialog_response( GtkDialog *dialog, gint code, BaseWindow *window );
@@ -227,7 +286,24 @@ instance_finalize( GObject *dialog )
 static NactPreferencesEditor *
 preferences_editor_new( BaseWindow *parent )
 {
-	return( g_object_new( NACT_PREFERENCES_EDITOR_TYPE, BASE_WINDOW_PROP_PARENT, parent, NULL ));
+	NactPreferencesEditor *editor;
+	NactApplication *application;
+	NAUpdater *updater;
+	NASettings *settings;
+	gboolean are_locked, mandatory;
+
+	editor = NACT_PREFERENCES_EDITOR( g_object_new( NACT_PREFERENCES_EDITOR_TYPE, BASE_WINDOW_PROP_PARENT, parent, NULL ));
+
+	application = NACT_APPLICATION( base_window_get_application( parent ));
+	updater = nact_application_get_updater( application );
+	settings = na_pivot_get_settings( NA_PIVOT( updater ));
+
+	are_locked = na_settings_get_boolean( settings, NA_IPREFS_ADMIN_PREFERENCES_LOCKED, NULL, &mandatory );
+	editor->private->preferences_locked = are_locked && mandatory;
+	g_debug( "nact_preferences_editor_new: are_locked=%s, mandatory=%s",
+			are_locked ? "True":"False", mandatory ? "True":"False" );
+
+	return( editor );
 }
 
 /**
@@ -278,13 +354,17 @@ on_base_initial_load_dialog( NactPreferencesEditor *editor, gpointer user_data )
 	GtkWidget *container;
 	GtkTreeView *listview;
 
-	g_debug( "%s: editor=%p, user_data=%p", thisfn, ( void * ) editor, ( void * ) user_data );
 	g_return_if_fail( NACT_IS_PREFERENCES_EDITOR( editor ));
 
+	g_debug( "%s: editor=%p, user_data=%p", thisfn, ( void * ) editor, ( void * ) user_data );
+
 	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
 	updater = nact_application_get_updater( application );
+
 	container = base_window_get_widget( BASE_WINDOW( editor ), "PreferencesExportFormatVBox" );
-	nact_export_format_init_display( NA_PIVOT( updater ), container, EXPORT_FORMAT_DISPLAY_PREFERENCES );
+	nact_export_format_init_display(
+			container, NA_PIVOT( updater ),
+			EXPORT_FORMAT_DISPLAY_PREFERENCES, !editor->private->preferences_locked );
 
 	listview = GTK_TREE_VIEW( base_window_get_widget( BASE_WINDOW( editor ), "SchemesTreeView" ));
 	nact_schemes_list_create_model( listview, SCHEMES_LIST_FOR_PREFERENCES );
@@ -299,20 +379,11 @@ on_base_runtime_init_dialog( NactPreferencesEditor *editor, gpointer user_data )
 	static const gchar *thisfn = "nact_preferences_editor_on_runtime_init_dialog";
 	NactApplication *application;
 	NAUpdater *updater;
-	gint order_mode;
-	gboolean add_about_item;
-	gboolean create_root_menu;
-	gboolean relabel;
-	guint import_mode;
-	GQuark export_format;
+	NASettings *settings;
 	GtkWidget *container;
-	GtkWidget *button;
-	gboolean esc_quit, esc_confirm;
+	GQuark export_format;
 	GtkTreeView *listview;
-	gboolean auto_save_on;
-	guint auto_save_period;
-	GtkAdjustment *adjustment;
-	NASettings *settings;
+	GtkWidget *ok_button;
 
 	g_debug( "%s: editor=%p, user_data=%p", thisfn, ( void * ) editor, ( void * ) user_data );
 
@@ -322,106 +393,28 @@ on_base_runtime_init_dialog( NactPreferencesEditor *editor, gpointer user_data )
 
 	/* first tab: runtime preferences
 	 */
-	order_mode = na_iprefs_get_order_mode( NA_PIVOT( updater ));
-	switch( order_mode ){
-		case IPREFS_ORDER_ALPHA_ASCENDING:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaAscButton" );
-			break;
-
-		case IPREFS_ORDER_ALPHA_DESCENDING:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaDescButton" );
-			break;
-
-		case IPREFS_ORDER_MANUAL:
-		default:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "OrderManualButton" );
-			break;
-	}
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), TRUE );
-	enable_order_mode_buttons( editor );
-
-	create_root_menu = na_settings_get_boolean( settings, NA_IPREFS_ITEMS_CREATE_ROOT_MENU, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "CreateRootMenuButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), create_root_menu );
-
-	add_about_item = na_settings_get_boolean( settings, NA_IPREFS_ITEMS_ADD_ABOUT_ITEM, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AddAboutButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), add_about_item );
+	order_mode_setup( editor, NA_PIVOT( updater ));
+	root_menu_setup( editor, settings );
+	about_item_setup( editor, settings );
 
 	/* second tab: ui preferences
 	 */
-	relabel = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_MENU, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelMenuButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), relabel );
-
-	relabel = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_ACTION, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelActionButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), relabel );
-
-	relabel = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_PROFILE, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelProfileButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), relabel );
-
-	button = base_window_get_widget( BASE_WINDOW( editor ), "EscCloseButton" );
-
-	base_window_signal_connect(
-			BASE_WINDOW( editor ),
-			G_OBJECT( button ),
-			"toggled",
-			G_CALLBACK( on_esc_quit_toggled ));
-
-	esc_quit = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_QUIT, NULL, NULL );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), esc_quit );
-	esc_quit_activated( editor, esc_quit );
-
-	esc_confirm = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_CONFIRM, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "EscConfirmButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), esc_confirm );
-
-	auto_save_on = na_settings_get_boolean( settings, NA_IPREFS_MAIN_SAVE_AUTO, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveCheckButton" );
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), auto_save_on );
-	auto_save_activated( editor, auto_save_on );
-
-	base_window_signal_connect(
-			BASE_WINDOW( editor ),
-			G_OBJECT( button ),
-			"toggled",
-			G_CALLBACK( on_auto_save_toggled ));
-
-	auto_save_period = na_settings_get_uint( settings, NA_IPREFS_MAIN_SAVE_PERIOD, NULL, NULL );
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AutoSavePeriodicitySpinButton" );
-	adjustment = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( button ));
-	gtk_adjustment_configure( adjustment, auto_save_period, 1, 999, 1, 10, 0 );
-
-	/* third tab: import tool
+	relabel_menu_setup( editor, settings );
+	relabel_action_setup( editor, settings );
+	relabel_profile_setup( editor, settings );
+	esc_quit_setup( editor, settings );
+	esc_confirm_setup( editor, settings );
+	auto_save_setup( editor, settings );
+
+	/* third tab: import mode
 	 */
-	import_mode = na_iprefs_get_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE );
-	switch( import_mode ){
-		case IMPORTER_MODE_ASK:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsAskButton" );
-			break;
-
-		case IMPORTER_MODE_RENUMBER:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsRenumberButton" );
-			break;
-
-		case IMPORTER_MODE_OVERRIDE:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsOverrideButton" );
-			break;
-
-		case IMPORTER_MODE_NO_IMPORT:
-		default:
-			button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsNoImportButton" );
-			break;
-	}
-	gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), TRUE );
+	import_mode_setup( editor, NA_PIVOT( updater ));
 
-	/* fourth tab: export tool
+	/* fourth tab: export format
 	 */
-	export_format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT );
+	export_format = na_iprefs_get_export_format( NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, &editor->private->export_format_mandatory );
 	container = base_window_get_widget( BASE_WINDOW( editor ), "PreferencesExportFormatVBox" );
-	nact_export_format_select( container, export_format );
+	nact_export_format_select( container, !editor->private->export_format_mandatory, export_format );
 
 	/* fifth tab: default schemes
 	 */
@@ -441,11 +434,13 @@ on_base_runtime_init_dialog( NactPreferencesEditor *editor, gpointer user_data )
 			"clicked",
 			G_CALLBACK( on_cancel_clicked ));
 
-	base_window_signal_connect_by_name(
+	ok_button = base_window_get_widget( BASE_WINDOW( editor ), "OKButton" );
+	base_window_signal_connect(
 			BASE_WINDOW( editor ),
-			"OKButton",
+			G_OBJECT( ok_button ),
 			"clicked",
 			G_CALLBACK( on_ok_clicked ));
+	nact_gtk_utils_set_editable( G_OBJECT( ok_button ), !editor->private->preferences_locked );
 }
 
 static void
@@ -461,203 +456,560 @@ on_base_all_widgets_showed( NactPreferencesEditor *editor, gpointer user_data )
 	nact_schemes_list_show_all( BASE_WINDOW( editor ));
 }
 
+/*
+ * 'order mode' is editable if preferences in general are not locked,
+ * and this one is not mandatory.
+ *
+ * This is not related in any way to the level zero order writability status
+ *
+ * The radio button group is insensitive if preferences are locked.
+ * If preferences in general are not locked, but this one is mandatory,
+ * then the radio group is sensitive, but not editable.
+ */
 static void
-on_esc_quit_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+order_mode_setup( NactPreferencesEditor *editor, NAPivot *pivot )
 {
-	gboolean is_active;
+	gboolean editable;
+	GtkWidget *alpha_asc_button, *alpha_desc_button, *manual_button;
+	GtkWidget *active_button;
+	GCallback active_handler;
+
+	editor->private->order_mode = na_iprefs_get_order_mode( pivot, &editor->private->order_mode_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->order_mode_mandatory;
+
+	alpha_asc_button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaAscButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( alpha_asc_button ), "toggled", G_CALLBACK( order_mode_on_alpha_asc_toggled ));
+
+	alpha_desc_button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaDescButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( alpha_desc_button ), "toggled", G_CALLBACK( order_mode_on_alpha_desc_toggled ));
+
+	manual_button = base_window_get_widget( BASE_WINDOW( editor ), "OrderManualButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( manual_button ), "toggled", G_CALLBACK( order_mode_on_manual_toggled ));
+
+	switch( editor->private->order_mode ){
+		case IPREFS_ORDER_ALPHA_ASCENDING:
+			active_button = alpha_asc_button;
+			active_handler = G_CALLBACK( order_mode_on_alpha_asc_toggled );
+			break;
+		case IPREFS_ORDER_ALPHA_DESCENDING:
+			active_button = alpha_desc_button;
+			active_handler = G_CALLBACK( order_mode_on_alpha_desc_toggled );
+			break;
+		case IPREFS_ORDER_MANUAL:
+		default:
+			active_button = manual_button;
+			active_handler = G_CALLBACK( order_mode_on_manual_toggled );
+			break;
+	}
 
-	is_active = gtk_toggle_button_get_active( button );
-	esc_quit_activated( editor, is_active );
+	nact_gtk_utils_radio_set_initial_state(
+			GTK_RADIO_BUTTON( active_button ),
+			active_handler, editor, editable, !editor->private->preferences_locked );
 }
 
 static void
-esc_quit_activated( NactPreferencesEditor *editor, gboolean esc_quit_active )
+order_mode_on_alpha_asc_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
 {
-	GtkWidget *toggle;
+	order_mode_on_toggled( editor, toggle_button, G_CALLBACK( order_mode_on_alpha_asc_toggled ), IPREFS_ORDER_ALPHA_ASCENDING );
+}
 
-	toggle = base_window_get_widget( BASE_WINDOW( editor ), "EscConfirmButton" );
-	gtk_widget_set_sensitive( toggle, esc_quit_active );
+static void
+order_mode_on_alpha_desc_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
+{
+	order_mode_on_toggled( editor, toggle_button, G_CALLBACK( order_mode_on_alpha_desc_toggled ), IPREFS_ORDER_ALPHA_DESCENDING );
 }
 
 static void
-on_auto_save_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+order_mode_on_manual_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
 {
-	gboolean is_active;
+	order_mode_on_toggled( editor, toggle_button, G_CALLBACK( order_mode_on_manual_toggled ), IPREFS_ORDER_MANUAL );
+}
 
-	is_active = gtk_toggle_button_get_active( button );
-	auto_save_activated( editor, is_active );
+static void
+order_mode_on_toggled( NactPreferencesEditor *editor, GtkToggleButton *toggle_button, GCallback cb, guint order_mode )
+{
+	gboolean editable;
+	gboolean active;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( toggle_button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		active = gtk_toggle_button_get_active( toggle_button );
+		if( active ){
+			editor->private->order_mode = order_mode;
+		}
+	} else {
+		nact_gtk_utils_radio_reset_initial_state( GTK_RADIO_BUTTON( toggle_button ), cb );
+	}
 }
 
+/*
+ * create a root menu
+ */
 static void
-auto_save_activated( NactPreferencesEditor *editor, gboolean auto_save_activated )
+root_menu_setup( NactPreferencesEditor *editor, NASettings *settings )
 {
-	GtkWidget *widget;
+	gboolean editable;
 
-	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSavePeriodicitySpinButton" );
-	gtk_widget_set_sensitive( widget, auto_save_activated );
+	editor->private->root_menu = na_settings_get_boolean( settings, NA_IPREFS_ITEMS_CREATE_ROOT_MENU, NULL, &editor->private->root_menu_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->root_menu_mandatory;
 
-	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveLabel1" );
-	gtk_widget_set_sensitive( widget, auto_save_activated );
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"CreateRootMenuButton", G_CALLBACK( root_menu_on_toggled ),
+			editor->private->root_menu, editable, !editor->private->preferences_locked );
+}
 
-	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveLabel2" );
-	gtk_widget_set_sensitive( widget, auto_save_activated );
+static void
+root_menu_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->root_menu = gtk_toggle_button_get_active( button );
+
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
 }
 
+/*
+ * add an about item
+ */
 static void
-on_cancel_clicked( GtkButton *button, NactPreferencesEditor *editor )
+about_item_setup( NactPreferencesEditor *editor, NASettings *settings )
 {
-	GtkNotebook *notebook = GTK_NOTEBOOK( base_window_get_widget( BASE_WINDOW( editor ), "PreferencesNotebook" ));
-	st_last_tab = gtk_notebook_get_current_page( notebook );
+	gboolean editable;
 
-	GtkWindow *toplevel = base_window_get_toplevel( BASE_WINDOW( editor ));
-	gtk_dialog_response( GTK_DIALOG( toplevel ), GTK_RESPONSE_CLOSE );
+	editor->private->about_item = na_settings_get_boolean( settings, NA_IPREFS_ITEMS_ADD_ABOUT_ITEM, NULL, &editor->private->about_item_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->about_item_mandatory;
+
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"AddAboutButton", G_CALLBACK( about_item_on_toggled ),
+			editor->private->about_item, editable, !editor->private->preferences_locked );
 }
 
 static void
-on_ok_clicked( GtkButton *button, NactPreferencesEditor *editor )
+about_item_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
 {
-	GtkNotebook *notebook = GTK_NOTEBOOK( base_window_get_widget( BASE_WINDOW( editor ), "PreferencesNotebook" ));
-	st_last_tab = gtk_notebook_get_current_page( notebook );
+	gboolean editable;
 
-	GtkWindow *toplevel = base_window_get_toplevel( BASE_WINDOW( editor ));
-	gtk_dialog_response( GTK_DIALOG( toplevel ), GTK_RESPONSE_OK );
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->about_item = gtk_toggle_button_get_active( button );
+
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
 }
 
+/*
+ * add an about item
+ */
 static void
-enable_order_mode_buttons( NactPreferencesEditor *editor )
+relabel_menu_setup( NactPreferencesEditor *editor, NASettings *settings )
 {
-	NactApplication *application;
-	NAUpdater *updater;
-	gboolean writable;
-	GtkWidget *button;
+	gboolean editable;
 
-	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
-	updater = nact_application_get_updater( application );
-	writable = na_iprefs_is_level_zero_writable( NA_PIVOT( updater ));
+	editor->private->relabel_menu = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_MENU, NULL, &editor->private->relabel_menu_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->relabel_menu_mandatory;
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaAscButton" );
-	gtk_widget_set_sensitive( button, writable );
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"RelabelMenuButton", G_CALLBACK( relabel_menu_on_toggled ),
+			editor->private->relabel_menu, editable, !editor->private->preferences_locked );
+}
+
+static void
+relabel_menu_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaDescButton" );
-	gtk_widget_set_sensitive( button, writable );
+	if( editable ){
+		editor->private->relabel_menu = gtk_toggle_button_get_active( button );
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "OrderManualButton" );
-	gtk_widget_set_sensitive( button, writable );
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
 }
 
+/*
+ * add an about item
+ */
 static void
-save_preferences( NactPreferencesEditor *editor )
+relabel_action_setup( NactPreferencesEditor *editor, NASettings *settings )
 {
-	NactApplication *application;
-	NAUpdater *updater;
-	GtkWidget *button;
-	gint order_mode;
-	gboolean enabled;
-	gboolean relabel;
-	guint import_mode;
-	GtkWidget *container;
-	NAExportFormat *export_format;
-	gboolean esc_quit, esc_confirm;
-	gboolean auto_save_on;
-	guint auto_save_period;
-	GtkAdjustment *adjustment;
-	NASettings *settings;
+	gboolean editable;
 
-	application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
-	updater = nact_application_get_updater( application );
-	settings = na_pivot_get_settings( NA_PIVOT( updater ));
+	editor->private->relabel_action = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_ACTION, NULL, &editor->private->relabel_action_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->relabel_action_mandatory;
+
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"RelabelActionButton", G_CALLBACK( relabel_action_on_toggled ),
+			editor->private->relabel_action, editable, !editor->private->preferences_locked );
+}
+
+static void
+relabel_action_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->relabel_action = gtk_toggle_button_get_active( button );
 
-	/* first tab: runtime preferences
-	 */
-	order_mode = IPREFS_ORDER_ALPHA_ASCENDING;
-	button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaAscButton" );
-	if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-		order_mode = IPREFS_ORDER_ALPHA_ASCENDING;
 	} else {
-		button = base_window_get_widget( BASE_WINDOW( editor ), "OrderAlphaDescButton" );
-		if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-			order_mode = IPREFS_ORDER_ALPHA_DESCENDING;
-		} else {
-			button = base_window_get_widget( BASE_WINDOW( editor ), "OrderManualButton" );
-			if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-				order_mode = IPREFS_ORDER_MANUAL;
-			}
-		}
+		nact_gtk_utils_toggle_reset_initial_state( button );
 	}
-	na_iprefs_set_order_mode( NA_PIVOT( updater ), order_mode );
+}
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "CreateRootMenuButton" );
-	enabled = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_ITEMS_CREATE_ROOT_MENU, enabled );
+/*
+ * add an about item
+ */
+static void
+relabel_profile_setup( NactPreferencesEditor *editor, NASettings *settings )
+{
+	gboolean editable;
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AddAboutButton" );
-	enabled = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_ITEMS_ADD_ABOUT_ITEM, enabled );
+	editor->private->relabel_profile = na_settings_get_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_PROFILE, NULL, &editor->private->relabel_profile_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->relabel_profile_mandatory;
 
-	/* second tab: runtime preferences
-	 */
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelMenuButton" );
-	relabel = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_MENU, relabel );
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"RelabelProfileButton", G_CALLBACK( relabel_profile_on_toggled ),
+			editor->private->relabel_profile, editable, !editor->private->preferences_locked );
+}
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelActionButton" );
-	relabel = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_ACTION, relabel );
+static void
+relabel_profile_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "RelabelProfileButton" );
-	relabel = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_PROFILE, relabel );
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "EscCloseButton" );
-	esc_quit = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_ASSISTANT_ESC_QUIT, esc_quit );
+	if( editable ){
+		editor->private->relabel_profile = gtk_toggle_button_get_active( button );
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "EscConfirmButton" );
-	esc_confirm = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_ASSISTANT_ESC_CONFIRM, esc_confirm );
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
+}
+
+/*
+ * whether Esc key quits the assistants
+ */
+static void
+esc_quit_setup( NactPreferencesEditor *editor, NASettings *settings )
+{
+	gboolean editable;
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveCheckButton" );
-	auto_save_on = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ));
-	na_settings_set_boolean( settings, NA_IPREFS_MAIN_SAVE_AUTO, auto_save_on );
+	editor->private->esc_quit = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_QUIT, NULL, &editor->private->esc_quit_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->esc_quit_mandatory;
 
-	button = base_window_get_widget( BASE_WINDOW( editor ), "AutoSavePeriodicitySpinButton" );
-	adjustment = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( button ));
-	auto_save_period = ( guint ) gtk_adjustment_get_value( adjustment );
-	na_settings_set_uint( settings, NA_IPREFS_MAIN_SAVE_PERIOD, auto_save_period );
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"EscCloseButton", G_CALLBACK( esc_quit_on_toggled ),
+			editor->private->esc_quit, editable, !editor->private->preferences_locked );
+}
+
+static void
+esc_quit_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+	GtkWidget *confirm_button;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->esc_quit = gtk_toggle_button_get_active( button );
+		confirm_button = base_window_get_widget( BASE_WINDOW( editor ), "EscConfirmButton" );
+		gtk_widget_set_sensitive( confirm_button, editor->private->esc_quit );
+
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
+}
+
+/*
+ * whether we should ask for a user confirmation when quitting an assistant
+ * on 'Esc' key
+ */
+static void
+esc_confirm_setup( NactPreferencesEditor *editor, NASettings *settings )
+{
+	gboolean editable;
+
+	editor->private->esc_confirm = na_settings_get_boolean( settings, NA_IPREFS_ASSISTANT_ESC_CONFIRM, NULL, &editor->private->esc_confirm_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->esc_confirm_mandatory;
+
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"EscConfirmButton", G_CALLBACK( esc_confirm_on_toggled ),
+			editor->private->esc_confirm, editable, !editor->private->preferences_locked );
+}
+
+static void
+esc_confirm_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->esc_confirm = gtk_toggle_button_get_active( button );
+
+	} else {
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
+}
+
+/*
+ * add an about item
+ */
+static void
+auto_save_setup( NactPreferencesEditor *editor, NASettings *settings )
+{
+	gboolean editable;
+	GtkWidget *spin_button;
+	GtkAdjustment *adjustment;
+
+	g_debug( "nact_preferences_editor_auto_save_setup" );
+	editor->private->auto_save = na_settings_get_boolean( settings, NA_IPREFS_MAIN_SAVE_AUTO, NULL, &editor->private->auto_save_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->auto_save_mandatory;
+
+	editor->private->auto_save_period = na_settings_get_uint( settings, NA_IPREFS_MAIN_SAVE_PERIOD, NULL, &editor->private->auto_save_period_mandatory );
+	spin_button = base_window_get_widget( BASE_WINDOW( editor ), "AutoSavePeriodicitySpinButton" );
+	adjustment = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin_button ));
+	gtk_adjustment_configure( adjustment, editor->private->auto_save_period, 1, 999, 1, 10, 0 );
+
+	editable = !editor->private->preferences_locked && !editor->private->auto_save_period_mandatory;
+	gtk_editable_set_editable( GTK_EDITABLE( spin_button ), editable );
+	base_window_signal_connect( BASE_WINDOW( editor ),
+			G_OBJECT( spin_button ), "value-changed", G_CALLBACK( auto_save_period_on_change_value ));
+
+	editable = !editor->private->preferences_locked && !editor->private->auto_save_mandatory;
+	nact_gtk_utils_toggle_set_initial_state( BASE_WINDOW( editor ),
+			"AutoSaveCheckButton", G_CALLBACK( auto_save_on_toggled ),
+			editor->private->auto_save, editable, !editor->private->preferences_locked );
+}
+
+static void
+auto_save_on_toggled( GtkToggleButton *button, NactPreferencesEditor *editor )
+{
+	gboolean editable;
+	GtkWidget *widget;
+	gboolean sensitive;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		editor->private->auto_save = gtk_toggle_button_get_active( button );
 
-	/* third tab: import tool
-	 */
-	import_mode = IMPORTER_MODE_NO_IMPORT;
-	button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsRenumberButton" );
-	if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-		import_mode = IMPORTER_MODE_RENUMBER;
 	} else {
-		button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsOverrideButton" );
-		if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-			import_mode = IMPORTER_MODE_OVERRIDE;
-		} else {
-			button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsAskButton" );
-			if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ))){
-				import_mode = IMPORTER_MODE_ASK;
-			}
+		nact_gtk_utils_toggle_reset_initial_state( button );
+	}
+
+	sensitive = editor->private->auto_save && !editor->private->preferences_locked;
+
+	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSavePeriodicitySpinButton" );
+	gtk_widget_set_sensitive( widget, sensitive );
+
+	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveLabel1" );
+	gtk_widget_set_sensitive( widget, sensitive  );
+
+	widget = base_window_get_widget( BASE_WINDOW( editor ), "AutoSaveLabel2" );
+	gtk_widget_set_sensitive( widget, sensitive  );
+}
+
+static void
+auto_save_period_on_change_value( GtkSpinButton *spinbutton, NactPreferencesEditor *editor )
+{
+	g_debug( "nact_preferences_editor_auto_save_period_on_change_value" );
+	editor->private->auto_save_period = gtk_spin_button_get_value_as_int( spinbutton );
+}
+
+/*
+ * preferred import mode
+ */
+static void
+import_mode_setup( NactPreferencesEditor *editor, NAPivot *pivot )
+{
+	gboolean editable;
+	GtkWidget *ask_button, *override_button, *renumber_button, *noimport_button;
+	GtkWidget *active_button;
+	GCallback active_handler;
+
+	editor->private->import_mode = na_iprefs_get_import_mode(
+			pivot, NA_IPREFS_IMPORT_PREFERRED_MODE, &editor->private->import_mode_mandatory );
+	editable = !editor->private->preferences_locked && !editor->private->import_mode_mandatory;
+
+	ask_button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsAskButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( ask_button ), "toggled", G_CALLBACK( import_mode_on_ask_toggled ));
+
+	override_button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsOverrideButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( override_button ), "toggled", G_CALLBACK( import_mode_on_override_toggled ));
+
+	renumber_button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsRenumberButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( renumber_button ), "toggled", G_CALLBACK( import_mode_on_renumber_toggled ));
+
+	noimport_button = base_window_get_widget( BASE_WINDOW( editor ), "PrefsNoImportButton" );
+	base_window_signal_connect( BASE_WINDOW( editor ), G_OBJECT( noimport_button ), "toggled", G_CALLBACK( import_mode_on_noimport_toggled ));
+
+	switch( editor->private->import_mode ){
+		case IMPORTER_MODE_ASK:
+			active_button = ask_button;
+			active_handler = G_CALLBACK( import_mode_on_ask_toggled );
+			break;
+		case IMPORTER_MODE_OVERRIDE:
+			active_button = override_button;
+			active_handler = G_CALLBACK( import_mode_on_override_toggled );
+			break;
+		case IMPORTER_MODE_RENUMBER:
+			active_button = renumber_button;
+			active_handler = G_CALLBACK( import_mode_on_renumber_toggled );
+			break;
+		case IMPORTER_MODE_NO_IMPORT:
+		default:
+			active_button = noimport_button;
+			active_handler = G_CALLBACK( import_mode_on_noimport_toggled );
+			break;
+	}
+
+	nact_gtk_utils_radio_set_initial_state(
+			GTK_RADIO_BUTTON( active_button ),
+			active_handler, editor, editable, !editor->private->preferences_locked );
+}
+
+static void
+import_mode_on_ask_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
+{
+	import_mode_on_toggled( editor, toggle_button, G_CALLBACK( import_mode_on_ask_toggled ), IMPORTER_MODE_ASK );
+}
+
+static void
+import_mode_on_override_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
+{
+	import_mode_on_toggled( editor, toggle_button, G_CALLBACK( import_mode_on_override_toggled ), IMPORTER_MODE_OVERRIDE );
+}
+
+static void
+import_mode_on_renumber_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
+{
+	import_mode_on_toggled( editor, toggle_button, G_CALLBACK( import_mode_on_renumber_toggled ), IMPORTER_MODE_RENUMBER );
+}
+
+static void
+import_mode_on_noimport_toggled( GtkToggleButton *toggle_button, NactPreferencesEditor *editor )
+{
+	import_mode_on_toggled( editor, toggle_button, G_CALLBACK( import_mode_on_noimport_toggled ), IMPORTER_MODE_NO_IMPORT );
+}
+
+static void
+import_mode_on_toggled( NactPreferencesEditor *editor, GtkToggleButton *toggle_button, GCallback cb, guint import_mode )
+{
+	gboolean editable;
+	gboolean active;
+
+	editable = ( gboolean ) GPOINTER_TO_UINT( g_object_get_data( G_OBJECT( toggle_button ), NACT_PROP_TOGGLE_EDITABLE ));
+
+	if( editable ){
+		active = gtk_toggle_button_get_active( toggle_button );
+		if( active ){
+			editor->private->import_mode = import_mode;
 		}
+	} else {
+		nact_gtk_utils_radio_reset_initial_state( GTK_RADIO_BUTTON( toggle_button ), cb );
 	}
-	na_iprefs_set_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE, import_mode );
+}
 
-	/* fourth tab: export tool
-	 */
-	container = base_window_get_widget( BASE_WINDOW( editor ), "PreferencesExportFormatVBox" );
-	export_format = nact_export_format_get_selected( container );
-	na_iprefs_set_export_format(
-			NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, na_export_format_get_quark( export_format ));
+static void
+on_cancel_clicked( GtkButton *button, NactPreferencesEditor *editor )
+{
+	GtkWindow *toplevel = base_window_get_toplevel( BASE_WINDOW( editor ));
+	gtk_dialog_response( GTK_DIALOG( toplevel ), GTK_RESPONSE_CLOSE );
+}
 
-	/* fifth tab: list of default schemes
-	 */
-	nact_schemes_list_save_defaults( BASE_WINDOW( editor ));
+static void
+on_ok_clicked( GtkButton *button, NactPreferencesEditor *editor )
+{
+	GtkWindow *toplevel = base_window_get_toplevel( BASE_WINDOW( editor ));
+	gtk_dialog_response( GTK_DIALOG( toplevel ), GTK_RESPONSE_OK );
+}
 
-	/* sixth tab: priorities of I/O providers
-	 */
-	nact_providers_list_save( BASE_WINDOW( editor ));
+static void
+save_preferences( NactPreferencesEditor *editor )
+{
+	NactApplication *application;
+	NAUpdater *updater;
+	NASettings *settings;
+	GtkWidget *container;
+	NAExportFormat *export_format;
+
+	if( !editor->private->preferences_locked ){
+		application = NACT_APPLICATION( base_window_get_application( BASE_WINDOW( editor )));
+		updater = nact_application_get_updater( application );
+		settings = na_pivot_get_settings( NA_PIVOT( updater ));
+
+		/* first tab: runtime preferences
+		 */
+		if( !editor->private->order_mode_mandatory ){
+			na_iprefs_set_order_mode( NA_PIVOT( updater ), editor->private->order_mode );
+		}
+		if( !editor->private->root_menu_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_ITEMS_CREATE_ROOT_MENU, editor->private->root_menu );
+		}
+		if( !editor->private->about_item_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_ITEMS_ADD_ABOUT_ITEM, editor->private->about_item );
+		}
+
+		/* second tab: runtime preferences
+		 */
+		if( !editor->private->relabel_menu_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_MENU, editor->private->relabel_menu );
+		}
+		if( !editor->private->relabel_action_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_ACTION, editor->private->relabel_action );
+		}
+		if( !editor->private->relabel_profile_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_RELABEL_DUPLICATE_PROFILE, editor->private->relabel_profile );
+		}
+		if( !editor->private->esc_quit_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_ASSISTANT_ESC_QUIT, editor->private->esc_quit );
+		}
+		if( !editor->private->esc_confirm_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_ASSISTANT_ESC_CONFIRM, editor->private->esc_confirm );
+		}
+		if( !editor->private->auto_save_mandatory ){
+			na_settings_set_boolean( settings, NA_IPREFS_MAIN_SAVE_AUTO, editor->private->auto_save );
+		}
+		if( !editor->private->auto_save_period_mandatory ){
+			na_settings_set_uint( settings, NA_IPREFS_MAIN_SAVE_PERIOD, editor->private->auto_save_period );
+		}
+
+		/* third tab: import mode
+		 */
+		if( !editor->private->import_mode_mandatory ){
+			na_iprefs_set_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE, editor->private->import_mode );
+		}
+
+		/* fourth tab: export format
+		 */
+		if( !editor->private->export_format_mandatory ){
+			container = base_window_get_widget( BASE_WINDOW( editor ), "PreferencesExportFormatVBox" );
+			export_format = nact_export_format_get_selected( container );
+			na_iprefs_set_export_format(
+					NA_PIVOT( updater ), NA_IPREFS_EXPORT_PREFERRED_FORMAT, na_export_format_get_quark( export_format ));
+		}
+
+		/* fifth tab: list of default schemes
+		 */
+		nact_schemes_list_save_defaults( BASE_WINDOW( editor ));
+
+		/* sixth tab: priorities of I/O providers
+		 */
+		nact_providers_list_save( BASE_WINDOW( editor ));
+	}
 }
 
 static gboolean
@@ -665,9 +1017,14 @@ base_dialog_response( GtkDialog *dialog, gint code, BaseWindow *window )
 {
 	static const gchar *thisfn = "nact_preferences_editor_on_dialog_response";
 	NactPreferencesEditor *editor;
+	gboolean stop;
+	GtkNotebook *notebook;
+
+	g_return_val_if_fail( NACT_IS_PREFERENCES_EDITOR( window ), FALSE );
 
 	g_debug( "%s: dialog=%p, code=%d, window=%p", thisfn, ( void * ) dialog, code, ( void * ) window );
-	g_assert( NACT_IS_PREFERENCES_EDITOR( window ));
+
+	stop = FALSE;
 	editor = NACT_PREFERENCES_EDITOR( window );
 
 	switch( code ){
@@ -676,16 +1033,21 @@ base_dialog_response( GtkDialog *dialog, gint code, BaseWindow *window )
 		case GTK_RESPONSE_CLOSE:
 		case GTK_RESPONSE_CANCEL:
 
-			g_object_unref( editor );
-			return( TRUE );
+			stop = TRUE;
 			break;
 
 		case GTK_RESPONSE_OK:
 			save_preferences( editor );
-			g_object_unref( editor );
-			return( TRUE );
+			stop = TRUE;
 			break;
 	}
 
-	return( FALSE );
+	if( stop ){
+		notebook = GTK_NOTEBOOK( base_window_get_widget( window, "PreferencesNotebook" ));
+		st_last_tab = gtk_notebook_get_current_page( notebook );
+		g_object_unref( editor );
+	}
+
+
+	return( stop );
 }
diff --git a/src/nact/nact-preferences.ui b/src/nact/nact-preferences.ui
index 90e969d..9ee7821 100644
--- a/src/nact/nact-preferences.ui
+++ b/src/nact/nact-preferences.ui
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0"?>
 <interface>
   <!-- interface-requires gtk+ 2.12 -->
   <!-- interface-naming-policy toplevel-contextual -->
@@ -23,6 +23,7 @@
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox4">
         <property name="visible">True</property>
+        <property name="orientation">vertical</property>
         <property name="spacing">2</property>
         <child>
           <object class="GtkNotebook" id="PreferencesNotebook">
@@ -31,6 +32,7 @@
             <child>
               <object class="GtkVBox" id="vbox33">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame3">
                     <property name="visible">True</property>
@@ -45,6 +47,7 @@
                           <object class="GtkVBox" id="vbox30">
                             <property name="visible">True</property>
                             <property name="border_width">6</property>
+                            <property name="orientation">vertical</property>
                             <property name="homogeneous">True</property>
                             <child>
                               <object class="GtkRadioButton" id="OrderAlphaAscButton">
@@ -123,6 +126,7 @@
                           <object class="GtkVBox" id="vbox17">
                             <property name="visible">True</property>
                             <property name="border_width">6</property>
+                            <property name="orientation">vertical</property>
                             <property name="homogeneous">True</property>
                             <child>
                               <object class="GtkCheckButton" id="CreateRootMenuButton">
@@ -187,6 +191,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
             <child>
               <object class="GtkVBox" id="vbox34">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame2">
                     <property name="visible">True</property>
@@ -200,6 +205,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                         <child>
                           <object class="GtkVBox" id="vbox25">
                             <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
                             <child>
                               <object class="GtkLabel" id="label45">
                                 <property name="visible">True</property>
@@ -216,6 +222,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                               <object class="GtkVBox" id="vbox27">
                                 <property name="visible">True</property>
                                 <property name="border_width">6</property>
+                                <property name="orientation">vertical</property>
                                 <child>
                                   <object class="GtkCheckButton" id="RelabelMenuButton">
                                     <property name="label" translatable="yes">Relabel _menus</property>
@@ -295,6 +302,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                           <object class="GtkVBox" id="vbox43">
                             <property name="visible">True</property>
                             <property name="border_width">6</property>
+                            <property name="orientation">vertical</property>
                             <child>
                               <object class="GtkCheckButton" id="EscCloseButton">
                                 <property name="label" translatable="yes">Esc key _quits the assistant</property>
@@ -358,6 +366,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                           <object class="GtkVBox" id="vbox3">
                             <property name="visible">True</property>
                             <property name="border_width">6</property>
+                            <property name="orientation">vertical</property>
                             <child>
                               <object class="GtkCheckButton" id="AutoSaveCheckButton">
                                 <property name="label" translatable="yes">Automatically _saves pending modifications</property>
@@ -391,7 +400,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                                   <object class="GtkSpinButton" id="AutoSavePeriodicitySpinButton">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="invisible_char">â??</property>
+                                    <property name="invisible_char">&#x25CF;</property>
                                     <property name="width_chars">5</property>
                                     <property name="snap_to_ticks">True</property>
                                     <property name="numeric">True</property>
@@ -456,6 +465,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
             <child>
               <object class="GtkVBox" id="vbox35">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame4">
                     <property name="visible">True</property>
@@ -469,6 +479,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                         <child>
                           <object class="GtkVBox" id="vbox13">
                             <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
                             <child>
                               <object class="GtkLabel" id="label8">
                                 <property name="visible">True</property>
@@ -485,6 +496,7 @@ Note that this item will be displayed only if a unique menu is defined in the Na
                               <object class="GtkVBox" id="vbox32">
                                 <property name="visible">True</property>
                                 <property name="border_width">6</property>
+                                <property name="orientation">vertical</property>
                                 <property name="homogeneous">True</property>
                                 <child>
                                   <object class="GtkRadioButton" id="PrefsNoImportButton">
@@ -593,6 +605,7 @@ Be warned: this mode may be dangerous. You will not be prompted another time.</p
             <child>
               <object class="GtkVBox" id="vbox41">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame5">
                     <property name="visible">True</property>
@@ -606,10 +619,12 @@ Be warned: this mode may be dangerous. You will not be prompted another time.</p
                         <child>
                           <object class="GtkVBox" id="vbox15">
                             <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
                             <child>
                               <object class="GtkVBox" id="PreferencesExportFormatVBox">
                                 <property name="visible">True</property>
                                 <property name="border_width">6</property>
+                                <property name="orientation">vertical</property>
                                 <property name="homogeneous">True</property>
                               </object>
                               <packing>
@@ -655,6 +670,7 @@ Be warned: this mode may be dangerous. You will not be prompted another time.</p
             <child>
               <object class="GtkVBox" id="vbox44">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame13">
                     <property name="visible">True</property>
@@ -699,6 +715,7 @@ You can add a new scheme by clicking on the '+' button.</property>
                             <child>
                               <object class="GtkVBox" id="vbox29">
                                 <property name="visible">True</property>
+                                <property name="orientation">vertical</property>
                                 <property name="spacing">6</property>
                                 <child>
                                   <object class="GtkButton" id="AddSchemeButton">
@@ -783,6 +800,7 @@ You can add a new scheme by clicking on the '+' button.</property>
             <child>
               <object class="GtkVBox" id="vbox1">
                 <property name="visible">True</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkFrame" id="frame7">
                     <property name="visible">True</property>
@@ -825,6 +843,7 @@ You can add a new scheme by clicking on the '+' button.</property>
                             <child>
                               <object class="GtkVBox" id="vbox2">
                                 <property name="visible">True</property>
+                                <property name="orientation">vertical</property>
                                 <property name="spacing">6</property>
                                 <child>
                                   <object class="GtkButton" id="ProviderButtonUp">
diff --git a/src/nact/nact-tree-model-dnd.c b/src/nact/nact-tree-model-dnd.c
index a8a8bc9..8747a5b 100644
--- a/src/nact/nact-tree-model-dnd.c
+++ b/src/nact/nact-tree-model-dnd.c
@@ -894,7 +894,7 @@ drop_uri_list( NactTreeModel *model, GtkTreePath *dest, GtkSelectionData  *selec
 	parms.parent = base_window_get_toplevel( BASE_WINDOW( main_window ));
 	parms.uris = g_slist_reverse( na_core_utils_slist_from_split( selection_data_data, "\r\n" ));
 
-	parms.mode = na_iprefs_get_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE );
+	parms.mode = na_iprefs_get_import_mode( NA_PIVOT( updater ), NA_IPREFS_IMPORT_PREFERRED_MODE, NULL );
 
 	parms.check_fn = ( NAIImporterCheckFn ) is_dropped_already_exists;
 	parms.check_fn_data = main_window;
diff --git a/src/nact/nact-tree-model.c b/src/nact/nact-tree-model.c
index 9e67f49..06e6592 100644
--- a/src/nact/nact-tree-model.c
+++ b/src/nact/nact-tree-model.c
@@ -313,7 +313,7 @@ tree_model_new( BaseWindow *window, GtkTreeView *treeview )
 	 */
 	application = NACT_APPLICATION( base_window_get_application( window ));
 	updater = nact_application_get_updater( application );
-	order_mode = na_iprefs_get_order_mode( NA_PIVOT( updater ));
+	order_mode = na_iprefs_get_order_mode( NA_PIVOT( updater ), NULL );
 	nact_tree_model_display_order_change( model, order_mode );
 
 	model->private->window = window;



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