gedit r6267 - in trunk: . plugins/filebrowser



Author: jessevdk
Date: Tue May  6 18:17:18 2008
New Revision: 6267
URL: http://svn.gnome.org/viewvc/gedit?rev=6267&view=rev

Log:
	* plugins/filebrowser/gedit-file-browser-widget.c: fixed problem when
	icon for virtual root is not available
	* plugins/filebrowser/gedit-file-browser-utils.c: fixed using basename
	if file info cannot be queried
	* plugins/filebrowser/gedit-file-browser-plugin.c: added support for
	also resetting the uri of any open documents under a renamed directory
	* plugins/filebrowser/gedit-file-browser-store.c: fixed up code to
	handle non existent files and to try to mount mountable root locations
	if necessary


Modified:
   trunk/ChangeLog
   trunk/plugins/filebrowser/gedit-file-bookmarks-store.c
   trunk/plugins/filebrowser/gedit-file-browser-plugin.c
   trunk/plugins/filebrowser/gedit-file-browser-store.c
   trunk/plugins/filebrowser/gedit-file-browser-utils.c
   trunk/plugins/filebrowser/gedit-file-browser-widget.c

Modified: trunk/plugins/filebrowser/gedit-file-bookmarks-store.c
==============================================================================
--- trunk/plugins/filebrowser/gedit-file-bookmarks-store.c	(original)
+++ trunk/plugins/filebrowser/gedit-file-bookmarks-store.c	Tue May  6 18:17:18 2008
@@ -326,6 +326,8 @@
 	GFile * file;
 	gboolean ret;
 	guint flags = GEDIT_FILE_BOOKMARKS_STORE_IS_BOOKMARK;
+	GtkTreeIter iter;
+	GdkPixbuf * pixbuf;
 	
 	file = g_file_new_for_uri (uri);
 	
@@ -335,7 +337,33 @@
 		flags |= GEDIT_FILE_BOOKMARKS_STORE_IS_REMOTE_BOOKMARK;
 	}
 
-	ret = add_file (model, file, name, flags, NULL);
+	ret = add_file (model, file, name, flags, &iter);
+	
+	if (!g_file_is_native (file)) {
+		/* Check icon */
+		gtk_tree_model_get (GTK_TREE_MODEL (model), 
+				    &iter, 
+				    GEDIT_FILE_BOOKMARKS_STORE_COLUMN_ICON, 
+				    &pixbuf, 
+				    -1);
+
+		if (!pixbuf) {
+			pixbuf = gedit_file_browser_utils_pixbuf_from_theme ("gnome-fs-directory", GTK_ICON_SIZE_MENU);
+
+			if (pixbuf) {			
+				gtk_tree_store_set (GTK_TREE_STORE (model), 
+						    &iter, 
+						    GEDIT_FILE_BOOKMARKS_STORE_COLUMN_ICON,
+						    pixbuf,
+						    -1);
+						    
+				g_object_unref (pixbuf);
+			}
+		} else {
+			g_object_unref (pixbuf);
+		}
+	}
+	
 	g_object_unref (file);
 	
 	return ret;

Modified: trunk/plugins/filebrowser/gedit-file-browser-plugin.c
==============================================================================
--- trunk/plugins/filebrowser/gedit-file-browser-plugin.c	(original)
+++ trunk/plugins/filebrowser/gedit-file-browser-plugin.c	Tue May  6 18:17:18 2008
@@ -983,30 +983,53 @@
 	GeditDocument * doc;
 	GFile * docfile;
 	GFile * oldfile;
+	GFile * newfile;
 	gchar * uri;
+	gchar * relative;
 	
 	/* Find all documents and set its uri to newuri where it matches olduri */
 	app = gedit_app_get_default ();
 	documents = gedit_app_get_documents (app);
 	
 	oldfile = g_file_new_for_uri (olduri);
+	newfile = g_file_new_for_uri (newuri);
 	
 	for (item = documents; item; item = item->next) {
 		doc = GEDIT_DOCUMENT (item->data);
 		uri = gedit_document_get_uri (doc);
 		
-		docfile = g_file_new_for_uri (uri);
+		if (!uri)
+			continue;
 		
+		docfile = g_file_new_for_uri (uri);
+
 		if (g_file_equal (docfile, oldfile)) {
 			gedit_document_set_uri (doc, newuri);
-
-			gedit_debug_message (DEBUG_PLUGINS, "Renamed %s to %s", olduri, newuri);
+		} else {
+			relative = g_file_get_relative_path (oldfile, docfile);
+			g_object_unref (docfile);
+			g_free (uri);
+		
+			if (relative) {
+				/* relative now contains the part in docfile without
+				   the prefix oldfile */
+
+				docfile = g_file_get_child (newfile, relative);
+				uri = g_file_get_uri (docfile);
+			
+				gedit_document_set_uri (doc, uri);
+			}
+		
+			g_free (relative);
 		}
 		
 		g_free (uri);
 		g_object_unref (docfile);
 	}
 	
+	g_object_unref (oldfile);
+	g_object_unref (newfile);
+	
 	g_list_free (documents);
 }
 

Modified: trunk/plugins/filebrowser/gedit-file-browser-store.c
==============================================================================
--- trunk/plugins/filebrowser/gedit-file-browser-store.c	(original)
+++ trunk/plugins/filebrowser/gedit-file-browser-store.c	Tue May  6 18:17:18 2008
@@ -1133,6 +1133,19 @@
 }
 
 static void
+row_changed (GeditFileBrowserStore * model,
+	     const GtkTreePath * path,
+	     GtkTreeIter * iter)
+{
+	GtkTreePath *copy = gtk_tree_path_copy (path);
+	
+	/* Insert a copy of the actual path here because the row-inserted
+	   signal may alter the path */
+	gtk_tree_model_row_inserted (GTK_TREE_MODEL(model), copy, iter);
+	gtk_tree_path_free (copy);
+}
+
+static void
 row_inserted (GeditFileBrowserStore * model,
 	      const GtkTreePath * path,
 	      GtkTreeIter * iter)
@@ -1769,13 +1782,26 @@
 	gchar const * name;
 	gboolean free_info = FALSE;
 	GtkTreePath * path;
+	gchar * uri;
+	GError * error = NULL;
 
 	if (info == NULL) {
 		info = g_file_query_info (node->file,  
 					  STANDARD_ATTRIBUTE_TYPES,
 					  G_FILE_QUERY_INFO_NONE,
 					  NULL,
-					  NULL);
+					  &error);
+					  
+		if (!info) {
+			uri = g_file_get_uri (node->file);
+			
+			g_warning ("Could not get info for %s: %s", uri, error->message);
+			g_error_free (error);
+			g_free (uri);
+			
+			return;
+		}
+		
 		free_info = TRUE;
 	}
 
@@ -1846,20 +1872,26 @@
 {
 	FileBrowserNode *node;
 	gboolean free_info = FALSE;
-	
-	if (!info)
-	{
-		info = g_file_query_info (file,
-					  STANDARD_ATTRIBUTE_TYPES,
-					  G_FILE_QUERY_INFO_NONE,
-					  NULL,
-					  NULL);
-		free_info = TRUE;
-	}
-	
+	GError * error = NULL;
+
 	// Check if it already exists
-	if ((node = model_file_exists (model, parent, file)) == NULL) {
-		if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
+	if ((node = model_file_exists (model, parent, file)) == NULL) {	
+		if (!info) {
+			info = g_file_query_info (file,
+						  STANDARD_ATTRIBUTE_TYPES,
+						  G_FILE_QUERY_INFO_NONE,
+						  NULL,
+						  &error);
+			free_info = TRUE;
+		}
+		
+		if (!info) {
+			g_warning ("Error querying file info: %s", error->message);
+			g_error_free (error);
+			
+			/* FIXME: What to do now then... */
+			node = file_browser_node_new (file, parent);
+		} else if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
 			node = file_browser_node_dir_new (model, file, parent);
 		} else {
 			node = file_browser_node_new (file, parent);
@@ -1867,10 +1899,37 @@
 
 		file_browser_node_set_from_info (model, node, info, FALSE);
 		model_add_node (model, node, parent);
+		
+		if (info && free_info)
+			g_object_unref (info);
+	}
+
+	return node;
+}
+
+static FileBrowserNode *
+model_add_node_from_dir (GeditFileBrowserStore * model,
+			 FileBrowserNode * parent,
+			 GFile * file,
+			 GFileInfo * info)
+{
+	FileBrowserNode *node;
+
+	// Check if it already exists
+	if ((node = model_file_exists (model, parent, file)) == NULL) {	
+		node = file_browser_node_dir_new (model, file, parent);
+		file_browser_node_set_from_info (model, node, info, FALSE);
+
+		if (node->name == NULL) {
+			file_browser_node_set_name (node);
+		}
+		
+		if (node->icon == NULL) {
+			node->icon = gedit_file_browser_utils_pixbuf_from_theme ("gnome-fs-directory", GTK_ICON_SIZE_MENU);
+		}
+
+		model_add_node (model, node, parent);
 	}
-	
-	if (free_info)
-		g_object_unref (info);
 
 	return node;
 }
@@ -2319,7 +2378,7 @@
 	for (item = files; item; item = item->next) {
 		check = G_FILE (item->data);
 		
-		parent = model_add_node_from_file (model, parent, check, NULL);
+		parent = model_add_node_from_dir (model, parent, check, NULL);
 		g_object_unref (check);
 	}
 
@@ -2409,6 +2468,114 @@
 	return newuri;
 }
 
+static GeditFileBrowserStoreResult
+model_root_mounted (GeditFileBrowserStore * model, gchar const * virtual_root)
+{
+	model_check_dummy (model, model->priv->root);
+	g_object_notify (G_OBJECT (model), "root");
+
+	if (virtual_root != NULL)
+		return
+		    gedit_file_browser_store_set_virtual_root_from_string
+		    (model, virtual_root);
+	else
+		set_virtual_root_from_node (model,
+					    model->priv->root);
+
+	return GEDIT_FILE_BROWSER_STORE_RESULT_OK;
+}
+
+typedef struct {
+	GeditFileBrowserStore * model;
+	gchar * virtual_root;
+	GMountOperation * operation;
+} MountInfo;
+
+static void
+mount_cb (GFile * file, 
+	  GAsyncResult * res, 
+	  MountInfo * mount_info)
+{
+	GFile * mounted_on;
+	GError * error = NULL;
+	FileBrowserNode * root;
+	GeditFileBrowserStore * model = mount_info->model;
+	
+	mounted_on = g_file_mount_mountable_finish (file, res, &error);
+	
+	if (mounted_on) {
+		model_root_mounted (model, mount_info->virtual_root);
+		g_object_unref (mounted_on);
+	} else if (error->code != G_IO_ERROR_CANCELLED) {
+		g_signal_emit (model, 
+			       model_signals[ERROR], 
+			       0, 
+			       GEDIT_FILE_BROWSER_ERROR_SET_ROOT,
+			       error->message);
+
+		g_error_free (error);
+		
+		/* Set the virtual root to the root */
+		root = model->priv->root;
+		model->priv->virtual_root = root;
+		
+		/* Set the root to be loaded */
+		root->flags |= GEDIT_FILE_BROWSER_STORE_FLAG_LOADED;
+		
+		/* Check the dummy */
+		model_check_dummy (model, root);
+		
+		g_object_notify (G_OBJECT (model), "root");
+		g_object_notify (G_OBJECT (model), "virtual-root");
+	}
+	
+	g_object_unref (mount_info->operation);
+	g_free (mount_info->virtual_root);
+	g_free (mount_info);
+}
+
+static GeditFileBrowserStoreResult
+model_mount_root (GeditFileBrowserStore * model, gchar const * virtual_root)
+{
+	GFileInfo * info;
+	GError * error = NULL;
+	MountInfo * mount_info;
+	
+	info = g_file_query_info (model->priv->root->file, 
+				  G_FILE_ATTRIBUTE_STANDARD_TYPE, 
+				  G_FILE_QUERY_INFO_NONE,
+				  NULL,
+				  &error);
+
+	if (!info) {
+		if (error->code == G_IO_ERROR_NOT_MOUNTED) {
+			/* Try to mount it */
+			FILE_BROWSER_NODE_DIR (model->priv->root)->cancellable = g_cancellable_new ();
+			
+			mount_info = g_new(MountInfo, 1);
+			mount_info->model = model;
+			mount_info->virtual_root = g_strdup (virtual_root);
+			mount_info->operation = g_mount_operation_new ();
+			
+			g_file_mount_mountable (model->priv->root->file, 
+						G_MOUNT_MOUNT_NONE,
+						mount_info->operation,
+						FILE_BROWSER_NODE_DIR (model->priv->root)->cancellable,
+						(GAsyncReadyCallback)mount_cb,
+						mount_info);
+						
+		}
+		
+		g_error_free (error);
+	} else {
+		g_object_unref (info);
+		
+		return model_root_mounted (model, virtual_root);
+	}
+	
+	return GEDIT_FILE_BROWSER_STORE_RESULT_OK;
+}
+
 /* Public */
 GeditFileBrowserStore *
 gedit_file_browser_store_new (gchar const *root)
@@ -2456,11 +2623,9 @@
 	model_recomposite_icon (tree_model, iter);
 
 	if (model_node_visibility (tree_model, node)) {
-		path =
-		    gedit_file_browser_store_get_path (GTK_TREE_MODEL
-						       (tree_model), iter);
-		gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_model),
-					    path, iter);
+		path = gedit_file_browser_store_get_path (GTK_TREE_MODEL (tree_model), 
+							  iter);
+		row_changed (tree_model, path, iter);
 		gtk_tree_path_free (path);
 	}
 }
@@ -2629,13 +2794,6 @@
 
 	if (root != NULL) {
 		file = g_file_new_for_uri (root);
-
-		if (file == NULL) {
-			g_signal_emit (model, model_signals[ERROR], 0,
-				       GEDIT_FILE_BROWSER_ERROR_SET_ROOT,
-				       _("Invalid uri"));
-			return GEDIT_FILE_BROWSER_STORE_RESULT_ERROR;
-		}
 	}
 
 	if (root != NULL && model->priv->root != NULL) {
@@ -2650,8 +2808,7 @@
 	if (virtual_root) {
 		vfile = g_file_new_for_uri (virtual_root);
 
-		if (equal && model->priv->virtual_root &&
-		    g_file_equal (vfile, model->priv->virtual_root->file)) {
+		if (equal && g_file_equal (vfile, model->priv->virtual_root->file)) {
 			if (file)
 				g_object_unref (file);
 
@@ -2672,20 +2829,11 @@
 	if (file != NULL) {
 		/* Create the root node */
 		node = file_browser_node_dir_new (model, file, NULL);
+		
 		g_object_unref (file);
 
 		model->priv->root = node;
-		model_check_dummy (model, node);
-		
-		g_object_notify (G_OBJECT (model), "root");
-
-		if (virtual_root != NULL)
-			return
-			    gedit_file_browser_store_set_virtual_root_from_string
-			    (model, virtual_root);
-		else
-			set_virtual_root_from_node (model,
-						    model->priv->root);
+		return model_mount_root (model, virtual_root);
 	} else {
 		g_object_notify (G_OBJECT (model), "root");
 		g_object_notify (G_OBJECT (model), "virtual-root");
@@ -2831,6 +2979,36 @@
 	model_load_directory (model, model->priv->virtual_root);
 }
 
+static void
+reparent_node (FileBrowserNode * node, gboolean reparent)
+{
+	FileBrowserNodeDir * dir;
+	GSList * child;
+	GFile * parent;
+	gchar * base;
+
+	if (!node->file) {
+		return;
+	}
+	
+	if (reparent) {
+		parent = node->parent->file;
+		base = g_file_get_basename (node->file);
+		g_object_unref (node->file);
+
+		node->file = g_file_get_child (parent, base);
+		g_free (base);
+	}
+	
+	if (NODE_IS_DIR (node)) {
+		dir = FILE_BROWSER_NODE_DIR (node);
+		
+		for (child = dir->children; child; child = child->next) {
+			reparent_node ((FileBrowserNode *)child->data, TRUE);
+		}
+	}
+}
+
 gboolean
 gedit_file_browser_store_rename (GeditFileBrowserStore * model,
 				 GtkTreeIter * iter,
@@ -2864,18 +3042,18 @@
 	}
 
 	if (g_file_move (node->file, file, G_FILE_COPY_NONE, NULL, NULL, NULL, &err)) {
-		/* TODO: make sure to also re'path all the child nodes that
-		   might be there! */
 		previous = node->file;
 		node->file = file;
 
 		/* This makes sure the actual info for the node is requeried */
 		file_browser_node_set_name (node);
 		file_browser_node_set_from_info (model, node, NULL, TRUE);
+		
+		reparent_node (node, FALSE);
 
 		if (model_node_visibility (model, node)) {
 			path = gedit_file_browser_store_get_path_real (model, node);
-			gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, iter);
+			row_changed (model, path, iter);
 			gtk_tree_path_free (path);
 
 			/* Reorder this item */

Modified: trunk/plugins/filebrowser/gedit-file-browser-utils.c
==============================================================================
--- trunk/plugins/filebrowser/gedit-file-browser-utils.c	(original)
+++ trunk/plugins/filebrowser/gedit-file-browser-utils.c	Tue May  6 18:17:18 2008
@@ -156,7 +156,7 @@
 	gchar * ret;
 
 	if (!display)
-		return NULL;
+		return g_file_get_basename (file);
 
 	ret = g_path_get_basename (display);
 	

Modified: trunk/plugins/filebrowser/gedit-file-browser-widget.c
==============================================================================
--- trunk/plugins/filebrowser/gedit-file-browser-widget.c	(original)
+++ trunk/plugins/filebrowser/gedit-file-browser-widget.c	Tue May  6 18:17:18 2008
@@ -1402,29 +1402,36 @@
 	GtkWidget *result;
 	GtkWidget *image;
 	gchar *unescape;
-	GdkPixbuf *pixbuf;
+	GdkPixbuf *pixbuf = NULL;
 	Location *loc;
 
 	loc = (Location *) (item->data);
 
 	if (!get_from_bookmark_file (obj, loc->virtual_root, &unescape, &pixbuf)) {
 		unescape = gedit_file_browser_utils_file_basename (loc->virtual_root);
-		pixbuf = g_object_ref (icon);
+		
+		if (icon)
+			pixbuf = g_object_ref (icon);
 	}
 
-	image = gtk_image_new_from_pixbuf (pixbuf);
-	g_object_unref (pixbuf);
+	if (pixbuf) {
+		image = gtk_image_new_from_pixbuf (pixbuf);
+		g_object_unref (pixbuf);
 
-	gtk_widget_show (image);
+		gtk_widget_show (image);
 
-	result = gtk_image_menu_item_new_with_label (unescape);
+		result = gtk_image_menu_item_new_with_label (unescape);
+		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (result),
+					       image);
+	} else {
+		result = gtk_menu_item_new_with_label (unescape);
+	}
+	
 	g_object_set_data (G_OBJECT (result), LOCATION_DATA_KEY, item);
 	g_signal_connect (result, "activate",
 			  G_CALLBACK (on_location_jump_activate), obj);
 
 	gtk_widget_show (result);
-	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (result),
-				       image);
 
 	g_free (unescape);
 



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