[maemo-commits] [maemo-commits] r14786 - projects/haf/trunk/hildon-fm/hildon-fm

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Nov 16 15:26:44 EET 2007
Author: marivoll
Date: 2007-11-16 15:26:42 +0200 (Fri, 16 Nov 2007)
New Revision: 14786

Modified:
   projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c
Log:
	* hildon-fm/hildon-file-chooser-dialog.c (show_info_note,
	show_gnome_vfs_result_for_folder_creation, create_folder,
	handle_folder_popup): Reverted changed from 2007-11-09.  We have
	to use gtk_file_system_create_folder since folder creation must
	work with any backend, not just the GnomeVFS one (N75960).


Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c	2007-11-16 13:26:23 UTC (rev 14785)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c	2007-11-16 13:26:42 UTC (rev 14786)
@@ -37,8 +37,6 @@
 #include <gtk/gtkfilechooserutils.h>
 #include <gtk/gtkfilesystem.h>
 
-#include <libgnomevfs/gnome-vfs.h>
-
 #include "hildon-file-selection.h"
 #include "hildon-file-chooser-dialog.h"
 #include "hildon-file-system-private.h"
@@ -1219,66 +1217,38 @@
     return dialog;
 }
 
-static void
-show_info_note (GtkWindow *parent, const char *msg)
+static void create_folder_callback(GtkFileSystemHandle *handle,
+    const GtkFilePath *path, const GError *error, gpointer data)
 {
-  GtkWidget *dialog;
+    HildonFileChooserDialog *self;
+    GtkDialog *dialog;
+    const gchar *message;
 
-  dialog = hildon_note_new_information (parent, msg);
-  gtk_dialog_run (GTK_DIALOG (dialog));
-  gtk_widget_destroy (dialog);
-}
+    g_assert(HILDON_IS_FILE_CHOOSER_DIALOG(data));
+    self = HILDON_FILE_CHOOSER_DIALOG(data);
 
-static void
-show_gnome_vfs_result_for_folder_creation (HildonFileChooserDialog *self,
-					   GnomeVFSResult result)
-{
-  /* XXX - We always use NULL as the parent for info banners.
-           Otherwise, they might get obscured by menus.
-  */
+    g_assert(self->priv->create_folder_handle == handle);
 
-  if (result == GNOME_VFS_ERROR_FILE_EXISTS)
-    {
-      hildon_banner_show_information 
-	(NULL, NULL, HCS ("ckdg_ib_folder_already_exists"));
-    }
-  else if (result == GNOME_VFS_ERROR_NOT_SUPPORTED)
-    {
-      hildon_banner_show_information 
-	(NULL, NULL, _ ("sfil_ib_create_folder_not_allowed"));
-    } 
-  else if (result == GNOME_VFS_ERROR_NO_SPACE)
-    {
-      show_info_note (GTK_WINDOW (self),
-		      HCS ("sfil_ni_not_enough_memory"));
-    }
-  else
-    {
-      show_info_note (GTK_WINDOW (self),
-		      HCS ("sfil_ni_operation_failed"));
-    }
-}
+    self->priv->create_folder_handle = NULL;
+    dialog = GTK_DIALOG(self);
 
-static gboolean
-create_folder (HildonFileChooserDialog *self, const char *uri)
-{
-  GnomeVFSURI *vfs_uri;
-  GnomeVFSResult result;
+    if (error) {
+        if (g_error_matches(error, GTK_FILE_SYSTEM_ERROR,
+			    GTK_FILE_SYSTEM_ERROR_ALREADY_EXISTS))
+            message = HCS("ckdg_ib_folder_already_exists");
+        else
+            message = HCS("sfil_ni_operation_failed");
 
-  vfs_uri = gnome_vfs_uri_new (uri);
-  if (!vfs_uri)
-    {
-      show_gnome_vfs_result_for_folder_creation (self,
-						 GNOME_VFS_ERROR_INVALID_URI);
-      return FALSE;
+        hildon_banner_show_information (GTK_WIDGET(self), NULL, message);
+        hildon_file_chooser_dialog_select_text(self->priv);
+        gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_OK, TRUE);
+    } else {
+        /* Fake response to close the dialog after folder is created */
+        gtk_dialog_response(dialog, HILDON_RESPONSE_FOLDER_CREATED);
     }
 
-  result = gnome_vfs_make_directory_for_uri (vfs_uri, 0755);
-  if (result != GNOME_VFS_OK)
-    show_gnome_vfs_result_for_folder_creation (self, result);
-    
-  gnome_vfs_uri_unref (vfs_uri);
-  return result == GNOME_VFS_OK;
+    /* This reference was added while setting up the callback */
+    g_object_unref(self);
 }
 
 static void handle_folder_popup(HildonFileChooserDialog *self)
@@ -1313,37 +1283,59 @@
 
   if (self->priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
   {
+    GtkFilePath *file_path = NULL;
+
     dialog = hildon_file_chooser_dialog_create_sub_dialog(self,
                GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER);
 
     while ((response = gtk_dialog_run(GTK_DIALOG(dialog))) == GTK_RESPONSE_OK)
       {
-	g_free (uri);
-	
-	uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER(dialog));
+	uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
 	ULOG_INFO_F("About to create folder %s", uri);
-	
-	if (create_folder (self, uri))
-	  break;
+
+	if (file_path)
+	  gtk_file_path_free(file_path);
+
+	file_path = gtk_file_system_uri_to_path(backend, uri);
+
+	/* There shouldn't be a way to invoke two simultaneous folder
+	   creating actions */
+
+	HildonFileChooserDialogPrivate *sub_priv =
+		HILDON_FILE_CHOOSER_DIALOG (dialog)->priv;
+
+	if (sub_priv->create_folder_handle)
+          {
+	    gtk_file_system_cancel_operation (sub_priv->create_folder_handle);
+	    sub_priv->create_folder_handle = NULL;
+	  }
+
+	/* Callback is quaranteed to be called, it unrefs the object data */
+	sub_priv->create_folder_handle =
+	  gtk_file_system_create_folder (backend, file_path,
+					 create_folder_callback,
+					 g_object_ref(dialog));
+
+	/* Make OK button insensitive while folder operation is going */
+	gtk_dialog_set_response_sensitive (GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE);
       }
 
+    /* If user cancelled the operation, we still can have handle
+     */
+    if (self->priv->create_folder_handle)
+      gtk_file_system_cancel_operation (self->priv->create_folder_handle);
+
     /* If we created a folder, change into it */
-    if (response == GTK_RESPONSE_OK)
+    if (response == HILDON_RESPONSE_FOLDER_CREATED)
       {
-	GtkFilePath *path;
-
-        g_assert (uri != NULL);
-	path = gtk_file_system_uri_to_path (backend, uri);
-
+        g_assert(file_path != NULL);
         if (!hildon_file_chooser_dialog_set_current_folder
-	    (GTK_FILE_CHOOSER(self), path, NULL))
-	  {
-	    hildon_file_selection_move_cursor_to_uri (self->priv->filetree, 
-						      uri);
-	  }
-	
-	gtk_file_path_free (path);
+          (GTK_FILE_CHOOSER(self), file_path, NULL) && uri) {
+			hildon_file_selection_move_cursor_to_uri (self->priv->filetree, 
+								  uri);
+		}
       }
+    gtk_file_path_free(file_path);
   }
   else
   {


More information about the maemo-commits mailing list