* src/modest-ui-actions.c:
[modest] / src / modest-ui-actions.c
index cb52073..8bae8df 100644 (file)
@@ -935,45 +935,28 @@ open_msg_cb (ModestMailOperation *mail_op,
        
        if (open_in_editor) {
                ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-               gchar *from_header = NULL;
+               gchar *from_header = NULL, *acc_name;
 
                from_header = tny_header_dup_from (header);
 
                /* we cannot edit without a valid account... */
                if (!modest_account_mgr_has_accounts(mgr, TRUE)) {
                        if (!modest_ui_actions_run_account_setup_wizard(parent_win)) {
-                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), 
+                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
                                                                     header);
                                g_free (from_header);
                                goto cleanup;
                        }
                }
-               
-               if (from_header) {
-                       GSList *accounts = modest_account_mgr_account_names (mgr, TRUE);
-                       GSList *node = NULL;
-
-                       for (node = accounts; node != NULL; node = g_slist_next (node)) {
-                               gchar *from = modest_account_mgr_get_from_string (mgr, node->data);
-                               
-                               if (from && (strcmp (from_header, from) == 0)) {
-                                       g_free (account);
-                                       account = g_strdup (node->data);
-                                       g_free (from);
-                                       break;
-                               }
-                               g_free (from);
-                       }
 
-                       g_free (from_header);
-                       g_slist_foreach (accounts, (GFunc) g_free, NULL);
-                       g_slist_free (accounts);
+               acc_name = modest_utils_get_account_name_from_recipient (from_header);
+               g_free (from_header);
+               if (acc_name) {
+                       g_free (account);
+                       account = acc_name;
                }
 
                win = modest_msg_edit_window_new (msg, account, TRUE);
-
-
-
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                
@@ -1026,6 +1009,11 @@ is_memory_full_error (GError *error)
        gnome_vfs_uri_unref (cache_dir_uri);
 
        if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
+            /* When asking for a mail and no space left on device
+               tinymail returns this error */
+            error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE ||
+            /* When the folder summary could not be read or
+               written */
             error->code == TNY_IO_ERROR_WRITE ||
             error->code == TNY_IO_ERROR_READ) && 
            !enough_free_space) {
@@ -1737,7 +1725,10 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                header_list = get_selected_headers (win);
                if (!header_list)
                        return;
-               if (tny_list_get_length (header_list) == 0) {
+               /* Check that only one message is selected for replying */
+               if (tny_list_get_length (header_list) != 1) {
+                       modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
+                                                           NULL, _("mcen_ib_select_one_message"));
                        g_object_unref (header_list);
                        return;
                }
@@ -2343,7 +2334,7 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                     gpointer user_data)
 {
        ModestMainWindow *win = NULL;
-       GtkWidget *header_view;
+       GtkWidget *folder_view;
        const GError *error;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
@@ -2360,18 +2351,19 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                return;
        }
 
-       header_view = 
-               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+       folder_view = 
+               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
 
-       if (header_view) {
-               TnyFolder *current_folder;
+       if (folder_view) {
+               TnyFolderStore *current_folder;
 
-               current_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
-               if (current_folder != NULL && folder != current_folder) {
-                       g_object_unref (current_folder);
-                       return;
-               } else if (current_folder)
+               current_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+               if (current_folder) {
+                       gboolean different = ((TnyFolderStore *) folder != current_folder);
                        g_object_unref (current_folder);
+                       if (different)
+                               return;
+               }
        }
 
        /* Check if folder is empty and set headers view contents style */
@@ -2588,37 +2580,31 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
        g_object_unref(edit_window);
 }
 
-gboolean
-modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+static gboolean
+enough_space_for_message (ModestMsgEditWindow *edit_window,
+                         MsgData *data)
 {
-       TnyTransportAccount *transport_account;
-       ModestMailOperation *mail_operation;
-       MsgData *data;
-       gchar *account_name, *from;
-       ModestAccountMgr *account_mgr;
-/*     char *info_text; */
-       gboolean had_error = FALSE;
+       TnyAccountStore *acc_store;
        guint64 available_disk, expected_size;
        gint parts_count;
        guint64 parts_size;
-       ModestMainWindow *win;
-
-       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
-       
-       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
+       acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store());
+       available_disk = modest_utils_get_available_space (NULL);
        modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
        expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
+                                                     data->html_body,
+                                                     parts_count,
+                                                     parts_size);
 
-       if ((available_disk != -1) && expected_size > available_disk) {
-               modest_msg_edit_window_free_msg_data (edit_window, data);
+       /* Double check: memory full condition or message too big */
+       if (available_disk < MIN_FREE_SPACE || 
+           expected_size > available_disk) {
 
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
+               modest_platform_information_banner (NULL, NULL, 
+                                                   dgettext("ke-recv", 
+                                                            "cerm_device_memory_full"));
                return FALSE;
        }
 
@@ -2628,13 +2614,9 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         * MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h) this
         * should still allow for sending anything critical...
         */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
+       if ((expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) &&
+           modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE))
+               return FALSE;
 
        /*
         * djcb: we also make sure that the attachments are smaller than the max size
@@ -2647,6 +2629,29 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                        GTK_WINDOW(edit_window),
                        dgettext("ke-recv","memr_ib_operation_disabled"),
                        TRUE);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+{
+       TnyTransportAccount *transport_account;
+       ModestMailOperation *mail_operation;
+       MsgData *data;
+       gchar *account_name, *from;
+       ModestAccountMgr *account_mgr;
+       gboolean had_error = FALSE;
+       ModestMainWindow *win;
+
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
+       
+       data = modest_msg_edit_window_get_msg_data (edit_window);
+
+       /* Check size */
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                return FALSE;
        }
@@ -2669,7 +2674,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        transport_account =
                TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                     (modest_runtime_get_account_store(),
+                                     (modest_runtime_get_account_store (),
                                       account_name,
                                       TNY_ACCOUNT_TYPE_TRANSPORT));
        if (!transport_account) {
@@ -2767,62 +2772,27 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 {
        TnyTransportAccount *transport_account = NULL;
        gboolean had_error = FALSE;
-       guint64 available_disk, expected_size;
-       gint parts_count;
-       guint64 parts_size;
+       MsgData *data;
+       ModestAccountMgr *account_mgr;
+       gchar *account_name;
+       gchar *from;
+       ModestMailOperation *mail_operation;
 
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
 
        if (!modest_msg_edit_window_check_names (edit_window, TRUE))
                return TRUE;
        
-       MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
+       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
-       modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
-       expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
-
-       if ((available_disk != -1) && expected_size > available_disk) {
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
-
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
                return FALSE;
        }
 
-       
-       /*
-        * djcb: if we're in low-memory state, we only allow for sending messages
-        * smaller than MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h)
-        * this should still allow for sending anything critical... 
-        */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
-
-       /*
-        * djcb: we also make sure that the attachments are smaller than the max size
-        * this is for the case where we'd try to forward a message with attachments 
-        * bigger than our max allowed size, or sending an message from drafts which
-        * somehow got past our checks when attaching.
-        */
-       if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
-               modest_platform_run_information_dialog (
-                       GTK_WINDOW(edit_window),
-                       dgettext("ke-recv","memr_ib_operation_disabled"),
-                       TRUE);
-               modest_msg_edit_window_free_msg_data (edit_window, data);
-               return FALSE;
-       }
-
-       ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
-       gchar *account_name = g_strdup (data->account_name);
+       account_mgr = modest_runtime_get_account_mgr();
+       account_name = g_strdup (data->account_name);
        if (!account_name)
                account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
@@ -2839,9 +2809,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        
        /* Get the currently-active transport account for this modest account: */
        if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) != 0) {
-               transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                                         (modest_runtime_get_account_store(),
-                                                          account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
+               transport_account = 
+                       TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
+                                             (modest_runtime_get_account_store (), 
+                                              account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
        }
        
        if (!transport_account) {
@@ -2851,17 +2822,17 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
                        return TRUE;
        }
        
-       gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */
-       ModestMailOperation *mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
+       from = modest_account_mgr_get_from_string (account_mgr, account_name);
+       mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
                                             transport_account,
                                             data->draft_msg,
                                             from,
-                                            data->to, 
+                                            data->to,
                                             data->cc, 
                                             data->bcc,
                                             data->subject, 
@@ -3055,6 +3026,38 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
        modest_msg_edit_window_remove_attachments (window, NULL);
 }
 
+
+#ifdef MODEST_PLATFORM_MAEMO
+typedef struct {
+       guint handler;
+       gchar *name;
+       GtkWindow *win;
+       TnyFolderStore *folder;
+} CreateFolderHelper;
+
+static gboolean
+show_create_folder_in_timeout (gpointer data)
+{
+       CreateFolderHelper *helper = (CreateFolderHelper *) data;
+
+       /* Remove the timeout ASAP, we can not wait until the dialog
+          is shown because it could take a lot of time and so the
+          timeout could be called twice or more times */
+       g_source_remove (helper->handler);
+
+       gdk_threads_enter ();
+       do_create_folder (helper->win, helper->folder, helper->name);
+       gdk_threads_leave ();
+
+       g_object_unref (helper->win);
+       g_object_unref (helper->folder);
+       g_free (helper->name);
+       g_slice_free (CreateFolderHelper, helper);
+
+       return FALSE;
+}
+#endif
+
 static void
 do_create_folder_cb (ModestMailOperation *mail_op,
                     TnyFolderStore *parent_folder, 
@@ -3079,7 +3082,21 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                /* Try again. Do *NOT* show any error because the mail
                   operations system will do it for us because we
                   created the mail_op with new_with_error_handler */
+#ifdef MODEST_PLATFORM_MAEMO
+               CreateFolderHelper *helper;
+               helper = g_slice_new0 (CreateFolderHelper);
+               helper->name = g_strdup (suggested_name);
+               helper->folder = g_object_ref (parent_folder);
+               helper->win = g_object_ref (source_win);
+
+               /* Ugly but neccesary stuff. The problem is that the
+                  dialog when is shown calls a function that destroys
+                  all the temporary windows, so the banner is
+                  destroyed */
+               helper->handler = g_timeout_add (2000, show_create_folder_in_timeout, helper);
+#else
                do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+#endif
        } else {
                /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
                 * FIXME: any other? */         
@@ -3779,9 +3796,16 @@ modest_ui_actions_on_copy (GtkAction *action,
                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);
+               const gchar *sel;
+               int len = -1;
+               sel = gtk_html_get_selection_html (GTK_HTML (focused_widget), &len);
+               if ((sel == NULL) || (sel[0] == '\0')) {
+                       copied = FALSE;
+               } else {
+                       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));