Only notify for new headers without seen flag (fixes MB#3004)
[modest] / src / modest-ui-actions.c
index 8076dd9..18468d8 100644 (file)
@@ -242,7 +242,6 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
 
                window_list = modest_window_mgr_get_window_list (mgr);
                if (window_list == NULL) {
-                       ModestWindow *old_win;
                        win = MODEST_WINDOW (modest_accounts_window_new ());
                        if (modest_window_mgr_register_window (mgr, win, NULL)) {
                                gtk_widget_show_all (GTK_WIDGET (win));
@@ -251,14 +250,6 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
                                win = NULL;
                        }
 
-                       old_win = win;
-                       win = MODEST_WINDOW (modest_folder_window_new (NULL));
-                       if (modest_window_mgr_register_window (mgr, win, NULL)) {
-                               gtk_widget_show_all (GTK_WIDGET (win));
-                       } else {
-                               gtk_widget_destroy (GTK_WIDGET (win));
-                               win = old_win;
-                       }
                } else {
                        g_list_free (window_list);
                }
@@ -805,7 +796,8 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                goto cleanup;
 
 #ifdef MODEST_TOOLKIT_HILDON2
-       account_name = g_strdup (modest_window_get_active_account(win));
+       if (win)
+               account_name = g_strdup (modest_window_get_active_account(win));
 #endif
        if (!account_name) {
                account_name = modest_account_mgr_get_default_account(mgr);
@@ -815,7 +807,10 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                goto cleanup;
        }
 
-       mailbox = modest_window_get_active_mailbox (win);
+       if (win)
+               mailbox = modest_window_get_active_mailbox (win);
+       else
+               mailbox = NULL;
        account = modest_tny_account_store_get_server_account (store, account_name, TNY_ACCOUNT_TYPE_STORE);
        if (!account) {
                g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
@@ -1234,10 +1229,11 @@ check_memory_full_error (GtkWidget *parent_window, GError *err)
        if (err == NULL)
                return FALSE;
 
-       if (is_memory_full_error (err, NULL))
-               modest_platform_information_banner (parent_window,
-                                                   NULL, _KR("cerm_device_memory_full"));
-       else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
+       if (is_memory_full_error (err, NULL)) {
+               gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+               modest_platform_information_banner (parent_window, NULL, msg);
+               g_free (msg);
+       } else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
                /* If the account was created in memory full
                   conditions then tinymail won't be able to
                   connect so it'll return this error code */
@@ -1265,8 +1261,9 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
           don't show any message */
        if (status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
                if (is_memory_full_error ((GError *) error, mail_op)) {
-                       modest_platform_information_banner ((GtkWidget *) win,
-                                                           NULL, _KR("cerm_device_memory_full"));
+                       gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+                       modest_platform_information_banner ((GtkWidget *) win, NULL, msg);
+                       g_free (msg);
                } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, _("emev_ui_imap_inbox_select_error"));
@@ -2138,9 +2135,34 @@ new_messages_arrived (ModestMailOperation *self,
           send&receive was invoked by the user then do not show any
           visual notification, only play a sound and activate the LED
           (for the Maemo version) */
-       if (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0)
-               modest_platform_on_new_headers_received (new_headers,
-                                                        show_visual_notifications);
+       if (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0) {
+
+               /* We only notify about really new messages (not seen) we get */
+               TnyList *actually_new_list;
+               TnyIterator *iterator;
+               actually_new_list = TNY_LIST (tny_simple_list_new ());
+               for (iterator = tny_list_create_iterator (new_headers);
+                    !tny_iterator_is_done (iterator);
+                    tny_iterator_next (iterator)) {
+                       TnyHeader *header;
+                       TnyHeaderFlags flags;
+                       header = TNY_HEADER (tny_iterator_get_current (iterator));
+                       flags = tny_header_get_flags (header);
+
+                       if (!(flags & TNY_HEADER_FLAG_SEEN)) {
+                               tny_list_append (actually_new_list, G_OBJECT (header));
+                       }
+                       g_object_unref (header);
+                       
+               }
+               g_object_unref (iterator);
+
+               if (tny_list_get_length (actually_new_list) > 0) {
+                       modest_platform_on_new_headers_received (actually_new_list,
+                                                                show_visual_notifications);
+               }
+               g_object_unref (actually_new_list);
+       }
 
 }
 
@@ -2574,7 +2596,7 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                     gpointer user_data)
 {
        ModestMainWindow *win = NULL;
-       GtkWidget *folder_view;
+       GtkWidget *folder_view, *header_view;
        const GError *error;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
@@ -2593,6 +2615,8 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 
        folder_view =
                modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+       header_view =
+               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
        if (folder_view) {
                TnyFolderStore *current_folder;
@@ -2607,10 +2631,10 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
        }
 
        /* Check if folder is empty and set headers view contents style */
-       if (tny_folder_get_all_count (folder) == 0)
+       if ((tny_folder_get_all_count (folder) == 0) ||
+           modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)))
                modest_main_window_set_contents_style (win,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
-
 }
 
 void
@@ -2843,9 +2867,10 @@ enough_space_for_message (ModestMsgEditWindow *edit_window,
        /* Double check: memory full condition or message too big */
        if (available_disk < MIN_FREE_SPACE ||
            expected_size > available_disk) {
+               gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+               modest_platform_information_banner (NULL, NULL, msg);
+               g_free (msg);
 
-               modest_platform_information_banner (NULL, NULL,
-                                                   _KR("cerm_device_memory_full"));
                return FALSE;
        }
 
@@ -3400,20 +3425,21 @@ do_create_folder (GtkWindow *parent_window,
 
 static void
 modest_ui_actions_create_folder(GtkWidget *parent_window,
-                                GtkWidget *folder_view)
+                                GtkWidget *folder_view,
+                               TnyFolderStore *parent_folder)
 {
-       TnyFolderStore *parent_folder;
-
+       if (!parent_folder) {
 #ifdef MODEST_TOOLKIT_HILDON2
-       ModestTnyAccountStore *acc_store;
+               ModestTnyAccountStore *acc_store;
 
-       acc_store = modest_runtime_get_account_store ();
+               acc_store = modest_runtime_get_account_store ();
 
-       parent_folder = (TnyFolderStore *)
-               modest_tny_account_store_get_local_folders_account (acc_store);
+               parent_folder = (TnyFolderStore *)
+                       modest_tny_account_store_get_local_folders_account (acc_store);
 #else
-       parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
+               parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
 #endif
+       }
 
        if (parent_folder) {
                do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
@@ -3435,13 +3461,13 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestWindow *window)
                if (!folder_view)
                        return;
 
-               modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view);
+               modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view, NULL);
 #ifdef MODEST_TOOLKIT_HILDON2
        } else if (MODEST_IS_FOLDER_WINDOW (window)) {
                GtkWidget *folder_view;
 
                folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (window)));
-               modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view);
+               modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view, NULL);
 #endif
        } else {
                g_assert_not_reached ();
@@ -3453,15 +3479,19 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
                                               gpointer user_data)
 {
        const GError *error = NULL;
-       const gchar *message = NULL;
+       gchar *message = NULL;
+       gboolean mem_full;
 
        /* Get error message */
        error = modest_mail_operation_get_error (mail_op);
        if (!error)
                g_return_if_reached ();
 
-       if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
-           error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
+       mem_full = is_memory_full_error ((GError *) error, mail_op);
+       if (mem_full) {
+               message = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+       } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                  error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
                message = _CS("ckdg_ib_folder_already_exists");
        } else if (error->domain == TNY_ERROR_DOMAIN &&
                   error->code == TNY_SERVICE_ERROR_STATE) {
@@ -3475,6 +3505,9 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
        /* We don't set a parent for the dialog because the dialog
           will be destroyed so the banner won't appear */
        modest_platform_information_banner (NULL, NULL, message);
+
+       if (mem_full)
+               g_free (message);
 }
 
 typedef struct {
@@ -4584,7 +4617,18 @@ headers_action_show_details (TnyHeader *header,
                             gpointer user_data)
 
 {
-       modest_platform_run_header_details_dialog (GTK_WINDOW (window), header);
+       gboolean async_retrieval;
+       TnyMsg *msg = NULL;
+
+       if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
+               async_retrieval = TRUE;
+               msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
+       } else {
+               async_retrieval = FALSE;
+       }
+       modest_platform_run_header_details_dialog (GTK_WINDOW (window), header, async_retrieval, msg);
+       if (msg)
+               g_object_unref (msg);
 }
 
 /*
@@ -4913,9 +4957,12 @@ on_move_to_dialog_response (GtkDialog *dialog,
 
        switch (response) {
                TnyFolderStore *dst_folder;
+               TnyFolderStore *selected;
 
        case MODEST_GTK_RESPONSE_NEW_FOLDER:
-               modest_ui_actions_create_folder (GTK_WIDGET (dialog), GTK_WIDGET (folder_view));
+               selected = modest_folder_view_get_selected (folder_view);
+               modest_ui_actions_create_folder (GTK_WIDGET (dialog), GTK_WIDGET (folder_view), selected);
+               g_object_unref (selected);
                return;
        case GTK_RESPONSE_NONE:
        case GTK_RESPONSE_CANCEL:
@@ -5045,7 +5092,9 @@ create_move_to_dialog (GtkWindow *win,
        g_object_set_data (G_OBJECT(dialog), MODEST_MOVE_TO_DIALOG_FOLDER_VIEW, tree_view);
 
        /* Hide special folders */
+#ifndef MODEST_TOOLKIT_HILDON2
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (tree_view), FALSE);
+#endif
        if (list_to_move)
                modest_folder_view_set_list_to_move (MODEST_FOLDER_VIEW (tree_view), list_to_move);
 #ifndef MODEST_TOOLKIT_HILDON2
@@ -5475,13 +5524,15 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
 
-       if (error && is_memory_full_error ((GError *) error, mail_op))
-               modest_platform_information_banner ((GtkWidget *) win,
-                                                   NULL, _KR("cerm_device_memory_full"));
-       else
+       if (error && is_memory_full_error ((GError *) error, mail_op)) {
+               gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+               modest_platform_information_banner ((GtkWidget *) win, NULL, msg);
+               g_free (msg);
+       } else {
                modest_platform_run_information_dialog ((GtkWindow *) win,
                                                        _("mail_in_ui_folder_move_target_error"),
                                                        FALSE);
+       }
        if (win)
                g_object_unref (win);
 }
@@ -6662,3 +6713,31 @@ modest_ui_actions_on_delete_account (GtkWindow *parent_window,
        }
        return removed;
 }
+
+void 
+modest_ui_actions_on_fetch_images (GtkAction *action,
+                                  ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
+
+       modest_msg_view_window_fetch_images (MODEST_MSG_VIEW_WINDOW (window));
+
+}
+
+void
+modest_ui_actions_on_reload_message (const gchar *msg_id)
+{
+       ModestWindow *window = NULL;
+
+       g_return_if_fail (msg_id && msg_id[0] != '\0');
+       if (!modest_window_mgr_find_registered_message_uid (modest_runtime_get_window_mgr (),
+                                                           msg_id,
+                                                           &window))
+               return;
+
+
+       if (window == NULL || !MODEST_IS_MSG_VIEW_WINDOW (window))
+               return;
+
+       modest_msg_view_window_reload (MODEST_MSG_VIEW_WINDOW (window));
+}