* Add new dimming rules for copy,cut and paste operations.
[modest] / src / modest-ui-actions.c
index 8c0dc41..93e78f8 100644 (file)
@@ -345,10 +345,13 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
 void
 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
 {
-       #ifdef MODEST_PLATFORM_MAEMO
+#ifdef MODEST_PLATFORM_MAEMO
        modest_osso_save_state();
-       #endif /* MODEST_PLATFORM_MAEMO */
-       
+#endif /* MODEST_PLATFORM_MAEMO */
+
+       /* FIXME: we need to cancel all actions/threads here,
+        so we really quit */
+
        gtk_main_quit ();
 }
 
@@ -483,7 +486,7 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
 void
 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
 {
-       ModestWindow *msg_win;
+       ModestWindow *msg_win = NULL;
        TnyMsg *msg = NULL;
        TnyFolder *folder = NULL;
        gchar *account_name = NULL;
@@ -559,6 +562,8 @@ cleanup:
        g_free (account_name);
        g_free (from_str);
        g_free (blank_and_signature);
+       if (msg_win)
+               g_object_unref (msg_win);
        if (account)
                g_object_unref (G_OBJECT(account));
        if (msg)
@@ -649,6 +654,7 @@ open_msg_cb (ModestMailOperation *mail_op,
        if (win != NULL) {
                mgr = modest_runtime_get_window_mgr ();
                modest_window_mgr_register_window (mgr, win);
+               g_object_unref (win);
                gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win));
                gtk_widget_show_all (GTK_WIDGET(win));
        }
@@ -659,7 +665,6 @@ cleanup:
        g_object_unref (parent_win);
        g_object_unref (msg);
        g_object_unref (folder);
-       g_object_unref (header);
 }
 
 /*
@@ -690,58 +695,98 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
 static void
 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
 {
-       ModestWindowMgr *mgr;
-       TnyIterator *iter;
-       ModestMailOperation *mail_op;
-       TnyList *not_opened_headers;
-
+       ModestWindowMgr *mgr = NULL;
+       TnyIterator *iter = NULL;
+       ModestMailOperation *mail_op1 = NULL;
+       ModestMailOperation *mail_op2 = NULL;
+       TnyList *not_opened_headers = NULL;
+       TnyList *not_opened_cached_headers = NULL;
+       TnyHeaderFlags flags;
+               
        /* Look if we already have a message view for each header. If
           true, then remove the header from the list of headers to
           open */
        mgr = modest_runtime_get_window_mgr ();
        iter = tny_list_create_iterator (headers);
        not_opened_headers = tny_simple_list_new ();
+       not_opened_cached_headers = tny_simple_list_new ();
        while (!tny_iterator_is_done (iter)) {
                ModestWindow *window;
                TnyHeader *header;
                
                header = TNY_HEADER (tny_iterator_get_current (iter));
+               flags = tny_header_get_flags (header);
                window = modest_window_mgr_find_window_by_header (mgr, header);
+
                /* Do not open again the message and present the
                   window to the user */
                if (window)
                        gtk_window_present (GTK_WINDOW (window));
-               else
+               else if (!(flags & TNY_HEADER_FLAG_CACHED))
                        tny_list_append (not_opened_headers, G_OBJECT (header));
-
+               /* Check if msg has already been retreived */
+               else
+                       tny_list_append (not_opened_cached_headers, G_OBJECT (header));
+               
                g_object_unref (header);
                tny_iterator_next (iter);
        }
        
-       /* Open each message */
-       mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
-                                                                G_OBJECT (win), 
-                                                                modest_ui_actions_get_msgs_full_error_handler, 
-                                                                NULL);
-       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       if (tny_list_get_length (not_opened_headers) > 1) {
-               modest_mail_operation_get_msgs_full (mail_op, 
-                                                    not_opened_headers, 
-                                                    open_msg_cb, 
-                                                    NULL, 
-                                                    NULL);
-       } else {
-               TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
-               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
-               modest_mail_operation_get_msg (mail_op, header, open_msg_cb, NULL);
-               g_object_unref (header);
-               g_object_unref (iter);
+       /* Open each uncached message */
+       if (tny_list_get_length (not_opened_headers) > 0) {
+               mail_op1 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
+                                                                        G_OBJECT (win), 
+                                                                        modest_ui_actions_get_msgs_full_error_handler, 
+                                                                        NULL);
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op1);
+               if (tny_list_get_length (not_opened_headers) > 1) {
+                       modest_mail_operation_get_msgs_full (mail_op1, 
+                                                            not_opened_headers, 
+                                                            open_msg_cb, 
+                                                            NULL, 
+                                                            NULL);
+               } else {
+                       TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
+                       TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+                       modest_mail_operation_get_msg (mail_op1, header, open_msg_cb, NULL);
+                       g_object_unref (header);
+                       g_object_unref (iter);
+               }
+       }
+
+       /* Open each cached message */
+       if (tny_list_get_length (not_opened_cached_headers) > 0) {
+               mail_op2 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_OPEN, 
+                                                                        G_OBJECT (win), 
+                                                                        modest_ui_actions_get_msgs_full_error_handler, 
+                                                                        NULL);
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op2);
+               if (tny_list_get_length (not_opened_cached_headers) > 1) {
+                       modest_mail_operation_get_msgs_full (mail_op2, 
+                                                            not_opened_headers, 
+                                                            open_msg_cb, 
+                                                            NULL, 
+                                                            NULL);
+               } else {
+                       TnyIterator *iter = tny_list_create_iterator (not_opened_cached_headers);
+                       TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+                       modest_mail_operation_get_msg (mail_op2, header, open_msg_cb, NULL);
+                       g_object_unref (header);
+                       g_object_unref (iter);
+               }
        }
 
        /* Clean */
-       g_object_unref (not_opened_headers);
-       g_object_unref (iter);
-       g_object_unref (mail_op);
+       if (not_opened_headers != NULL)
+               g_object_unref (not_opened_headers);
+       if (not_opened_cached_headers != NULL)
+               g_object_unref (not_opened_cached_headers);
+       if (iter != NULL) 
+               g_object_unref (iter);
+       if (mail_op1 != NULL)
+               g_object_unref (mail_op1);
+       if (mail_op2 != NULL) 
+               g_object_unref (mail_op2);
 }
 
 void
@@ -779,11 +824,11 @@ reply_forward_cb (ModestMailOperation *mail_op,
 {
        TnyMsg *new_msg;
        ReplyForwardHelper *rf_helper;
-       ModestWindow *msg_win;
+       ModestWindow *msg_win = NULL;
        ModestEditType edit_type;
-       gchar *from;
+       gchar *from = NULL;
        TnyAccount *account = NULL;
-       ModestWindowMgr *mgr;
+       ModestWindowMgr *mgr = NULL;
        gchar *signature = NULL;
                        
        g_return_if_fail (user_data != NULL);
@@ -854,6 +899,8 @@ reply_forward_cb (ModestMailOperation *mail_op,
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
+       if (msg_win)
+               g_object_unref (msg_win);
        if (new_msg)
                g_object_unref (G_OBJECT (new_msg));
        if (account)
@@ -875,11 +922,11 @@ static gboolean
 download_uncached_messages (TnyList *header_list, GtkWindow *win)
 {
        TnyIterator *iter;
-       gboolean found, retval;
+       gboolean retval;
+       gint uncached_messages = 0;
 
        iter = tny_list_create_iterator (header_list);
-       found = FALSE;
-       while (!tny_iterator_is_done (iter) && !found) {
+       while (!tny_iterator_is_done (iter)) {
                TnyHeader *header;
                TnyHeaderFlags flags;
 
@@ -888,7 +935,8 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win)
                /* TODO: is this the right flag?, it seems that some
                   headers that have been previously downloaded do not
                   come with it */
-               found = !(flags & TNY_HEADER_FLAG_CACHED);
+               if (! (flags & TNY_HEADER_FLAG_CACHED))
+                       uncached_messages ++;
                g_object_unref (header);
                tny_iterator_next (iter);
        }
@@ -896,11 +944,13 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win)
 
        /* Ask for user permission to download the messages */
        retval = TRUE;
-       if (found) {
+       if (uncached_messages > 0) {
                GtkResponseType response;
                response = 
                        modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
-                                                                _("mcen_nc_get_multi_msg_txt"));
+                                                                ngettext("mcen_nc_get_msg",
+                                                                         "mcen_nc_get_msgs",
+                                                                        uncached_messages));
                if (response == GTK_RESPONSE_CANCEL)
                        retval = FALSE;
        }
@@ -1224,7 +1274,11 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
        /* If no header has been selected then exit */
        if (!header)
                return;
-       
+
+       /* Update focus */
+       if (!gtk_widget_is_focus (GTK_WIDGET(header_view)))
+           gtk_widget_grab_focus (GTK_WIDGET(header_view));
+
        /* Update Main window title */
        if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
                const gchar *subject = tny_header_get_subject (header);
@@ -1472,6 +1526,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        MsgData *data;
        gchar *account_name, *from;
        ModestAccountMgr *account_mgr;
+       gchar *info_text = NULL;
 
        g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
        
@@ -1528,8 +1583,9 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        modest_msg_edit_window_free_msg_data (edit_window, data);
 
-       /* Save settings and close the window */
-       gtk_widget_destroy (GTK_WIDGET (edit_window));
+       info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
+       modest_platform_information_banner (NULL, NULL, info_text);
+       g_free (info_text);
 }
 
 /* For instance, when clicking the Send toolbar button when editing a message: */
@@ -1627,6 +1683,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        g_object_unref (G_OBJECT (mail_operation));
 
        modest_msg_edit_window_free_msg_data (edit_window, data);
+       modest_msg_edit_window_set_sent (edit_window, TRUE);
 
        /* Save settings and close the window: */
        gtk_widget_destroy (GTK_WIDGET (edit_window));
@@ -2094,12 +2151,8 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                        const gboolean username_was_changed = 
                                (strcmp (*username, initial_username) != 0);
                        if (username_was_changed) {
-                               /* To actually use a changed username, 
-                                * we must reset the connection, according to pvanhoof.
-                                * This _might_ be a sensible way to do that: */
-                                TnyDevice *device = modest_runtime_get_device();
-                                tny_device_force_offline (device);
-                                tny_device_force_online (device);
+                               g_warning ("%s: tinymail does not yet support changing the "
+                                       "username in the get_password() callback.\n", __FUNCTION__);
                        }
                }
                        
@@ -2208,15 +2261,26 @@ modest_ui_actions_on_copy (GtkAction *action,
        } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
                modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
        }    
+
+       /* Show information banner */
+       modest_platform_information_banner (NULL, NULL, _CS("ecoc_ib_edwin_copied"));
+       
 }
 
 void
 modest_ui_actions_on_undo (GtkAction *action,
                           ModestWindow *window)
 {
+       ModestEmailClipboard *clipboard = NULL;
+
        if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
                modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
-       } else {
+       } if (MODEST_IS_MAIN_WINDOW (window)) {
+               /* Clear clipboard source */
+               clipboard = modest_runtime_get_email_clipboard ();
+               modest_email_clipboard_clear (clipboard);               
+       }
+       else {
                g_return_if_reached ();
        }
 }
@@ -2308,28 +2372,24 @@ modest_ui_actions_on_select_all (GtkAction *action,
                gtk_text_buffer_get_start_iter (buffer, &start);
                gtk_text_buffer_get_end_iter (buffer, &end);
                gtk_text_buffer_select_range (buffer, &start, &end);
-       }
-       else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) ||
-                (MODEST_IS_HEADER_VIEW (focused_widget))) {
-               
-               GtkTreeSelection *selection = NULL;
-
-               /* Get header view */           
+       } else if (GTK_IS_HTML (focused_widget)) {
+               gtk_html_select_all (GTK_HTML (focused_widget));
+       } else if (MODEST_IS_MAIN_WINDOW (window)) {
                GtkWidget *header_view = focused_widget;
-               if (MODEST_IS_FOLDER_VIEW (focused_widget))
+               GtkTreeSelection *selection = NULL;
+               
+               if (!(MODEST_IS_HEADER_VIEW (focused_widget)))
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
                                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
-
+                               
                /* Select all messages */
                selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
                gtk_tree_selection_select_all (selection);
 
                /* Set focuse on header view */
                gtk_widget_grab_focus (header_view);
-
-       } else if (GTK_IS_HTML (focused_widget)) {
-               gtk_html_select_all (GTK_HTML (focused_widget));
        }
+
 }
 
 void
@@ -2743,6 +2803,10 @@ msgs_move_to_confirmation (GtkWindow *win,
                g_object_unref (header);
                g_object_unref (iter);
 
+               /* if no src_folder, message may be an attahcment */
+               if (src_folder == NULL) 
+                       return GTK_RESPONSE_CANCEL;
+
                /* If the source is a remote folder */
                if (!modest_tny_folder_is_local_folder (src_folder)) {
                        const gchar *message;
@@ -2884,8 +2948,9 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                        g_object_unref (headers);
                }
        }
-       g_object_unref (folder_store);
  end:
+       if (folder_store != NULL)
+               g_object_unref (folder_store);
        gtk_widget_destroy (dialog);
 }
 
@@ -2925,6 +2990,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
 
                /* Create header list */
                header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));              
+                       
                headers = tny_simple_list_new ();
                tny_list_prepend (headers, G_OBJECT (header));
                g_object_unref (header);
@@ -3045,7 +3111,7 @@ modest_ui_actions_remove_attachments (GtkAction *action,
                                      ModestWindow *window)
 {
        if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
-               modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
+               modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window));
        } else {
                /* not supported window for this action */
                g_return_if_reached ();
@@ -3060,7 +3126,7 @@ modest_ui_actions_on_settings (GtkAction *action,
 
        dialog = modest_platform_get_global_settings_dialog ();
        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
-       gtk_widget_show (dialog);
+       gtk_widget_show_all (dialog);
 
        gtk_dialog_run (GTK_DIALOG (dialog));