Improved d&d support. Fixed several reference leaks
authorSergio Villar Senin <svillar@igalia.com>
Fri, 16 Feb 2007 14:31:26 +0000 (14:31 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Fri, 16 Feb 2007 14:31:26 +0000 (14:31 +0000)
pmo-trunk-r834

13 files changed:
src/gtk/modest-main-window.c
src/gtk/modest-msg-view-window.c
src/gtk/ui/modest-msg-view-window-ui.xml
src/maemo/modest-main-window.c
src/modest-conf.c
src/modest-mail-operation.c
src/modest-mail-operation.h
src/modest-marshal.list
src/modest-ui-actions.c
src/modest-ui-actions.h
src/widgets/modest-folder-view.c
src/widgets/modest-folder-view.h
src/widgets/modest-header-view.c

index f0cb173..6c5ab19 100644 (file)
@@ -384,8 +384,8 @@ connect_signals (ModestMainWindow *self)
        /* folder view */
        g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed",
                          G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self);
-       g_signal_connect (G_OBJECT(priv->folder_view), "folder_moved",
-                         G_CALLBACK(modest_ui_actions_on_folder_moved), NULL);
+       g_signal_connect (G_OBJECT(priv->folder_view), "folder_xfer",
+                         G_CALLBACK(modest_ui_actions_on_folder_xfer), NULL);
        g_signal_connect (G_OBJECT(priv->folder_view), "button-press-event",
                          G_CALLBACK (on_folder_view_button_press_event),self);
        g_signal_connect (priv->folder_view,"popup-menu",
@@ -414,8 +414,6 @@ connect_signals (ModestMainWindow *self)
                          G_CALLBACK(modest_ui_actions_on_msg_attachment_clicked), self);
 
        /* Account store */
-       g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "accounts_reloaded",
-                         G_CALLBACK (modest_ui_actions_on_accounts_reloaded), self);
        g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "password_requested",
                          G_CALLBACK (modest_ui_actions_on_password_requested), self);
        
@@ -517,8 +515,6 @@ modest_main_window_new (void)
        gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win);
        gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview));
 
-       gtk_widget_show (GTK_WIDGET(priv->header_view));
-
        /* status bar / progress */
        status_hbox = gtk_hbox_new (FALSE, 0);
        gtk_box_pack_start (GTK_BOX(status_hbox), priv->folder_info_label, FALSE,FALSE, 6);
index 028f2da..e2c5989 100644 (file)
 #include <tny-account-store.h>
 #include <tny-simple-list.h>
 #include <modest-tny-msg.h>
+#include "modest-icon-names.h"
+#include "modest-ui-actions.h"
+#include <modest-widget-memory.h>
+#include <modest-runtime.h>
 
 #include <widgets/modest-msg-view-window.h>
-#include "modest-main-window-ui.h"
 #include <widgets/modest-window-priv.h>
+#include "widgets/modest-msg-view.h"
 
-#include <modest-widget-memory.h>
-#include <modest-runtime.h>
 
 static void  modest_msg_view_window_class_init   (ModestMsgViewWindowClass *klass);
 static void  modest_msg_view_window_init         (ModestMsgViewWindow *obj);
@@ -63,8 +65,36 @@ struct _ModestMsgViewWindowPrivate {
 /* globals */
 static GtkWindowClass *parent_class = NULL;
 
-/* uncomment the following if you have defined any signals */
-/* static guint signals[LAST_SIGNAL] = {0}; */
+/* Action entries */
+static const GtkActionEntry modest_action_entries [] = {
+
+       /* Toplevel menus */
+       { "Edit", NULL, N_("_Edit") },
+       { "Actions", NULL, N_("_Actions") },
+       { "Help", NULL, N_("_Help") },
+
+       /* EDIT */
+       { "EditUndo",        GTK_STOCK_UNDO,   N_("_Undo"), "<CTRL>Z",        N_("Undo last action"),  NULL },
+       { "EditRedo",        GTK_STOCK_REDO,   N_("_Redo"), "<shift><CTRL>Z", N_("Redo previous action"),  NULL },
+       { "EditCut",         GTK_STOCK_CUT,    N_("Cut"),   "<CTRL>X",        N_("_Cut"), NULL   },
+       { "EditCopy",        GTK_STOCK_COPY,   N_("Copy"),  "<CTRL>C",        N_("Copy"), NULL },
+       { "EditPaste",       GTK_STOCK_PASTE,  N_("Paste"), "<CTRL>V",        N_("Paste"), NULL },
+       { "EditDelete",      GTK_STOCK_DELETE, N_("_Delete"),      "<CTRL>Q",         N_("Delete"), NULL },
+       { "EditSelectAll",   NULL,             N_("Select all"),   "<CTRL>A",         N_("Select all"), NULL },
+       { "EditDeselectAll", NULL,             N_("Deselect all"), "<Shift><CTRL>A",  N_("Deselect all"), NULL },
+
+       /* ACTIONS */
+       { "ActionsReply",       MODEST_STOCK_REPLY, N_("_Reply"),         NULL, N_("Reply to a message"), G_CALLBACK (modest_ui_actions_on_reply) },
+       { "ActionsReplyAll",    MODEST_STOCK_REPLY_ALL, N_("Reply to all"),   NULL, N_("Reply to all"), G_CALLBACK (modest_ui_actions_on_reply_all) },
+       { "ActionsForward",     MODEST_STOCK_FORWARD, N_("_Forward"),       NULL, N_("Forward a message"), G_CALLBACK (modest_ui_actions_on_forward) },
+       { "ActionsBounce",      NULL, N_("_Bounce"),        NULL, N_("Bounce a message"),          NULL },
+       { "ActionsSendReceive", MODEST_STOCK_SEND_RECEIVE, N_("Send/Receive"),   NULL, N_("Send and receive messages"), NULL },
+       { "ActionsDelete",      MODEST_STOCK_DELETE, N_("Delete message"), NULL, N_("Delete messages"), G_CALLBACK (modest_ui_actions_on_delete) },
+
+       /* HELP */
+       { "HelpAbout", GTK_STOCK_ABOUT, N_("About"), NULL, N_("About Modest"), G_CALLBACK (modest_ui_actions_on_about) },
+};
+
 
 GType
 modest_msg_view_window_get_type (void)
index e0a75a4..244e63f 100644 (file)
       <menuitem name="ActionsReplyMenu" action="ActionsReply"/>
       <menuitem name="ActionsReplyAllMenu" action="ActionsReplyAll"/>
       <menuitem name="ActionsForwardMenu" action="ActionsForward"/>
-      <separator/>
-      <menuitem name="ActionsFolderNewMenu" action="ActionsFolderNew"/>
-      <menuitem name="ActionsFolderDeleteMenu" action="ActionsFolderDelete"/>
-      <menuitem name="ActionsFolderRenameMenu" action="ActionsFolderRename"/>
-      <menuitem name="ActionsFolderMoveToTrashMenu" action="ActionsFolderMoveToTrash"/>
     </menu>
   </menubar>
 
index 28c3daf..efa7896 100644 (file)
@@ -331,8 +331,8 @@ connect_signals (ModestMainWindow *self)
        /* folder view */
        g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed",
                          G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self);
-       g_signal_connect (G_OBJECT(priv->folder_view), "folder_moved",
-                         G_CALLBACK(modest_ui_actions_on_folder_moved), NULL);
+       g_signal_connect (G_OBJECT(priv->folder_view), "folder_xfer",
+                         G_CALLBACK(modest_ui_actions_on_folder_xfer), NULL);
 //     g_signal_connect (G_OBJECT(self->folder_view), "button-press-event",
 //                       G_CALLBACK (on_folder_view_button_press_event),self);
 //     g_signal_connect (self->folder_view,"popup-menu",
@@ -352,10 +352,6 @@ connect_signals (ModestMainWindow *self)
 //     g_signal_connect (G_OBJECT(self->header_view),"popup-menu",0
 //                       G_CALLBACK (on_header_view_button_press_event), self);
 
-       /* Account store */
-       g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "accounts_reloaded",
-                         G_CALLBACK (modest_ui_actions_on_accounts_reloaded), self);
-               
        /* window */
        g_signal_connect (G_OBJECT(self), "destroy", G_CALLBACK(on_destroy), NULL);
        g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self);
index f1d4694..fc25272 100644 (file)
@@ -228,7 +228,6 @@ modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType li
 {
        ModestConfPrivate *priv;
        GConfValueType gconf_type;
-       GSList *retval = NULL;
        
        g_return_val_if_fail (self, NULL);
        g_return_val_if_fail (key,  NULL);
@@ -237,10 +236,7 @@ modest_conf_get_list (ModestConf* self, const gchar* key, ModestConfValueType li
 
        gconf_type = modest_conf_type_to_gconf_type (list_type, err);
 
-       if (!err)
-              retval = gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
-
-       return retval;
+       return gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
 }
 
 
index 27f5894..c3defdf 100644 (file)
@@ -70,16 +70,6 @@ static void     update_folders_cb    (TnyFolderStore *self,
 static void     add_attachments      (TnyMsg *msg, 
                                      GList *attachments_list);
 
-static void        modest_mail_operation_xfer_folder       (ModestMailOperation *self,
-                                                           TnyFolder *folder,
-                                                           TnyFolderStore *parent,
-                                                           gboolean delete_original);
-
-static gboolean    modest_mail_operation_xfer_msg          (ModestMailOperation *self,
-                                                           TnyHeader *header, 
-                                                           TnyFolder *folder, 
-                                                           gboolean delete_original);
-
 enum _ModestMailOperationSignals 
 {
        PROGRESS_CHANGED_SIGNAL,
@@ -659,10 +649,11 @@ modest_mail_operation_create_folder (ModestMailOperation *self,
 
 void
 modest_mail_operation_remove_folder (ModestMailOperation *self,
-                                    TnyFolder *folder,
-                                    gboolean remove_to_trash)
+                                    TnyFolder           *folder,
+                                    gboolean             remove_to_trash)
 {
-       TnyFolderStore *folder_store;
+       TnyFolderStore *parent;
+       TnyAccount *account;
        ModestMailOperationPrivate *priv;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
@@ -670,26 +661,27 @@ modest_mail_operation_remove_folder (ModestMailOperation *self,
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
-       /* Get folder store */
-       folder_store = TNY_FOLDER_STORE (tny_folder_get_account (folder));
+       /* Get the account */
+       account = tny_folder_get_account (folder);
 
        /* Delete folder or move to trash */
        if (remove_to_trash) {
-               TnyFolder *trash_folder;
-               trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(folder_store),
+               TnyFolder *trash_folder, *new_folder;
+               trash_folder = modest_tny_account_get_special_folder (account,
                                                                      TNY_FOLDER_TYPE_TRASH);
                /* TODO: error_handling */
-               modest_mail_operation_move_folder (self, folder, 
-                                                  TNY_FOLDER_STORE (trash_folder));
+               new_folder = modest_mail_operation_xfer_folder (self, folder, 
+                                                               TNY_FOLDER_STORE (trash_folder), TRUE);
+               g_object_unref (G_OBJECT (new_folder));
        } else {
-               tny_folder_store_remove_folder (folder_store, folder, &(priv->error));
+               parent = tny_folder_get_folder_store (folder);
+
+               tny_folder_store_remove_folder (parent, folder, &(priv->error));
                CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, );
 
-               g_object_unref (G_OBJECT (folder));
+               if (parent) g_object_unref (G_OBJECT (parent));
        }
-
-       /* Free instances */
-       g_object_unref (G_OBJECT (folder_store));
+       g_object_unref (G_OBJECT (account));
 }
 
 void
@@ -714,88 +706,25 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
        CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, return);
  }
 
-void
-modest_mail_operation_move_folder (ModestMailOperation *self,
-                                  TnyFolder *folder,
-                                  TnyFolderStore *parent)
-{
-       g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
-       g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
-       g_return_if_fail (TNY_IS_FOLDER (folder));
-       
-       modest_mail_operation_xfer_folder (self, folder, parent, TRUE);
-}
-
-void
-modest_mail_operation_copy_folder (ModestMailOperation *self,
-                                  TnyFolder *folder,
-                                  TnyFolderStore *parent)
-{
-       g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
-       g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
-       g_return_if_fail (TNY_IS_FOLDER (folder));
-
-       modest_mail_operation_xfer_folder (self, folder, parent, FALSE);
-}
-
-static void
+TnyFolder *
 modest_mail_operation_xfer_folder (ModestMailOperation *self,
                                   TnyFolder *folder,
                                   TnyFolderStore *parent,
                                   gboolean delete_original)
 {
        ModestMailOperationPrivate *priv;
-       const gchar *folder_name;
-       TnyFolder *dest_folder = NULL, *child = NULL;
-       TnyIterator *iter = NULL;
-       TnyList *folders = NULL, *headers = NULL;
 
-       g_return_if_fail (TNY_IS_FOLDER (folder));
-       g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
+       g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), NULL);
+       g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL);
+       g_return_val_if_fail (TNY_IS_FOLDER (folder), NULL);
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
-       /* Create the destination folder */
-       folder_name = tny_folder_get_name (folder);
-       dest_folder = modest_mail_operation_create_folder (self, parent, folder_name);
-       CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
-       /* Transfer messages */
-       headers = TNY_LIST (tny_simple_list_new ());
-       tny_folder_get_headers (folder, headers, FALSE, &(priv->error));
-       CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
-       tny_folder_transfer_msgs (folder, headers, dest_folder, delete_original, &(priv->error));
-       CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
-       /* Recurse children */
-       folders = TNY_LIST (tny_simple_list_new ());
-       tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL,  &(priv->error));
-       CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
-       iter = tny_list_create_iterator (folders);
-       while (!tny_iterator_is_done (iter)) {
-               child = TNY_FOLDER (tny_iterator_get_current (iter));
-               modest_mail_operation_xfer_folder (self, child, TNY_FOLDER_STORE (dest_folder),
-                                                  delete_original);
-               tny_iterator_next (iter);
-               g_object_unref (G_OBJECT(child));
-       }
-
-       /* Delete source folder (if needed) */
-       if (delete_original)
-               modest_mail_operation_remove_folder (self, folder, FALSE);
-
-       /* Clean up */
- clean:
-       if (dest_folder)
-               g_object_unref (G_OBJECT (dest_folder));
-       if (headers)
-               g_object_unref (G_OBJECT (headers));
-       if (folders)
-               g_object_unref (G_OBJECT (folders));
-       if (iter)
-               g_object_unref (G_OBJECT (iter));
+       return tny_folder_copy (folder, 
+                               parent, 
+                               tny_folder_get_name (folder), 
+                               delete_original, 
+                               &(priv->error));
 }
 
 
@@ -803,28 +732,6 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
 /* **************************  MSG  ACTIONS  ************************* */
 /* ******************************************************************* */
 
-gboolean 
-modest_mail_operation_copy_msg (ModestMailOperation *self,
-                               TnyHeader *header, 
-                               TnyFolder *folder)
-{
-       g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
-       g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
-
-       return modest_mail_operation_xfer_msg (self, header, folder, FALSE);
-}
-
-gboolean 
-modest_mail_operation_move_msg (ModestMailOperation *self,
-                               TnyHeader *header, 
-                               TnyFolder *folder)
-{
-       g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
-       g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
-
-       return modest_mail_operation_xfer_msg (self, header, folder, TRUE);
-}
-
 void 
 modest_mail_operation_remove_msg (ModestMailOperation *self,
                                  TnyHeader *header,
@@ -845,7 +752,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
                trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(store_account),
                                                                      TNY_FOLDER_TYPE_TRASH);
                if (trash_folder) {
-                       modest_mail_operation_move_msg (self, header, trash_folder);
+                       modest_mail_operation_xfer_msg (self, header, trash_folder, TRUE);
 /*                     g_object_unref (trash_folder); */
                } else {
                        ModestMailOperationPrivate *priv;
@@ -880,7 +787,7 @@ transfer_msgs_cb (TnyFolder *folder, GError **err, gpointer user_data)
        g_signal_emit (G_OBJECT (user_data), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
-static gboolean
+gboolean
 modest_mail_operation_xfer_msg (ModestMailOperation *self,
                                TnyHeader *header, 
                                TnyFolder *folder, 
@@ -890,6 +797,10 @@ modest_mail_operation_xfer_msg (ModestMailOperation *self,
        TnyFolder *src_folder;
        TnyList *headers;
 
+       g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE);
+       g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
+       g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
+
        src_folder = tny_header_get_folder (header);
        headers = tny_simple_list_new ();
 
index 99a72b4..c03d4ec 100644 (file)
@@ -258,85 +258,51 @@ void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
                                                    const gchar *name);
 
 /**
- * modest_mail_operation_move_folder:
+ * modest_mail_operation_xfer_folder:
  * @self: a #ModestMailOperation
  * @folder: a #TnyFolder
  * @parent: the new parent of the folder as #TnyFolderStore
+ * @delete_original: wheter or not delete the original folder
  * 
  * Sets the given @folder as child of a provided #TnyFolderStore. This
- * operation moves also all the messages contained in the folder and
- * all of his children folders with their messages as well. This
+ * operation also transfers all the messages contained in the folder
+ * and all of his children folders with their messages as well. This
  * operation is synchronous, so the #ModestMailOperation should not be
- * added to any #ModestMailOperationQueue
+ * added to any #ModestMailOperationQueue.
+ *
+ * If @delete_original is TRUE this function moves the original
+ * folder, if it is FALSE the it just copies it
+ *
+ * Returns: the newly transfered folder
  **/
-void          modest_mail_operation_move_folder    (ModestMailOperation *self,
+TnyFolder*    modest_mail_operation_xfer_folder    (ModestMailOperation *self,
                                                    TnyFolder *folder, 
-                                                   TnyFolderStore *parent);
+                                                   TnyFolderStore *parent,
+                                                   gboolean delete_original);
 
-/**
- * modest_mail_operation_copy_folder:
- * @self: a #ModestMailOperation
- * @folder: a #TnyFolder
- * @parent: a #TnyFolderStore that will be the parent of the copied folder
- * 
- * Sets a copy of the given @folder as child of a provided
- * #TnyFolderStore. This operation copies also all the messages
- * contained in the folder and all of his children folders with their
- * messages as well. This operation is synchronous, so the
- * #ModestMailOperation should not be added to any
- * #ModestMailOperationQueue
- **/
-void          modest_mail_operation_copy_folder    (ModestMailOperation *self,
-                                                   TnyFolder *folder, 
-                                                   TnyFolderStore *parent);
 
 /* Functions that performs msg operations */
 
 /**
- * modest_mail_operation_copy_msg:
- * @self: a #ModestMailOperation
- * @header: the #TnyHeader of the message to copy
- * @folder: the #TnyFolder where the message will be copied
- * 
- * Asynchronously copies a message from its current folder to another
- * one. The caller should add the #ModestMailOperation to a
- * #ModestMailOperationQueue and then free it. The caller will be
- * notified by the "progress_changed" when the operation is completed.
- * 
- * Example
- * <informalexample><programlisting>
- * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
- * mail_op = modest_mail_operation_new ();
- * if (modest_mail_operation_copy_msg (mail_op, account))
- * {
- *     g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
- *     modest_mail_operation_queue_add (queue, mail_op);
- * }
- * g_object_unref (G_OBJECT (mail_op));
- * </programlisting></informalexample>
- *
- * Returns: TRUE if the mail operation could be started, or FALSE otherwise
- **/
-gboolean      modest_mail_operation_copy_msg       (ModestMailOperation *self,
-                                                   TnyHeader *header, 
-                                                   TnyFolder *folder);
-
-/**
- * modest_mail_operation_move_msg:
+ * modest_mail_operation_xfer_msg:
  * @self: a #ModestMailOperation
  * @header: the #TnyHeader of the message to move
  * @folder: the #TnyFolder where the message will be moved
+ * @delete_original: whether or not delete the source message
  * 
- * Asynchronously moves a message from its current folder to another
- * one. The caller should add the #ModestMailOperation to a
+ * Asynchronously transfers a message from its current folder to
+ * another one. The caller should add the #ModestMailOperation to a
  * #ModestMailOperationQueue and then free it. The caller will be
  * notified by the "progress_changed" when the operation is completed.
+ *
+ * If the @delete_original paramter is TRUE then this function moves
+ * the message between folders, otherwise it copies it.
  * 
  * Example
  * <informalexample><programlisting>
  * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
  * mail_op = modest_mail_operation_new ();
- * if (modest_mail_operation_move_msg (mail_op, account))
+ * if (modest_mail_operation_xfer_msg (mail_op, header, folder, TRUE))
  * {
  *     g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
  *     modest_mail_operation_queue_add (queue, mail_op);
@@ -346,9 +312,10 @@ gboolean      modest_mail_operation_copy_msg       (ModestMailOperation *self,
  *
  * Returns: TRUE if the mail operation could be started, or FALSE otherwise
  **/
-gboolean      modest_mail_operation_move_msg       (ModestMailOperation *self,
+gboolean      modest_mail_operation_xfer_msg       (ModestMailOperation *self,
                                                    TnyHeader *header, 
-                                                   TnyFolder *folder);
+                                                   TnyFolder *folder,
+                                                   gboolean delete_original);
 
 /**
  * modest_mail_operation_remove_msg:
index 85f3d34..fcdfbfb 100644 (file)
@@ -1,5 +1,6 @@
 VOID:POINTER,POINTER
 VOID:POINTER,POINTER,POINTER
+VOID:POINTER,POINTER,BOOL,POINTER
 VOID:STRING,POINTER,POINTER,POINTER
 VOID:POINTER,BOOL
 VOID:STRING,INT
index 339162d..c4847e4 100644 (file)
@@ -55,7 +55,7 @@
 
 
 typedef struct _GetMsgAsyncHelper {
-       ModestMainWindow *main_window;
+       ModestWindow *window;
        TnyIterator *iter;
        GFunc func;
        gpointer user_data;
@@ -137,8 +137,8 @@ get_selected_headers (ModestWindow *win)
 
        } else
                return NULL;
-       
 }
+
 void
 modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win)
 {
@@ -368,7 +368,6 @@ cleanup:
        g_free (rf_helper->account_name);
        g_slice_free (ReplyForwardHelper, rf_helper);
 }
-
 /*
  * Common code for the reply and forward actions
  */
@@ -384,7 +383,7 @@ reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
        
        g_return_if_fail (MODEST_IS_WINDOW(win));
 
-       header_list = get_selected_headers (win);       
+       header_list = get_selected_headers (win);
        if (!header_list)
                return;
        
@@ -406,7 +405,7 @@ reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
                rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
 
        helper = g_slice_new0 (GetMsgAsyncHelper);
-       //helper->main_window = NULL;
+       helper->window = win;
        helper->func = reply_forward_func;
        helper->iter = tny_list_create_iterator (header_list);
        helper->user_data = rf_helper;
@@ -561,7 +560,7 @@ read_msg_func (gpointer data, gpointer user_data)
        msg = TNY_MSG (data);
        helper = (GetMsgAsyncHelper *) user_data;
 
-       msg_preview = modest_main_window_get_child_widget (helper->main_window,
+       msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
                                                           MODEST_WIDGET_TYPE_MSG_PREVIEW);
        if (!msg_preview)
                return;
@@ -593,13 +592,9 @@ get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
        helper = (GetMsgAsyncHelper *) user_data;
 
        if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
-               GtkWidget *header_view =
-                       modest_main_window_get_child_widget(helper->main_window,
-                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
-               if (header_view)
-                       modest_ui_actions_on_item_not_found (MODEST_HEADER_VIEW(header_view),
-                                                            MODEST_ITEM_TYPE_MESSAGE,
-                                                            MODEST_WINDOW(helper->main_window));
+               modest_ui_actions_on_item_not_found (NULL,
+                                                    MODEST_ITEM_TYPE_MESSAGE,
+                                                    helper->window);
                return;
        }
 
@@ -655,7 +650,7 @@ modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
 
        /* Fill helper data */
        helper = g_slice_new0 (GetMsgAsyncHelper);
-       helper->main_window = main_window;
+       helper->window = MODEST_WINDOW (main_window);
        helper->iter = tny_list_create_iterator (list);
        helper->func = read_msg_func;
 
@@ -712,7 +707,7 @@ cleanup:
        if (folder)
                g_object_unref (G_OBJECT (folder));
        if (msg)
-               g_object_unref (G_OBJECT (folder));
+               g_object_unref (G_OBJECT (msg));
 }
 
 
@@ -1110,8 +1105,9 @@ modest_ui_actions_on_rename_folder (GtkWidget *widget,
                                /* TODO: tinymail should do this. 
                                   Update view */
                                modest_folder_view_rename (MODEST_FOLDER_VIEW(folder_view));
-
-                       /* TODO: else ? notify error ? */
+                       else
+                               /* TODO: notify error ? */
+                               g_warning ("Could not rename a folder: %s\n", error->message);
 
                        g_object_unref (mail_op);
                }
@@ -1125,6 +1121,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
        TnyFolder *folder;
        ModestMailOperation *mail_op;
        GtkWidget *folder_view;
+       const GError *error;
        
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
@@ -1137,6 +1134,11 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
        
        mail_op = modest_mail_operation_new ();
        modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
+
+       error = modest_mail_operation_get_error (mail_op);
+       if (error)
+               g_warning ("%s\n", error->message);
+
        g_object_unref (mail_op);
 }
 
@@ -1157,33 +1159,24 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainW
        delete_folder (main_window, TRUE);
 }
 
-void
-modest_ui_actions_on_accounts_reloaded (TnyAccountStore *store, gpointer user_data)
-{
-       /* FIXME */
-       /* ModestFolderView *folder_view; */
-       
-/*     folder_view = modest_widget_factory_get_folder_view (modest_runtime_get_widget_factory()); */
-/*     modest_folder_view_update_model (folder_view, store); */
-}
-
 void 
-modest_ui_actions_on_folder_moved (ModestFolderView *folder_view,  TnyFolder *folder, 
-                                   TnyFolderStore *parent,  gboolean *done,
-                                   gpointer user_data)
+modest_ui_actions_on_folder_xfer (ModestFolderView *folder_view,  
+                                 TnyFolder        *folder, 
+                                 TnyFolderStore   *parent,
+                                 gboolean          delete_source,
+                                 TnyFolder        **new_folder,
+                                 gpointer          user_data)
 {
        ModestMailOperation *mail_op;
        const GError *error;
 
-       *done = TRUE;
-
-       /* Try to move the folder */    
+       /* Try to move the folder */
        mail_op = modest_mail_operation_new ();
-       modest_mail_operation_move_folder (mail_op, folder, parent);
+       *new_folder = modest_mail_operation_xfer_folder (mail_op, folder, parent, delete_source);
 
        error = modest_mail_operation_get_error (mail_op);
        if (error)
-               *done = FALSE;
+               g_warning ("Error transferring folder: %s\n", error->message);
 
        g_object_unref (G_OBJECT (mail_op));
 }
index 0a0bc7d..73c047d 100644 (file)
@@ -115,14 +115,11 @@ void     modest_ui_actions_on_move_folder_to_trash_folder     (GtkWidget *widget
 void     modest_ui_actions_on_connection_changed    (TnyDevice *device, gboolean online,
                                                     ModestMainWindow *main_window);
 
-
-void     modest_ui_actions_on_accounts_reloaded     (TnyAccountStore *store, 
-                                                    gpointer user_data);
-
-void     modest_ui_actions_on_folder_moved          (ModestFolderView *folder_view,
+void     modest_ui_actions_on_folder_xfer           (ModestFolderView *folder_view,
                                                     TnyFolder        *folder, 
                                                     TnyFolderStore   *parent,
-                                                    gboolean         *done,
+                                                    gboolean          delete_source,
+                                                    TnyFolder        **new_folder,
                                                     gpointer          user_data);
 
 void     modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
index 2c2aa73..b69e4d6 100644 (file)
@@ -71,6 +71,9 @@ static void         on_account_update      (TnyAccountStore *account_store,
                                            const gchar *account,
                                            gpointer user_data);
 
+static void         on_accounts_reloaded   (TnyAccountStore *store, 
+                                           gpointer user_data);
+
 static gint         cmp_rows               (GtkTreeModel *tree_model, 
                                            GtkTreeIter *iter1, 
                                            GtkTreeIter *iter2,
@@ -117,7 +120,7 @@ static const GtkTargetEntry drag_types[] =
 
 enum {
        FOLDER_SELECTION_CHANGED_SIGNAL,
-       FOLDER_MOVED_SIGNAL,
+       FOLDER_XFER_SIGNAL,
        LAST_SIGNAL
 };
 
@@ -127,7 +130,9 @@ struct _ModestFolderViewPrivate {
        TnyFolder           *cur_folder;
        GtkTreeRowReference *cur_row;
 
-       gulong               sig1, sig2;
+       gulong               account_update_signal;
+       gulong               changed_signal;
+       gulong               accounts_reloaded_signal;
        GMutex              *lock;
        
        GtkTreeSelection    *cur_selection;
@@ -189,8 +194,6 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
 
        parent_class            = g_type_class_peek_parent (klass);
        gobject_class->finalize = modest_folder_view_finalize;
-       
-       klass->update_model = modest_folder_view_update_model;
 
        g_type_class_add_private (gobject_class,
                                  sizeof(ModestFolderViewPrivate));
@@ -216,14 +219,15 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
         * Emitted when a the user wants to move a folder through a
         * drag and drop action
         */
-       signals[FOLDER_MOVED_SIGNAL] = 
-               g_signal_new ("folder_moved",
+       signals[FOLDER_XFER_SIGNAL] = 
+               g_signal_new ("folder_xfer",
                              G_TYPE_FROM_CLASS (gobject_class),
                              G_SIGNAL_RUN_FIRST,
-                             G_STRUCT_OFFSET (ModestFolderViewClass, folder_moved),
+                             G_STRUCT_OFFSET (ModestFolderViewClass, folder_xfer),
                              NULL, NULL,
-                             modest_marshal_VOID__POINTER_POINTER_POINTER,
-                             G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
+                             modest_marshal_VOID__POINTER_POINTER_BOOL_POINTER,
+                             G_TYPE_NONE, 4, 
+                             G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_POINTER);
 }
 
 
@@ -233,10 +237,10 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
                 GtkTreeModel *tree_model,  GtkTreeIter *iter,  gpointer data)
 {
        GObject *rendobj;
-       gchar *fname;
+       gchar *fname = NULL;
        gint unread;
        TnyFolderType type;
-       TnyFolder *folder;
+       TnyFolder *folder = NULL;
        
        g_return_if_fail (column);
        g_return_if_fail (tree_model);
@@ -248,7 +252,7 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
                            -1);
        rendobj = G_OBJECT(renderer);
-
        if (!fname)
                return;
        
@@ -276,9 +280,7 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
                g_object_set (rendobj,"text", fname, "weight", 400, NULL);
                
        g_free (fname);
-       if (folder)
-               g_object_unref (G_OBJECT(folder));
-       
+       if (folder) g_object_unref (G_OBJECT (folder));
 }
 
 
@@ -326,7 +328,8 @@ icon_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
        gtk_tree_model_get (tree_model, iter,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &fname,
-                           TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1);
+                           TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, 
+                           -1);
        rendobj = G_OBJECT(renderer);
        
        if (type == TNY_FOLDER_TYPE_NORMAL || type == TNY_FOLDER_TYPE_UNKNOWN) {
@@ -444,7 +447,9 @@ modest_folder_view_finalize (GObject *obj)
 
        if (priv->account_store) {
                g_signal_handler_disconnect (G_OBJECT(priv->account_store),
-                                            priv->sig1);
+                                            priv->account_update_signal);
+               g_signal_handler_disconnect (G_OBJECT(priv->account_store),
+                                            priv->accounts_reloaded_signal);
                g_object_unref (G_OBJECT(priv->account_store));
                priv->account_store = NULL;
        }
@@ -461,7 +466,7 @@ modest_folder_view_finalize (GObject *obj)
 
        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(obj));
        if (sel)
-               g_signal_handler_disconnect (G_OBJECT(sel), priv->sig2);
+               g_signal_handler_disconnect (G_OBJECT(sel), priv->changed_signal);
        
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
@@ -480,22 +485,28 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore
        device = tny_account_store_get_device (account_store);
 
        if (G_UNLIKELY (priv->account_store)) {
-               TnyDevice *old_device; 
-               
-               old_device = tny_account_store_get_device (priv->account_store);
 
-               if (g_signal_handler_is_connected (G_OBJECT (old_device), priv->sig1))
-                       g_signal_handler_disconnect (G_OBJECT (old_device), 
-                                                    priv->sig1);
+               if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), 
+                                                  priv->account_update_signal))
+                       g_signal_handler_disconnect (G_OBJECT (priv->account_store), 
+                                                    priv->account_update_signal);
+               if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), 
+                                                  priv->accounts_reloaded_signal))
+                       g_signal_handler_disconnect (G_OBJECT (priv->account_store), 
+                                                    priv->accounts_reloaded_signal);
 
                g_object_unref (G_OBJECT (priv->account_store));
-               g_object_unref (G_OBJECT (old_device));
        }
 
        priv->account_store = g_object_ref (G_OBJECT (account_store));
 
-       priv->sig1 = g_signal_connect (G_OBJECT(account_store), "account_update",
-                                      G_CALLBACK (on_account_update), self);
+       priv->account_update_signal = 
+               g_signal_connect (G_OBJECT(account_store), "account_update",
+                                 G_CALLBACK (on_account_update), self);
+
+       priv->accounts_reloaded_signal = 
+               g_signal_connect (G_OBJECT(account_store), "accounts_reloaded",
+                                 G_CALLBACK (on_accounts_reloaded), self);
        
        if (!update_model (MODEST_FOLDER_VIEW (self),
                           MODEST_TNY_ACCOUNT_STORE (priv->account_store)))
@@ -514,6 +525,14 @@ on_account_update (TnyAccountStore *account_store, const gchar *account,
                            account);
 }
 
+static void 
+on_accounts_reloaded   (TnyAccountStore *account_store, 
+                       gpointer user_data)
+{
+       update_model (MODEST_FOLDER_VIEW (user_data), 
+                     MODEST_TNY_ACCOUNT_STORE(account_store));
+}
+
 void
 modest_folder_view_set_title (ModestFolderView *self, const gchar *title)
 {
@@ -545,8 +564,8 @@ modest_folder_view_new (TnyFolderStoreQuery *query)
        priv->query = g_object_ref (query);
        
        sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
-       priv->sig2 = g_signal_connect (sel, "changed",
-                                      G_CALLBACK (on_selection_changed), self);
+       priv->changed_signal = g_signal_connect (sel, "changed",
+                                                G_CALLBACK (on_selection_changed), self);
        return GTK_WIDGET(self);
 }
 
@@ -628,9 +647,6 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store)
                g_object_unref (account_list);
        }
        
-       //if (model)
-       //      g_object_unref (model);
-               
        return TRUE;
 }
 
@@ -655,7 +671,8 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        /* folder was _un_selected if true */
        if (!gtk_tree_selection_get_selected (sel, &model_sort, &iter_sort)) {
                priv->cur_folder = NULL; /* FIXME: need this? */
-               priv->cur_row = NULL; /* FIXME: need this? */
+               gtk_tree_row_reference_free (priv->cur_row);
+               priv->cur_row = NULL;
                return; 
        }
 
@@ -671,36 +688,33 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
                            -1);
 
-       if (type == TNY_FOLDER_TYPE_ROOT)
+       if (type == TNY_FOLDER_TYPE_ROOT) {
+               g_object_unref (folder);
                return;
+       }
        
-       /* emit 2 signals: one for the unselection of the old one,
-        * and one for the selection of the new on */
+       /* Current folder was unselected */
        g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
                       priv->cur_folder, FALSE);
 
-       if (priv->cur_folder) {
+       if (priv->cur_row) {
 /*             tny_folder_sync (priv->cur_folder, TRUE, NULL); /\* FIXME *\/ */
                gtk_tree_row_reference_free (priv->cur_row);
        }
-       priv->cur_folder = folder;
-       g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
-                      folder, TRUE);
+
+       /* New current references */
        path = gtk_tree_model_get_path (model_sort, &iter_sort);
+       priv->cur_folder = folder;
        priv->cur_row = gtk_tree_row_reference_new (model_sort, path);
-       gtk_tree_path_free (path);
-}
 
-gboolean
-modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store)
-{
-       g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
+       /* Frees */
+       gtk_tree_path_free (path);
+       g_object_unref (G_OBJECT (folder));
 
-       g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL],
-                      0, NULL, TRUE);
-       
-       return update_model (self, MODEST_TNY_ACCOUNT_STORE(account_store)); /* ugly */
+       /* New folder has been selected */
+       g_signal_emit (G_OBJECT(tree_view), 
+                      signals[FOLDER_SELECTION_CHANGED_SIGNAL], 
+                      0, folder, TRUE); 
 }
 
 TnyFolder *
@@ -755,7 +769,6 @@ modest_folder_view_rename (ModestFolderView *self)
        GtkTreeModel *model;
        GtkTreeIter iter;
        ModestFolderViewPrivate *priv;
-       gchar *old_name;
 
        g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
 
@@ -764,12 +777,6 @@ modest_folder_view_rename (ModestFolderView *self)
        if (!get_model_iter (self, &model, &iter))
                return FALSE;
 
-       /* Remove old name */
-       gtk_tree_model_get (model, &iter,
-                           TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 
-                           &old_name, -1);
-       g_free (old_name);
-               
        /* Set new name */
        gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
@@ -796,9 +803,9 @@ modest_folder_view_add_subfolder (ModestFolderView *self, TnyFolder *folder)
        /* Append a new child to the folder */
        gtk_tree_store_append (GTK_TREE_STORE (model), &child, &iter);
        gtk_tree_store_set (GTK_TREE_STORE (model), &child,
-                           TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 
+                           TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
                            tny_folder_get_name (TNY_FOLDER (folder)),
-                           TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, 
+                           TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,
                            tny_folder_get_unread_count (TNY_FOLDER (folder)),
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN,
                            tny_folder_get_folder_type (TNY_FOLDER (folder)),
@@ -892,6 +899,22 @@ on_drag_data_get (GtkWidget *widget,
        gtk_tree_path_free (source_row);
 }
 
+
+static void
+on_progress_changed (ModestMailOperation *mail_op, gpointer user_data)
+{
+       ModestMailOperationQueue *queue;
+
+       if (modest_mail_operation_get_status (mail_op) == 
+           MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+               g_print ("Bien bien");
+       }
+       queue = modest_runtime_get_mail_operation_queue ();
+
+       modest_mail_operation_queue_remove (queue, mail_op);
+       g_object_unref (G_OBJECT (mail_op));
+}
+
 /*
  * This function receives the data set by the "drag-data-get" signal
  * handler. This information comes within the #GtkSelectionData. This
@@ -958,20 +981,54 @@ on_drag_data_received (GtkWidget *widget,
        child_dest_row = 
                gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (model_sort),
                                                                dest_row);
-       gtk_tree_path_free (dest_row);
 
        /* Drags from the header view */
        if ((target_type == TARGET_TREE_ROW) && (source_widget != widget)) {
+               TnyHeader *header;
+               TnyFolder *folder;
+               ModestMailOperationQueue *queue;
+               ModestMailOperation *mail_op;
+               gboolean started;
+               GtkTreeIter source_iter, dest_iter;
+
+               /* Get header */
+               gtk_tree_model_get_iter (source_model, &source_iter, source_row);
+               gtk_tree_model_get (source_model, &source_iter, 
+                                   TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, 
+                                   &header, -1);
+
+               /* Get Folder */
+               gtk_tree_model_get_iter (dest_model, &dest_iter, dest_row);
+               gtk_tree_model_get (dest_model, &dest_iter, 
+                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 
+                                   &folder, -1);
 
-               /* TODO: do the mail operation */
+               /* Transfer message */
+               queue = modest_runtime_get_mail_operation_queue ();
+               mail_op = modest_mail_operation_new ();
+               started = modest_mail_operation_xfer_msg (mail_op, header,
+                                                         folder, delete_source);
+               if (started) {
+                       g_signal_connect (G_OBJECT (mail_op), "progress_changed", 
+                                         G_CALLBACK (on_progress_changed), queue);
+                       modest_mail_operation_queue_add (queue, mail_op);
+               } else {
+                       const GError *error;
+                       error = modest_mail_operation_get_error (mail_op);
+                       g_warning ("Error trying to transfer messages: %s\n",
+                                  error->message);
+               }
+               g_object_unref (G_OBJECT (mail_op));
+               g_object_unref (G_OBJECT (header));
+               g_object_unref (G_OBJECT (folder));
 
+               /* FIXME */
                success = TRUE;
        } else {
                GtkTreeRowReference *source_row_reference;
                GtkTreeIter parent_iter, iter;
-               TnyFolder *folder;
+               TnyFolder *folder, *new_folder;
                TnyFolderStore *parent_folder;
-               gboolean done;
 
                /* Check if the drag is possible */
                if (!gtk_tree_path_compare (source_row, child_dest_row))
@@ -988,13 +1045,17 @@ on_drag_data_received (GtkWidget *widget,
                gtk_tree_model_get (source_model, &parent_iter, 
                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 
                                    &parent_folder, -1);
-               gtk_tree_model_get (source_model, &iter, 
-                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 
+               gtk_tree_model_get (source_model, &iter,
+                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
                                    &folder, -1);
                
-               g_signal_emit (G_OBJECT (widget), signals[FOLDER_MOVED_SIGNAL], 0,
-                              folder, parent_folder, &done);
-               if (!done)
+               g_signal_emit (G_OBJECT (widget), signals[FOLDER_XFER_SIGNAL], 0,
+                              folder, parent_folder, delete_source, &new_folder);
+
+               g_object_unref (G_OBJECT (parent_folder));
+               g_object_unref (G_OBJECT (folder));
+
+               if (!new_folder)
                        goto out;
 
                /* Get a row reference to the source path because the path
@@ -1010,6 +1071,15 @@ on_drag_data_received (GtkWidget *widget,
                                                           child_dest_row,
                                                           selection_data)) {
 
+                       {
+                               GtkTreeIter iter;
+
+                               gtk_tree_model_get_iter (dest_model, &iter, child_dest_row);
+                               gtk_tree_store_set (GTK_TREE_STORE (dest_model), &iter,
+                                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, new_folder, -1);
+                               g_object_unref (G_OBJECT (new_folder));
+                       }
+
                        source_row = gtk_tree_row_reference_get_path (source_row_reference);
 
                        success = TRUE;
@@ -1023,15 +1093,21 @@ on_drag_data_received (GtkWidget *widget,
                
        }
  out:
+       gtk_tree_path_free (dest_row);
        gtk_tree_path_free (child_dest_row);
 
        /* Save the new path, will be used by the
           drag-data-delete handler */
-       if (success)
+       if (success && delete_source)
                g_object_set_data (G_OBJECT (source_widget),
                                   ROW_REF_DATA_NAME,
                                   gtk_tree_path_copy (source_row));
 
+       /* Clean dest row */
+       gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
+                                        NULL,
+                                        GTK_TREE_VIEW_DROP_BEFORE);
+
  finish:
        gtk_drag_finish (context, success, (success && delete_source), time);
 }
@@ -1077,11 +1153,6 @@ drag_data_delete_cb (GtkWidget      *widget,
        GtkTreePath *source_row;
        GtkTreeModel *model_sort, *model;
 
-       /* Clean dest row */
-       gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
-                                        NULL,
-                                        GTK_TREE_VIEW_DROP_BEFORE);
-
        model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
        model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort));
        source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME);
index 9ad14e8..72f7d32 100644 (file)
@@ -62,13 +62,11 @@ struct _ModestFolderViewClass {
                                              gboolean selected,
                                              gpointer user_data);
 
-       void     (*folder_moved)             (ModestFolderView *self, 
+       void     (*folder_xfer)              (ModestFolderView *self, 
                                              TnyFolder        *folder,
                                              TnyFolderStore   *parent,
-                                             gboolean         *done);
-       
-       gboolean (*update_model)             (ModestFolderView *self, 
-                                             TnyAccountStore  *account_store);
+                                             gboolean          delete_original,
+                                             TnyFolder         *new_folder);
 };
 
 /**
index 54de306..4e16493 100644 (file)
@@ -48,21 +48,21 @@ static gboolean     on_header_clicked      (GtkWidget *widget,
                                            GdkEventButton *event, 
                                            gpointer user_data);
 
-static void         on_selection_changed   (GtkTreeSelection *sel, 
-                                           gpointer user_data);
-
 static gint         cmp_rows               (GtkTreeModel *tree_model, 
                                            GtkTreeIter *iter1, 
                                            GtkTreeIter *iter2,
                                            gpointer user_data);
 
+static void         on_selection_changed   (GtkTreeSelection *sel, 
+                                           gpointer user_data);
+
 static void         setup_drag_and_drop    (GtkTreeView *self);
 
+
 typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
 struct _ModestHeaderViewPrivate {
        TnyFolder            *folder;
        TnyList              *headers;
-       GMutex               *lock;
        ModestHeaderViewStyle style;
 };
 
@@ -206,8 +206,6 @@ remove_all_columns (ModestHeaderView *obj)
        g_list_free (columns);  
 }
 
-
-
 gboolean
 modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
 {
@@ -227,11 +225,9 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
        
        remove_all_columns (self);
 
-       if (priv->headers)
-               sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
-       else
-               sortable = NULL;
-       
+       sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+
+       /* Add new columns */
        for (cursor = columns; cursor; cursor = g_list_next(cursor)) {
                ModestHeaderViewColumn col =
                        (ModestHeaderViewColumn) GPOINTER_TO_INT(cursor->data);
@@ -345,6 +341,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
                                   self);
                gtk_tree_view_append_column (GTK_TREE_VIEW(self), column);              
        }       
+
        return TRUE;
 }
 
@@ -355,7 +352,6 @@ modest_header_view_init (ModestHeaderView *obj)
 
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj); 
 
-       priv->lock    = g_mutex_new ();
        priv->folder  = NULL;
        priv->headers = NULL;
 
@@ -371,16 +367,15 @@ modest_header_view_finalize (GObject *obj)
        self = MODEST_HEADER_VIEW(obj);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
-       if (priv->headers)      
+       if (priv->headers) {
                g_object_unref (G_OBJECT(priv->headers));
+               priv->headers  = NULL;
+       }
        
-       if (priv->lock) {
-               g_mutex_free (priv->lock);
-               priv->lock = NULL;
+       if (priv->folder) {
+               g_object_unref (G_OBJECT (priv->folder));
+               priv->folder   = NULL;
        }
-
-       priv->headers  = NULL;
-       priv->folder   = NULL;
        
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
@@ -454,6 +449,8 @@ modest_header_view_get_selected_headers (ModestHeaderView *self)
                                            &header, -1);
                        /* Prepend to list */
                        tny_list_prepend (header_list, G_OBJECT (header));
+                       g_object_unref (G_OBJECT (header));
+
                        tmp = g_list_next (tmp);
                }
                /* Clean up*/
@@ -597,13 +594,15 @@ modest_header_view_get_style (ModestHeaderView *self)
 
 
 static void
-on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err,
-                  gpointer user_data)
+on_refresh_folder (TnyFolder   *folder, 
+                  gboolean     cancelled, 
+                  GError     **error,
+                  gpointer     user_data)
 {
        GtkTreeModel *sortable; 
        ModestHeaderView *self;
        ModestHeaderViewPrivate *priv;
-       GError *error = NULL;
+       GList *cols, *cursor;
 
        if (cancelled) {
                GtkTreeSelection *selection;
@@ -616,44 +615,34 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err,
        self = MODEST_HEADER_VIEW(user_data);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
-       priv->folder = folder;
-               
-       if (folder) { /* it's a new one or a refresh */
-               GList *cols, *cursor;
-               
-               if (priv->headers) {
-                       g_object_unref (priv->headers);
-                       modest_runtime_verify_object_death(priv->headers,"");
-               }
-               priv->headers = TNY_LIST(tny_gtk_header_list_model_new ());
-               tny_folder_get_headers (folder, priv->headers, FALSE, &error); /* FIXME */
-               if (error) {
-                       g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL],
-                                      0, MODEST_ITEM_TYPE_MESSAGE);
-                       g_print (error->message);
-                       g_error_free (error);
-                       return;
-               }
+       if (priv->headers) {
+               g_object_unref (priv->headers);
+               modest_runtime_verify_object_death(priv->headers,"");
+       }
 
-               tny_gtk_header_list_model_set_folder
-                       (TNY_GTK_HEADER_LIST_MODEL(priv->headers),folder, TRUE); /*async*/
+       priv->headers = TNY_LIST(tny_gtk_header_list_model_new ());
 
-               sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
+       tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(priv->headers),
+                                             folder, TRUE);
 
-               /* install our special sorting functions */
-               cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
-               while (cursor) {
-                       gint col_id = GPOINTER_TO_INT (g_object_get_data(G_OBJECT(cursor->data),
-                                                                        MODEST_HEADER_VIEW_COLUMN));
-                       gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
-                                                        col_id,
-                                                        (GtkTreeIterCompareFunc)cmp_rows,
-                                                        cursor->data, NULL);
-                       cursor = g_list_next(cursor);
-               }
-               g_list_free (cols);             
-               gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
+       sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
+
+       /* install our special sorting functions */
+       cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
+       while (cursor) {
+               gint col_id = GPOINTER_TO_INT (g_object_get_data(G_OBJECT(cursor->data),
+                                                                MODEST_HEADER_VIEW_COLUMN));
+               gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
+                                                col_id,
+                                                (GtkTreeIterCompareFunc)cmp_rows,
+                                                cursor->data, NULL);
+               cursor = g_list_next(cursor);
        }
+       g_list_free (cols);
+
+       /* Set new model */
+       gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable); 
+       g_object_unref (G_OBJECT (sortable));
 }
 
 
@@ -683,6 +672,9 @@ modest_header_view_get_folder (ModestHeaderView *self)
        ModestHeaderViewPrivate *priv;
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
+       if (priv->folder)
+               g_object_ref (priv->folder);
+
        return priv->folder;
 }
 
@@ -693,9 +685,15 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
        ModestHeaderViewPrivate *priv;
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
+       /* Unset the old one */
+       if (priv->folder)
+               g_object_unref (priv->folder);
+
        priv->folder = folder;
 
        if (folder) {
+               g_object_ref (priv->folder);    
+
                tny_folder_refresh_async (folder,
                                          on_refresh_folder,
                                          on_refresh_folder_status_update,
@@ -704,6 +702,9 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
                /* no message selected */               
                g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0,
                               NULL);
+       } else {
+               gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL); 
+/*             gtk_widget_show (GTK_WIDGET (self)); */
        }
 }
 
@@ -739,6 +740,9 @@ on_header_clicked (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
                       signals[HEADER_ACTIVATED_SIGNAL], 
                       0, header);
 
+       /* Free */
+       g_object_unref (G_OBJECT (header));
+
        return TRUE;
 }
 
@@ -942,17 +946,48 @@ drag_data_get_cb (GtkWidget *widget,
        gtk_tree_path_free (source_row);
 }
 
+static void 
+drag_data_delete_cb (GtkWidget      *widget,
+                    GdkDragContext *context,
+                    gpointer        user_data)
+{
+       GtkTreeIter iter;
+       GtkTreePath *source_row;
+       GtkTreeModel *model_sort, *model;
+       TnyHeader *header;
+
+       model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+       model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort));
+/*     source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME); */
+       source_row = g_object_steal_data (G_OBJECT (widget), "row-ref");
+
+       /* Delete the source row */
+       gtk_tree_model_get_iter (model, &iter, source_row);
+       gtk_tree_model_get (model, &iter, 
+                           TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, 
+                           -1);
+       tny_list_remove (TNY_LIST (model), G_OBJECT (header));
+       g_object_unref (G_OBJECT (header));
+
+       gtk_tree_path_free (source_row);
+}
+
 static void
 setup_drag_and_drop (GtkTreeView *self)
 {
        gtk_drag_source_set (GTK_WIDGET (self),
-                            GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
+                            GDK_BUTTON1_MASK,
                             drag_types,
                             G_N_ELEMENTS (drag_types),
-                            GDK_ACTION_MOVE);
+                            GDK_ACTION_MOVE | GDK_ACTION_COPY);
 
        gtk_signal_connect(GTK_OBJECT (self),
                           "drag_data_get",
                           GTK_SIGNAL_FUNC(drag_data_get_cb),
                           NULL);
+
+       gtk_signal_connect(GTK_OBJECT (self),
+                          "drag_data_delete",
+                          GTK_SIGNAL_FUNC(drag_data_delete_cb),
+                          NULL);
 }