* src/modest-ui-actions.c:
[modest] / src / modest-ui-actions.c
index 664e742..811b72c 100644 (file)
@@ -395,11 +395,8 @@ void
 modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win)
 {
        /* Close msg view window or select next */
-       if (modest_msg_view_window_last_message_selected (win) &&
-               modest_msg_view_window_first_message_selected (win)) {
-               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win));
-       } else if (!modest_msg_view_window_select_next_message (win) &&
-                  !modest_msg_view_window_select_previous_message (win)) {
+       if (!modest_msg_view_window_select_next_message (win) &&
+           !modest_msg_view_window_select_previous_message (win)) {
                gboolean ret_value;
                g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);       
        }
@@ -598,8 +595,6 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *
        modest_ui_actions_on_delete_message (action, win);
 }
 
-
-
 void
 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
 {      
@@ -814,25 +809,6 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
        modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL);
 }
 
-void
-modest_ui_actions_on_new_msg_or_folder (GtkAction *action, ModestWindow *win)
-{
-       g_return_if_fail (MODEST_IS_WINDOW (win));
-
-       /* Check first if the folder view has the focus */
-       if (MODEST_IS_MAIN_WINDOW (win)) {
-               GtkWidget *w;
-               w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                        MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-               if (gtk_widget_is_focus (w)) {
-                       modest_ui_actions_on_new_folder (action, MODEST_MAIN_WINDOW(win));
-                       return;
-               }
-       }
-
-       modest_ui_actions_on_new_msg (action, win);
-}
-
 
 gboolean 
 modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
@@ -1021,14 +997,21 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
 {
        const GError *error;
        GObject *win = NULL;
-       const gchar *err_msg = (const gchar *) user_data;
 
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
 
        /* Show error */
-       if (err_msg)
-               modest_platform_run_information_dialog ((GtkWindow *) win, err_msg);
+       if (error->code == TNY_SYSTEM_ERROR_MEMORY ||
+           error->code == TNY_IO_ERROR_WRITE ||
+           error->code == TNY_IO_ERROR_READ) {
+               modest_platform_information_banner ((GtkWidget *) win, 
+                                                   NULL, dgettext("ke-recv", 
+                                                                  "cerm_device_memory_full"));
+       } else if (user_data) {
+               modest_platform_information_banner ((GtkWidget *) win, 
+                                                   NULL, user_data);
+       }
 
        if (win)
                g_object_unref (win);
@@ -2974,6 +2957,7 @@ on_delete_folder_cb (gboolean canceled,
        if (!MODEST_IS_MAIN_WINDOW(parent_window) || canceled || (err!=NULL)) {
                g_object_unref (G_OBJECT (info->folder));
                g_free (info);
+               return;
        }
        
        folder_view = modest_main_window_get_child_widget (
@@ -3288,9 +3272,11 @@ modest_ui_actions_on_cut (GtkAction *action,
                GtkTextBuffer *buffer;
 
                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);
+               if (modest_text_utils_buffer_selection_is_valid (buffer)) {
+                       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)) {
                TnyList *header_list = modest_header_view_get_selected_headers (
                                MODEST_HEADER_VIEW (focused_widget));
@@ -3330,7 +3316,10 @@ modest_ui_actions_on_copy (GtkAction *action,
        focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
 
        if (GTK_IS_LABEL (focused_widget)) {
-               gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
+               gchar *selection;
+               selection = modest_text_utils_label_get_selection (GTK_LABEL (focused_widget));
+               gtk_clipboard_set_text (clipboard, selection, -1);
+               g_free (selection);
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
                gtk_clipboard_store (clipboard);
        } else if (GTK_IS_EDITABLE (focused_widget)) {
@@ -3344,9 +3333,11 @@ modest_ui_actions_on_copy (GtkAction *action,
        } 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);
+               if (modest_text_utils_buffer_selection_is_valid (buffer)) {
+                       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));
@@ -3977,9 +3968,11 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        GtkWidget *folder_view = NULL;
        ModestTnyFolderRules rules;
 
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW(self));
+       
        if (!selected)
                return;
-
+       
        /* Get the OK button */
        dialog = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_DIALOG);
        if (!dialog)
@@ -4061,25 +4054,36 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                }
                g_object_unref (moved_folder);
        } else {
-               TnyHeader *header = NULL;
                TnyFolder *src_folder = NULL;
 
                /* Moving a message */
                if (MODEST_IS_MSG_VIEW_WINDOW (user_data)) {
-                       header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (user_data));
-                       src_folder = tny_header_get_folder (header);
-                       g_object_unref (header);
+
+                       TnyHeader *header = NULL;
+                       header = modest_msg_view_window_get_header
+                               (MODEST_MSG_VIEW_WINDOW (user_data));
+                       if (!TNY_IS_HEADER(header))
+                               g_warning ("%s: could not get source header", __FUNCTION__);
+                       else
+                               src_folder = tny_header_get_folder (header);
+
+                       if (header)
+                               g_object_unref (header);
                } else {
                        src_folder = 
-                               TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
+                               TNY_FOLDER (modest_folder_view_get_selected
+                                           (MODEST_FOLDER_VIEW (folder_view)));
                }
 
-               /* Do not allow to move the msg to the same folder */
-               /* Do not allow to move the msg to an account */
-               if ((gpointer) src_folder == (gpointer) folder_store ||
-                   TNY_IS_ACCOUNT (folder_store))
-                       ok_sensitive = FALSE;
-               g_object_unref (src_folder);
+               if (TNY_IS_FOLDER(src_folder)) {
+                       /* Do not allow to move the msg to the same folder */
+                       /* Do not allow to move the msg to an account */
+                       if ((gpointer) src_folder == (gpointer) folder_store ||
+                           TNY_IS_ACCOUNT (folder_store))
+                               ok_sensitive = FALSE;
+                       g_object_unref (src_folder);
+               } else
+                       g_warning ("%s: could not get source folder", __FUNCTION__);
        }
 
  end:
@@ -4321,11 +4325,8 @@ move_to_cb (ModestMailOperation *mail_op,
                if (MODEST_IS_MSG_VIEW_WINDOW (object)) {
                        ModestMsgViewWindow *self = MODEST_MSG_VIEW_WINDOW (object);
 
-                       if (modest_msg_view_window_last_message_selected (self) &&
-                           modest_msg_view_window_first_message_selected (self)) {
-                               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
-                       } else if (!modest_msg_view_window_select_next_message (self) &&
-                                  !modest_msg_view_window_select_previous_message (self)) {
+                       if (!modest_msg_view_window_select_next_message (self) &&
+                           !modest_msg_view_window_select_previous_message (self)) {
                                /* No more messages to view, so close this window */
                                modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
                        }
@@ -4356,7 +4357,17 @@ folder_move_to_cb (ModestMailOperation *mail_op,
                   TnyFolder *new_folder,
                   gpointer user_data)
 {
+       GtkWidget *folder_view;
+       GObject *object;
+
+       object = modest_mail_operation_get_source (mail_op);
+       folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(object),
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+       g_object_ref (folder_view);
+       g_object_unref (object);
        move_to_cb (mail_op, user_data);
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), new_folder, FALSE);
+       g_object_unref (folder_view);
 }
 
 static void
@@ -4484,6 +4495,7 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
 
                                tny_iterator_next (iter);
                        }
+                       g_object_unref (iter);
                        
                        tny_msg_rewrite_cache (msg);
                }
@@ -4491,7 +4503,6 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op,
                /* This string no longer exists, refer to NB#75415 for more info */
                /* modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); */
        }
-       g_object_unref (iter);
 
        modest_window_mgr_unregister_header (mgr, header);
 
@@ -4504,7 +4515,6 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
 {
        GtkWidget *header_view;
        TnyList *header_list;
-       TnyIterator *iter;
        TnyHeader *header;
        TnyHeaderFlags flags;
        ModestWindow *msg_view_window =  NULL;
@@ -4522,7 +4532,7 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
        }
        
        if (tny_list_get_length (header_list) == 1) {
-               iter = tny_list_create_iterator (header_list);
+               TnyIterator *iter = tny_list_create_iterator (header_list);
                header = TNY_HEADER (tny_iterator_get_current (iter));
                g_object_unref (iter);
        } else
@@ -4646,36 +4656,6 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
 }
 
 typedef struct {
-       TnyAccount *dst_account;
-       ModestConnectedPerformer callback;
-       gpointer data;
-} DoubleConnectionInfo;
-
-static void
-src_account_connect_performer (gboolean canceled, 
-                              GError *err,
-                              GtkWindow *parent_window, 
-                              TnyAccount *src_account, 
-                              gpointer user_data)
-{
-       DoubleConnectionInfo *info = (DoubleConnectionInfo *) user_data;
-
-       if (canceled || err) {
-               /* If there was any error call the user callback */
-               info->callback (canceled, err, parent_window, src_account, info->data);
-       } else {
-               /* Connect the destination account */
-               modest_platform_connect_if_remote_and_perform (parent_window, TRUE, 
-                                                              TNY_FOLDER_STORE (info->dst_account),
-                                                              info->callback, info->data);
-       }
-
-       /* Free the info object */
-       g_object_unref (info->dst_account);
-       g_slice_free (DoubleConnectionInfo, info);
-}
-
-typedef struct {
        TnyFolder *src_folder;
        TnyFolderStore *dst_folder;
        gboolean delete_original;
@@ -4748,6 +4728,15 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
        g_free (user_data);
 }
 
+static TnyAccount *
+get_account_from_folder_store (TnyFolderStore *folder_store) 
+{
+       if (TNY_IS_ACCOUNT (folder_store))
+               return g_object_ref (folder_store);
+       else
+               return tny_folder_get_account (TNY_FOLDER (folder_store));
+}
+
 /*
  * UI handler for the "Move to" action when invoked from the
  * ModestMainWindow
@@ -4776,29 +4765,30 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
 
                /* Allow only to transfer folders to the local root folder */
                if (TNY_IS_ACCOUNT (dst_folder) && 
-                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) {
+                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder) &&
+                   !modest_tny_account_is_memory_card_account (TNY_ACCOUNT (dst_folder))) {
                        do_xfer = FALSE;
                } else if (!TNY_IS_FOLDER (src_folder)) {
                        g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
                        do_xfer = FALSE;
-               } /* else if (!online && modest_tny_folder_store_is_remote(src_folder)) {
-                       guint num_headers = tny_folder_get_all_count(TNY_FOLDER (src_folder));
-                       TnyAccount *account = tny_folder_get_account (TNY_FOLDER (src_folder));
-                       if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
-                               do_xfer = FALSE;
-                       g_object_unref (account);
-               }*/
+               }
 
-               if (do_xfer) {
+               if (do_xfer) {                  
                        MoveFolderInfo *info = g_new0 (MoveFolderInfo, 1);
-                       info->src_folder = TNY_FOLDER (src_folder);
-                       info->dst_folder = dst_folder;
+                       DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
+
+                       info->src_folder = g_object_ref (src_folder);
+                       info->dst_folder = g_object_ref (dst_folder);
                        info->delete_original = TRUE;
                        info->folder_view = folder_view;
-                       g_object_ref (G_OBJECT (info->src_folder));
-                       g_object_ref (G_OBJECT (info->dst_folder));
-                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE,
-                                   TNY_FOLDER_STORE (dst_folder), on_move_folder_cb, info);
+
+                       connect_info->callback = on_move_folder_cb;
+                       connect_info->dst_account = get_account_from_folder_store (TNY_FOLDER_STORE (dst_folder));
+                       connect_info->data = info;
+
+                       modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
+                                                                  TNY_FOLDER_STORE (src_folder), 
+                                                                  connect_info);
                }
        } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
                gboolean do_xfer = TRUE;
@@ -4831,15 +4821,14 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                        g_object_unref(headers);
                }
                if (do_xfer) /* Transfer messages */ {
-                       DoubleConnectionInfo *info = g_slice_new (DoubleConnectionInfo);
-                       info->callback = xfer_messages_from_move_to_cb;
-                       info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
-                       info->data = g_object_ref (dst_folder);
-
-                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE,
-                                                                     TNY_FOLDER_STORE (src_folder), 
-                                                                     src_account_connect_performer, 
-                                                                     info);
+                       DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
+                       connect_info->callback = xfer_messages_from_move_to_cb;
+                       connect_info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
+                       connect_info->data = g_object_ref (dst_folder);
+                       
+                       modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
+                                                                  TNY_FOLDER_STORE (src_folder), 
+                                                                  connect_info);
                }
        }
 
@@ -5449,3 +5438,54 @@ modest_ui_actions_on_account_connection_error (GtkWindow *parent_window,
                g_free (error_note);
        }
 }
+
+gchar *
+modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
+{
+       gchar *msg = NULL;
+       TnyFolderStore *folder = NULL;
+       TnyAccount *account = NULL;
+       ModestTransportStoreProtocol proto;
+       TnyHeader *header = NULL;
+
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               GtkWidget *header_view;
+               TnyList* headers = NULL;
+               TnyIterator *iter;
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+               headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
+               if (!headers || tny_list_get_length (headers) == 0) {
+                       if (headers)
+                               g_object_unref (headers);
+                       return NULL;
+               }
+               iter = tny_list_create_iterator (headers);
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
+               g_object_unref (iter);
+               g_object_unref (headers);
+       } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
+               folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
+       }
+
+       /* Get the account type */
+       account = tny_folder_get_account (TNY_FOLDER (folder));
+       proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
+       if (proto == MODEST_PROTOCOL_STORE_POP) {
+               msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
+       } else if (proto == MODEST_PROTOCOL_STORE_IMAP) {
+               msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), 
+                                      tny_header_get_subject (header));
+       } else {
+               msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
+       }
+
+       /* Frees */
+       g_object_unref (account);
+       g_object_unref (folder);
+       g_object_unref (header);
+
+       return msg;
+}