2007-06-20 Murray Cumming <murrayc@murrayc-desktop>
[modest] / src / modest-ui-actions.c
index 0af6fe9..663915b 100644 (file)
@@ -97,6 +97,7 @@ typedef struct _ReplyForwardHelper {
        GtkWidget *parent_window;
 } ReplyForwardHelper;
 
+
 /*
  * The do_headers_action uses this kind of functions to perform some
  * action to each member of a list of headers
@@ -263,9 +264,18 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
        gint response;
        gboolean found;
        ModestWindowMgr *mgr;
+       GtkWidget *header_view;
 
        g_return_if_fail (MODEST_IS_WINDOW(win));
 
+       /* Check first if the header view has the focus */
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                                  MODEST_WIDGET_TYPE_HEADER_VIEW);
+               if (!gtk_widget_is_focus (header_view))
+                       return;
+       }
+
        header_list = get_selected_headers (win);
        if (!header_list) return;
 
@@ -297,16 +307,15 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
        }
 
        /* Select message */
-       if (tny_list_get_length(header_list) > 1)
-               message = g_strdup(_("emev_nc_delete_messages"));
-       else {
+       if (tny_list_get_length(header_list) == 1) {
                iter = tny_list_create_iterator (header_list);
                header = TNY_HEADER (tny_iterator_get_current (iter));
                desc = g_strdup_printf ("%s", tny_header_get_subject (header)); 
-               message = g_strdup_printf(_("emev_nc_delete_message"), desc);
                g_object_unref (header);
                g_object_unref (iter);
        }
+       message = g_strdup_printf(ngettext("emev_nc_delete_message", "emev_nc_delete_messages", 
+                                          tny_list_get_length(header_list)), desc);
 
        /* Confirmation dialog */               
        response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
@@ -465,9 +474,9 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
        /* Show the window: */  
        gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
        gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
-    gtk_widget_show (specific_window);
+       gtk_widget_show (specific_window);
     
-    /* Save changes when the window is hidden: */
+       /* Save changes when the window is hidden: */
        g_signal_connect (specific_window, "hide", 
                G_CALLBACK (on_smtp_servers_window_hide), win);
 #endif /* MODEST_PLATFORM_MAEMO */
@@ -492,9 +501,9 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
                        return;
        }
        
-       account_name = g_strdup(modest_window_get_active_account (win));
+       account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
        if (!account_name)
-               account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
+               account_name = g_strdup (modest_window_get_active_account (win));
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                goto cleanup;
@@ -584,9 +593,9 @@ open_msg_cb (ModestMailOperation *mail_op,
        headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
 
        /* Get account */
-       account =  g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
+       account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
        if (!account)
-               account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
+               account =  g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
        
        /* Gets folder type (OUTBOX headers will be opened in edit window */
        if (modest_tny_folder_is_local_folder (folder))
@@ -649,6 +658,7 @@ open_msg_cb (ModestMailOperation *mail_op,
 cleanup:
        /* Free */
        g_free(account);
+       g_object_unref (parent_win);
        g_object_unref (msg);
        g_object_unref (folder);
        g_object_unref (header);
@@ -670,6 +680,7 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
 
                modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
                                                        error->message);
+               g_object_unref (win);
        }
 }
 
@@ -715,11 +726,20 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
                                                                 modest_ui_actions_get_msgs_full_error_handler, 
                                                                 NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       modest_mail_operation_get_msgs_full (mail_op, 
-                                            not_opened_headers, 
-                                            open_msg_cb, 
-                                            NULL, 
-                                            NULL);
+       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);
+       }
+
        /* Clean */
        g_object_unref (not_opened_headers);
        g_object_unref (iter);
@@ -1127,9 +1147,9 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win)
                modest_ui_actions_do_send_receive ((const char*) iter->data, win);
                iter = g_slist_next (iter);
        }
-       
-       g_slist_foreach (account_names, (GFunc) g_free, NULL);
-       g_slist_free (account_names);
+
+       modest_account_mgr_free_account_names (account_names);
+       account_names = NULL;
 }
 
 /*
@@ -1197,7 +1217,7 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
                return;
        
        /* Update Main window title */
-       if (GTK_WIDGET_HAS_FOCUS (header_view)) {
+       if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
                const gchar *subject = tny_header_get_subject (header);
                if (subject && strlen(subject) > 0)
                        gtk_window_set_title (GTK_WINDOW (main_window), subject);
@@ -1255,7 +1275,7 @@ folder_refreshed_cb (const GObject *obj,
                     TnyFolder *folder, 
                     gpointer user_data)
 {
-       printf ("DEBUG: %s\n", __FUNCTION__);
+/*     printf ("DEBUG: %s\n", __FUNCTION__); */
        ModestMainWindow *win = NULL;
        GtkWidget *header_view;
 
@@ -1272,21 +1292,6 @@ folder_refreshed_cb (const GObject *obj,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
        } else {
                printf ("DEBUG: %s: tny_folder_get_all_count() returned >0.\n", __FUNCTION__);
-
-               /* Set the header view, we could change it to
-                  the empty view after the refresh. We do not
-                  need to save the configuration because we
-                  have already done that when unselecting the
-                  folder */
-               modest_main_window_set_contents_style (win, 
-                                                      MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
-
-               /* Restore configuration. There is no need to set the
-                  contents style to headers because it was already
-                  being done in folder_selection_changed */
-               modest_widget_memory_restore (modest_runtime_get_conf (), 
-                                             G_OBJECT(header_view),
-                                             MODEST_CONF_HEADER_VIEW_KEY);
        }
 }
 
@@ -1309,20 +1314,29 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
        conf = modest_runtime_get_conf ();
 
        if (TNY_IS_ACCOUNT (folder_store)) {
-               /* Update active account */
-               set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
-               /* Show account details */
-               modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+               if (selected) {
+                       /* Update active account */
+                       set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
+                       /* Show account details */
+                       modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+               }
        } else {
                if (TNY_IS_FOLDER (folder_store) && selected) {
                        
-                       if (!TNY_IS_MERGE_FOLDER (folder_store)) { /* TnyMergeFolder can have no get_account() implementation. */
-                               /* Update the active account */
-                               TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
+                       /* Update the active account */
+                       TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
+                       if (account) {
                                set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
                                g_object_unref (account);
+                               account = NULL;
                        }
 
+                       /* Set the header style by default, it could
+                          be changed later by the refresh callback to
+                          empty */
+                       modest_main_window_set_contents_style (main_window, 
+                                                              MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
+
                        /* Set folder on header view. This function
                           will call tny_folder_refresh_async so we
                           pass a callback that will be called when
@@ -1332,13 +1346,21 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                                                       TNY_FOLDER (folder_store),
                                                       folder_refreshed_cb,
                                                       main_window);
+                       
+                       /* Restore configuration. We need to do this
+                          *after* the set_folder because the widget
+                          memory asks the header view about its
+                          folder  */
+                       modest_widget_memory_restore (modest_runtime_get_conf (), 
+                                                     G_OBJECT(header_view),
+                                                     MODEST_CONF_HEADER_VIEW_KEY);
                } else {
                        /* Update the active account */
                        modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
                        /* Do not show folder */
                        modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY);
                        modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
-               }                       
+               }
        }
 
        /* Update toolbar dimming state */
@@ -1892,6 +1914,7 @@ modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
 
        modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
                                                _("mail_in_ui_folder_delete_error"));
+       g_object_unref (win);
 }
 
 static void
@@ -2157,6 +2180,10 @@ modest_ui_actions_on_cut (GtkAction *action,
                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);
+       } 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)) {
+               modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
        }
 }
 
@@ -2169,16 +2196,41 @@ modest_ui_actions_on_copy (GtkAction *action,
 
        clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
        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);
        } else if (GTK_IS_EDITABLE (focused_widget)) {
                gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
        } 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);
-       }
+               modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
+       } 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);
+               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+               TnyFolder *folder = tny_header_get_folder (header);
+               TnyAccount *account = tny_folder_get_account (folder);
+               const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
+               /* If it's POP then ask */
+               gboolean ask = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
+                      MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
+               g_object_unref (account);
+               g_object_unref (folder);
+               g_object_unref (header);
+               g_object_unref (iter);
+               
+               /* Check that the messages have been previously downloaded */
+               gboolean continue_download = TRUE;
+               if (ask)
+                       continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
+               if (continue_download)
+                       modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
+               g_object_unref (header_list);
+       } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
+               modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
+       }    
 }
 
 void
@@ -2197,6 +2249,7 @@ modest_ui_actions_on_paste (GtkAction *action,
                            ModestWindow *window)
 {
        GtkWidget *focused_widget;
+       ModestMailOperation *mail_op = NULL;
 
        focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
        if (GTK_IS_EDITABLE (focused_widget)) {
@@ -2208,6 +2261,52 @@ modest_ui_actions_on_paste (GtkAction *action,
                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_FOLDER_VIEW (focused_widget)) {
+               ModestEmailClipboard *clipboard = NULL;
+               TnyFolder *src_folder = NULL;
+               TnyFolderStore *folder_store = NULL;
+               TnyList *data = NULL;           
+               gboolean delete = FALSE;
+               
+               /* Check clipboard source */
+               clipboard = modest_runtime_get_email_clipboard ();
+               if (modest_email_clipboard_cleared (clipboard)) 
+                       return;
+               
+               /* Get elements to paste */
+               modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
+
+               /* Create a new mail operation */
+               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                                mail_op);
+               
+               /* Get destination folder */
+               folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
+
+               /* transfer messages  */
+               if (data != NULL) {
+                       modest_mail_operation_xfer_msgs (mail_op, 
+                                                        data,
+                                                        TNY_FOLDER (folder_store),
+                                                        delete,
+                                                        NULL,
+                                                        NULL);
+                       
+               } else if (src_folder != NULL) {                        
+                       modest_mail_operation_xfer_folder (mail_op, 
+                                                          src_folder,
+                                                          folder_store,
+                                                          delete);
+               }
+
+               /* Free */
+               if (data != NULL) 
+                       g_object_unref (data);
+               if (src_folder != NULL) 
+                       g_object_unref (src_folder);
+               if (folder_store != NULL) 
+                       g_object_unref (folder_store);
        }
 }
 
@@ -2247,6 +2346,10 @@ modest_ui_actions_on_select_all (GtkAction *action,
                /* 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));
        }
@@ -2450,6 +2553,7 @@ modest_ui_actions_on_details (GtkAction *action,
                                return;
 
                        show_folder_details (folder, GTK_WINDOW (win));
+                       g_object_unref (folder);
 
                } else {
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
@@ -2662,17 +2766,13 @@ msgs_move_to_confirmation (GtkWindow *win,
                if (!modest_tny_folder_is_local_folder (src_folder)) {
                        const gchar *message;
                        
-                       if (tny_list_get_length (headers) == 1)
-                               if (has_retrieved_msgs (headers))
-                                       message = _("mcen_nc_move_retrieve");
-                               else
-                                       message = _("mcen_nc_move_header");
-                       else
-                               if (has_retrieved_msgs (headers))
-                                       message = _("mcen_nc_move_retrieves");
-                               else
-                                       message = _("mcen_nc_move_headers");
-                       
+                       if (has_retrieved_msgs (headers))
+                               message = ngettext ("mcen_nc_move_retrieve", "mcen_nc_move_retrieves",
+                                                   tny_list_get_length (headers));
+                       else 
+                               message = ngettext ("mcen_nc_move_header", "mcen_nc_move_headers",
+                                                   tny_list_get_length (headers));
+
                        response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
                                                                            (const gchar *) message);
                }
@@ -2705,6 +2805,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
        /* TODO: show error message */
        modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
                                                _("mail_in_ui_folder_move_target_error"));
+       g_object_unref (win);
 }
 
 /*
@@ -3029,6 +3130,7 @@ modest_ui_actions_on_help (GtkAction *action,
                                        help_id = NULL;
                                }
                        }
+                       g_object_unref (folder_store);
                } else {
                        help_id = "applications_email_mainview";        
                }
@@ -3191,3 +3293,5 @@ _on_send_receive_progress_changed (ModestMailOperation  *mail_op,
                modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));
        
 }
+
+