* src/modest-ui-actions.c:
[modest] / src / modest-ui-actions.c
index d17f3a3..2f12ad9 100644 (file)
@@ -100,6 +100,11 @@ typedef struct _ReplyForwardHelper {
        GtkWidget *parent_window;
 } ReplyForwardHelper;
 
+typedef struct _PasteAsAttachmentHelper {
+       ModestMsgEditWindow *window;
+       GtkWidget *banner;
+} PasteAsAttachmentHelper;
+
 
 /*
  * The do_headers_action uses this kind of functions to perform some
@@ -131,6 +136,9 @@ static void     _on_send_receive_progress_changed (ModestMailOperation  *mail_op
                                                   ModestMailOperationState *state,
                                                   gpointer user_data);
 
+static gboolean
+download_uncached_messages (TnyList *header_list, GtkWindow *win,
+                           gboolean reply_fwd);
 
 
 static void
@@ -742,11 +750,12 @@ open_msg_cb (ModestMailOperation *mail_op,
        
        /* Gets folder type (OUTBOX headers will be opened in edit window */
        if (modest_tny_folder_is_local_folder (folder))
-               folder_type = modest_tny_folder_get_local_folder_type (folder);
+               folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
 
        /* If the header is in the drafts folder then open the editor,
           else the message view window */
-       if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
+       if ((folder_type == TNY_FOLDER_TYPE_DRAFTS) ||
+           (folder_type == TNY_FOLDER_TYPE_OUTBOX)) {
                /* we cannot edit without a valid account... */
                if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
                        run_account_setup_wizard(parent_win);
@@ -894,12 +903,24 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
         * than later in a thread:
         */
        if (tny_list_get_length (not_opened_headers) > 0) {
-               gboolean connected = modest_platform_connect_and_wait (GTK_WINDOW (win), NULL);
-               
-               /* Don't go further if a connection would be necessary but none is available: */
-               if (!connected) {
+               TnyIterator *iter;
+               gboolean found = FALSE;
+
+               iter = tny_list_create_iterator (not_opened_headers);
+               while (!tny_iterator_is_done (iter) && !found) {
+                       TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+                       if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED))
+                               found = TRUE;
+                       else
+                               tny_iterator_next (iter);
+
+                       g_object_unref (header);
+               }
+               g_object_unref (iter);
+
+               if (found && !modest_platform_connect_and_wait (GTK_WINDOW (win), NULL)) {
                        g_object_unref (not_opened_headers);
-                       return;
+                       return;                 
                }
        }
        
@@ -1082,7 +1103,8 @@ cleanup:
  * of them are currently downloaded
  */
 static gboolean
-download_uncached_messages (TnyList *header_list, GtkWindow *win,
+download_uncached_messages (TnyList *header_list, 
+                           GtkWindow *win,
                            gboolean reply_fwd)
 {
        TnyIterator *iter;
@@ -1092,15 +1114,10 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win,
        iter = tny_list_create_iterator (header_list);
        while (!tny_iterator_is_done (iter)) {
                TnyHeader *header;
-               TnyHeaderFlags flags;
 
                header = TNY_HEADER (tny_iterator_get_current (iter));
                if (header) {
-                       flags = tny_header_get_flags (header);
-                       /* TODO: is this the right flag?, it seems that some
-                          headers that have been previously downloaded do not
-                          come with it */
-                       if (! (flags & TNY_HEADER_FLAG_CACHED))
+                       if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED))
                                uncached_messages ++;
                        g_object_unref (header);
                }
@@ -1483,22 +1500,11 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win)
        account_names = NULL;
 }
 
-/*
- * Handler of the click on Send&Receive button in the main toolbar
- */
-void
-modest_ui_actions_on_send_receive (GtkAction *action,  ModestWindow *win)
+void 
+modest_do_refresh_current_folder(ModestWindow *win)
 {
-       /* Check if accounts exist */
-       gboolean accounts_exist = 
-               modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
-       
-       /* If not, allow the user to create an account before trying to send/receive. */
-       if (!accounts_exist)
-               modest_ui_actions_on_accounts (NULL, win);
-
        /* Refresh currently selected folder. Note that if we only
-          want to retrive the headers, then the refresh only will
+          want to retreive the headers, then the refresh only will
           invoke a poke_status over all folders, i.e., only the
           total/unread count will be updated */
        if (MODEST_IS_MAIN_WINDOW (win)) {
@@ -1530,6 +1536,24 @@ modest_ui_actions_on_send_receive (GtkAction *action,  ModestWindow *win)
                if (folder_store)
                        g_object_unref (folder_store);
        }
+}
+
+
+/*
+ * Handler of the click on Send&Receive button in the main toolbar
+ */
+void
+modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
+{
+       /* Check if accounts exist */
+       gboolean accounts_exist = 
+               modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
+       
+       /* If not, allow the user to create an account before trying to send/receive. */
+       if (!accounts_exist)
+               modest_ui_actions_on_accounts (NULL, win);
+
+       modest_do_refresh_current_folder (win);
        
        /* Refresh the active account */
        modest_ui_actions_do_send_receive (NULL, win);
@@ -1785,7 +1809,8 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp
 
                gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
                if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-//                     modest_platform_connect_and_wait ();
+                       /* TODO: Comment about why is this commented out: */
+                       /* modest_platform_connect_and_wait (); */
                }
        }
        gtk_widget_destroy (dialog);
@@ -2618,18 +2643,21 @@ modest_ui_actions_on_cut (GtkAction *action,
                          ModestWindow *window)
 {
        GtkWidget *focused_widget;
+       GtkClipboard *clipboard;
 
+       clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
        focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
        if (GTK_IS_EDITABLE (focused_widget)) {
                gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
+               gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
-               GtkClipboard *clipboard;
 
-               clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
                gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
                modest_header_view_cut_selection (MODEST_HEADER_VIEW (focused_widget));
        } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
@@ -2649,15 +2677,22 @@ modest_ui_actions_on_copy (GtkAction *action,
 
        if (GTK_IS_LABEL (focused_widget)) {
                gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
+               gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (GTK_IS_EDITABLE (focused_widget)) {
                gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
+               gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (GTK_IS_HTML (focused_widget)) {
                gtk_html_copy (GTK_HTML (focused_widget));
+               gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
                gtk_text_buffer_copy_clipboard (buffer, clipboard);
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
+               gtk_clipboard_store (clipboard);
        } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
                TnyList *header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (focused_widget));
                TnyIterator *iter = tny_list_create_iterator (header_list);
@@ -2735,6 +2770,32 @@ paste_msgs_cb (const GObject *object, gpointer user_data)
        gtk_widget_destroy (GTK_WIDGET(user_data));
 }
 
+static void
+paste_as_attachment_free (gpointer data)
+{
+       PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) data;
+
+       gtk_widget_destroy (helper->banner);
+       g_object_unref (helper->banner);
+       g_free (helper);
+}
+
+static void
+paste_msg_as_attachment_cb (ModestMailOperation *mail_op,
+                           TnyHeader *header,
+                           TnyMsg *msg,
+                           gpointer userdata)
+{
+       PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) userdata;
+       g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (helper->window));
+
+       if (msg == NULL)
+               return;
+
+       modest_msg_edit_window_add_part (MODEST_MSG_EDIT_WINDOW (helper->window), TNY_MIME_PART (msg));
+       
+}
+
 void
 modest_ui_actions_on_paste (GtkAction *action,
                            ModestWindow *window)
@@ -2747,12 +2808,41 @@ modest_ui_actions_on_paste (GtkAction *action,
        if (GTK_IS_EDITABLE (focused_widget)) {
                gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
-               GtkTextBuffer *buffer;
-               GtkClipboard *clipboard;
+               ModestEmailClipboard *e_clipboard = NULL;
+               e_clipboard = modest_runtime_get_email_clipboard ();
+               if (modest_email_clipboard_cleared (e_clipboard)) {
+                       GtkTextBuffer *buffer;
+                       GtkClipboard *clipboard;
+
+                       clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+                       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
+                       gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
+               } else if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
+                       ModestMailOperation *mail_op;
+                       TnyFolder *src_folder;
+                       TnyList *data;
+                       gboolean delete;
+                       PasteAsAttachmentHelper *helper = g_new0 (PasteAsAttachmentHelper, 1);
+                       helper->window = MODEST_MSG_EDIT_WINDOW (window);
+                       helper->banner = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
+                                                                          _CS("ckct_nw_pasting"));
+                       modest_email_clipboard_get_data (e_clipboard, &src_folder, &data, &delete);
+                       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
+                                                            G_OBJECT (window));
+                       if (helper->banner != NULL) {
+                               g_object_ref (G_OBJECT (helper->banner));
+                               gtk_window_set_modal (GTK_WINDOW (helper->banner), FALSE);
+                               gtk_widget_show (GTK_WIDGET (helper->banner));
+                       }
 
-               clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-               buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
-               gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
+                       if (data != NULL) {
+                               modest_mail_operation_get_msgs_full (mail_op, 
+                                                                    data,
+                                                                    (GetMsgAsyncUserCallback) paste_msg_as_attachment_cb,
+                                                                    helper,
+                                                                    paste_as_attachment_free);
+                       }
+               }
        } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
                ModestEmailClipboard *clipboard = NULL;
                TnyFolder *src_folder = NULL;