[gthumb/ext: 32/79] Implemented create / rename / delete / cut / copy folder commands



commit de9d0ad74572fa1f2acb19dbf0c8d43f54d6b2e6
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Jul 2 22:22:47 2009 +0200

    Implemented create / rename / delete / cut / copy folder commands

 extensions/catalogs/actions.c                  |   63 +++---
 extensions/catalogs/callbacks.c                |    6 +-
 extensions/catalogs/dlg-add-to-catalog.c       |   43 ++---
 extensions/catalogs/gth-file-source-catalogs.c |    9 +-
 extensions/file_manager/actions.c              |  276 +++++++++++++++++++++++-
 extensions/file_manager/actions.h              |    7 +
 extensions/file_manager/callbacks.c            |  212 +++++++++++++++++--
 extensions/file_manager/callbacks.h            |    1 +
 extensions/file_manager/main.c                 |    1 +
 extensions/search/gth-search-task.c            |    2 +-
 gthumb/gio-utils.c                             |   13 ++
 gthumb/glib-utils.h                            |   21 ++
 gthumb/gth-browser-actions-callbacks.c         |   26 ++--
 gthumb/gth-browser.c                           |  222 +++++++-------------
 gthumb/gth-browser.h                           |    2 +
 gthumb/gth-file-data.c                         |    2 +-
 gthumb/gth-file-data.h                         |   17 --
 gthumb/gth-file-list.c                         |   53 +++++-
 gthumb/gth-file-list.h                         |    3 +
 gthumb/gth-file-source-vfs.c                   |   11 +-
 gthumb/gth-file-source.c                       |    8 +-
 gthumb/gth-file-source.h                       |    6 +-
 gthumb/gth-file-store.c                        |   11 +
 gthumb/gth-file-store.h                        |    4 +-
 gthumb/gth-folder-tree.c                       |  161 +++++++-------
 gthumb/gth-folder-tree.h                       |    4 +-
 gthumb/gth-location-chooser.c                  |    2 +-
 gthumb/gth-main-default-hooks.c                |    7 +
 gthumb/gth-source-tree.c                       |    6 +-
 gthumb/gth-uri-list.c                          |   98 +++++-----
 30 files changed, 882 insertions(+), 415 deletions(-)
---
diff --git a/extensions/catalogs/actions.c b/extensions/catalogs/actions.c
index 2842928..d82c331 100644
--- a/extensions/catalogs/actions.c
+++ b/extensions/catalogs/actions.c
@@ -175,7 +175,7 @@ void
 gth_browser_activate_action_catalog_new (GtkAction  *action,
 					 GthBrowser *browser)
 {
-	GFile         *selected_parent;
+	GthFileData   *selected_parent;
 	GFile         *parent;
 	GthFileSource *file_source;
 	GFile         *gio_parent;
@@ -187,12 +187,12 @@ gth_browser_activate_action_catalog_new (GtkAction  *action,
 		GthFileSource *file_source;
 		GFileInfo     *info;
 
-		file_source = gth_main_get_file_source (selected_parent);
-		info = gth_file_source_get_file_info (file_source, selected_parent);
+		file_source = gth_main_get_file_source (selected_parent->file);
+		info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
 		if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
-			parent = g_file_get_parent (selected_parent);
+			parent = g_file_get_parent (selected_parent->file);
 		else
-			parent = g_file_dup (selected_parent);
+			parent = g_file_dup (selected_parent->file);
 
 		g_object_unref (info);
 		g_object_unref (file_source);
@@ -202,16 +202,16 @@ gth_browser_activate_action_catalog_new (GtkAction  *action,
 
 	file_source = gth_main_get_file_source (parent);
 	gio_parent = gth_file_source_to_gio_file (file_source, parent);
-	gio_file = _g_file_create_unique (gio_parent, _("New Catalog"), ".catalog", &error);
+	gio_file = _g_file_create_unique (gio_parent, _("untitled catalog"), ".catalog", &error);
 	if (gio_file != NULL) {
-		GFile        *file;
-		GList        *list;
-		GFileInfo    *info;
-		GthFileData  *file_data;
-		GList        *file_data_list;
+		GFile       *file;
+		GList       *list;
+		GFileInfo   *info;
+		GthFileData *file_data;
+		GList       *file_data_list;
 
 		file = gth_catalog_file_from_gio_file (gio_file, NULL);
-		info = gth_file_source_get_file_info (file_source, file);
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
 		file_data = gth_file_data_new (file, info);
 		file_data_list = g_list_prepend (NULL, file_data);
 		gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent, file_data_list);
@@ -242,11 +242,11 @@ void
 gth_browser_activate_action_catalog_new_library (GtkAction  *action,
 						 GthBrowser *browser)
 {
-	GFile         *selected_parent;
+	GthFileData   *selected_parent;
 	GFile         *parent;
 	GthFileSource *file_source;
 	GFile         *gio_parent;
-	GError        *error;
+	GError        *error = NULL;
 	GFile         *gio_file;
 
 	selected_parent = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
@@ -254,12 +254,12 @@ gth_browser_activate_action_catalog_new_library (GtkAction  *action,
 		GthFileSource *file_source;
 		GFileInfo     *info;
 
-		file_source = gth_main_get_file_source (selected_parent);
-		info = gth_file_source_get_file_info (file_source, selected_parent);
+		file_source = gth_main_get_file_source (selected_parent->file);
+		info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
 		if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
-			parent = g_file_get_parent (selected_parent);
+			parent = g_file_get_parent (selected_parent->file);
 		else
-			parent = g_file_dup (selected_parent);
+			parent = g_file_dup (selected_parent->file);
 
 		g_object_unref (info);
 		g_object_unref (file_source);
@@ -269,7 +269,7 @@ gth_browser_activate_action_catalog_new_library (GtkAction  *action,
 
 	file_source = gth_main_get_file_source (parent);
 	gio_parent = gth_file_source_to_gio_file (file_source, parent);
-	gio_file = _g_directory_create_unique (gio_parent, _("New Library"), "", &error);
+	gio_file = _g_directory_create_unique (gio_parent, _("untitled library"), "", &error);
 	if (gio_file != NULL) {
 		GFile        *file;
 		GList        *list;
@@ -278,7 +278,7 @@ gth_browser_activate_action_catalog_new_library (GtkAction  *action,
 		GList        *file_data_list;
 
 		file = gth_catalog_file_from_gio_file (gio_file, NULL);
-		info = gth_file_source_get_file_info (file_source, file);
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
 		file_data = gth_file_data_new (file, info);
 		file_data_list = g_list_prepend (NULL, file_data);
 		gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent, file_data_list);
@@ -310,27 +310,26 @@ gth_browser_activate_action_catalog_remove (GtkAction  *action,
 					    GthBrowser *browser)
 {
 	GthFolderTree *folder_tree;
-	GFile         *file;
+	GthFileData   *file_data;
 	GFile         *gio_file;
 	GError        *error = NULL;
 
 	folder_tree = GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser));
-	file = gth_folder_tree_get_selected (folder_tree);
-	gio_file = gth_main_get_gio_file (file);
+	file_data = gth_folder_tree_get_selected (folder_tree);
+	gio_file = gth_main_get_gio_file (file_data->file);
 	if (g_file_delete (gio_file, NULL, &error)) {
 		GFile *parent;
 		GList *files;
 
-		parent = g_file_get_parent (file);
-		files = g_list_prepend (NULL, g_object_ref (file));
+		parent = g_file_get_parent (file_data->file);
+		files = g_list_prepend (NULL, g_object_ref (file_data->file));
 		gth_monitor_folder_changed (gth_main_get_default_monitor (),
 					    parent,
 					    files,
 					    GTH_MONITOR_EVENT_DELETED);
 
 		_g_object_list_unref (files);
-		if (parent != NULL)
-			g_object_unref (parent);
+		_g_object_unref (parent);
 	}
 	else
 		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
@@ -338,7 +337,7 @@ gth_browser_activate_action_catalog_remove (GtkAction  *action,
 						    &error);
 
 	g_object_unref (gio_file);
-	g_object_unref (file);
+	g_object_unref (file_data);
 }
 
 
@@ -347,11 +346,11 @@ gth_browser_activate_action_catalog_rename (GtkAction  *action,
 					    GthBrowser *browser)
 {
 	GthFolderTree *folder_tree;
-	GFile         *file;
+	GthFileData   *file_data;
 
 	folder_tree = GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser));
-	file = gth_folder_tree_get_selected (folder_tree);
-	gth_folder_tree_start_editing (folder_tree, file);
+	file_data = gth_folder_tree_get_selected (folder_tree);
+	gth_folder_tree_start_editing (folder_tree, file_data->file);
 
-	g_object_unref (file);
+	g_object_unref (file_data);
 }
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index e9d63bc..ea2851c 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -168,7 +168,7 @@ catalogs__gth_browser_update_sensitivity_cb (GthBrowser *browser)
 void
 catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 						   GthFileSource *file_source,
-					           GFile         *folder)
+					           GthFileData   *folder)
 {
 	BrowserData *data;
 
@@ -190,11 +190,11 @@ catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 		}
 
 		action = gtk_action_group_get_action (data->actions, "Catalog_Remove");
-		sensitive = folder != NULL;
+		sensitive = (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE);
 		g_object_set (action, "sensitive", sensitive, NULL);
 
 		action = gtk_action_group_get_action (data->actions, "Catalog_Rename");
-		sensitive = folder != NULL;
+		sensitive = (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME);
 		g_object_set (action, "sensitive", sensitive, NULL);
 	}
 	else {
diff --git a/extensions/catalogs/dlg-add-to-catalog.c b/extensions/catalogs/dlg-add-to-catalog.c
index 54108eb..b8bde64 100644
--- a/extensions/catalogs/dlg-add-to-catalog.c
+++ b/extensions/catalogs/dlg-add-to-catalog.c
@@ -63,20 +63,11 @@ static GthFileData *
 get_selected_catalog (DialogData *data)
 {
 	GthFileData *file_data = NULL;
-	GFile       *file;
 
-	file = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (data->source_tree));
-	if (file != NULL) {
-		GthFileSource *file_source;
-		GFileInfo     *info;
-
-		file_source = gth_main_get_file_source (file);
-		info = gth_file_source_get_file_info (file_source, file);
-		if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
-			file_data = gth_file_data_new (file, info);
-
-		g_object_unref (info);
-		g_object_unref (file);
+	file_data = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (data->source_tree));
+	if (! g_file_info_get_attribute_boolean (file_data->info, "gthumb::no-child")) {
+		_g_object_unref (file_data);
+		file_data = NULL;
 	}
 
 	return file_data;
@@ -185,7 +176,7 @@ get_catalog_parent (GFile *selected_parent)
 		GFileInfo     *info;
 
 		file_source = gth_main_get_file_source (selected_parent);
-		info = gth_file_source_get_file_info (file_source, selected_parent);
+		info = gth_file_source_get_file_info (file_source, selected_parent, GFILE_BASIC_ATTRIBUTES);
 		if ((g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) &&
 		    ! g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
 		{
@@ -208,7 +199,7 @@ static void
 new_catalog_button_clicked_cb (GtkWidget  *widget,
 		       	       DialogData *data)
 {
-	GFile         *selected_parent;
+	GthFileData   *selected_parent;
 	GFile         *parent;
 	GthFileSource *file_source;
 	GFile         *gio_parent;
@@ -220,12 +211,12 @@ new_catalog_button_clicked_cb (GtkWidget  *widget,
 		GthFileSource *file_source;
 		GFileInfo     *info;
 
-		file_source = gth_main_get_file_source (selected_parent);
-		info = gth_file_source_get_file_info (file_source, selected_parent);
+		file_source = gth_main_get_file_source (selected_parent->file);
+		info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
 		if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
-			parent = g_file_get_parent (selected_parent);
+			parent = g_file_get_parent (selected_parent->file);
 		else
-			parent = g_file_dup (selected_parent);
+			parent = g_file_dup (selected_parent->file);
 
 		g_object_unref (info);
 		g_object_unref (file_source);
@@ -244,7 +235,7 @@ new_catalog_button_clicked_cb (GtkWidget  *widget,
 		GList        *file_data_list;
 
 		file = gth_catalog_file_from_gio_file (gio_file, NULL);
-		info = gth_file_source_get_file_info (file_source, file);
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
 		file_data = gth_file_data_new (file, info);
 		file_data_list = g_list_prepend (NULL, file_data);
 		gth_folder_tree_add_children (GTH_FOLDER_TREE (data->source_tree), parent, file_data_list);
@@ -275,11 +266,11 @@ static void
 new_library_button_clicked_cb (GtkWidget  *widget,
 		       	       DialogData *data)
 {
-	char   *display_name;
-	GFile  *selected_catalog;
-	GFile  *parent;
-	GFile  *new_library;
-	GError *error = NULL;
+	char        *display_name;
+	GthFileData *selected_catalog;
+	GFile       *parent;
+	GFile       *new_library;
+	GError      *error = NULL;
 
 	display_name = _gtk_request_dialog_run (GTK_WINDOW (data->dialog),
 						GTK_DIALOG_MODAL,
@@ -292,7 +283,7 @@ new_library_button_clicked_cb (GtkWidget  *widget,
 		return;
 
 	selected_catalog = gth_folder_tree_get_selected (GTH_FOLDER_TREE (data->source_tree));
-	parent = get_catalog_parent (selected_catalog);
+	parent = get_catalog_parent (selected_catalog->file);
 	new_library = g_file_get_child_for_display_name (parent, display_name, &error);
 
 	if ((new_library != NULL) && (strchr (display_name, '/') != NULL)) {
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index 8e739d0..f4704ed 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -50,7 +50,7 @@ get_entry_points (GthFileSource *file_source)
 	GFileInfo   *info;
 
 	file = g_file_new_for_uri ("catalog:///");
-	info = gth_file_source_get_file_info (file_source, file);
+	info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
 	list = g_list_append (list, gth_file_data_new (file, info));
 
 	g_object_unref (info);
@@ -115,14 +115,15 @@ update_file_info (GthFileSource *file_source,
 
 static GFileInfo *
 gth_file_source_catalogs_get_file_info (GthFileSource *file_source,
-					 GFile         *file)
+					GFile         *file,
+					const char    *attributes)
 {
 	GFile     *gio_file;
 	GFileInfo *file_info;
 
 	gio_file = gth_catalog_file_to_gio_file (file);
 	file_info = g_file_query_info (gio_file,
-				       "standard::display-name,standard::icon",
+				       attributes,
 				       G_FILE_QUERY_INFO_NONE,
 				       NULL,
 				       NULL);
@@ -370,7 +371,7 @@ gth_file_source_catalogs_read_attributes (GthFileSource *file_source,
 
 	gio_files = gth_file_source_to_gio_file_list (GTH_FILE_SOURCE (catalogs), files);
 	g_query_info_async (gio_files,
-			    GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE,
+			    GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE,
 			    catalogs->priv->cancellable,
 			    info_ready_cb,
 			    data);
diff --git a/extensions/file_manager/actions.c b/extensions/file_manager/actions.c
index b62a350..2caf417 100644
--- a/extensions/file_manager/actions.c
+++ b/extensions/file_manager/actions.c
@@ -134,20 +134,16 @@ clipboard_clear_cb (GtkClipboard *clipboard,
 
 static void
 _gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
+				    GList      *file_list,
 				    gboolean    cut)
 {
 	ClipboardData  *data;
-	GList          *items;
-	GList          *file_list;
 	GtkTargetList  *target_list;
 	GtkTargetEntry *targets;
 	int             n_targets;
 	GList          *scan;
 	int             i;
 
-	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
 	data = g_new0 (ClipboardData, 1);
 	data->cut = cut;
 	data->n_uris = g_list_length (file_list);
@@ -172,8 +168,6 @@ _gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
 
 	gtk_target_list_unref (target_list);
 	gtk_target_table_free (targets, n_targets);
-	_g_object_list_unref (file_list);
-	_gtk_tree_path_list_free (items);
 }
 
 
@@ -181,7 +175,15 @@ void
 gth_browser_activate_action_edit_cut_files (GtkAction  *action,
 					    GthBrowser *browser)
 {
-	_gth_browser_clipboard_copy_or_cut (browser, TRUE);
+	GList *items;
+	GList *file_list;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	_gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
+
+	_g_object_list_unref (file_list);
+	_gtk_tree_path_list_free (items);
 }
 
 
@@ -189,7 +191,15 @@ void
 gth_browser_activate_action_edit_copy_files (GtkAction  *action,
 					     GthBrowser *browser)
 {
-	_gth_browser_clipboard_copy_or_cut (browser, FALSE);
+	GList *items;
+	GList *file_list;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	_gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
+
+	_g_object_list_unref (file_list);
+	_gtk_tree_path_list_free (items);
 }
 
 
@@ -345,8 +355,22 @@ delete_file_permanently (GtkWindow *window,
 	GError *error = NULL;
 
 	files = gth_file_data_list_to_file_list (file_list);
-	if (! _g_delete_files (files, TRUE, &error))
+	if (! _g_delete_files (files, TRUE, &error)) {
 		_gtk_error_dialog_from_gerror_show (window, _("Could not delete the files"), &error);
+	}
+	else {
+		GthFileData *first;
+		GFile       *parent;
+
+		first = files->data;
+		parent = g_file_get_parent (first->file);
+		gth_monitor_folder_changed (gth_main_get_default_monitor (),
+					    parent,
+					    files,
+					    GTH_MONITOR_EVENT_DELETED);
+
+		g_object_unref (parent);
+	}
 
 	_g_object_list_unref (files);
 }
@@ -357,10 +381,11 @@ delete_permanently_response_cb (GtkDialog *dialog,
 				int        response_id,
 				gpointer   user_data)
 {
-	GList  *file_list = user_data;
+	GList *file_list = user_data;
 
 	if (response_id == GTK_RESPONSE_YES)
 		delete_file_permanently (gtk_window_get_transient_for (GTK_WINDOW (dialog)), file_list);
+
 	gtk_widget_destroy (GTK_WIDGET (dialog));
 	_g_object_list_unref (file_list);
 }
@@ -449,3 +474,232 @@ gth_browser_activate_action_edit_delete (GtkAction  *action,
 	g_free (prompt);
 	_gtk_tree_path_list_free (items);
 }
+
+
+void
+gth_browser_activate_action_folder_create (GtkAction  *action,
+					   GthBrowser *browser)
+{
+	GthFileData   *parent;
+	GthFileSource *file_source;
+	GError        *error = NULL;
+	GFile         *file;
+
+	parent = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (parent == NULL)
+		return;
+
+	file_source = gth_main_get_file_source (parent->file);
+	file = _g_directory_create_unique (parent->file, _("untitled folder"), "", &error);
+	if (file != NULL) {
+		GList       *list;
+		GFileInfo   *info;
+		GthFileData *file_data;
+		GList       *file_data_list;
+
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
+		file_data = gth_file_data_new (file, info);
+		file_data_list = g_list_prepend (NULL, file_data);
+		gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent->file, file_data_list);
+		gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file);
+
+		list = g_list_prepend (NULL, g_object_ref (file));
+		gth_monitor_folder_changed (gth_main_get_default_monitor (),
+					    parent->file,
+					    list,
+					    GTH_MONITOR_EVENT_CREATED);
+
+		_g_object_list_unref (list);
+		g_list_free (file_data_list);
+		g_object_unref (file_data);
+		g_object_unref (info);
+	}
+	else
+		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser), _("Could not create the folder"), &error);
+
+	_g_object_unref (file);
+	g_object_unref (file_source);
+	g_object_unref (parent);
+}
+
+
+void
+gth_browser_activate_action_folder_rename (GtkAction  *action,
+					   GthBrowser *browser)
+{
+	GthFileData *file_data;
+
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (file_data == NULL)
+		return;
+
+	gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file_data->file);
+
+	g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_cut (GtkAction  *action,
+					GthBrowser *browser)
+{
+	GthFileData *file_data;
+	GList       *file_list;
+
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (file_data == NULL)
+		return;
+
+	file_list = g_list_prepend (NULL, file_data);
+	_gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
+
+	g_list_free (file_list);
+}
+
+
+void
+gth_browser_activate_action_folder_copy (GtkAction  *action,
+					 GthBrowser *browser)
+{
+	GthFileData *file_data;
+	GList       *file_list;
+
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (file_data == NULL)
+		return;
+
+	file_list = g_list_prepend (NULL, file_data);
+	_gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
+
+	g_list_free (file_list);
+}
+
+
+void
+gth_browser_activate_action_folder_paste (GtkAction  *action,
+					  GthBrowser *browser)
+{
+
+}
+
+
+/* -- gth_browser_activate_action_folder_trash -- */
+
+
+static void
+delete_folder_permanently (GtkWindow   *window,
+			   GthFileData *file_data)
+{
+	GList  *files;
+	GError *error = NULL;
+
+	files = g_list_prepend (NULL, file_data->file);
+	if (! _g_delete_files (files, TRUE, &error)) {
+		_gtk_error_dialog_from_gerror_show (window, _("Could not delete the folder"), &error);
+	}
+	else {
+		GFile *parent;
+
+		parent = g_file_get_parent (file_data->file);
+		gth_monitor_folder_changed (gth_main_get_default_monitor (),
+					    parent,
+					    files,
+					    GTH_MONITOR_EVENT_DELETED);
+
+		g_object_unref (parent);
+	}
+
+	g_list_free (files);
+}
+
+
+static void
+delete_folder_permanently_response_cb (GtkDialog *dialog,
+				       int        response_id,
+				       gpointer   user_data)
+{
+	GthFileData *file_data = user_data;
+
+	if (response_id == GTK_RESPONSE_YES)
+		delete_folder_permanently (gtk_window_get_transient_for (GTK_WINDOW (dialog)), file_data);
+
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+	_g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_trash (GtkAction  *action,
+					  GthBrowser *browser)
+{
+	GthFileData *file_data;
+	GError      *error = NULL;
+
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (file_data == NULL)
+		return;
+
+	if (! g_file_trash (file_data->file, NULL, &error)) {
+		if (g_error_matches (error, G_IO_ERROR,  G_IO_ERROR_NOT_SUPPORTED)) {
+			GtkWidget *d;
+
+			g_clear_error (&error);
+
+			d = _gtk_yesno_dialog_new (GTK_WINDOW (browser),
+						   GTK_DIALOG_MODAL,
+						   _("The folder cannot be moved to the Trash. Do you want to delete it permanently?"),
+						   GTK_STOCK_CANCEL,
+						   GTK_STOCK_DELETE);
+			g_signal_connect (d, "response", G_CALLBACK (delete_folder_permanently_response_cb), file_data);
+			gtk_widget_show (d);
+
+			file_data = NULL;
+		}
+		else
+			_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser), _("Could not move the folder to the Trash"), &error);
+	}
+	else {
+		GFile *parent;
+		GList *files;
+
+		parent = g_file_get_parent (file_data->file);
+		files = g_list_prepend (NULL, file_data->file);
+		gth_monitor_folder_changed (gth_main_get_default_monitor (),
+					    parent,
+					    files,
+					    GTH_MONITOR_EVENT_DELETED);
+
+		g_list_free (files);
+		g_object_unref (parent);
+	}
+
+	_g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_delete (GtkAction  *action,
+					   GthBrowser *browser)
+{
+	GthFileData *file_data;
+	char        *prompt;
+	GtkWidget   *d;
+
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	if (file_data == NULL)
+		return;
+
+	prompt = g_strdup_printf (_("Are you sure you want to permanently delete \"%s\"?"), g_file_info_get_display_name (file_data->info));
+	d = _gtk_message_dialog_new (GTK_WINDOW (browser),
+				     GTK_DIALOG_MODAL,
+				     GTK_STOCK_DIALOG_QUESTION,
+				     prompt,
+				     _("If you delete a file, it will be permanently lost."),
+				     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+				     GTK_STOCK_DELETE, GTK_RESPONSE_YES,
+				     NULL);
+	g_signal_connect (d, "response", G_CALLBACK (delete_folder_permanently_response_cb), file_data);
+	gtk_widget_show (d);
+
+	g_free (prompt);
+}
diff --git a/extensions/file_manager/actions.h b/extensions/file_manager/actions.h
index 06ce4fd..ec2befa 100644
--- a/extensions/file_manager/actions.h
+++ b/extensions/file_manager/actions.h
@@ -36,5 +36,12 @@ DEFINE_ACTION(gth_browser_activate_action_edit_duplicate)
 DEFINE_ACTION(gth_browser_activate_action_edit_rename)
 DEFINE_ACTION(gth_browser_activate_action_edit_trash)
 DEFINE_ACTION(gth_browser_activate_action_edit_delete)
+DEFINE_ACTION(gth_browser_activate_action_folder_create)
+DEFINE_ACTION(gth_browser_activate_action_folder_rename)
+DEFINE_ACTION(gth_browser_activate_action_folder_cut)
+DEFINE_ACTION(gth_browser_activate_action_folder_copy)
+DEFINE_ACTION(gth_browser_activate_action_folder_paste)
+DEFINE_ACTION(gth_browser_activate_action_folder_trash)
+DEFINE_ACTION(gth_browser_activate_action_folder_delete)
 
 #endif /* ACTIONS_H */
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index 0a1ae3c..6bbeb11 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -83,8 +83,16 @@ static const char *folder_popup_ui_info =
 "<ui>"
 "  <popup name='FolderListPopup'>"
 "    <placeholder name='SourceCommands'>"
-"      <menuitem action='File_NewFolder'/>"
-"      <menuitem action='File_RenameFolder'/>"
+"      <menuitem action='Folder_Create'/>"
+"      <separator />"
+"      <menuitem action='Folder_Cut'/>"
+"      <menuitem action='Folder_Copy'/>"
+"      <menuitem action='Folder_Paste'/>"
+"      <separator />"
+"      <menuitem action='Folder_Rename'/>"
+"      <separator />"
+"      <menuitem action='Folder_Trash'/>"
+"      <menuitem action='Folder_Delete'/>"
 "    </placeholder>"
 "  </popup>"
 "</ui>";
@@ -127,6 +135,34 @@ static GtkActionEntry action_entries[] = {
 	  N_("_Delete"), "<shift>Delete",
 	  N_("Delete the selected files"),
 	  G_CALLBACK (gth_browser_activate_action_edit_delete) },
+	{ "Folder_Create", NULL,
+	  N_("Create _Folder"), NULL,
+	  N_("Create a new empty folder inside this folder"),
+	  G_CALLBACK (gth_browser_activate_action_folder_create) },
+	{ "Folder_Rename", NULL,
+	  N_("_Rename"), NULL,
+  	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_rename) },
+	{ "Folder_Cut", GTK_STOCK_CUT,
+	  NULL, NULL,
+  	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_cut) },
+	{ "Folder_Copy", GTK_STOCK_COPY,
+	  NULL, NULL,
+  	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_copy) },
+	{ "Folder_Paste", GTK_STOCK_PASTE,
+	  N_("_Paste Into Folder"), NULL,
+  	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_paste) },
+	{ "Folder_Trash", "user-trash",
+	  N_("Mo_ve to Trash"), NULL,
+	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_trash) },
+	{ "Folder_Delete", "edit-delete",
+	  N_("_Delete"), NULL,
+	  NULL,
+	  G_CALLBACK (gth_browser_activate_action_folder_delete) },
 };
 
 
@@ -136,6 +172,7 @@ typedef struct {
 	guint           browser_merge_id;
 	guint           browser_vfs_merge_id;
 	guint           folder_popup_merge_id;
+	gboolean        can_paste;
 } BrowserData;
 
 
@@ -264,7 +301,7 @@ fm__gth_browser_load_location_after_cb (GthBrowser   *browser,
 void
 fm__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 					     GthFileSource *file_source,
-					     GFile         *folder)
+					     GthFileData   *folder)
 {
 	BrowserData *data;
 
@@ -272,9 +309,6 @@ fm__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 	g_return_if_fail (data != NULL);
 
 	if (GTH_IS_FILE_SOURCE_VFS (file_source)) {
-		GtkAction *action;
-		gboolean   sensitive;
-
 		if (data->folder_popup_merge_id == 0) {
 			GError *error = NULL;
 
@@ -284,10 +318,11 @@ fm__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 				g_error_free (error);
 			}
 		}
-
-		action = gtk_action_group_get_action (data->action_group, "File_RenameFolder");
-		sensitive = folder != NULL;
-		g_object_set (action, "sensitive", sensitive, NULL);
+		set_action_sensitive (data, "Folder_Create", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+		set_action_sensitive (data, "Folder_Rename", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
+		set_action_sensitive (data, "Folder_Delete", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+		set_action_sensitive (data, "Folder_Trash", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH));
+		set_action_sensitive (data, "Folder_Cut", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
 	}
 	else {
 		if (data->folder_popup_merge_id != 0) {
@@ -306,18 +341,22 @@ clipboard_targets_received_cb (GtkClipboard *clipboard,
 {
 	GthBrowser  *browser = user_data;
 	BrowserData *data;
-	gboolean     can_paste;
 	int          i;
+	GthFileData *folder;
 
 	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
 
-	can_paste = FALSE;
-	for (i = 0; ! can_paste && (i < n_atoms); i++)
+	data->can_paste = FALSE;
+	for (i = 0; ! data->can_paste && (i < n_atoms); i++)
 		if (atoms[i] == GNOME_COPIED_FILES)
-			can_paste = TRUE;
+			data->can_paste = TRUE;
 
-	set_action_sensitive (data, "Edit_PasteInFolder", can_paste);
+	set_action_sensitive (data, "Edit_PasteInFolder", data->can_paste);
 
+	folder = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	set_action_sensitive (data, "Folder_Paste", (folder != NULL) && data->can_paste && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+
+	_g_object_unref (folder);
 	g_object_unref (browser);
 }
 
@@ -331,6 +370,7 @@ _gth_browser_update_paste_command_sensitivity (GthBrowser   *browser,
 	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
 	g_return_if_fail (data != NULL);
 
+	data->can_paste = FALSE;
         set_action_sensitive (data, "Edit_PasteInFolder", FALSE);
 
 	if (clipboard == NULL)
@@ -348,6 +388,7 @@ fm__gth_browser_update_sensitivity_cb (GthBrowser *browser)
 	GthFileSource *file_source;
 	int            n_selected;
 	gboolean       sensitive;
+	GthFileData   *folder;
 
 	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
 	g_return_if_fail (data != NULL);
@@ -365,7 +406,147 @@ fm__gth_browser_update_sensitivity_cb (GthBrowser *browser)
 	set_action_sensitive (data, "Edit_Duplicate", sensitive);
 	set_action_sensitive (data, "Edit_Rename", sensitive);
 
+	folder = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+	set_action_sensitive (data, "Folder_Create", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+	set_action_sensitive (data, "Folder_Rename", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
+	set_action_sensitive (data, "Folder_Delete", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+	set_action_sensitive (data, "Folder_Trash", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH));
+	set_action_sensitive (data, "Folder_Cut", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+
 	_gth_browser_update_paste_command_sensitivity (browser, NULL);
+
+	_g_object_unref (folder);
+}
+
+
+/* -- selection_changed -- */
+
+
+static void
+activate_open_with_application_item (GtkMenuItem *menuitem,
+				     gpointer     data)
+{
+	GthBrowser *browser = data;
+	GList      *items;
+	GList      *file_list;
+	GList      *uris;
+	GList      *scan;
+	GAppInfo   *appinfo;
+	GError     *error = NULL;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+
+	uris = NULL;
+	for (scan = file_list; scan; scan = scan->next) {
+		GthFileData *file_data = scan->data;
+		uris = g_list_prepend (uris, g_file_get_uri (file_data->file));
+	}
+
+	appinfo = g_object_get_data (G_OBJECT (menuitem), "appinfo");
+	g_return_if_fail (G_IS_APP_INFO (appinfo));
+
+	if (! g_app_info_launch_uris (appinfo, uris, NULL, &error))
+		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
+						    _("Could not perform the operation"),
+						    &error);
+
+	g_list_free (uris);
+	_g_object_list_unref (file_list);
+	_gtk_tree_path_list_free (items);
+}
+
+
+static void
+_gth_browser_update_open_menu (GthBrowser *browser)
+{
+	GtkWidget    *openwith_item;
+	GtkWidget    *menu;
+	GList        *items;
+	GList        *file_list;
+	GList        *scan;
+	GList        *appinfo_list;
+	GthIconCache *icon_cache;
+	GHashTable   *used_apps;
+
+	openwith_item = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/FileListPopup/OpenWith");
+	menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (openwith_item));
+	_gtk_container_remove_children (GTK_CONTAINER (menu), NULL, NULL);
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+
+	appinfo_list = NULL;
+	for (scan = file_list; scan; scan = scan->next) {
+		GthFileData *file_data = scan->data;
+		const char  *mime_type;
+
+		mime_type = gth_file_data_get_mime_type (file_data);
+		if ((mime_type == NULL) || g_content_type_is_unknown (mime_type))
+			continue;
+
+		appinfo_list = g_list_concat (appinfo_list, g_app_info_get_all_for_type (mime_type));
+	}
+
+	icon_cache = gth_browser_get_menu_icon_cache (browser);
+	used_apps = g_hash_table_new (g_str_hash, g_str_equal);
+	for (scan = appinfo_list; scan; scan = scan->next) {
+		GAppInfo  *appinfo = scan->data;
+		char      *label;
+		GtkWidget *menu_item;
+		GIcon     *icon;
+		GdkPixbuf *pixbuf;
+
+		if (strcmp (g_app_info_get_executable (appinfo), "gthumb") == 0)
+			continue;
+		if (g_hash_table_lookup (used_apps, g_app_info_get_id (appinfo)) != NULL)
+			continue;
+		g_hash_table_insert (used_apps, (gpointer) g_app_info_get_id (appinfo), GINT_TO_POINTER (1));
+
+		label = g_strdup_printf (_("Open with \"%s\""), g_app_info_get_name (appinfo));
+		menu_item = gtk_image_menu_item_new_with_label (label);
+
+		icon = g_app_info_get_icon (appinfo);
+		pixbuf = gth_icon_cache_get_pixbuf (icon_cache, icon);
+		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), gtk_image_new_from_pixbuf (pixbuf));
+
+		gtk_widget_show (menu_item);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+
+		g_object_set_data (G_OBJECT (menu_item), "appinfo", appinfo);
+		g_signal_connect (menu_item,
+				  "activate",
+				  G_CALLBACK (activate_open_with_application_item),
+			  	  browser);
+
+		g_object_unref (pixbuf);
+		g_free (label);
+	}
+
+	/*
+	if (appinfo_list == NULL) {
+		GtkWidget *menu_item;
+
+		menu_item = gtk_image_menu_item_new_with_label (_("No application available"));
+		gtk_widget_set_sensitive (menu_item, FALSE);
+		gtk_widget_show (menu_item);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+	}*/
+
+	gtk_widget_set_sensitive (openwith_item, appinfo_list != NULL);
+	gtk_widget_show (openwith_item);
+
+	g_hash_table_destroy (used_apps);
+	g_list_free (appinfo_list);
+	_g_object_list_unref (file_list);
+	_gtk_tree_path_list_free (items);
+}
+
+
+void
+fm__gth_browser_selection_changed_cb (GthBrowser *browser)
+{
+	_gth_browser_update_open_menu (browser);
 }
 
 
@@ -401,4 +582,3 @@ fm__gth_browser_unrealize_cb (GthBrowser *browser)
 	                                      G_CALLBACK (clipboard_owner_change_cb),
 	                                      browser);
 }
-
diff --git a/extensions/file_manager/callbacks.h b/extensions/file_manager/callbacks.h
index 2c5f71d..7e244cb 100644
--- a/extensions/file_manager/callbacks.h
+++ b/extensions/file_manager/callbacks.h
@@ -35,6 +35,7 @@ void fm__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
 						  GthFileSource *file_source,
 					          GFile         *folder);
 void fm__gth_browser_update_sensitivity_cb       (GthBrowser    *browser);
+void fm__gth_browser_selection_changed_cb        (GthBrowser    *browser);
 void fm__gth_browser_realize_cb                  (GthBrowser    *browser);
 void fm__gth_browser_unrealize_cb                (GthBrowser    *browser);
 
diff --git a/extensions/file_manager/main.c b/extensions/file_manager/main.c
index 1a9dc06..259a9b5 100644
--- a/extensions/file_manager/main.c
+++ b/extensions/file_manager/main.c
@@ -37,6 +37,7 @@ gthumb_extension_activate (void)
 	gth_hook_add_callback ("gth-browser-update-sensitivity", 10, G_CALLBACK (fm__gth_browser_update_sensitivity_cb), NULL);
 	gth_hook_add_callback ("gth-browser-realize", 10, G_CALLBACK (fm__gth_browser_realize_cb), NULL);
 	gth_hook_add_callback ("gth-browser-unrealize", 10, G_CALLBACK (fm__gth_browser_unrealize_cb), NULL);
+	gth_hook_add_callback ("gth-browser-selection-changed", 10, G_CALLBACK (fm__gth_browser_selection_changed_cb), NULL);
 }
 
 
diff --git a/extensions/search/gth-search-task.c b/extensions/search/gth-search-task.c
index addd18a..db4cda8 100644
--- a/extensions/search/gth-search-task.c
+++ b/extensions/search/gth-search-task.c
@@ -297,7 +297,7 @@ browser_location_ready_cb (GthBrowser    *browser,
 	g_directory_foreach_child (gth_search_get_folder (task->priv->search),
 				   gth_search_is_recursive (task->priv->search),
 				   TRUE,
-				   eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+				   eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 				   task->priv->cancellable,
 				   start_dir_func,
 				   for_each_file_func,
diff --git a/gthumb/gio-utils.c b/gthumb/gio-utils.c
index 834c31c..71cf240 100644
--- a/gthumb/gio-utils.c
+++ b/gthumb/gio-utils.c
@@ -1867,6 +1867,11 @@ _g_directory_create_unique (GFile       *parent,
 	int       n;
 
 	file = g_file_get_child_for_display_name (parent, display_name, &local_error);
+	if (file == NULL) {
+		g_propagate_error (error, local_error);
+		return NULL;
+	}
+
 	n = 0;
 	do {
 		char *new_display_name;
@@ -1891,6 +1896,14 @@ _g_directory_create_unique (GFile       *parent,
 	}
 	while (! created && (local_error == NULL));
 
+	if (local_error != NULL) {
+		g_object_unref (file);
+		file = NULL;
+	}
+
+	if (local_error != NULL)
+		g_propagate_error (error, local_error);
+
 	return file;
 }
 
diff --git a/gthumb/glib-utils.h b/gthumb/glib-utils.h
index d45dd35..5431696 100644
--- a/gthumb/glib-utils.h
+++ b/gthumb/glib-utils.h
@@ -30,6 +30,27 @@
 
 G_BEGIN_DECLS
 
+#define GFILE_BASIC_ATTRIBUTES "standard::display-name,standard::icon,standard::type"
+
+#define DEFINE_STANDARD_ATTRIBUTES(a) ( \
+	"standard::type," \
+	"standard::is-hidden," \
+	"standard::is-backup," \
+	"standard::name," \
+	"standard::display-name," \
+	"standard::edit-name," \
+	"standard::icon," \
+	"standard::size," \
+	"time::created," \
+	"time::created-usec," \
+	"time::modified," \
+	"time::modified-usec," \
+	"access::*" \
+	a)
+#define GFILE_STANDARD_ATTRIBUTES (DEFINE_STANDARD_ATTRIBUTES(""))
+#define GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE (DEFINE_STANDARD_ATTRIBUTES(",standard::fast-content-type"))
+#define GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE (DEFINE_STANDARD_ATTRIBUTES(",standard::content-type"))
+
 #define GNOME_COPIED_FILES (gdk_atom_intern_static_string ("x-special/gnome-copied-files"))
 #define IROUND(x) ((int)floor(((double)x) + 0.5))
 #define FLOAT_EQUAL(a,b) (fabs (a - b) < 1e-6)
diff --git a/gthumb/gth-browser-actions-callbacks.c b/gthumb/gth-browser-actions-callbacks.c
index 186a2ef..bdf52c3 100644
--- a/gthumb/gth-browser-actions-callbacks.c
+++ b/gthumb/gth-browser-actions-callbacks.c
@@ -291,17 +291,17 @@ void
 gth_browser_activate_action_folder_open (GtkAction  *action,
 					 GthBrowser *browser)
 {
-	GtkWidget *folder_tree;
-	GFile     *file;
+	GtkWidget   *folder_tree;
+	GthFileData *file_data;
 
 	folder_tree = gth_browser_get_folder_tree (browser);
-	file = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
-	if (file == NULL)
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
+	if (file_data == NULL)
 		return;
 
-	gth_browser_load_location (browser, file);
+	gth_browser_load_location (browser, file_data->file);
 
-	g_object_unref (file);
+	g_object_unref (file_data);
 }
 
 
@@ -309,20 +309,20 @@ void
 gth_browser_activate_action_folder_open_in_new_window (GtkAction  *action,
 						       GthBrowser *browser)
 {
-	GtkWidget *folder_tree;
-	GFile     *file;
-	GtkWidget *new_browser;
+	GtkWidget   *folder_tree;
+	GthFileData *file_data;
+	GtkWidget   *new_browser;
 
 	folder_tree = gth_browser_get_folder_tree (browser);
-	file = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
-	if (file == NULL)
+	file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
+	if (file_data == NULL)
 		return;
 
 	new_browser = gth_browser_new (NULL);
 	gtk_window_present (GTK_WINDOW (new_browser));
-	gth_browser_load_location (GTH_BROWSER (new_browser), file);
+	gth_browser_load_location (GTH_BROWSER (new_browser), file_data->file);
 
-	g_object_unref (file);
+	g_object_unref (file_data);
 }
 
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 225142b..06e261c 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -354,7 +354,7 @@ _gth_browser_add_file_menu_item (GthBrowser *browser,
 	GFileInfo     *info;
 
 	file_source = gth_main_get_file_source (file);
-	info = gth_file_source_get_file_info (file_source, file);
+	info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
 	if (info != NULL) {
 		_gth_browser_add_file_menu_item_full (browser,
 						      menu,
@@ -1026,7 +1026,7 @@ load_data_load_next_folder (LoadData *data)
 
 	gth_file_source_list (data->file_source,
 			      folder_to_load,
-			      eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+			      eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 			      _gth_browser_load_ready_cb,
 			      data);
 }
@@ -1844,7 +1844,7 @@ folder_tree_load_cb (GthFolderTree *folder_tree,
 
 static void
 folder_tree_folder_popup_cb (GthFolderTree *folder_tree,
-			     GFile         *file,
+			     GthFileData   *file_data,
 			     guint          time,
 			     gpointer       user_data)
 {
@@ -1852,15 +1852,15 @@ folder_tree_folder_popup_cb (GthFolderTree *folder_tree,
 	gboolean       sensitive;
 	GthFileSource *file_source;
 
-	sensitive = (file != NULL);
+	sensitive = (file_data != NULL);
 	_gth_browser_set_action_sensitive (browser, "Folder_Open", sensitive);
 	_gth_browser_set_action_sensitive (browser, "Folder_OpenInNewWindow", sensitive);
 
-	if (file != NULL)
-		file_source = gth_main_get_file_source (file);
+	if (file_data != NULL)
+		file_source = gth_main_get_file_source (file_data->file);
 	else
 		file_source = NULL;
-	gth_hook_invoke ("gth-browser-folder-tree-popup-before", browser, file_source, file);
+	gth_hook_invoke ("gth-browser-folder-tree-popup-before", browser, file_source, file_data);
 	gtk_ui_manager_ensure_update (browser->priv->ui);
 
 	gtk_menu_popup (GTK_MENU (browser->priv->folder_popup),
@@ -2070,7 +2070,7 @@ folder_changed_cb (GthMonitor      *monitor,
 			monitor_data->update_folder_tree = update_folder_tree;
 			gth_file_source_read_attributes (monitor_data->file_source,
 						 	 list,
-						 	 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+						 	 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 						 	 file_attributes_ready_cb,
 						 	 monitor_data);
 			break;
@@ -2121,32 +2121,75 @@ folder_changed_cb (GthMonitor      *monitor,
 }
 
 
+typedef struct {
+	GthBrowser    *browser;
+	GthFileSource *file_source;
+	GFile         *file;
+	GFile         *new_file;
+} RenameData;
+
+
+static void
+rename_data_free (RenameData *rename_data)
+{
+	g_object_unref (rename_data->file_source);
+	g_object_unref (rename_data->file);
+	g_object_unref (rename_data->new_file);
+	g_free (rename_data);
+}
+
+
+static void
+renamed_file_attributes_ready_cb (GthFileSource *file_source,
+				  GList         *files,
+				  GError        *error,
+				  gpointer       user_data)
+{
+	RenameData  *rename_data = user_data;
+	GthBrowser  *browser = rename_data->browser;
+	GthFileData *file_data;
+
+	if (error != NULL) {
+		rename_data_free (rename_data);
+		g_clear_error (&error);
+		return;
+	}
+
+	file_data = files->data;
+
+	gth_folder_tree_update_child (GTH_FOLDER_TREE (browser->priv->folder_tree), rename_data->file, file_data);
+	gth_file_list_rename_file (GTH_FILE_LIST (browser->priv->file_list), rename_data->file, file_data);
+
+	if (g_file_equal (rename_data->file, browser->priv->location))
+		_gth_browser_set_location (browser, rename_data->new_file);
+
+	rename_data_free (rename_data);
+}
+
+
 static void
 file_renamed_cb (GthMonitor *monitor,
 		 GFile      *file,
 		 GFile      *new_file,
 		 GthBrowser *browser)
 {
-	GthFileSource *file_source;
-	GFileInfo     *info;
-	GthFileData   *file_data;
-	GList         *list;
-
-	file_source = gth_main_get_file_source (new_file);
-	info = gth_file_source_get_file_info (file_source, new_file);
-	file_data = gth_file_data_new (new_file, info);
-	gth_folder_tree_update_child (GTH_FOLDER_TREE (browser->priv->folder_tree), file, file_data);
+	RenameData *rename_data;
+	GList      *list;
 
-	list = g_list_prepend (NULL, file_data);
-	gth_file_list_update_files (GTH_FILE_LIST (browser->priv->file_list), list);
+	rename_data = g_new0 (RenameData, 1);
+	rename_data->browser = browser;
+	rename_data->file_source = gth_main_get_file_source (new_file);
+	rename_data->file = g_file_dup (file);
+	rename_data->new_file = g_file_dup (new_file);
 
-	if (g_file_equal (file, browser->priv->location))
-		_gth_browser_set_location (browser, new_file);
+	list = g_list_prepend (NULL, new_file);
+	gth_file_source_read_attributes (rename_data->file_source,
+				 	 list,
+				 	 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
+				 	 renamed_file_attributes_ready_cb,
+				 	 rename_data);
 
 	g_list_free (list);
-	g_object_unref (file_data);
-	g_object_unref (info);
-	g_object_unref (file_source);
 }
 
 
@@ -2256,125 +2299,6 @@ gth_file_list_button_press_cb  (GtkWidget      *widget,
 
 
 static void
-activate_open_with_application_item (GtkMenuItem *menuitem,
-				     gpointer     data)
-{
-	GthBrowser *browser = data;
-	GList      *items;
-	GList      *file_list;
-	GList      *uris;
-	GList      *scan;
-	GAppInfo   *appinfo;
-	GError     *error = NULL;
-
-	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
-	uris = NULL;
-	for (scan = file_list; scan; scan = scan->next) {
-		GthFileData *file_data = scan->data;
-		uris = g_list_prepend (uris, g_file_get_uri (file_data->file));
-	}
-
-	appinfo = g_object_get_data (G_OBJECT (menuitem), "appinfo");
-	g_return_if_fail (G_IS_APP_INFO (appinfo));
-
-	if (! g_app_info_launch_uris (appinfo, uris, NULL, &error))
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
-						    _("Could not perform the operation"),
-						    &error);
-
-	g_list_free (uris);
-	_g_object_list_unref (file_list);
-	_gtk_tree_path_list_free (items);
-}
-
-
-static void
-_gth_browser_update_open_menu (GthBrowser *browser)
-{
-	GtkWidget  *openwith_item;
-	GtkWidget  *menu;
-	GList      *items;
-	GList      *file_list;
-	GList      *scan;
-	GList      *appinfo_list;
-	GHashTable *used_apps;
-
-	openwith_item = gtk_ui_manager_get_widget (browser->priv->ui, "/FileListPopup/OpenWith");
-	menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (openwith_item));
-	_gtk_container_remove_children (GTK_CONTAINER (menu), NULL, NULL);
-
-	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
-	appinfo_list = NULL;
-	for (scan = file_list; scan; scan = scan->next) {
-		GthFileData *file_data = scan->data;
-		const char  *mime_type;
-
-		mime_type = gth_file_data_get_mime_type (file_data);
-		if ((mime_type == NULL) || g_content_type_is_unknown (mime_type))
-			continue;
-
-		appinfo_list = g_list_concat (appinfo_list, g_app_info_get_all_for_type (mime_type));
-	}
-
-	used_apps = g_hash_table_new (g_str_hash, g_str_equal);
-	for (scan = appinfo_list; scan; scan = scan->next) {
-		GAppInfo  *appinfo = scan->data;
-		char      *label;
-		GtkWidget *menu_item;
-		GIcon     *icon;
-		GdkPixbuf *pixbuf;
-
-		if (strcmp (g_app_info_get_executable (appinfo), "gthumb") == 0)
-			continue;
-		if (g_hash_table_lookup (used_apps, g_app_info_get_id (appinfo)) != NULL)
-			continue;
-		g_hash_table_insert (used_apps, (gpointer) g_app_info_get_id (appinfo), GINT_TO_POINTER (1));
-
-		label = g_strdup_printf (_("Open with \"%s\""), g_app_info_get_name (appinfo));
-		menu_item = gtk_image_menu_item_new_with_label (label);
-
-		icon = g_app_info_get_icon (appinfo);
-		pixbuf = gth_icon_cache_get_pixbuf (browser->priv->menu_icon_cache, icon);
-		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), gtk_image_new_from_pixbuf (pixbuf));
-
-		gtk_widget_show (menu_item);
-		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-
-		g_object_set_data (G_OBJECT (menu_item), "appinfo", appinfo);
-		g_signal_connect (menu_item,
-				  "activate",
-				  G_CALLBACK (activate_open_with_application_item),
-			  	  browser);
-
-		g_object_unref (pixbuf);
-		g_free (label);
-	}
-
-	/*
-	if (appinfo_list == NULL) {
-		GtkWidget *menu_item;
-
-		menu_item = gtk_image_menu_item_new_with_label (_("No application available"));
-		gtk_widget_set_sensitive (menu_item, FALSE);
-		gtk_widget_show (menu_item);
-		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-	}*/
-
-	gtk_widget_set_sensitive (openwith_item, appinfo_list != NULL);
-	gtk_widget_show (openwith_item);
-
-	g_hash_table_destroy (used_apps);
-	g_list_free (appinfo_list);
-	_g_object_list_unref (file_list);
-	_gtk_tree_path_list_free (items);
-}
-
-
-static void
 gth_file_view_selection_changed_cb (GtkIconView *iconview,
 				    gpointer     user_data)
 {
@@ -2383,7 +2307,8 @@ gth_file_view_selection_changed_cb (GtkIconView *iconview,
 
 	gth_browser_update_sensitivity (browser);
 	_gth_browser_update_statusbar_list_info (browser);
-	_gth_browser_update_open_menu (browser);
+
+	gth_hook_invoke ("gth-browser-selection-changed", browser);
 
 	if (gth_window_get_current_page (GTH_WINDOW (browser)) != GTH_BROWSER_PAGE_BROWSER)
 		return;
@@ -3183,6 +3108,13 @@ gth_browser_get_ui_manager (GthBrowser *browser)
 }
 
 
+GthIconCache *
+gth_browser_get_menu_icon_cache (GthBrowser *browser)
+{
+	return browser->priv->menu_icon_cache;
+}
+
+
 GtkWidget *
 gth_browser_get_statusbar (GthBrowser *browser)
 {
@@ -3909,7 +3841,7 @@ gth_browser_load_location (GthBrowser *browser,
 	list = g_list_prepend (NULL, g_object_ref (data->location));
 	gth_file_source_read_attributes (data->file_source,
 					 list,
-					 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+					 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 					 load_file_attributes_ready_cb,
 					 data);
 
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 5f817be..1a015b1 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -25,6 +25,7 @@
 
 #include "gth-file-source.h"
 #include "gth-file-store.h"
+#include "gth-icon-cache.h"
 #include "gth-task.h"
 #include "gth-window.h"
 #include "typedefs.h"
@@ -87,6 +88,7 @@ void             gth_browser_set_dialog             (GthBrowser       *browser,
 GtkWidget *      gth_browser_get_dialog             (GthBrowser       *browser,
 						     const char       *dialog_name);
 GtkUIManager *   gth_browser_get_ui_manager         (GthBrowser       *browser);
+GthIconCache *   gth_browser_get_menu_icon_cache    (GthBrowser       *browser);
 GtkWidget *      gth_browser_get_statusbar          (GthBrowser       *browser);
 GtkWidget *      gth_browser_get_file_list          (GthBrowser       *browser);
 GtkWidget *      gth_browser_get_file_list_view     (GthBrowser       *browser);
diff --git a/gthumb/gth-file-data.c b/gthumb/gth-file-data.c
index 697cebf..e09b24f 100644
--- a/gthumb/gth-file-data.c
+++ b/gthumb/gth-file-data.c
@@ -264,7 +264,7 @@ gth_file_data_update_info (GthFileData *fd,
 			   const char  *attributes)
 {
 	if (attributes == NULL)
-		attributes = GTH_FILE_DATA_ATTRIBUTES;
+		attributes = GFILE_STANDARD_ATTRIBUTES;
 	if (fd->info != NULL)
 		g_object_unref (fd->info);
 
diff --git a/gthumb/gth-file-data.h b/gthumb/gth-file-data.h
index 8f1da8b..51499c1 100644
--- a/gthumb/gth-file-data.h
+++ b/gthumb/gth-file-data.h
@@ -29,23 +29,6 @@
 
 G_BEGIN_DECLS
 
-#define GTH_FILE_DATA_ATTR(a) ("standard::type," \
-			       "standard::is-hidden," \
-			       "standard::is-backup," \
-			       "standard::name," \
-			       "standard::display-name," \
-			       "standard::edit-name," \
-			       "standard::icon," \
-			       "standard::size," \
-			       "time::created," \
-			       "time::created-usec," \
-			       "time::modified," \
-			       "time::modified-usec," \
-			       a)
-#define GTH_FILE_DATA_ATTRIBUTES (GTH_FILE_DATA_ATTR(""))
-#define GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE (GTH_FILE_DATA_ATTR("standard::fast-content-type"))
-#define GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE (GTH_FILE_DATA_ATTR("standard::content-type"))
-
 #define GTH_TYPE_FILE_DATA (gth_file_data_get_type ())
 #define GTH_FILE_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_FILE_DATA, GthFileData))
 #define GTH_FILE_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_FILE_DATA, GthFileDataClass))
diff --git a/gthumb/gth-file-list.c b/gthumb/gth-file-list.c
index e053604..f7d0e09 100644
--- a/gthumb/gth-file-list.c
+++ b/gthumb/gth-file-list.c
@@ -49,9 +49,9 @@ typedef enum {
 	GTH_FILE_LIST_OP_TYPE_DELETE_FILES,
 	GTH_FILE_LIST_OP_TYPE_SET_FILTER,
 	GTH_FILE_LIST_OP_TYPE_SET_SORT_FUNC,
-	GTH_FILE_LIST_OP_TYPE_ENABLE_THUMBS
-	/*GTH_FILE_LIST_OP_TYPE_RENAME,
-	GTH_FILE_LIST_OP_TYPE_SET_THUMBS_SIZE,*/
+	GTH_FILE_LIST_OP_TYPE_ENABLE_THUMBS,
+	GTH_FILE_LIST_OP_TYPE_RENAME_FILE
+	/*GTH_FILE_LIST_OP_TYPE_SET_THUMBS_SIZE,*/
 } GthFileListOpType;
 
 
@@ -66,6 +66,8 @@ typedef struct {
 	gboolean             inverse_sort;
 	char                *sval;
 	int                  ival;
+	GFile               *file;
+	GthFileData         *file_data;
 } GthFileListOp;
 
 
@@ -148,6 +150,10 @@ gth_file_list_op_free (GthFileListOp *op)
 	case GTH_FILE_LIST_OP_TYPE_SET_FILTER:
 		g_object_unref (op->filter);
 		break;
+	case GTH_FILE_LIST_OP_TYPE_RENAME_FILE:
+		g_object_unref (op->file);
+		g_object_unref (op->file_data);
+		break;
 	default:
 		break;
 	}
@@ -800,6 +806,44 @@ gth_file_list_update_files (GthFileList *file_list,
 
 
 static void
+gfl_rename_file (GthFileList *file_list,
+		 GFile       *file,
+		 GthFileData *file_data)
+{
+	GthFileStore *file_store;
+	int           abs_pos;
+
+	file_store = (GthFileStore*) gth_file_view_get_model (GTH_FILE_VIEW (file_list->priv->view));
+	abs_pos = gth_file_store_find (file_store, file);
+	if (abs_pos < 0)
+		return;
+
+	gth_file_store_queue_set (file_store,
+				  abs_pos,
+				  file_data,
+				  NULL,
+				  -1,
+				  NULL);
+	gth_file_store_exec_set (file_store);
+	_gth_file_list_update_pane (file_list);
+}
+
+
+void
+gth_file_list_rename_file (GthFileList *file_list,
+			   GFile       *file,
+			   GthFileData *file_data)
+{
+	GthFileListOp *op;
+
+	op = gth_file_list_op_new (GTH_FILE_LIST_OP_TYPE_RENAME_FILE);
+	op->file = g_object_ref (file);
+	op->file_data = g_object_ref (file_data);
+	_gth_file_list_queue_op (file_list, op);
+}
+
+
+static void
 gfl_set_files (GthFileList   *file_list,
 	       GthFileSource *file_source,
 	       GList         *files)
@@ -1258,6 +1302,9 @@ _gth_file_list_exec_next_op (GthFileList *file_list)
 	case GTH_FILE_LIST_OP_TYPE_SET_SORT_FUNC:
 		gfl_set_sort_func (file_list, op->cmp_func, op->inverse_sort);
 		break;
+	case GTH_FILE_LIST_OP_TYPE_RENAME_FILE:
+		gfl_rename_file (file_list, op->file, op->file_data);
+		break;
 	default:
 		exec_next_op = FALSE;
 		break;
diff --git a/gthumb/gth-file-list.h b/gthumb/gth-file-list.h
index cca125f..2f10193 100644
--- a/gthumb/gth-file-list.h
+++ b/gthumb/gth-file-list.h
@@ -69,6 +69,9 @@ void           gth_file_list_delete_files   (GthFileList          *file_list,
 					     GList                *list /* GFile */);
 void           gth_file_list_update_files   (GthFileList          *file_list,
 					     GList                *list /* GthFileData */);
+void           gth_file_list_rename_file    (GthFileList          *file_list,
+					     GFile                *file,
+					     GthFileData          *file_data);
 void           gth_file_list_set_filter     (GthFileList          *file_list,
 					     GthTest              *filter);
 void           gth_file_list_set_sort_func  (GthFileList          *file_list,
diff --git a/gthumb/gth-file-source-vfs.c b/gthumb/gth-file-source-vfs.c
index 97f2ade..4f71cf3 100644
--- a/gthumb/gth-file-source-vfs.c
+++ b/gthumb/gth-file-source-vfs.c
@@ -65,14 +65,14 @@ get_entry_points (GthFileSource *file_source)
 	list = NULL;
 
 	file = g_file_new_for_uri (get_home_uri ());
-	info = gth_file_source_get_file_info (file_source, file);
+	info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
 	g_file_info_set_display_name (info, _("Home Folder"));
 	list = g_list_append (list, gth_file_data_new (file, info));
 	g_object_unref (info);
 	g_object_unref (file);
 
 	file = g_file_new_for_uri ("file:///");
-	info = gth_file_source_get_file_info (file_source, file);
+	info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
 	g_file_info_set_display_name (info, _("File System"));
 	list = g_list_append (list, gth_file_data_new (file, info));
 	g_object_unref (info);
@@ -87,7 +87,7 @@ get_entry_points (GthFileSource *file_source)
 			continue;
 
 		file = g_mount_get_root (mount);
-		info = gth_file_source_get_file_info (file_source, file);
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
 
 		volume = g_mount_get_volume (mount);
 		if (volume != NULL) {
@@ -134,14 +134,15 @@ to_gio_file (GthFileSource *file_source,
 
 static GFileInfo *
 get_file_info (GthFileSource *file_source,
-	       GFile         *file)
+	       GFile         *file,
+	       const char    *attributes)
 {
 	GFile     *gio_file;
 	GFileInfo *file_info;
 
 	gio_file = gth_file_source_to_gio_file (file_source, file);
 	file_info = g_file_query_info (gio_file,
-				       "standard::display-name,standard::icon,standard::type",
+				       attributes,
 				       G_FILE_QUERY_INFO_NONE,
 				       NULL,
 				       NULL);
diff --git a/gthumb/gth-file-source.c b/gthumb/gth-file-source.c
index 12d946a..7ebd28a 100644
--- a/gthumb/gth-file-source.c
+++ b/gthumb/gth-file-source.c
@@ -307,7 +307,8 @@ base_to_gio_file (GthFileSource *file_source,
 
 static GFileInfo *
 base_get_file_info (GthFileSource *file_source,
-		    GFile         *file)
+		    GFile         *file,
+		    const char    *attributes)
 {
 	return NULL;
 }
@@ -544,9 +545,10 @@ gth_file_source_to_gio_file_list (GthFileSource *file_source,
 
 GFileInfo *
 gth_file_source_get_file_info (GthFileSource *file_source,
-			       GFile         *file)
+			       GFile         *file,
+			       const char    *attributes)
 {
-	return GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->get_file_info (file_source, file);
+	return GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->get_file_info (file_source, file, attributes);
 }
 
 
diff --git a/gthumb/gth-file-source.h b/gthumb/gth-file-source.h
index a026912..40cf2cc 100644
--- a/gthumb/gth-file-source.h
+++ b/gthumb/gth-file-source.h
@@ -71,7 +71,8 @@ struct _GthFileSourceClass
 	GFile *      (*to_gio_file)           (GthFileSource  *file_source,
 					       GFile          *file);
 	GFileInfo *  (*get_file_info)         (GthFileSource  *file_source,
-					       GFile          *file);
+					       GFile          *file,
+					       const char     *attributes);
 	void         (*list)                  (GthFileSource  *file_source,
 					       GFile          *folder,
 					       const char     *attributes,
@@ -121,7 +122,8 @@ GFile *      gth_file_source_to_gio_file           (GthFileSource  *file_source,
 GList *      gth_file_source_to_gio_file_list      (GthFileSource  *file_source,
 						    GList          *files);
 GFileInfo *  gth_file_source_get_file_info         (GthFileSource  *file_source,
-						    GFile          *file);
+						    GFile          *file,
+						    const char     *attributes);
 gboolean     gth_file_source_is_active             (GthFileSource  *file_source);
 void         gth_file_source_cancel                (GthFileSource  *file_source);
 void         gth_file_source_list                  (GthFileSource  *file_source,
diff --git a/gthumb/gth-file-store.c b/gthumb/gth-file-store.c
index 00ee185..ea2bc43 100644
--- a/gthumb/gth-file-store.c
+++ b/gthumb/gth-file-store.c
@@ -1149,6 +1149,17 @@ gth_file_store_get_file_at_pos (GthFileStore *file_store,
 }
 
 
+GthFileData *
+gth_file_store_get_file_at_abs_pos (GthFileStore *file_store,
+				    int           abs_pos)
+{
+	if ((abs_pos < 0) || (abs_pos >= file_store->priv->tot_rows))
+		return NULL;
+	else
+		return g_object_ref (file_store->priv->all_rows[abs_pos]->file);
+}
+
+
 int
 gth_file_store_find (GthFileStore *file_store,
 		     GFile        *file)
diff --git a/gthumb/gth-file-store.h b/gthumb/gth-file-store.h
index 90c8c29..d3169c7 100644
--- a/gthumb/gth-file-store.h
+++ b/gthumb/gth-file-store.h
@@ -77,10 +77,12 @@ GthFileData *   gth_file_store_get_file        (GthFileStore         *file_store
 					        GtkTreeIter          *iter);
 GthFileData *   gth_file_store_get_file_at_pos (GthFileStore         *file_store,
 					        int                   pos);
+GthFileData *   gth_file_store_get_file_at_abs_pos (GthFileStore     *file_store,
+					        int                   abs_pos);
 int             gth_file_store_find            (GthFileStore         *file_store,
 					        GFile                *file);
 int             gth_file_store_find_visible    (GthFileStore         *file_store,
-					        GFile                *file);					        
+					        GFile                *file);
 void            gth_file_store_add             (GthFileStore         *file_store,
 					        GthFileData          *file,
 					        GdkPixbuf            *thumbnail,
diff --git a/gthumb/gth-folder-tree.c b/gthumb/gth-folder-tree.c
index 93393c5..f9111dd 100644
--- a/gthumb/gth-folder-tree.c
+++ b/gthumb/gth-folder-tree.c
@@ -52,7 +52,7 @@ enum {
 	COLUMN_WEIGHT,
 	COLUMN_ICON,
 	COLUMN_TYPE,
-	COLUMN_FILE,
+	COLUMN_FILE_DATA,
 	COLUMN_SORT_KEY,
 	COLUMN_SORT_ORDER,
 	COLUMN_NAME,
@@ -190,7 +190,7 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
 	GtkTreePath   *tree_path;
 	GtkTreeIter    iter;
 	EntryType      entry_type;
-	GFile         *file;
+	GthFileData   *file_data;
 	char          *name;
 
 	tree_path = gtk_tree_path_new_from_string (path);
@@ -206,15 +206,14 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    &iter,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    COLUMN_NAME, &name,
 			    -1);
 
 	if ((entry_type == ENTRY_TYPE_FILE) && (g_utf8_collate (name, new_text) != 0))
-		g_signal_emit (folder_tree, gth_folder_tree_signals[RENAME], 0, file, new_text);
+		g_signal_emit (folder_tree, gth_folder_tree_signals[RENAME], 0, file_data->file, new_text);
 
-	if (file != NULL)
-		g_object_unref (file);
+	_g_object_unref (file_data);
 	g_free (name);
 }
 
@@ -259,13 +258,13 @@ add_columns (GthFolderTree *folder_tree,
 
 static void
 open_uri (GthFolderTree *folder_tree,
-	  GFile         *file,
+	  GthFileData   *file_data,
 	  EntryType      entry_type)
 {
 	if (entry_type == ENTRY_TYPE_PARENT)
 		g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN_PARENT], 0);
 	else if (entry_type == ENTRY_TYPE_FILE)
-		g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN], 0, file);
+		g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN], 0, file_data->file);
 }
 
 
@@ -278,7 +277,7 @@ row_activated_cb (GtkTreeView       *tree_view,
 	GthFolderTree *folder_tree = user_data;
 	GtkTreeIter    iter;
 	EntryType      entry_type;
-	GFile         *file;
+	GthFileData   *file_data;
 
 	if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 				       &iter,
@@ -290,12 +289,11 @@ row_activated_cb (GtkTreeView       *tree_view,
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    &iter,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    -1);
-	open_uri (folder_tree, file, entry_type);
+	open_uri (folder_tree, file_data, entry_type);
 
-	if (file != NULL)
-		g_object_unref (file);
+	_g_object_unref (file_data);
 
 	return TRUE;
 }
@@ -309,7 +307,7 @@ row_expanded_cb (GtkTreeView  *tree_view,
 {
 	GthFolderTree *folder_tree = user_data;
 	EntryType      entry_type;
-	GFile         *file;
+	GthFileData   *file_data;
 	gboolean       loaded;
 
 	if ((folder_tree->priv->click_path == NULL)
@@ -321,18 +319,17 @@ row_expanded_cb (GtkTreeView  *tree_view,
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    expanded_iter,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    COLUMN_LOADED, &loaded,
 			    -1);
 
 	if ((entry_type == ENTRY_TYPE_FILE) && ! loaded)
-		g_signal_emit (folder_tree, gth_folder_tree_signals[LIST_CHILDREN], 0, file);
+		g_signal_emit (folder_tree, gth_folder_tree_signals[LIST_CHILDREN], 0, file_data->file);
 
 	gtk_tree_path_free (folder_tree->priv->click_path);
 	folder_tree->priv->click_path = NULL;
 
-	if (file != NULL)
-		g_object_unref (file);
+	_g_object_unref (file_data);
 
 	return FALSE;
 }
@@ -402,13 +399,13 @@ button_press_cb (GtkWidget      *widget,
 	}
 
  	if (event->button == 3) {
- 		EntryType  entry_type;
-		GFile     *file;
+ 		EntryType    entry_type;
+		GthFileData *file_data;
 
 		gtk_tree_model_get (GTK_TREE_MODEL (tree_store),
 				    &iter,
 				    COLUMN_TYPE, &entry_type,
-				    COLUMN_FILE, &file,
+				    COLUMN_FILE_DATA, &file_data,
 				    -1);
 
 		if (entry_type == ENTRY_TYPE_FILE) {
@@ -427,13 +424,12 @@ button_press_cb (GtkWidget      *widget,
 			g_signal_emit (folder_tree,
 				       gth_folder_tree_signals[FOLDER_POPUP],
 				       0,
-				       file,
+				       file_data,
 				       event->time);
 			retval = TRUE;
 		}
 
-		if (file != NULL)
-			g_object_unref (file);
+		_g_object_unref (file_data);
  	}
 	else if ((event->button == 1) && (event->type == GDK_BUTTON_PRESS)) {
 		GtkTreeSelection *selection;
@@ -487,10 +483,10 @@ button_press_cb (GtkWidget      *widget,
 static void
 load_uri (GthFolderTree *folder_tree,
 	  EntryType      entry_type,
-	  GFile         *file)
+	  GthFileData   *file_data)
 {
 	if (entry_type == ENTRY_TYPE_FILE)
-		g_signal_emit (folder_tree, gth_folder_tree_signals[LOAD], 0, file);
+		g_signal_emit (folder_tree, gth_folder_tree_signals[LOAD], 0, file_data->file);
 }
 
 
@@ -530,19 +526,18 @@ return FALSE;
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
 	if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
-		EntryType  entry_type;
-		GFile     *file;
+		EntryType    entry_type;
+		GthFileData *file_data;
 
 		gtk_tree_model_get (GTK_TREE_MODEL (tree_store),
 				    &iter,
 				    COLUMN_TYPE, &entry_type,
-				    COLUMN_FILE, &file,
+				    COLUMN_FILE_DATA, &file_data,
 				    -1);
 
-		load_uri (folder_tree, entry_type, file);
+		load_uri (folder_tree, entry_type, file_data);
 
-		if (file != NULL)
-			g_object_unref (file);
+		_g_object_unref (file_data);
 	}
 
 	gtk_tree_path_free (path);
@@ -559,7 +554,7 @@ selection_changed_cb (GtkTreeSelection *selection,
 	GtkTreeIter    iter;
 	GtkTreePath   *selected_path;
 	EntryType      entry_type;
-	GFile         *file;
+	GthFileData   *file_data;
 
 	if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
 		return FALSE;
@@ -584,13 +579,12 @@ selection_changed_cb (GtkTreeSelection *selection,
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    &iter,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    -1);
 
-	load_uri (folder_tree, entry_type, file);
+	load_uri (folder_tree, entry_type, file_data);
 
-	if (file != NULL)
-		g_object_unref (file);
+	_g_object_unref (file_data);
 	gtk_tree_path_free (selected_path);
 
 	return FALSE;
@@ -655,15 +649,17 @@ gth_folder_tree_get_iter (GthFolderTree *folder_tree,
 		return FALSE;
 
 	if (root != NULL) {
-		GFile    *root_file;
-		gboolean  found;
+		GthFileData *root_file_data;
+		EntryType    root_type;
+		gboolean     found;
 
-		gtk_tree_model_get (tree_model, root, COLUMN_FILE, &root_file, -1);
-
-		found = (root_file != NULL) && g_file_equal (file, root_file);
+		gtk_tree_model_get (tree_model, root,
+				    COLUMN_FILE_DATA, &root_file_data,
+				    COLUMN_TYPE, &root_type,
+				    -1);
+		found = (root_type == ENTRY_TYPE_FILE) && (root_file_data != NULL) && g_file_equal (file, root_file_data->file);
 
-		if (root_file != NULL)
-			g_object_unref (root_file);
+		_g_object_unref (root_file_data);
 
 		if (found) {
 			*file_iter = *root;
@@ -779,7 +775,7 @@ _gth_folder_tree_set_file_data (GthFolderTree *folder_tree,
 			    COLUMN_STYLE, PANGO_STYLE_NORMAL,
 			    COLUMN_ICON, pixbuf,
 			    COLUMN_TYPE, ENTRY_TYPE_FILE,
-			    COLUMN_FILE, file_data->file,
+			    COLUMN_FILE_DATA, file_data,
 			    COLUMN_NAME, name,
 			    COLUMN_SORT_KEY, sort_key,
 			    COLUMN_SORT_ORDER, g_file_info_get_sort_order (file_data->info),
@@ -1029,11 +1025,15 @@ _gth_folder_tree_get_children (GthFolderTree *folder_tree,
 
 	list = NULL;
 	do {
-		GFile *file;
+		GthFileData *file_data;
+		EntryType    file_type;
 
-		gtk_tree_model_get (tree_model, &iter, COLUMN_FILE, &file, -1);
-		if (file != NULL)
-			list = g_list_prepend (list, file);
+		gtk_tree_model_get (tree_model, &iter,
+				    COLUMN_FILE_DATA, &file_data,
+				    COLUMN_TYPE, &file_type,
+				    -1);
+		if ((file_type == ENTRY_TYPE_FILE) && (file_data != NULL))
+			list = g_list_prepend (list, file_data);
 	}
 	while (gtk_tree_model_iter_next (tree_model, &iter));
 
@@ -1097,10 +1097,10 @@ gth_folder_tree_set_children (GthFolderTree *folder_tree,
 
 	old_files = _gth_folder_tree_get_children (folder_tree, p_parent_iter);
 	for (scan = old_files; scan; scan = scan->next) {
-		GFile *file = scan->data;
+		GthFileData *file_data = scan->data;
 
-		if (! gth_file_data_list_find_file (files, file)
-		    && gth_folder_tree_get_iter (folder_tree, file, &iter, p_parent_iter))
+		if (! gth_file_data_list_find_file (files, file_data->file)
+		    && gth_folder_tree_get_iter (folder_tree, file_data->file, &iter, p_parent_iter))
 		{
 			gtk_tree_store_remove (folder_tree->priv->tree_store, &iter);
 		}
@@ -1182,16 +1182,17 @@ _gth_folder_tree_file_is_in_children (GthFolderTree *folder_tree,
 		return FALSE;
 
 	do {
-		GFile *test_file;
+		GthFileData *test_file_data;
+		EntryType    file_entry_type;
 
 		gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter,
-				    COLUMN_FILE, &test_file,
+				    COLUMN_FILE_DATA, &test_file_data,
+				    COLUMN_TYPE, &file_entry_type,
 				    -1);
-		if ((test_file != NULL) && g_file_equal (file, test_file))
+		if ((file_entry_type == ENTRY_TYPE_FILE) && (test_file_data != NULL) && g_file_equal (file, test_file_data->file))
 			found = TRUE;
 
-		if (test_file != NULL)
-			g_object_unref (test_file);
+		_g_object_unref (test_file_data);
 	}
 	while (! found && gtk_tree_model_iter_next (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter));
 
@@ -1244,13 +1245,20 @@ _gth_folder_tree_get_child (GthFolderTree *folder_tree,
 		return FALSE;
 
 	do {
-		GFile *test_file;
+		GthFileData *test_file_data;
+		EntryType    file_entry_type;
 
-		gtk_tree_model_get (tree_model, &iter, COLUMN_FILE, &test_file, -1);
-		if ((test_file != NULL) && g_file_equal (file, test_file)) {
+		gtk_tree_model_get (tree_model, &iter,
+				    COLUMN_FILE_DATA, &test_file_data,
+				    COLUMN_TYPE, &file_entry_type,
+				    -1);
+		if ((file_entry_type == ENTRY_TYPE_FILE) && (test_file_data != NULL) && g_file_equal (file, test_file_data->file)) {
+			_g_object_unref (test_file_data);
 			*file_iter = iter;
 			return TRUE;
 		}
+
+		_g_object_unref (test_file_data);
 	}
 	while (gtk_tree_model_iter_next (tree_model, &iter));
 
@@ -1350,6 +1358,7 @@ gth_folder_tree_start_editing (GthFolderTree *folder_tree,
 
 	tree_column = gtk_tree_view_get_column (GTK_TREE_VIEW (folder_tree), 0);
 	gtk_tree_view_expand_to_path (GTK_TREE_VIEW (folder_tree), tree_path);
+	gtk_tree_view_collapse_row (GTK_TREE_VIEW (folder_tree), tree_path);
 	gtk_tree_view_set_cursor (GTK_TREE_VIEW (folder_tree),
 				  tree_path,
 				  tree_column,
@@ -1450,14 +1459,14 @@ gth_folder_tree_get_root (GthFolderTree *folder_tree)
 }
 
 
-GFile *
+GthFileData *
 gth_folder_tree_get_selected (GthFolderTree *folder_tree)
 {
 	GtkTreeSelection *selection;
 	GtkTreeModel     *tree_model;
 	GtkTreeIter       iter;
 	EntryType         entry_type;
-	GFile            *file;
+	GthFileData      *file_data;
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
 	if (selection == NULL)
@@ -1470,20 +1479,19 @@ gth_folder_tree_get_selected (GthFolderTree *folder_tree)
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    &iter,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    -1);
 
 	if (entry_type != ENTRY_TYPE_FILE) {
-		if (file != NULL)
-			g_object_unref (file);
-		file = NULL;
+		_g_object_unref (file_data);
+		file_data = NULL;
 	}
 
-	return file;
+	return file_data;
 }
 
 
-GFile *
+GthFileData *
 gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
 {
 	GtkTreeSelection *selection;
@@ -1491,11 +1499,11 @@ gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
 	GtkTreeIter       iter;
 	GtkTreeIter       parent;
 	EntryType         entry_type;
-	GFile            *file;
+	GthFileData      *file_data;
 
-	file = gth_folder_tree_get_selected (folder_tree);
-	if (file != NULL)
-		return file;
+	file_data = gth_folder_tree_get_selected (folder_tree);
+	if (file_data != NULL)
+		return file_data;
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
 	if (selection == NULL)
@@ -1511,14 +1519,13 @@ gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
 	gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
 			    &parent,
 			    COLUMN_TYPE, &entry_type,
-			    COLUMN_FILE, &file,
+			    COLUMN_FILE_DATA, &file_data,
 			    -1);
 
 	if (entry_type != ENTRY_TYPE_FILE) {
-		if (file != NULL)
-			g_object_unref (file);
-		file = NULL;
+		_g_object_unref (file_data);
+		file_data = NULL;
 	}
 
-	return file;
+	return file_data;
 }
diff --git a/gthumb/gth-folder-tree.h b/gthumb/gth-folder-tree.h
index 16bfc53..346dc05 100644
--- a/gthumb/gth-folder-tree.h
+++ b/gthumb/gth-folder-tree.h
@@ -101,8 +101,8 @@ void          gth_folder_tree_expand_row       (GthFolderTree   *folder_tree,
 void          gth_folder_tree_select_path      (GthFolderTree   *folder_tree,
 						GtkTreePath     *path);
 GFile *       gth_folder_tree_get_root         (GthFolderTree   *folder_tree);
-GFile *       gth_folder_tree_get_selected     (GthFolderTree   *folder_tree);
-GFile *       gth_folder_tree_get_selected_or_parent
+GthFileData * gth_folder_tree_get_selected     (GthFolderTree   *folder_tree);
+GthFileData * gth_folder_tree_get_selected_or_parent
 					       (GthFolderTree   *folder_tree);
 
 G_END_DECLS
diff --git a/gthumb/gth-location-chooser.c b/gthumb/gth-location-chooser.c
index ec05012..db7f7e1 100644
--- a/gthumb/gth-location-chooser.c
+++ b/gthumb/gth-location-chooser.c
@@ -711,7 +711,7 @@ gth_location_chooser_set_current (GthLocationChooser *chooser,
 			GFile     *file = scan->data;
 			GFileInfo *info;
 
-			info = gth_file_source_get_file_info (chooser->priv->file_source, file);
+			info = gth_file_source_get_file_info (chooser->priv->file_source, file, GFILE_BASIC_ATTRIBUTES);
 			if (info == NULL)
 				continue;
 			add_file_source_entries (chooser,
diff --git a/gthumb/gth-main-default-hooks.c b/gthumb/gth-main-default-hooks.c
index 61f0dbb..b5d45aa 100644
--- a/gthumb/gth-main-default-hooks.c
+++ b/gthumb/gth-main-default-hooks.c
@@ -120,6 +120,13 @@ gth_main_register_default_hooks (void)
 	gth_hook_register ("gth-browser-view-file", 2);
 
 	/**
+	 * Called when the selection changes
+	 *
+	 * @browser (GthBrowser*): the relative window.
+	 **/
+	gth_hook_register ("gth-browser-selection-changed", 1);
+
+	/**
 	 * Called in _gdk_pixbuf_save_async
 	 *
 	 * @data (SavePixbufData*):
diff --git a/gthumb/gth-source-tree.c b/gthumb/gth-source-tree.c
index 7e08259..c45ea82 100644
--- a/gthumb/gth-source-tree.c
+++ b/gthumb/gth-source-tree.c
@@ -127,7 +127,7 @@ load_data_run (LoadData  *load_data,
 {
 	gth_file_source_list (load_data->file_source,
 			      load_data->folder,
-			      eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+			      eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 			      func,
 			      load_data);
 }
@@ -258,7 +258,7 @@ monitor_folder_changed_cb (GthMonitor      *monitor,
 			monitor_data->source_tree = source_tree;
 			gth_file_source_read_attributes (source_tree->priv->file_source,
 						 	 list,
-						 	 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+						 	 eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
 						 	 file_attributes_ready_cb,
 						 	 monitor_data);
 			break;
@@ -282,7 +282,7 @@ monitor_file_renamed_cb (GthMonitor    *monitor,
 	GFileInfo   *info;
 	GthFileData *file_data;
 
-	info = gth_file_source_get_file_info (source_tree->priv->file_source, new_file);
+	info = gth_file_source_get_file_info (source_tree->priv->file_source, new_file, GFILE_BASIC_ATTRIBUTES);
 	file_data = gth_file_data_new (new_file, info);
 	gth_folder_tree_update_child (GTH_FOLDER_TREE (source_tree), file, file_data);
 
diff --git a/gthumb/gth-uri-list.c b/gthumb/gth-uri-list.c
index ad3e991..494ae38 100644
--- a/gthumb/gth-uri-list.c
+++ b/gthumb/gth-uri-list.c
@@ -23,7 +23,7 @@
 #include <config.h>
 #include <gtk/gtk.h>
 #include "glib-utils.h"
-#include "gth-file-source.h" 
+#include "gth-file-source.h"
 #include "gth-icon-cache.h"
 #include "gth-main.h"
 #include "gth-uri-list.h"
@@ -89,15 +89,15 @@ static gboolean
 order_changed (gpointer user_data)
 {
 	GthUriList *uri_list = user_data;
-	
+
 	if (uri_list->priv->changed_id != 0)
 		g_source_remove (uri_list->priv->changed_id);
 	uri_list->priv->changed_id = 0;
-	
+
 	g_signal_emit (G_OBJECT (uri_list),
 		       uri_list_signals[ORDER_CHANGED],
 		       0);
-	
+
 	return FALSE;
 }
 
@@ -108,7 +108,7 @@ row_deleted_cb (GtkTreeModel *tree_model,
 		gpointer      user_data)
 {
 	GthUriList *uri_list = user_data;
-	
+
 	if (uri_list->priv->changed_id != 0)
 		g_source_remove (uri_list->priv->changed_id);
 	uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);
@@ -122,10 +122,10 @@ row_inserted_cb (GtkTreeModel *tree_model,
 		 gpointer      user_data)
 {
 	GthUriList *uri_list = user_data;
-	
+
 	if (uri_list->priv->changed_id != 0)
 		g_source_remove (uri_list->priv->changed_id);
-	uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);	
+	uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);
 }
 
 
@@ -133,7 +133,7 @@ static void
 gth_uri_list_init (GthUriList *uri_list)
 {
 	uri_list->priv = g_new0 (GthUriListPrivate, 1);
-	
+
 	uri_list->priv->list_store = gtk_list_store_new (URI_LIST_NUM_COLUMNS,
 						         GDK_TYPE_PIXBUF,
 						         G_TYPE_STRING,
@@ -141,22 +141,22 @@ gth_uri_list_init (GthUriList *uri_list)
 	g_signal_connect (uri_list->priv->list_store,
 			  "row-deleted",
 			  G_CALLBACK (row_deleted_cb),
-			  uri_list);					         
+			  uri_list);
 	g_signal_connect (uri_list->priv->list_store,
 			  "row-inserted",
 			  G_CALLBACK (row_inserted_cb),
 			  uri_list);
-			  
+
 	gtk_tree_view_set_model (GTK_TREE_VIEW (uri_list), GTK_TREE_MODEL (uri_list->priv->list_store));
 	g_object_unref (uri_list->priv->list_store);
-		         
+
 	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (uri_list), FALSE);
         add_columns (GTK_TREE_VIEW (uri_list));
 	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (uri_list), FALSE);
         gtk_tree_view_set_enable_search (GTK_TREE_VIEW (uri_list), TRUE);
         gtk_tree_view_set_search_column (GTK_TREE_VIEW (uri_list), URI_LIST_COLUMN_NAME);
         gtk_tree_view_set_reorderable (GTK_TREE_VIEW (uri_list), TRUE);
-        
+
         uri_list->priv->icon_cache = gth_icon_cache_new_for_widget (GTK_WIDGET (uri_list), GTK_ICON_SIZE_MENU);
 	uri_list->priv->changed_id = 0;
 }
@@ -166,21 +166,21 @@ static void
 gth_uri_list_finalize (GObject *object)
 {
 	GthUriList *uri_list = GTH_URI_LIST (object);
-	
+
 	if (uri_list->priv != NULL) {
 		g_free (uri_list->priv);
 		uri_list->priv = NULL;
 	}
-	
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 
-static void 
-gth_uri_list_class_init (GthUriListClass *klass) 
+static void
+gth_uri_list_class_init (GthUriListClass *klass)
 {
 	GObjectClass *gobject_class;
-	
+
 	parent_class = g_type_class_peek_parent (klass);
 	gobject_class = G_OBJECT_CLASS (klass);
 
@@ -198,36 +198,36 @@ gth_uri_list_class_init (GthUriListClass *klass)
 }
 
 
-GType 
-gth_uri_list_get_type (void) 
+GType
+gth_uri_list_get_type (void)
 {
 	static GType type = 0;
-	
+
 	if (type == 0) {
-		static const GTypeInfo g_define_type_info = { 
-			sizeof (GthUriListClass), 
-			(GBaseInitFunc) NULL, 
-			(GBaseFinalizeFunc) NULL, 
-			(GClassInitFunc) gth_uri_list_class_init, 
-			(GClassFinalizeFunc) NULL, 
-			NULL, 
-			sizeof (GthUriList), 
-			0, 
-			(GInstanceInitFunc) gth_uri_list_init, 
-			NULL 
+		static const GTypeInfo g_define_type_info = {
+			sizeof (GthUriListClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) gth_uri_list_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,
+			sizeof (GthUriList),
+			0,
+			(GInstanceInitFunc) gth_uri_list_init,
+			NULL
 		};
-		type = g_type_register_static (GTK_TYPE_TREE_VIEW, 
-					       "GthUriList", 
-					       &g_define_type_info, 
+		type = g_type_register_static (GTK_TYPE_TREE_VIEW,
+					       "GthUriList",
+					       &g_define_type_info,
 					       0);
 	}
-	
+
 	return type;
 }
 
 
 GtkWidget *
-gth_uri_list_new (void) 
+gth_uri_list_new (void)
 {
 	return g_object_new (GTH_TYPE_URI_LIST, NULL);
 }
@@ -243,7 +243,7 @@ gth_uri_list_set_uris (GthUriList  *uri_list,
 
 	g_signal_handlers_block_by_func (uri_list->priv->list_store, row_deleted_cb, uri_list);
 	g_signal_handlers_block_by_func (uri_list->priv->list_store, row_inserted_cb, uri_list);
-	
+
 	gtk_list_store_clear (uri_list->priv->list_store);
 
 	for (i = 0; uris[i] != NULL; i++) {
@@ -255,11 +255,11 @@ gth_uri_list_set_uris (GthUriList  *uri_list,
 		GIcon         *icon;
 		GdkPixbuf     *pixbuf;
 		GtkTreeIter    iter;
-		
+
 		file = g_file_new_for_uri (uri);
-		file_source = gth_main_get_file_source (file);	
-		info = gth_file_source_get_file_info (file_source, file);
-		
+		file_source = gth_main_get_file_source (file);
+		info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
+
 		display_name = g_file_info_get_display_name (info);
 		icon = g_file_info_get_icon (info);
 		pixbuf = gth_icon_cache_get_pixbuf (uri_list->priv->icon_cache, icon);
@@ -275,7 +275,7 @@ gth_uri_list_set_uris (GthUriList  *uri_list,
 		g_object_unref (file_source);
 		g_object_unref (file);
 	}
-	
+
 	g_signal_handlers_unblock_by_func (uri_list->priv->list_store, row_deleted_cb, uri_list);
 	g_signal_handlers_unblock_by_func (uri_list->priv->list_store, row_inserted_cb, uri_list);
 }
@@ -286,12 +286,12 @@ gth_uri_list_get_uri (GthUriList  *uri_list,
 		      GtkTreeIter *iter)
 {
 	char *uri;
-	
+
 	gtk_tree_model_get (GTK_TREE_MODEL (uri_list->priv->list_store),
 			    iter,
 			    URI_LIST_COLUMN_URI, &uri,
 			    -1);
-			    
+
 	return uri;
 }
 
@@ -314,7 +314,7 @@ gth_uri_list_get_selected (GthUriList *uri_list)
 			    &iter,
 			    URI_LIST_COLUMN_URI, &uri,
 			    -1);
-	
+
 	return uri;
 }
 
@@ -328,14 +328,14 @@ gth_uri_list_get_uris (GthUriList *uri_list)
 
 	if (! gtk_tree_model_get_iter_first (model, &iter))
 		return NULL;
-		
+
 	do {
 		char *uri;
-		
+
 		gtk_tree_model_get (model, &iter, URI_LIST_COLUMN_URI, &uri, -1);
 		uris = g_list_prepend (uris, uri);
-	} 
+	}
 	while (gtk_tree_model_iter_next (model, &iter));
-	
+
 	return g_list_reverse (uris);
 }



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