Fixes NB#123401, toolbar icons not dimmed when deleting a message in viewer view
[modest] / src / modest-ui-actions.c
index dd3275c..26effc7 100644 (file)
@@ -521,7 +521,6 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
 
 
        if (response == GTK_RESPONSE_OK) {
-               ModestWindow *main_window = NULL;
                ModestWindowMgr *mgr = NULL;
                GtkTreeModel *model = NULL;
                GtkTreeSelection *sel = NULL;
@@ -552,7 +551,7 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                }
 
                /* Disable window dimming management */
-               modest_window_disable_dimming (MODEST_WINDOW(win));
+               modest_window_disable_dimming (win);
 
                /* Remove each header. If it's a view window header_view == NULL */
                mail_op = modest_mail_operation_new ((GObject *) win);
@@ -565,18 +564,14 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                if (sel != NULL) {
                        gtk_tree_selection_unselect_all (sel);
                }
-               modest_window_enable_dimming (MODEST_WINDOW(win));
+               modest_window_enable_dimming (win);
 
                if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                        modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win));
 
                        /* Get main window */
                        mgr = modest_runtime_get_window_mgr ();
-                       main_window = modest_window_mgr_get_main_window (mgr, FALSE); /* don't create */
                } else if (MODEST_IS_MAIN_WINDOW (win)) {
-                       /* Move cursor to next row */
-                       main_window = win;
-
                        /* Select next or previous row */
                        if (gtk_tree_row_reference_valid (next_row_reference)) {
                                gtk_tree_selection_select_path (sel, next_path);
@@ -597,10 +592,8 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                }
 
                /* Update toolbar dimming state */
-               if (main_window) {
-                       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
-                       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
-               }
+               modest_ui_actions_check_menu_dimming_rules (win);
+               modest_ui_actions_check_toolbar_dimming_rules (win);
 
                /* Free */
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
@@ -863,7 +856,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
                modest_platform_run_information_dialog (
                        GTK_WINDOW(win),
-                       _FM("sfil_ib_opening_not_allowed"),
+                       _("mail_ib_error_attachment_size"),
                        TRUE);
                return;
        }
@@ -1001,7 +994,8 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                              error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) {
                        gchar *subject, *msg, *format = NULL;
                        TnyAccount *account;
-                       subject = tny_header_dup_subject (header);
+                       
+                       subject = header?tny_header_dup_subject (header):NULL;
                        if (!subject)
                                subject = g_strdup (_("mail_va_no_subject"));
 
@@ -1045,6 +1039,7 @@ typedef struct {
 typedef struct {
        GtkTreeModel *model;
        TnyHeader *header;
+       ModestWindow *caller_window;
        OpenMsgBannerInfo *banner_info;
        GtkTreeRowReference *rowref;
 } OpenMsgHelper;
@@ -1349,10 +1344,22 @@ get_account_from_header (TnyHeader *header)
 }
 
 static void
+caller_win_destroyed (OpenMsgHelper *helper, GObject *object)
+{
+       if (helper->caller_window)
+               helper->caller_window = NULL;
+}
+
+static void
 open_msg_helper_destroyer (gpointer user_data)
 {
        OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
 
+       if (helper->caller_window) {
+               g_object_weak_unref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper);
+               helper->caller_window = NULL;
+       }
+
        if (helper->banner_info) {
                g_free (helper->banner_info->message);
                if (helper->banner_info->idle_handler > 0) {
@@ -1392,7 +1399,7 @@ open_msg_performer(gboolean canceled,
        helper = (OpenMsgHelper *) user_data;
 
        status = tny_account_get_connection_status (account);
-       if (err || canceled) {
+       if (err || canceled || helper->caller_window == NULL) {
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
                /* Free the helper */
                open_msg_helper_destroyer (helper);
@@ -1591,6 +1598,8 @@ open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWind
           (the user could switch between folders) */
        helper = g_slice_new (OpenMsgHelper);
        helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
+       helper->caller_window = win;
+       g_object_weak_ref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper);
        helper->header = g_object_ref (header);
        helper->rowref = gtk_tree_row_reference_copy (rowref);
        helper->banner_info = NULL;
@@ -1744,20 +1753,27 @@ reply_forward_cb (ModestMailOperation *mail_op,
 
        /* Create reply mail */
        switch (rf_helper->action) {
+               /* Use the msg_header to ensure that we have all the
+                  information. The summary can lack some data */
+               TnyHeader *msg_header;
        case ACTION_REPLY:
+               msg_header = tny_msg_get_header (msg);
                new_msg =
-                       modest_tny_msg_create_reply_msg (msg, header, from,
+                       modest_tny_msg_create_reply_msg (msg, msg_header, from,
                                                         (use_signature) ? signature : NULL,
                                                         rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_SENDER);
+               g_object_unref (msg_header);
                break;
        case ACTION_REPLY_TO_ALL:
+               msg_header = tny_msg_get_header (msg);
                new_msg =
-                       modest_tny_msg_create_reply_msg (msg, header, from,
+                       modest_tny_msg_create_reply_msg (msg, msg_header, from,
                                                         (use_signature) ? signature : NULL,
                                                         rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_ALL);
                edit_type = MODEST_EDIT_TYPE_REPLY;
+               g_object_unref (msg_header);
                break;
        case ACTION_FORWARD:
                new_msg =
@@ -2297,7 +2313,7 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
                if (!acc_name)
                        acc_name  = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
                if (!acc_name) {
-                       g_printerr ("modest: cannot get default account\n");
+                       modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error"));
                        return;
                }
        } else {
@@ -2307,6 +2323,12 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
        acc_store = modest_runtime_get_account_store ();
        account = modest_tny_account_store_get_server_account (acc_store, acc_name, TNY_ACCOUNT_TYPE_STORE);
 
+       if (!account) {
+               g_free (acc_name);
+               modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error"));
+               return;
+       }
+
        /* Do not automatically refresh accounts that are flagged as
           NO_AUTO_UPDATE. This could be useful for accounts that
           handle their own update times */
@@ -2929,7 +2951,7 @@ enough_space_for_message (ModestMsgEditWindow *edit_window,
        if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
                modest_platform_run_information_dialog (
                        GTK_WINDOW(edit_window),
-                       _FM("sfil_ib_opening_not_allowed"),
+                       _("mail_ib_error_attachment_size"),
                        TRUE);
                return FALSE;
        }
@@ -3364,7 +3386,7 @@ do_create_folder_cb (ModestMailOperation *mail_op,
 
        error = modest_mail_operation_get_error (mail_op);
        if (error) {
-               gboolean disk_full;
+               gboolean disk_full = FALSE;
                TnyAccount *account;
                /* Show an error. If there was some problem writing to
                   disk, show it, otherwise show the generic folder
@@ -3433,14 +3455,10 @@ do_create_folder_performer (gboolean canceled,
        ModestMailOperation *mail_op;
 
        if (canceled || err) {
-               TnyAccount *account = modest_mail_operation_get_account (mail_op);
                /* In disk full conditions we could get this error here */
                modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(),
                                                                (GtkWidget *) parent_window, err,
-                                                               account,
-                                                               _("mail_in_ui_folder_create_error_memory"));
-               if (account)
-                       g_object_unref (account);
+                                                               NULL, _("mail_in_ui_folder_create_error_memory"));
 
                /* This happens if we have selected the outbox folder
                   as the parent */
@@ -5370,7 +5388,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 {
        GObject *win = NULL;
        const GError *error;
-       TnyAccount *account;
+       TnyAccount *account = NULL;
 
 #ifndef MODEST_TOOLKIT_HILDON2
        ModestWindow *main_window = NULL;
@@ -5395,7 +5413,11 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 #endif
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
-       account = modest_mail_operation_get_account (mail_op);
+
+       if (TNY_IS_FOLDER (user_data))
+               account = modest_tny_folder_get_account (TNY_FOLDER (user_data));
+       else if (TNY_IS_ACCOUNT (user_data))
+               account = g_object_ref (user_data);
 
        /* If it's not a disk full error then show a generic error */
        if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(),
@@ -5808,15 +5830,10 @@ on_move_folder_cb (gboolean canceled,
 
        mail_op =
                modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
-                               modest_ui_actions_move_folder_error_handler,
-                               info->src_folder, NULL);
+                                                              modest_ui_actions_move_folder_error_handler,
+                                                              g_object_ref (info->dst_folder), g_object_unref);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                       mail_op);
-
-       /* Select *after* the changes */
-       /* TODO: this function hangs UI after transfer */
-       /*                      modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
-       /*                                                        TNY_FOLDER (src_folder), TRUE); */
+                                        mail_op);
 
        if (MODEST_IS_MAIN_WINDOW (parent_window)) {
                modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),