+ /* Create the error messages */
+ if (tny_list_get_length (not_opened_headers) == 1) {
+ if (proto == MODEST_PROTOCOL_STORE_POP) {
+ error_msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
+ } else if (proto == MODEST_PROTOCOL_STORE_IMAP) {
+ TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
+ TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
+ gchar *subject = tny_header_dup_subject (header);
+ error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"),
+ subject);
+ g_free (subject);
+ g_object_unref (header);
+ g_object_unref (iter);
+ } else {
+ TnyHeader *header;
+ TnyFolder *folder;
+ TnyIterator *iter;
+ TnyFolderType folder_type;
+
+ iter = tny_list_create_iterator (not_opened_headers);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ folder = tny_header_get_folder (header);
+ folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+ show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+ g_object_unref (folder);
+ g_object_unref (header);
+ g_object_unref (iter);
+ error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+ }
+ } else {
+ error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+ }
+
+ /* Create the mail operation */
+ mail_op =
+ modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
+ modest_ui_actions_disk_operations_error_handler,
+ error_msg, g_free);
+ modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+ mail_op);
+
+ if (show_open_draft) {
+ helper->banner_info = g_slice_new (OpenMsgBannerInfo);
+ helper->banner_info->message = g_strdup (_("mail_ib_opening_draft_message"));
+ helper->banner_info->banner = NULL;
+ helper->banner_info->idle_handler = g_timeout_add (500, open_msg_banner_idle,
+ helper->banner_info);
+ }
+
+ modest_mail_operation_get_msgs_full (mail_op,
+ not_opened_headers,
+ open_msg_cb,
+ helper,
+ open_msgs_helper_destroyer);
+
+ /* Frees */
+ clean:
+ if (mail_op)
+ g_object_unref (mail_op);
+ g_object_unref (account);
+}
+
+/*
+ * This function is used by both modest_ui_actions_on_open and
+ * modest_ui_actions_on_header_activated. This way we always do the
+ * same when trying to open messages.
+ */
+static void
+open_msgs_from_headers (TnyList *headers, ModestWindow *win)
+{
+ ModestWindowMgr *mgr = NULL;
+ TnyIterator *iter = NULL, *iter_not_opened = NULL;
+ TnyList *not_opened_headers = NULL;
+ TnyHeaderFlags flags = 0;
+ TnyAccount *account;
+ gint uncached_msgs = 0;
+ GtkWidget *header_view;
+ GtkTreeModel *model;
+ GHashTable *refs_for_headers;
+ OpenMsgHelper *helper;
+ GtkTreeSelection *sel;
+ GList *sel_list = NULL, *sel_list_iter = NULL;
+
+ g_return_if_fail (headers != NULL);
+
+ /* Check that only one message is selected for opening */
+ if (tny_list_get_length (headers) != 1) {
+ modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
+ NULL, _("mcen_ib_select_one_message"));
+ return;
+ }
+
+ mgr = modest_runtime_get_window_mgr ();
+ iter = tny_list_create_iterator (headers);
+
+ /* Get the account */
+ account = get_account_from_header_list (headers);
+
+ if (!account)
+ return;
+
+ /* Get the selections, we need to get the references to the
+ rows here because the treeview/model could dissapear (the
+ user might want to select another folder)*/
+ header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+ MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+ sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
+ refs_for_headers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL,
+ (GDestroyNotify) gtk_tree_row_reference_free);
+
+ /* Look if we already have a message view for each header. If
+ true, then remove the header from the list of headers to