Refactored the code that offers UI to add contacts to address book
[modest] / src / hildon2 / modest-msg-view-window.c
index 8f481f0..25659fe 100644 (file)
@@ -67,6 +67,7 @@
 #include <modest-debug.h>
 #include <modest-header-window.h>
 #include <modest-account-protocol.h>
+#include <tny-camel-msg.h>
 
 #define MYDOCS_ENV "MYDOCSDIR"
 #define DOCS_FOLDER ".documents"
@@ -229,6 +230,7 @@ static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
                                                   GdkEvent *event,
                                                   gpointer userdata);
 static void update_branding (ModestMsgViewWindow *self);
+static void sync_flags      (ModestMsgViewWindow *self);
 
 /* list my signals */
 enum {
@@ -602,7 +604,7 @@ modest_msg_view_window_disconnect_signals (ModestWindow *self)
                                                           MODEST_HEADER_VIEW_OBSERVER(self));
                }
        }
-}      
+}
 
 static void
 modest_msg_view_window_finalize (GObject *obj)
@@ -949,8 +951,6 @@ modest_msg_view_window_new_from_uid (const gchar *modest_account_name,
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
 
-
-
        is_merge = g_str_has_prefix (msg_uid, "merge:");
 
        /* Get the account */
@@ -958,7 +958,6 @@ modest_msg_view_window_new_from_uid (const gchar *modest_account_name,
                account = tny_account_store_find_account (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()),
                                                          msg_uid);
 
-       
        if (is_merge || account) {
                TnyFolder *folder = NULL;
 
@@ -991,6 +990,8 @@ modest_msg_view_window_new_from_uid (const gchar *modest_account_name,
                                        update_window_title (MODEST_MSG_VIEW_WINDOW (window));
                                        update_branding (MODEST_MSG_VIEW_WINDOW (window));
                                        g_object_unref (msg);
+                                       /* Sync flags to server */
+                                       sync_flags (MODEST_MSG_VIEW_WINDOW (window));
                                } else {
                                        message_reader (window, priv, NULL, msg_uid, folder, NULL);
                                }
@@ -2156,6 +2157,7 @@ view_msg_cb (ModestMailOperation *mail_op,
                if (self) {
                        /* Restore window title */
                        update_window_title (self);
+                       modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
                        g_object_unref (self);
                }
                return;
@@ -2169,6 +2171,7 @@ view_msg_cb (ModestMailOperation *mail_op,
                if (self) {
                        /* Restore window title */
                        update_window_title (self);
+                       modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
                        g_object_unref (self);
                }
                return;
@@ -2214,13 +2217,18 @@ view_msg_cb (ModestMailOperation *mail_op,
        }
 
        /* Notify the observers */
-       g_signal_emit (G_OBJECT (self), signals[MSG_CHANGED_SIGNAL], 
+       g_signal_emit (G_OBJECT (self), signals[MSG_CHANGED_SIGNAL],
                       0, priv->header_model, priv->row_reference);
 
+       /* Sync the flags if the message is not opened from a header
+          model, i.e, if it's opened from a notification */
+       if (!priv->header_model)
+               sync_flags (self);
+
        /* Frees */
        g_object_unref (self);
        if (row_reference)
-               gtk_tree_row_reference_free (row_reference);            
+               gtk_tree_row_reference_free (row_reference);
 }
 
 TnyFolderType
@@ -2307,24 +2315,22 @@ toolbar_resize (ModestMsgViewWindow *self)
        static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?120:120;
 
        if (parent_priv->toolbar) {
-               /* left size buttons */
+               /* Set expandable and homogeneous tool buttons */
                widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
-               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_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
                widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReplyAll");
-               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_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageForward");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
                widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
-               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_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
                widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDownloadExternalImages");
-               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_expand (GTK_TOOL_ITEM (widget), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
                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);
@@ -2566,6 +2572,7 @@ modest_msg_view_window_get_attachments (ModestMsgViewWindow *win)
 typedef struct {
        ModestMsgViewWindow *self;
        gchar *file_path;
+       gchar *attachment_uid;
 } DecodeAsyncHelper;
 
 static void
@@ -2576,30 +2583,83 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part,
                                   gpointer user_data)
 {
        DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
-
-       /* It could happen that the window was closed */
-       if (GTK_WIDGET_VISIBLE (helper->self))
-               set_progress_hint (helper->self, FALSE);
+       const gchar *content_type;
 
        if (cancelled || err) {
                if (err) {
-                       gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+                       gchar *msg;
+                       if ((err->domain == TNY_ERROR_DOMAIN) && 
+                           (err->code == TNY_IO_ERROR_WRITE) &&
+                           (errno == ENOSPC)) {
+                               msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+                       } else {
+                               msg = g_strdup (_("mail_ib_file_operation_failed"));
+                       }
                        modest_platform_information_banner (NULL, NULL, msg);
                        g_free (msg);
                }
                goto free;
        }
 
-       /* make the file read-only */
-       g_chmod(helper->file_path, 0444);
+       /* It could happen that the window was closed. So we
+          assume it is a cancelation */
+       if (!GTK_WIDGET_VISIBLE (helper->self))
+               goto free;
+
+       /* Remove the progress hint */
+       set_progress_hint (helper->self, FALSE);
+
+       content_type = tny_mime_part_get_content_type (mime_part);
+       if (g_str_has_prefix (content_type, "message/rfc822")) {
+               ModestWindowMgr *mgr;
+               ModestWindow *msg_win = NULL;
+               TnyMsg * msg;
+               gchar *account;
+               const gchar *mailbox;
+               TnyStream *file_stream;
+               gint fd;
+
+               fd = g_open (helper->file_path, O_RDONLY, 0644);
+               if (fd != -1) {
+                       file_stream = tny_fs_stream_new (fd);
+
+                       mgr = modest_runtime_get_window_mgr ();
+
+                       account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (helper->self)));
+                       mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (helper->self));
+
+                       if (!account)
+                               account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
+
+                       msg = tny_camel_msg_new ();
+                       tny_camel_msg_parse (msg, file_stream);
+                       msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (msg), account, mailbox, helper->attachment_uid);
+                       modest_window_set_zoom (MODEST_WINDOW (msg_win),
+                                               modest_window_get_zoom (MODEST_WINDOW (helper->self)));
+                       if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (helper->self)))
+                               gtk_widget_show_all (GTK_WIDGET (msg_win));
+                       else
+                               gtk_widget_destroy (GTK_WIDGET (msg_win));
+                       g_object_unref (msg);
+                       g_object_unref (file_stream);
+               } else {
+                       modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+               }
 
-       /* Activate the file */
-       modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
+       } else {
+
+               /* make the file read-only */
+               g_chmod(helper->file_path, 0444);
+
+               /* Activate the file */
+               modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
+       }
 
  free:
        /* Frees */
        g_object_unref (helper->self);
        g_free (helper->file_path);
+       g_free (helper->attachment_uid);
        g_slice_free (DecodeAsyncHelper, helper);
 }
 
@@ -2673,21 +2733,25 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window,
                        helper = g_slice_new0 (DecodeAsyncHelper);
                        helper->self = g_object_ref (window);
                        helper->file_path = g_strdup (filepath);
+                       helper->attachment_uid = g_strdup (attachment_uid);
 
                        decode_in_provider = FALSE;
                        mgr = modest_runtime_get_account_mgr ();
                        account = modest_window_get_active_account (MODEST_WINDOW (window));
                        if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
                                if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+                                       gchar *uri;
+                                       uri = g_strconcat ("file://", filepath, NULL);
                                        decode_in_provider = 
                                                modest_account_protocol_decode_part_to_stream_async (
                                                        MODEST_ACCOUNT_PROTOCOL (protocol),
                                                        mime_part,
-                                                       NULL,
+                                                       filepath,
                                                        TNY_STREAM (temp_stream),
                                                        on_decode_to_stream_async_handler,
                                                        NULL,
                                                        helper);
+                                       g_free (uri);
                                }
                        }
 
@@ -3533,10 +3597,6 @@ setup_menu (ModestMsgViewWindow *self)
                                           APP_MENU_CALLBACK (modest_ui_actions_on_move_to),
                                           MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_move_to));
 
-       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_forward"), "<Control>d",
-                                          APP_MENU_CALLBACK (modest_ui_actions_on_forward),
-                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
-
        modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_read"), NULL,
                                           APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_read),
                                           MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_read_msg_in_view));
@@ -3571,7 +3631,6 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
        GSList *recipients = NULL;
        TnyMsg *msg = NULL;
-       gboolean contacts_to_add = FALSE;
 
        msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
        if (msg == NULL) {
@@ -3587,51 +3646,11 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
                g_object_unref (msg);
        }
 
-       if (recipients != NULL) {
-               GtkWidget *picker_dialog;
-               GtkWidget *selector;
-               GSList *node;
-               gchar *selected = NULL;
-
-               selector = hildon_touch_selector_new_text ();
-               g_object_ref (selector);
-
-               for (node = recipients; node != NULL; node = g_slist_next (node)) {
-                       if (!modest_address_book_has_address ((const gchar *) node->data)) {
-                               hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector), 
-                                                                  (const gchar *) node->data);
-                               contacts_to_add = TRUE;
-                       }
-               }
-
-               if (contacts_to_add) {
-                       gint picker_result;
-
-                       picker_dialog = hildon_picker_dialog_new (GTK_WINDOW (self));
-                       gtk_window_set_title (GTK_WINDOW (picker_dialog), _("mcen_me_viewer_addtocontacts"));
-
-                       hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (picker_dialog), 
-                                                          HILDON_TOUCH_SELECTOR (selector));
-                       
-                       picker_result = gtk_dialog_run (GTK_DIALOG (picker_dialog));
-
-                       if (picker_result == GTK_RESPONSE_OK) {
-                               selected = hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector));
-                       }
-                       gtk_widget_destroy (picker_dialog);
-
-                       if (selected)
-                               modest_address_book_add_address (selected, (GtkWindow *) self);
-                       g_free (selected);
-
-               } else {
-
-                       g_object_unref (selector);
-
-               }
+       if (recipients) {
+               /* Offer the user to add recipients to the address book */
+               modest_address_book_add_address_list_with_selector (recipients, (GtkWindow *) self);
+               g_slist_foreach (recipients, (GFunc) g_free, NULL); g_slist_free (recipients);
        }
-       
-       if (recipients) {g_slist_foreach (recipients, (GFunc) g_free, NULL); g_slist_free (recipients);}
 }
 
 static gboolean 
@@ -3734,3 +3753,35 @@ update_branding (ModestMsgViewWindow *self)
        modest_msg_view_set_branding (MODEST_MSG_VIEW (priv->msg_view), service_name, service_icon);
        g_free (service_name);
 }
+
+static void
+sync_flags (ModestMsgViewWindow *self)
+{
+       TnyHeader *header = NULL;
+
+       header = modest_msg_view_window_get_header (self);
+       if (!header) {
+               TnyMsg *msg = modest_msg_view_window_get_message (self);
+               if (msg) {
+                       header = tny_msg_get_header (msg);
+                       g_object_unref (msg);
+               }
+       }
+
+       if (header) {
+               TnyFolder *folder = tny_header_get_folder (header);
+
+               if (folder) {
+                       ModestMailOperation *mail_op;
+
+                       /* Sync folder, we need this to save the seen flag */
+                       mail_op = modest_mail_operation_new (NULL);
+                       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                                                        mail_op);
+                       modest_mail_operation_sync_folder (mail_op, folder, FALSE, NULL, NULL);
+                       g_object_unref (mail_op);
+                       g_object_unref (folder);
+               }
+               g_object_unref (header);
+       }
+}