Do not update window title if the window is destroyed before the message is retrieved
[modest] / src / hildon2 / modest-msg-view-window.c
index b2468ba..fca8093 100644 (file)
@@ -94,7 +94,7 @@ struct _ModestMsgViewWindowPrivate {
 
        /* Whether the message is in outbox */
        gboolean is_outbox;
-       
+
        /* A reference to the @model of the header view 
         * to allow selecting previous/next messages,
         * if the message is currently selected in the header view.
@@ -116,7 +116,7 @@ struct _ModestMsgViewWindowPrivate {
        GtkWidget *remove_attachment_banner;
 
        gchar *msg_uid;
-       
+
        GSList *sighandlers;
 };
 
@@ -222,6 +222,9 @@ static gboolean message_reader (ModestMsgViewWindow *window,
                                GtkTreeRowReference *row_reference);
 
 static void setup_menu (ModestMsgViewWindow *self);
+static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
+                                                  GdkEvent *event,
+                                                  gpointer userdata);
 
 /* list my signals */
 enum {
@@ -530,7 +533,10 @@ init_window (ModestMsgViewWindow *obj)
        priv->find_toolbar = hildon_find_toolbar_new (NULL);
        hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
        gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
-       
+
+       /* NULL-ize fields if the window is destroyed */
+       g_signal_connect (priv->msg_view, "destroy", G_CALLBACK (gtk_widget_destroyed), &(priv->msg_view));
+
        gtk_widget_show_all (GTK_WIDGET(main_vbox));
 }
 
@@ -785,6 +791,10 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        g_signal_connect (G_OBJECT (obj), "move-focus",
                          G_CALLBACK (on_move_focus), obj);
 
+       g_signal_connect (G_OBJECT (obj), "map-event",
+                         G_CALLBACK (_modest_msg_view_window_map_event),
+                         G_OBJECT (obj));
+
        /* Mail Operation Queue */
        priv->queue_change_handler = g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()),
                                                       "queue-changed",
@@ -1460,7 +1470,6 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
                        g_free (priv->last_search);
                        priv->last_search = NULL;
                } else {
-                       modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
                        hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
                }
        } else {
@@ -1470,7 +1479,6 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
                        g_free (priv->last_search);
                        priv->last_search = NULL;
                } else {
-                       modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
                        hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
                }
        }
@@ -1792,6 +1800,7 @@ message_reader_performer (gboolean canceled,
 
        info = (MsgReaderInfo *) user_data;
        if (canceled || err) {
+               update_window_title (MODEST_MSG_VIEW_WINDOW (parent_window));
                goto frees;
        }
 
@@ -1802,7 +1811,7 @@ message_reader_performer (gboolean canceled,
        mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
                                                                 modest_ui_actions_disk_operations_error_handler, 
                                                                 NULL, NULL);
-                               
+
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
        modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
        g_object_unref (mail_op);
@@ -1858,9 +1867,11 @@ message_reader (ModestMsgViewWindow *window,
 
                        response = modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
                                                                            _("mcen_nc_get_msg"));
-                       if (response == GTK_RESPONSE_CANCEL)
+                       if (response == GTK_RESPONSE_CANCEL) {
+                               update_window_title (window);
                                return FALSE;
-               
+                       }
+
                        folder = tny_header_get_folder (header);
                        info = g_slice_new (MsgReaderInfo);
                        info->header = g_object_ref (header);
@@ -2007,12 +2018,24 @@ view_msg_cb (ModestMailOperation *mail_op,
        row_reference = (GtkTreeRowReference *) user_data;
        if (canceled) {
                gtk_tree_row_reference_free (row_reference);
+               self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
+               if (self) {
+                       /* Restore window title */
+                       update_window_title (self);
+                       g_object_unref (self);
+               }
                return;
        }
-       
+
        /* If there was any error */
        if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
-               gtk_tree_row_reference_free (row_reference);                    
+               gtk_tree_row_reference_free (row_reference);
+               self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
+               if (self) {
+                       /* Restore window title */
+                       update_window_title (self);
+                       g_object_unref (self);
+               }
                return;
        }
 
@@ -2140,7 +2163,7 @@ toolbar_resize (ModestMsgViewWindow *self)
        parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
 
        mgr = modest_runtime_get_window_mgr ();
-       static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?118:108;
+       static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?120:120;
 
        if (parent_priv->toolbar) {
                /* left size buttons */
@@ -2160,13 +2183,12 @@ toolbar_resize (ModestMsgViewWindow *self)
                gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
                gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
                gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
-               
+
                gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
                gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
                gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
                gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
        }
-               
 }
 
 static void
@@ -2186,6 +2208,7 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
        if (!parent_priv->toolbar) {
                parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
                                                                  "/ToolBar");
+               gtk_toolbar_set_icon_size (GTK_TOOLBAR (parent_priv->toolbar), HILDON_ICON_SIZE_FINGER);
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
 
                priv->next_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
@@ -2302,7 +2325,7 @@ on_mail_operation_started (ModestMailOperation *mail_op,
        tmp = priv->progress_widgets;
        source = modest_mail_operation_get_source(mail_op);
        if (G_OBJECT (self) == source) {
-               if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ) {
+               if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
                        set_toolbar_transfer_mode(self);
                        while (tmp) {
                                modest_progress_object_add_operation (
@@ -2329,7 +2352,7 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
        op_type = modest_mail_operation_get_type_operation (mail_op);
        tmp = priv->progress_widgets;
        
-       if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ) {
+       if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
                while (tmp) {
                        modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
                                                                 mail_op);
@@ -2340,15 +2363,15 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
                if (observers_empty (self)) {
                        set_progress_hint (self, FALSE);
                }
-
-               /* Update dimming rules. We have to do this right here
-                  and not in view_msg_cb because at that point the
-                  transfer mode is still enabled so the dimming rule
-                  won't let the user delete the message that has been
-                  readed for example */
-               modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
-               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
        }
+
+       /* Update dimming rules. We have to do this right here
+          and not in view_msg_cb because at that point the
+          transfer mode is still enabled so the dimming rule
+          won't let the user delete the message that has been
+          readed for example */
+       check_dimming_rules_after_change (self);
+
 }
 
 static void
@@ -2401,23 +2424,6 @@ modest_msg_view_window_get_attachments (ModestMsgViewWindow *win)
        return selected_attachments;
 }
 
-typedef struct {
-       gchar *filepath;
-       GtkWidget *banner;
-       guint banner_idle_id;
-} DecodeAsyncHelper;
-
-static gboolean
-decode_async_banner_idle (gpointer user_data)
-{
-       DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
-
-       helper->banner_idle_id = 0;
-       helper->banner = hildon_banner_show_animation (NULL, NULL, _("mail_me_opening"));
-
-       return FALSE;
-}
-
 static void
 on_decode_to_stream_async_handler (TnyMimePart *mime_part, 
                                   gboolean cancelled, 
@@ -2425,16 +2431,8 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part,
                                   GError *err, 
                                   gpointer user_data)
 {
-       DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
+       gchar *filepath = (gchar *) user_data;
 
-       if (helper->banner_idle_id > 0) {
-               g_source_remove (helper->banner_idle_id);
-               helper->banner_idle_id = 0;
-       }
-       if (helper->banner) {
-               gtk_widget_destroy (helper->banner);
-               helper->banner = NULL;
-       }
        if (cancelled || err) {
                modest_platform_information_banner (NULL, NULL, 
                                                    _("mail_ib_file_operation_failed"));
@@ -2442,15 +2440,14 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part,
        }
 
        /* make the file read-only */
-       g_chmod(helper->filepath, 0444);
+       g_chmod(filepath, 0444);
 
        /* Activate the file */
-       modest_platform_activate_file (helper->filepath, tny_mime_part_get_content_type (mime_part));
+       modest_platform_activate_file (filepath, tny_mime_part_get_content_type (mime_part));
 
  free:
        /* Frees */
-       g_free (helper->filepath);
-       g_slice_free (DecodeAsyncHelper, helper);
+       g_free (filepath);
 }
 
 void
@@ -2510,16 +2507,12 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window,
                TnyFsStream *temp_stream = NULL;
                temp_stream = modest_utils_create_temp_stream (att_filename, attachment_uid,
                                                               &filepath);
-               
+
                if (temp_stream != NULL) {
-                       DecodeAsyncHelper *helper = g_slice_new (DecodeAsyncHelper);
-                       helper->filepath = g_strdup (filepath);
-                       helper->banner = NULL;
-                       helper->banner_idle_id = g_timeout_add (1000, decode_async_banner_idle, helper);
                        tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream), 
                                                              on_decode_to_stream_async_handler, 
-                                                             NULL, 
-                                                             helper);
+                                                             NULL,
+                                                             g_strdup (filepath));
                        g_object_unref (temp_stream);
                        /* NOTE: files in the temporary area will be automatically
                         * cleaned after some time if they are no longer in use */
@@ -2579,7 +2572,6 @@ typedef struct
 typedef struct
 {
        GList *pairs;
-       GtkWidget *banner;
        GnomeVFSResult result;
 } SaveMimePartInfo;
 
@@ -2602,7 +2594,6 @@ save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct)
        g_list_free (info->pairs);
        info->pairs = NULL;
        if (with_struct) {
-               gtk_widget_destroy (info->banner);
                g_slice_free (SaveMimePartInfo, info);
        }
 }
@@ -2695,9 +2686,6 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info)
        if (!is_ok) {
                save_mime_part_info_free (info, TRUE);
        } else {
-               GtkWidget *banner = hildon_banner_show_animation (NULL, NULL, 
-                                                                 _CS("sfil_ib_saving"));
-               info->banner = banner;
                g_thread_create ((GThreadFunc)save_mime_part_to_file, info, FALSE, NULL);
        }
 
@@ -2782,6 +2770,10 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                /* In Hildon 2.2 save and delete operate over all the attachments as there's no
                 * selection available */
                mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
+               if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts)) {
+                       g_object_unref (mime_parts);
+                       return;
+               }
                if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0)
                        return;
        } else {
@@ -2810,7 +2802,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"), 
                                                     tny_list_get_length (mime_parts));
        }
-       
+
        save_dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), 
                                                      GTK_FILE_CHOOSER_ACTION_SAVE);
 
@@ -2894,7 +2886,8 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean
        }
        g_object_unref (iter);
 
-       if (tny_list_get_length (mime_parts) == 0) {
+       if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts) ||
+           tny_list_get_length (mime_parts) == 0) {
                g_object_unref (mime_parts);
                return;
        }
@@ -2973,11 +2966,18 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean
 static void
 update_window_title (ModestMsgViewWindow *window)
 {
-       ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+       ModestMsgViewWindowPrivate *priv;
        TnyMsg *msg = NULL;
        TnyHeader *header = NULL;
        gchar *subject = NULL;
-       
+
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+       /* Note that if the window is closed while we're retrieving
+          the message, this widget could de deleted */
+       if (!priv->msg_view)
+               return;
+
        msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
 
        if (msg != NULL) {
@@ -2996,9 +2996,10 @@ update_window_title (ModestMsgViewWindow *window)
 }
 
 
-static void on_move_focus (GtkWidget *widget,
-                          GtkDirectionType direction,
-                          gpointer userdata)
+static void
+on_move_focus (GtkWidget *widget,
+              GtkDirectionType direction,
+              gpointer userdata)
 {
        g_signal_stop_emission_by_name (G_OBJECT (widget), "move-focus");
 }
@@ -3114,7 +3115,7 @@ on_fetch_image (ModestMsgView *msgview,
                return FALSE;
        }
 
-       return TRUE;;
+       return TRUE;
 }
 
 static void 
@@ -3221,3 +3222,18 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
        
        if (recipients) {g_slist_foreach (recipients, (GFunc) g_free, NULL); g_slist_free (recipients);}
 }
+
+static gboolean 
+_modest_msg_view_window_map_event (GtkWidget *widget,
+                                  GdkEvent *event,
+                                  gpointer userdata)
+{
+       ModestMsgViewWindow *self = (ModestMsgViewWindow *) userdata;
+       ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+       if (priv->progress_hint) {
+               hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), TRUE);
+       }
+
+       return FALSE;
+}