* Fixes NB#79209, select the renamed folder after finishing the operation
authorSergio Villar Senin <svillar@igalia.com>
Fri, 11 Jan 2008 11:32:36 +0000 (11:32 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Fri, 11 Jan 2008 11:32:36 +0000 (11:32 +0000)
pmo-trunk-r4016

src/modest-mail-operation.c
src/modest-mail-operation.h
src/modest-ui-actions.c
src/widgets/modest-folder-view.c

index 7fcad61..e178724 100644 (file)
@@ -160,18 +160,25 @@ typedef struct _RefreshAsyncHelper {
        gpointer user_data;
 } RefreshAsyncHelper;
 
-typedef struct _XFerMsgAsyncHelper
+typedef struct _XFerMsgsAsyncHelper
 {
        ModestMailOperation *mail_op;
        TnyList *headers;
        TnyFolder *dest_folder;
-       XferAsyncUserCallback user_callback;    
+       XferMsgsAsyncUserCallback user_callback;        
        gboolean delete;
        gpointer user_data;
        gint last_total_bytes;
        gint sum_total_bytes;
        gint total_bytes;
-} XFerMsgAsyncHelper;
+} XFerMsgsAsyncHelper;
+
+typedef struct _XFerFolderAsyncHelper
+{
+       ModestMailOperation *mail_op;
+       XferFolderAsyncUserCallback user_callback;      
+       gpointer user_data;
+} XFerFolderAsyncHelper;
 
 typedef void (*ModestMailOperationCreateMsgCallback) (ModestMailOperation *mail_op,
                                                      TnyMsg *msg,
@@ -1818,12 +1825,12 @@ transfer_folder_status_cb (GObject *obj,
        ModestMailOperation *self;
        ModestMailOperationPrivate *priv;
        ModestMailOperationState *state;
-       XFerMsgAsyncHelper *helper;
+       XFerFolderAsyncHelper *helper;
 
        g_return_if_fail (status != NULL);
        g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_COPY_FOLDER);
 
-       helper = (XFerMsgAsyncHelper *) user_data;
+       helper = (XFerFolderAsyncHelper *) user_data;
        g_return_if_fail (helper != NULL);
 
        self = helper->mail_op;
@@ -1855,11 +1862,11 @@ transfer_folder_cb (TnyFolder *folder,
                    GError *err, 
                    gpointer user_data)
 {
-       XFerMsgAsyncHelper *helper;
+       XFerFolderAsyncHelper *helper;
        ModestMailOperation *self = NULL;
        ModestMailOperationPrivate *priv = NULL;
 
-       helper = (XFerMsgAsyncHelper *) user_data;
+       helper = (XFerFolderAsyncHelper *) user_data;
        g_return_if_fail (helper != NULL);       
 
        self = helper->mail_op;
@@ -1890,13 +1897,13 @@ transfer_folder_cb (TnyFolder *folder,
                 * which is already GDK locked by Tinymail */
 
                /* no gdk_threads_enter (), CHECKED */
-               helper->user_callback (self, helper->user_data);
+               helper->user_callback (self, new_folder, helper->user_data);
                /* no gdk_threads_leave () , CHECKED */
        }
 
        /* Free */
        g_object_unref (helper->mail_op);
-       g_slice_free   (XFerMsgAsyncHelper, helper);
+       g_slice_free   (XFerFolderAsyncHelper, helper);
 }
 
 /**
@@ -1945,12 +1952,12 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                                   TnyFolder *folder,
                                   TnyFolderStore *parent,
                                   gboolean delete_original,
-                                  XferAsyncUserCallback user_callback,
+                                  XferFolderAsyncUserCallback user_callback,
                                   gpointer user_data)
 {
        ModestMailOperationPrivate *priv = NULL;
        ModestTnyFolderRules parent_rules = 0, rules; 
-       XFerMsgAsyncHelper *helper = NULL;
+       XFerFolderAsyncHelper *helper = NULL;
        const gchar *folder_name = NULL;
        const gchar *error_msg;
 
@@ -2002,10 +2009,8 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                goto error;
        } else {
                /* Create the helper */
-               helper = g_slice_new0 (XFerMsgAsyncHelper);
+               helper = g_slice_new0 (XFerFolderAsyncHelper);
                helper->mail_op = g_object_ref (self);
-               helper->dest_folder = NULL;
-               helper->headers = NULL;
                helper->user_callback = user_callback;
                helper->user_data = user_data;
                
@@ -2030,7 +2035,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 
        /* Call the user callback if exists */
        if (user_callback)
-               user_callback (self, user_data);
+               user_callback (self, NULL, user_data);
 
        /* Notify the queue */
        modest_mail_operation_notify_end (self);
@@ -2039,11 +2044,13 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 void
 modest_mail_operation_rename_folder (ModestMailOperation *self,
                                     TnyFolder *folder,
-                                    const gchar *name)
+                                    const gchar *name,
+                                    XferFolderAsyncUserCallback user_callback,
+                                    gpointer user_data)
 {
        ModestMailOperationPrivate *priv;
        ModestTnyFolderRules rules;
-       XFerMsgAsyncHelper *helper;
+       XFerFolderAsyncHelper *helper;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_FOLDER_STORE (folder));
@@ -2058,21 +2065,9 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
        /* Check folder rules */
        rules = modest_tny_folder_get_rules (TNY_FOLDER (folder));
        if (rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE) {
-               /* Set status failed and set an error */
-               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
-               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
-                            MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
-                            _("FIXME: unable to rename"));
-
-               /* Notify about operation end */
-               modest_mail_operation_notify_end (self);
+               goto error;
        } else if (!strcmp (name, " ") || strchr (name, '/')) {
-               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
-               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
-                            MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
-                            _("FIXME: unable to rename"));
-               /* Notify about operation end */
-               modest_mail_operation_notify_end (self);
+               goto error;
        } else {
                TnyFolderStore *into;
 
@@ -2082,12 +2077,10 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
                   special local folder */
                if (new_name_valid_if_local_account (priv, into, name)) {
                        /* Create the helper */
-                       helper = g_slice_new0 (XFerMsgAsyncHelper);
+                       helper = g_slice_new0 (XFerFolderAsyncHelper);
                        helper->mail_op = g_object_ref(self);
-                       helper->dest_folder = NULL;
-                       helper->headers = NULL;
-                       helper->user_callback = NULL;
-                       helper->user_data = NULL;
+                       helper->user_callback = user_callback;
+                       helper->user_data = user_data;
                
                        /* Rename. Camel handles folder subscription/unsubscription */
                        modest_mail_operation_notify_start (self);
@@ -2096,10 +2089,24 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
                                               transfer_folder_status_cb,
                                               helper);
                } else {
-                       modest_mail_operation_notify_end (self);
+                       goto error;
                }
                g_object_unref (into);
+
+               return;
        }
+ error:
+       /* Set status failed and set an error */
+       priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+       g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                    MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+                    _("FIXME: unable to rename"));
+       
+       if (user_callback)
+               user_callback (self, NULL, user_data);
+
+       /* Notify about operation end */
+       modest_mail_operation_notify_end (self);
 }
 
 /* ******************************************************************* */
@@ -2594,12 +2601,12 @@ transfer_msgs_status_cb (GObject *obj,
                         TnyStatus *status,  
                         gpointer user_data)
 {
-       XFerMsgAsyncHelper *helper;
+       XFerMsgsAsyncHelper *helper;
 
        g_return_if_fail (status != NULL);
        g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_XFER_MSGS);
 
-       helper = (XFerMsgAsyncHelper *) user_data;
+       helper = (XFerMsgsAsyncHelper *) user_data;
        g_return_if_fail (helper != NULL);       
 
        /* Notify progress */
@@ -2611,13 +2618,13 @@ transfer_msgs_status_cb (GObject *obj,
 static void
 transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer user_data)
 {
-       XFerMsgAsyncHelper *helper;
+       XFerMsgsAsyncHelper *helper;
        ModestMailOperation *self;
        ModestMailOperationPrivate *priv;
        TnyIterator *iter = NULL;
        TnyHeader *header = NULL;
 
-       helper = (XFerMsgAsyncHelper *) user_data;
+       helper = (XFerMsgsAsyncHelper *) user_data;
        self = helper->mail_op;
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
@@ -2681,7 +2688,7 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
                g_object_unref (folder);
        if (iter)
                g_object_unref (iter);
-       g_slice_free (XFerMsgAsyncHelper, helper);
+       g_slice_free (XFerMsgsAsyncHelper, helper);
 }
 
 static guint
@@ -2722,13 +2729,13 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self,
                                 TnyList *headers, 
                                 TnyFolder *folder, 
                                 gboolean delete_original,
-                                XferAsyncUserCallback user_callback,
+                                XferMsgsAsyncUserCallback user_callback,
                                 gpointer user_data)
 {
        ModestMailOperationPrivate *priv = NULL;
        TnyIterator *iter = NULL;
        TnyFolder *src_folder = NULL;
-       XFerMsgAsyncHelper *helper = NULL;
+       XFerMsgsAsyncHelper *helper = NULL;
        TnyHeader *header = NULL;
        ModestTnyFolderRules rules = 0;
 
@@ -2790,7 +2797,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self,
        }
 
        /* Create the helper */
-       helper = g_slice_new0 (XFerMsgAsyncHelper);
+       helper = g_slice_new0 (XFerMsgsAsyncHelper);
        helper->mail_op = g_object_ref(self);
        helper->dest_folder = g_object_ref(folder);
        helper->headers = g_object_ref(headers);
index f86812a..46990ad 100644 (file)
@@ -129,16 +129,34 @@ typedef void (*GetMimePartSizeCallback) (ModestMailOperation *mail_op,
                                         gpointer user_data);
 
 /**
- * XferAsyncUserCallback:
+ * XferMsgsAsyncUserCallback:
  *
  * @obj: a #GObject generic object which has created current mail operation.
+ * @new_folder: the new instance of the #TnyFolder that has been transferred
  * @user_data: generic data passed to user defined function.
  *
  * This function will be called after transfer_msgs_cb private function, which is
  * used as tinymail operation callback. The private function fills private 
  * fields of mail operation and calls user defined callback if it exists.
  */
-typedef void (*XferAsyncUserCallback) (ModestMailOperation *mail_op, gpointer user_data);
+typedef void (*XferMsgsAsyncUserCallback) (ModestMailOperation *mail_op, 
+                                          gpointer user_data);
+
+
+/**
+ * XferFolderAsyncUserCallback:
+ *
+ * @obj: a #GObject generic object which has created current mail operation.
+ * @new_folder: the new instance of the #TnyFolder that has been transferred
+ * @user_data: generic data passed to user defined function.
+ *
+ * This function will be called after transfer_msgs_cb private function, which is
+ * used as tinymail operation callback. The private function fills private 
+ * fields of mail operation and calls user defined callback if it exists.
+ */
+typedef void (*XferFolderAsyncUserCallback) (ModestMailOperation *mail_op, 
+                                            TnyFolder *new_folder,
+                                            gpointer user_data);
 
 
 /**
@@ -479,7 +497,9 @@ void          modest_mail_operation_remove_folder  (ModestMailOperation *self,
  **/
 void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
                                                    TnyFolder *folder, 
-                                                   const gchar *name);
+                                                   const gchar *name,
+                                                   XferFolderAsyncUserCallback user_callback,
+                                                   gpointer user_data);
 
 /**
  * modest_mail_operation_xfer_folder:
@@ -487,7 +507,7 @@ void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
  * @folder: a #TnyFolder
  * @parent: the new parent of the folder as #TnyFolderStore
  * @delete_original: wheter or not delete the original folder
- * @user_callback: a #XferAsyncUserCallback function to call after tinymail callback execution.
+ * @user_callback: a #XferFolderAsyncUserCallback function to call after tinymail callback execution.
  * @user_data: generic user data which will be passed to @user_callback function.
  * 
  * Sets the given @folder as child of a provided #TnyFolderStore. This
@@ -504,7 +524,7 @@ void          modest_mail_operation_xfer_folder    (ModestMailOperation *self,
                                                    TnyFolder *folder,
                                                    TnyFolderStore *parent,
                                                    gboolean delete_original,
-                                                   XferAsyncUserCallback user_callback,
+                                                   XferFolderAsyncUserCallback user_callback,
                                                    gpointer user_data);
                                                    
 
@@ -516,7 +536,7 @@ void          modest_mail_operation_xfer_folder    (ModestMailOperation *self,
  * @header_list: a #TnyList of #TnyHeader to transfer
  * @folder: the #TnyFolder where the messages will be transferred
  * @delete_original: whether or not delete the source messages
- * @user_callback: a #XferAsyncUserCallback function to call after tinymail callback execution.
+ * @user_callback: a #XferFolderAsyncUserCallback function to call after tinymail callback execution.
  * @user_data: generic user data which will be passed to @user_callback function.
  * 
  * Asynchronously transfers messages from their current folder to
@@ -544,7 +564,7 @@ void          modest_mail_operation_xfer_msgs      (ModestMailOperation *self,
                                                    TnyList *header_list, 
                                                    TnyFolder *folder,
                                                    gboolean delete_original,
-                                                   XferAsyncUserCallback user_callback,
+                                                   XferMsgsAsyncUserCallback user_callback,
                                                    gpointer user_data);
 
 /**
index f18f369..95c7023 100644 (file)
@@ -2744,8 +2744,21 @@ typedef struct {
 } RenameFolderInfo;
 
 static void
-on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
-               TnyAccount *account, gpointer user_data)
+on_rename_folder_cb (ModestMailOperation *mail_op, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
+{
+       /* Select now */
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data),
+                                         new_folder, FALSE);
+}
+
+static void
+on_rename_folder_performer (gboolean canceled, 
+                           GError *err, 
+                           GtkWindow *parent_window, 
+                           TnyAccount *account, 
+                           gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
        GtkTreeSelection *sel = NULL;
@@ -2770,20 +2783,12 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
                gtk_tree_selection_unselect_all (sel);
 
-               /* Select *after* the changes */
-               modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view),
-                               TNY_FOLDER(data->folder), TRUE);
-
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
-                               TNY_FOLDER (data->folder),
-                               (const gchar *) (data->new_name));
-               
-               /* TODO folder view filter refilter */
-               /* 
-               GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view));
-               if (GTK_IS_TREE_MODEL_FILTER (tree_model))
-                       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model)); */
+                                                    TNY_FOLDER (data->folder),
+                                                    (const gchar *) (data->new_name),
+                                                    on_rename_folder_cb,
+                                                    folder_view);
        }
 
        g_object_unref (mail_op);
@@ -2838,7 +2843,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                        rename_folder_data->folder = folder;
                        rename_folder_data->new_name = folder_name;
                        modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), 
-                                       folder, on_rename_folder_cb, rename_folder_data);
+                                       folder, on_rename_folder_performer, rename_folder_data);
                }
        }
        g_object_unref (folder);
@@ -3313,7 +3318,17 @@ modest_ui_actions_on_redo (GtkAction *action,
 
 
 static void
-destroy_information_note (ModestMailOperation *mail_op, gpointer user_data)
+destroy_information_note (ModestMailOperation *mail_op, 
+                         gpointer user_data)
+{
+       /* destroy information note */
+       gtk_widget_destroy (GTK_WIDGET(user_data));
+}
+
+static void
+destroy_folder_information_note (ModestMailOperation *mail_op, 
+                                TnyFolder *new_folder,
+                                gpointer user_data)
 {
        /* destroy information note */
        gtk_widget_destroy (GTK_WIDGET(user_data));
@@ -3458,7 +3473,7 @@ modest_ui_actions_on_paste (GtkAction *action,
                                                           src_folder,
                                                           folder_store,
                                                           delete,
-                                                          destroy_information_note,
+                                                          destroy_folder_information_note,
                                                           inf_note);
                }
 
@@ -4191,10 +4206,9 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
        return response;
 }
 
-
-
 static void
-move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
+move_to_cb (ModestMailOperation *mail_op, 
+           gpointer user_data)
 {
        MoveToHelper *helper = (MoveToHelper *) user_data;
 
@@ -4233,6 +4247,21 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
        g_free (helper);
 }
 
+static void
+folder_move_to_cb (ModestMailOperation *mail_op, 
+                  TnyFolder *new_folder,
+                  gpointer user_data)
+{
+       move_to_cb (mail_op, user_data);
+}
+
+static void
+msgs_move_to_cb (ModestMailOperation *mail_op, 
+                gpointer user_data)
+{
+       move_to_cb (mail_op, user_data);
+}
+
 void
 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, 
                                             gpointer user_data)
@@ -4511,7 +4540,7 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
                                         headers,
                                         TNY_FOLDER (dst_folder),
                                         TRUE,
-                                        move_to_cb,
+                                        msgs_move_to_cb,
                                         helper);
 
        g_object_unref (G_OBJECT (mail_op));
@@ -4577,7 +4606,7 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                        TNY_FOLDER (info->src_folder),
                        info->dst_folder,
                        info->delete_original, 
-                       move_to_cb, 
+                       folder_move_to_cb, 
                        helper);
        
        modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
index 5242232..abefb52 100644 (file)
@@ -1933,15 +1933,6 @@ dnd_helper_destroyer (DndHelper *helper)
        g_slice_free (DndHelper, helper);
 }
 
-/*
- * This function is the callback of the
- * modest_mail_operation_xfer_msgs () and
- * modest_mail_operation_xfer_folder() calls. We check here if the
- * message/folder was correctly asynchronously transferred. The reason
- * to use the same callback is that the code is the same, it only has
- * to check that the operation went fine and then finalize the drag
- * and drop action
- */
 static void
 xfer_cb (ModestMailOperation *mail_op, 
         gpointer user_data)
@@ -1966,6 +1957,33 @@ xfer_cb (ModestMailOperation *mail_op,
        dnd_helper_destroyer (helper);
 }
 
+static void
+xfer_msgs_cb (ModestMailOperation *mail_op, 
+             gpointer user_data)
+{
+       /* Common part */
+       xfer_cb (mail_op, user_data);
+}
+
+static void
+xfer_folder_cb (ModestMailOperation *mail_op, 
+               TnyFolder *new_folder,
+               gpointer user_data)
+{
+       DndHelper *helper;
+
+       helper = (DndHelper *) user_data;
+
+       /* Common part */
+       xfer_cb (mail_op, user_data);
+
+       /* Select the folder */
+       if (new_folder)
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (helper->folder_view),
+                                                 new_folder, FALSE);
+}
+
+
 /* get the folder for the row the treepath refers to. */
 /* folder must be unref'd */
 static TnyFolderStore *
@@ -2077,7 +2095,7 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
                                         headers, 
                                         folder, 
                                         helper->delete_source, 
-                                        xfer_cb, helper);
+                                        xfer_msgs_cb, helper);
        
        /* Frees */
 cleanup:
@@ -2159,11 +2177,11 @@ drag_and_drop_from_folder_view_src_folder_performer (gboolean canceled,
                                           TNY_FOLDER (info->src_folder),
                                           info->dst_folder,
                                           info->helper->delete_source,
-                                          xfer_cb,
+                                          xfer_folder_cb,
                                           info->helper);
        
-       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
-                                         TNY_FOLDER (info->dst_folder), TRUE);
+/*     modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view), */
+/*                                       TNY_FOLDER (info->dst_folder), TRUE); */
 
        g_object_unref (G_OBJECT (mail_op));
 }
@@ -2822,7 +2840,9 @@ find_folder_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *folder_it
 
 
 static void
-on_row_inserted_maybe_select_folder (GtkTreeModel *tree_model, GtkTreePath  *path, GtkTreeIter *iter,
+on_row_inserted_maybe_select_folder (GtkTreeModel *tree_model, 
+                                    GtkTreePath *path, 
+                                    GtkTreeIter *iter,
                                     ModestFolderView *self)
 {
        ModestFolderViewPrivate *priv = NULL;
@@ -2866,8 +2886,6 @@ on_row_inserted_maybe_select_folder (GtkTreeModel *tree_model, GtkTreePath  *pat
 
                /* Disable next */
                modest_folder_view_disable_next_folder_selection (self);
-/*             g_object_unref (priv->folder_to_select); */
-/*             priv->folder_to_select = NULL; */
                
                /* Refilter the model */
                gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model));