* select the newly created folder.
[modest] / src / modest-ui-actions.c
index be1d2a0..c25a287 100644 (file)
@@ -48,6 +48,7 @@
 
 #ifdef MODEST_PLATFORM_MAEMO
 #include "maemo/modest-osso-state-saving.h"
+#include "maemo/modest-maemo-utils.h"
 #endif /* MODEST_PLATFORM_MAEMO */
 
 #include "widgets/modest-ui-constants.h"
@@ -253,8 +254,8 @@ headers_action_delete (TnyHeader *header,
        g_object_unref (G_OBJECT (mail_op));
 
        /* refilter treemodel to hide marked-as-deleted rows */
-       if (MODEST_IS_HEADER_VIEW (user_data))
-               modest_header_view_refilter (MODEST_HEADER_VIEW (user_data));
+/*     if (MODEST_IS_HEADER_VIEW (user_data)) */
+/*             modest_header_view_refilter (MODEST_HEADER_VIEW (user_data)); */
 }
 
 void
@@ -329,9 +330,29 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
        
 
        if (response == GTK_RESPONSE_OK) {      
-               ModestMainWindow *main_window;
-               ModestWindowMgr *mgr;
-
+               ModestWindow *main_window = NULL;
+               ModestWindowMgr *mgr = NULL;
+               GtkTreeModel *model = NULL;
+               GtkTreeSelection *sel = NULL;
+               GList *sel_list = NULL, *tmp = NULL;
+               GtkTreeRowReference *row_reference = NULL;
+               GtkTreePath *next_path = NULL;
+
+               /* Find last selected row */                    
+               if (MODEST_IS_MAIN_WINDOW (win)) {
+                       model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+                       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
+                       sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
+                       for (tmp=sel_list; tmp; tmp=tmp->next) {
+                               if (tmp->next == NULL) {
+                                       next_path = gtk_tree_path_copy((GtkTreePath *) tmp->data);
+                                       gtk_tree_path_next (next_path);
+                                       row_reference = gtk_tree_row_reference_new (model, next_path);
+                                       gtk_tree_path_free (next_path);
+                               }
+                       }
+               }
+               
                /* Remove each header. If it's a view window header_view == NULL */
                do_headers_action (win, headers_action_delete, header_view);
 
@@ -343,24 +364,34 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                        } else {
                                modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (win));
                        }
+                       
+                       /* Get main window */
+                       mgr = modest_runtime_get_window_mgr ();
+                       main_window = modest_window_mgr_get_main_window (mgr);
+               }
+               else {                  
+                       /* Move cursor to next row */
+                       main_window = win; 
+
+                       /* Select next row */
+                       if (gtk_tree_row_reference_valid (row_reference)) {
+                               next_path = gtk_tree_row_reference_get_path (row_reference);
+                               gtk_tree_selection_select_path (sel, next_path);
+                               gtk_tree_path_free (next_path);
+                       }
+                       if (row_reference != NULL)
+                               gtk_tree_row_reference_free (row_reference);
                }
 
-               /* Refilter header view model, if main window still exists */
-               mgr = modest_runtime_get_window_mgr ();
-               main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (mgr));
-               if (main_window) {
-                       GtkWidget *widget;
-
-                       widget = modest_main_window_get_child_widget (main_window,
-                                                                     MODEST_WIDGET_TYPE_HEADER_VIEW);
-                       modest_header_view_refilter (MODEST_HEADER_VIEW (widget));
+               /* Update toolbar dimming state */
+               modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
 
-                       /* Update toolbar dimming state */
-                       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
-               }
+               /* Free */
+               g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
+               g_list_free (sel_list);
        }
 
-       /* free */
+       /* Free*/
        g_free(message);
        g_free(desc);
        g_object_unref (header_list);
@@ -369,7 +400,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
 
 
 
-/* delete either message or folder, based on what has focus */
+/* delete either message or folder, based on where we are */
 void
 modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *win)
 {
@@ -378,14 +409,6 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *
        /* Check first if the header view has the focus */
        if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *w;
-
-               w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                        MODEST_WIDGET_TYPE_HEADER_VIEW);
-               if (gtk_widget_is_focus (w)) {
-                       modest_ui_actions_on_delete_message (action, win);
-                       return;
-               }
-               
                w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
                                                         MODEST_WIDGET_TYPE_FOLDER_VIEW);
                if (gtk_widget_is_focus (w)) {
@@ -393,8 +416,7 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *
                        return;
                }
        }
-       g_warning ("BUG: delete toolbar button pressed with neither headerview nor folderview "
-                  "having focus");
+       modest_ui_actions_on_delete_message (action, win);
 }
 
 
@@ -471,9 +493,7 @@ modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
        } else  {
                /* Show the list of accounts: */
                GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
-               gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
-               gtk_dialog_run (account_win);
-               gtk_widget_destroy (GTK_WIDGET(account_win));
+               modest_maemo_show_dialog_and_forget (GTK_WINDOW (win), account_win); 
        }
 #else
        GtkWidget *dialog, *label;
@@ -988,8 +1008,10 @@ reply_forward_cb (ModestMailOperation *mail_op,
        ModestWindowMgr *mgr = NULL;
        gchar *signature = NULL;
 
-       /* If there was any error */
-       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+       /* If there was any error. The mail operation could be NULL,
+          this means that we already have the message downloaded and
+          that we didn't do a mail operation to retrieve it */
+       if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
                return;
                        
        g_return_if_fail (user_data != NULL);
@@ -1081,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;
        gboolean retval;
@@ -1108,11 +1131,15 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win)
        retval = TRUE;
        if (uncached_messages > 0) {
                GtkResponseType response;
-               response = 
-                       modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
-                                                                ngettext("mcen_nc_get_msg",
-                                                                         "mcen_nc_get_msgs",
-                                                                        uncached_messages));
+               if (reply_fwd)
+                       response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                           _("emev_nc_include_original"));
+               else
+                       response =
+                               modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                        ngettext("mcen_nc_get_msg",
+                                                                                 "mcen_nc_get_msgs",
+                                                                                 uncached_messages));
                if (response == GTK_RESPONSE_CANCEL)
                        retval = FALSE;
                else {
@@ -1149,7 +1176,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                return;
 
        /* Check that the messages have been previously downloaded */
-       continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
+       continue_download = download_uncached_messages (header_list, GTK_WINDOW (win), TRUE);
        if (!continue_download) {
                g_object_unref (header_list);
                return;
@@ -1495,7 +1522,7 @@ modest_ui_actions_on_send_receive (GtkAction *action,  ModestWindow *win)
 
                folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
 
-               if (TNY_IS_FOLDER (folder_store)) {
+               if (folder_store && TNY_IS_FOLDER (folder_store)) {
                        header_view = 
                                modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
                                                                     MODEST_WIDGET_TYPE_HEADER_VIEW);
@@ -1509,7 +1536,9 @@ modest_ui_actions_on_send_receive (GtkAction *action,  ModestWindow *win)
                                                       folder_refreshed_cb,
                                                       MODEST_MAIN_WINDOW (win));
                }
-               g_object_unref (folder_store);
+               
+               if (folder_store)
+                       g_object_unref (folder_store);
        }
        
        /* Refresh the active account */
@@ -1810,7 +1839,6 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        gchar *account_name, *from;
        ModestAccountMgr *account_mgr;
        gchar *info_text = NULL;
-       TnyMsg *new_draft = NULL;
 
        g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
        
@@ -1847,18 +1875,19 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
-       new_draft = modest_mail_operation_save_to_drafts (mail_operation,
-                                                         transport_account,
-                                                         data->draft_msg,
-                                                         from,
-                                                         data->to, 
-                                                         data->cc, 
-                                                         data->bcc,
-                                                         data->subject, 
-                                                         data->plain_body, 
-                                                         data->html_body,
-                                                         data->attachments,
-                                                         data->priority_flags);
+       modest_mail_operation_save_to_drafts (mail_operation,
+                                             transport_account,
+                                             data->draft_msg,
+                                             edit_window,
+                                             from,
+                                             data->to, 
+                                             data->cc, 
+                                             data->bcc,
+                                             data->subject, 
+                                             data->plain_body, 
+                                             data->html_body,
+                                             data->attachments,
+                                             data->priority_flags);
        /* Frees */
        g_free (from);
        g_free (account_name);
@@ -1867,10 +1896,6 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        modest_msg_edit_window_free_msg_data (edit_window, data);
 
-       modest_msg_edit_window_set_draft (edit_window, new_draft);
-       if (new_draft != NULL)
-               g_object_unref (new_draft);
-
        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);
@@ -2145,6 +2170,7 @@ modest_ui_actions_new_folder_error_handler (ModestMailOperation *mail_op,
                                            modest_mail_operation_get_error (mail_op)->message);*/
 }
 
+
 void 
 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
 {
@@ -2192,6 +2218,14 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo
                                                                                  parent_folder,
                                                                                  (const gchar *) folder_name);
                                if (new_folder) {
+                                       if (main_window) {
+                                               folder_view = modest_main_window_get_child_widget (main_window,
+                                                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                               if (folder_view)
+                                                       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), 
+                                                                                         new_folder, TRUE);
+                                       }
+
                                        g_object_unref (new_folder);
                                        finished = TRUE;
                                }
@@ -2591,6 +2625,8 @@ modest_ui_actions_on_copy (GtkAction *action,
                gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
        } else if (GTK_IS_EDITABLE (focused_widget)) {
                gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
+       } else if (GTK_IS_HTML (focused_widget)) {
+               gtk_html_copy (GTK_HTML (focused_widget));
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
@@ -2614,7 +2650,7 @@ modest_ui_actions_on_copy (GtkAction *action,
                /* Check that the messages have been previously downloaded */
                gboolean continue_download = TRUE;
                if (ask)
-                       continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
+                       continue_download = download_uncached_messages (header_list, GTK_WINDOW (window), FALSE);
                if (continue_download)
                        modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
                g_object_unref (header_list);
@@ -3022,16 +3058,12 @@ void
 modest_ui_actions_toggle_folders_view (GtkAction *action, 
                                       ModestMainWindow *main_window)
 {
-       ModestConf *conf;
-       
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
-       conf = modest_runtime_get_conf ();
-       
-       if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
-               modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
-       else
+       if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
                modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
+       else
+               modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
 }
 
 void 
@@ -3095,7 +3127,7 @@ modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window
 
 
 static GtkWidget*
-create_move_to_dialog (ModestWindow *win,
+create_move_to_dialog (GtkWindow *win,
                       GtkWidget *folder_view,
                       GtkWidget **tree_view)
 {
@@ -3130,6 +3162,8 @@ create_move_to_dialog (ModestWindow *win,
                modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view), 
                                                 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
 
+       modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (*tree_view), FALSE);
+       
        gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
 
        /* Add scroll to dialog */
@@ -3453,9 +3487,10 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                                                           MODEST_WIDGET_TYPE_HEADER_VIEW);
 
        /* Create and run the dialog */
-       dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
+       dialog = create_move_to_dialog (GTK_WINDOW(win), folder_view, &tree_view);
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
        result = gtk_dialog_run (GTK_DIALOG(dialog));
+       modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (tree_view), TRUE);
        g_object_ref (tree_view);
 
        /* We do this to save an indentation level ;-) */
@@ -3566,8 +3601,9 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
                folder_view = NULL;
 
        /* Create and run the dialog */
-       dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);  
+       dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view);     
        result = gtk_dialog_run (GTK_DIALOG(dialog));
+       modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (tree_view), TRUE);
 
        if (result == GTK_RESPONSE_ACCEPT) {
                TnyFolderStore *folder_store;
@@ -3778,8 +3814,10 @@ modest_ui_actions_on_help (GtkAction *action,
                                        help_id = "applications_email_archive";
                                        break;
                                default:
-                                       help_id = NULL;
+                                       help_id = "applications_email_mainview";
                                }
+                       } else {
+                               help_id = "applications_email_mainview";        
                        }
                        g_object_unref (folder_store);
                } else {