X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=830de9925929a244180d8c85569be12fae4ad720;hb=a5426ee60e3bc5a1eef0e03ad9192818ef2a487b;hp=834beeb915407869745c7be65b647e223b840bfb;hpb=c77f999bedc4612fc12568a070c592f0b16da8cc;p=modest diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 834beeb..830de99 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -63,10 +63,12 @@ #include #include -typedef struct _GetMsgAsyncHelper { +typedef struct _GetMsgAsyncHelper { ModestWindow *window; + ModestMailOperation *mail_op; TnyIterator *iter; - GFunc func; + guint num_ops; + GFunc func; gpointer user_data; } GetMsgAsyncHelper; @@ -82,16 +84,26 @@ guint reply_forward_type; gchar *account_name; } ReplyForwardHelper; +/* + * The do_headers_action uses this kind of functions to perform some + * action to each member of a list of headers + */ +typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data); + +static void +do_headers_action (ModestWindow *win, + HeadersFunc func, + gpointer user_data); + static void reply_forward_func (gpointer data, gpointer user_data); -static void read_msg_func (gpointer data, gpointer user_data); -static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, + +static void get_msg_cb (TnyFolder *folder, gboolean canceled, TnyMsg *msg, GError **err, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); - void modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) { @@ -148,44 +160,36 @@ get_selected_headers (ModestWindow *win) return NULL; } -void -modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) +static void +headers_action_delete (TnyHeader *header, + ModestWindow *win, + gpointer user_data) { - TnyList *header_list; - TnyIterator *iter; - - g_return_if_fail (MODEST_IS_WINDOW(win)); - - header_list = get_selected_headers (win); - - if (header_list) { - iter = tny_list_create_iterator (header_list); - do { - TnyHeader *header; - ModestMailOperation *mail_op; - - header = TNY_HEADER (tny_iterator_get_current (iter)); - /* TODO: thick grain mail operation involving - a list of objects. Composite pattern ??? */ - /* TODO: add confirmation dialog */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - /* Always delete. TODO: Move to trash still not supported */ - modest_mail_operation_remove_msg (mail_op, header, FALSE); + ModestMailOperation *mail_op; - /* Frees */ - g_object_unref (G_OBJECT (mail_op)); - g_object_unref (G_OBJECT (header)); + /* TODO: add confirmation dialog */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(win)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); - tny_iterator_next (iter); + /* Always delete. TODO: Move to trash still not supported */ + modest_mail_operation_remove_msg (mail_op, header, FALSE); + g_object_unref (G_OBJECT (mail_op)); +} - } while (!tny_iterator_is_done (iter)); +void +modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_WINDOW(win)); - /* Free iter */ - g_object_unref (G_OBJECT (iter)); + if (MODEST_IS_MSG_EDIT_WINDOW (win)) { + gboolean ret_value; + g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); + return; } + + /* Remove each header */ + do_headers_action (win, headers_action_delete, NULL); if (MODEST_IS_MSG_VIEW_WINDOW (win)) { gtk_widget_destroy (GTK_WIDGET(win)); @@ -204,6 +208,9 @@ modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win) { if (MODEST_IS_MSG_VIEW_WINDOW (win)) { gtk_widget_destroy (GTK_WIDGET (win)); + } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) { + gboolean ret_value; + g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); } else if (MODEST_IS_WINDOW (win)) { gtk_widget_destroy (GTK_WIDGET (win)); } else { @@ -232,11 +239,11 @@ modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) * because it requires a providers preset file which is not publically available. */ #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ - GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr()); + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(), + TRUE /* enabled accounts only */); gboolean accounts_exist = account_names != NULL; g_slist_free (account_names); -/* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */ if (!accounts_exist) { /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */ ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new (); @@ -285,9 +292,10 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) TnyFolder *folder = NULL; gchar *account_name = NULL; gchar *from_str = NULL; - GError *err = NULL; +/* GError *err = NULL; */ TnyAccount *account = NULL; ModestWindowMgr *mgr; + gchar *signature = NULL; account_name = g_strdup(modest_window_get_active_account (win)); if (!account_name) @@ -311,7 +319,15 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) goto cleanup; } - msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL); + if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name, + MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) { + signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name, + MODEST_ACCOUNT_SIGNATURE, FALSE); + } else { + signature = g_strdup (""); + } + + msg = modest_tny_msg_new ("", from_str, "", "", "", signature, NULL); if (!msg) { g_printerr ("modest: failed to create new msg\n"); goto cleanup; @@ -323,13 +339,13 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) goto cleanup; } - tny_folder_add_msg (folder, msg, &err); - if (err) { - g_printerr ("modest: error adding msg to Drafts folder: %s", - err->message); - g_error_free (err); - goto cleanup; - } +/* tny_folder_add_msg (folder, msg, &err); */ +/* if (err) { */ +/* g_printerr ("modest: error adding msg to Drafts folder: %s", */ +/* err->message); */ +/* g_error_free (err); */ +/* goto cleanup; */ +/* } */ /* Create and register edit window */ msg_win = modest_msg_edit_window_new (msg, account_name); @@ -344,6 +360,7 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) cleanup: g_free (account_name); g_free (from_str); + g_free (signature); if (account) g_object_unref (G_OBJECT(account)); if (msg) @@ -352,13 +369,28 @@ cleanup: g_object_unref (G_OBJECT(folder)); } +static void +headers_action_open (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + modest_ui_actions_on_header_activated (MODEST_HEADER_VIEW (user_data), + header, + MODEST_MAIN_WINDOW (win)); +} void modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) { - modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */ -} + GtkWidget *header_view; + + /* Get header view */ + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_HEADER_VIEW); + /* Open each message */ + do_headers_action (win, headers_action_open, header_view); +} static void @@ -374,6 +406,7 @@ reply_forward_func (gpointer data, gpointer user_data) TnyFolder *folder = NULL; TnyAccount *account = NULL; ModestWindowMgr *mgr; + gchar *signature = NULL; msg = TNY_MSG (data); helper = (GetMsgAsyncHelper *) user_data; @@ -381,23 +414,30 @@ reply_forward_func (gpointer data, gpointer user_data) from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), rf_helper->account_name); + if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(), + rf_helper->account_name, + MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) { + signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), + rf_helper->account_name, + MODEST_ACCOUNT_SIGNATURE, FALSE); + } /* Create reply mail */ switch (rf_helper->action) { case ACTION_REPLY: new_msg = - modest_tny_msg_create_reply_msg (msg, from, + modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type, MODEST_TNY_MSG_REPLY_MODE_SENDER); break; case ACTION_REPLY_TO_ALL: new_msg = - modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type, + modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type, MODEST_TNY_MSG_REPLY_MODE_ALL); edit_type = MODEST_EDIT_TYPE_REPLY; break; case ACTION_FORWARD: new_msg = - modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type); + modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type); edit_type = MODEST_EDIT_TYPE_FORWARD; break; default: @@ -405,6 +445,8 @@ reply_forward_func (gpointer data, gpointer user_data) return; } + g_free (signature); + if (!new_msg) { g_printerr ("modest: failed to create message\n"); goto cleanup; @@ -448,8 +490,8 @@ cleanup: if (account) g_object_unref (G_OBJECT (account)); - g_free (rf_helper->account_name); - g_slice_free (ReplyForwardHelper, rf_helper); +/* g_free (rf_helper->account_name); */ +/* g_slice_free (ReplyForwardHelper, rf_helper); */ } /* * Common code for the reply and forward actions @@ -460,7 +502,6 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) TnyList *header_list; guint reply_forward_type; TnyHeader *header; - TnyFolder *folder; GetMsgAsyncHelper *helper; ReplyForwardHelper *rf_helper; @@ -493,6 +534,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) helper->func = reply_forward_func; helper->iter = tny_list_create_iterator (header_list); helper->user_data = rf_helper; + helper->num_ops = tny_list_get_length (header_list); if (MODEST_IS_MSG_VIEW_WINDOW(win)) { TnyMsg *msg; @@ -504,14 +546,11 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) reply_forward_func (msg, helper); } else { header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - folder = tny_header_get_folder (header); - if (folder) { - /* The callback will call it per each header */ - tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper); - g_object_unref (G_OBJECT (folder)); - } else - g_printerr ("modest: no folder for header\n"); + helper->mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), helper->mail_op); + modest_mail_operation_process_msg (helper->mail_op, header, helper->num_ops, get_msg_cb, helper); + /* Clean */ g_object_unref (G_OBJECT (header)); } @@ -628,7 +667,7 @@ action_send (const gchar* account_name) return FALSE; } - //modest_tny_send_queue_flush (send_queue); + modest_tny_send_queue_flush (send_queue); g_object_unref (G_OBJECT(send_queue)); g_object_unref (G_OBJECT(tny_account)); @@ -638,7 +677,8 @@ action_send (const gchar* account_name) static gboolean -action_receive (const gchar* account_name) +action_receive (const gchar* account_name, + ModestWindow *win) { TnyAccount *tny_account; ModestMailOperation *mail_op; @@ -656,7 +696,7 @@ action_receive (const gchar* account_name) /* Create the mail operation */ /* TODO: The spec wants us to first do any pending deletions, before receiving. */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account)); @@ -687,13 +727,12 @@ gboolean check_for_connection (const gchar *account_name) return TRUE; } } - -void -modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) + +static void +do_send_receive_current_or_default (ModestWindow *win) { gchar *account_name; - g_message ("%s: online? %s", __FUNCTION__, tny_device_is_online(modest_runtime_get_device()) ? "yes":"no"); @@ -709,22 +748,83 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) } /* Do not continue if no suitable connection is open: */ - if (!check_for_connection (account_name)) - return; + if (check_for_connection (account_name)) { + /* As per the UI spec, + * for POP accounts, we should receive, + * for IMAP we should synchronize everything, including receiving, + * for SMTP we should send, + * first receiving, then sending: + */ + if (!action_receive(account_name, win)) + g_printerr ("modest: failed to receive\n"); + if (!action_send(account_name)) + g_printerr ("modest: failed to send\n"); + + g_free (account_name); + } +} - /* As per the UI spec, - * for POP accounts, we should receive, - * for IMAP we should synchronize everything, including receiving, - * for SMTP we should send, - * first receiving, then sending: - */ - if (!action_receive(account_name)) - g_printerr ("modest: failed to receive\n"); - if (!action_send(account_name)) - g_printerr ("modest: failed to send\n"); + +static void +do_send_receive_auto (ModestWindow *win) +{ + g_message ("%s: online? %s", __FUNCTION__, + tny_device_is_online(modest_runtime_get_device()) ? "yes":"no"); + + /* TODO: Delete the item->data strings as well as the list? */ + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(), + TRUE /* enabled accounts only */); + GSList *iter = account_names; + while (iter) { + const gchar * account_name = (const char*) iter->data; + + /* Do not continue if no suitable connection is open: */ + if (account_name && check_for_connection (account_name)) { + /* As per the UI spec, + * for POP accounts, we should receive, + * for IMAP we should synchronize everything, including receiving, + * for SMTP we should send, + * first receiving, then sending: + */ + if (!action_receive(account_name, win)) + g_printerr ("modest: failed to receive for account %s\n", account_name); + if (!action_send(account_name)) + g_printerr ("modest: failed to send for account %s\n", account_name); + } + } + + g_slist_free (account_names); } +void +do_send_receive (ModestWindow *win) +{ + const gboolean auto_update = TRUE; /* TODO: Get gconf setting. */ + if (auto_update) + do_send_receive_current_or_default (win); + else + do_send_receive_auto (win); +} + +void +modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) +{ + /* Check that at least one account exists: */ + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(), + TRUE /* enabled accounts only */); + gboolean accounts_exist = account_names != NULL; + g_slist_free (account_names); + + /* If not, allow the user to create an account before trying to send/receive. */ + if (!accounts_exist) { + modest_ui_actions_on_accounts (NULL, win); + } + + do_send_receive (win); +} + + void @@ -745,7 +845,7 @@ modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow * /* what is saved/restored is depending on the style; thus; we save with * old style, then update the style, and restore for this new style */ - modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view"); + modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY); if (modest_header_view_get_style (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS) @@ -756,38 +856,7 @@ modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow * MODEST_HEADER_VIEW_STYLE_DETAILS); modest_widget_memory_restore (conf, G_OBJECT(header_view), - "header-view"); -} - - - -/* - * Marks a message as read and passes it to the msg preview widget - */ -static void -read_msg_func (gpointer data, gpointer user_data) -{ - TnyMsg *msg; - TnyHeader *header; - GetMsgAsyncHelper *helper; - TnyHeaderFlags header_flags; - GtkWidget *msg_preview; - - msg = TNY_MSG (data); - helper = (GetMsgAsyncHelper *) user_data; - - msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window), - MODEST_WIDGET_TYPE_MSG_PREVIEW); - if (!msg_preview) - return; - - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - header_flags = tny_header_get_flags (header); - tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN); - g_object_unref (G_OBJECT (header)); - - /* Set message on msg view */ - modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg); + MODEST_CONF_HEADER_VIEW_KEY); } /* @@ -800,12 +869,13 @@ read_msg_func (gpointer data, gpointer user_data) * function */ static void -get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) +get_msg_cb (TnyFolder *folder, gboolean canceled, TnyMsg *msg, GError **err, gpointer user_data) { GetMsgAsyncHelper *helper; helper = (GetMsgAsyncHelper *) user_data; + /* Check errors */ if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) { modest_ui_actions_on_item_not_found (NULL, MODEST_ITEM_TYPE_MESSAGE, @@ -814,22 +884,33 @@ get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) } /* Call user function */ - helper->func (msg, user_data); + if (helper->func) + helper->func (msg, user_data); /* Process next element (if exists) */ tny_iterator_next (helper->iter); if (tny_iterator_is_done (helper->iter)) { + /* Notify the queue */ + if (helper->mail_op != NULL) + modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), helper->mail_op); + + /* Free resources */ TnyList *headers; + ReplyForwardHelper *rf_helper = (ReplyForwardHelper *) helper->user_data; headers = tny_iterator_get_list (helper->iter); - /* Free resources */ g_object_unref (G_OBJECT (headers)); g_object_unref (G_OBJECT (helper->iter)); + g_object_unref (G_OBJECT (helper->mail_op)); + if (rf_helper != NULL) { + g_free (rf_helper->account_name); + g_slice_free (ReplyForwardHelper, rf_helper); + } g_slice_free (GetMsgAsyncHelper, helper); } else { TnyHeader *header; - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - tny_folder_get_msg_async (folder, header, - get_msg_cb, NULL, helper); + header = TNY_HEADER (tny_iterator_get_current (helper->iter)); + modest_mail_operation_process_msg (helper->mail_op, header, helper->num_ops, get_msg_cb, helper); + g_object_unref (G_OBJECT(header)); } } @@ -839,24 +920,11 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view, TnyHeader *header, ModestMainWindow *main_window) { - TnyFolder *folder; - GetMsgAsyncHelper *helper; - TnyList *list; - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - /* when there's no header, clear the msgview */ - if (!header) { - GtkWidget *msg_preview; - - /* Clear msg preview if exists */ - msg_preview = modest_main_window_get_child_widget(main_window, - MODEST_WIDGET_TYPE_MSG_PREVIEW); - - if (msg_preview) - modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL); + /* If no header has been selected then exit */ + if (!header) return; - } /* Update Main window title */ if (GTK_WIDGET_HAS_FOCUS (header_view)) { @@ -866,37 +934,23 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view, else gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject")); } - - /* Create list */ - list = tny_simple_list_new (); - tny_list_prepend (list, G_OBJECT (header)); - - /* Fill helper data */ - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->window = MODEST_WINDOW (main_window); - helper->iter = tny_list_create_iterator (list); - helper->func = read_msg_func; - - folder = tny_header_get_folder (TNY_HEADER(header)); - - tny_folder_get_msg_async (TNY_FOLDER(folder), - header, get_msg_cb, - NULL, helper); - - /* Frees */ - g_object_unref (G_OBJECT (folder)); } void -modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header, +modest_ui_actions_on_header_activated (ModestHeaderView *header_view, TnyHeader *header, ModestMainWindow *main_window) { ModestWindow *win = NULL; TnyFolder *folder = NULL; TnyMsg *msg = NULL; + TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN; ModestWindowMgr *mgr; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *sel = NULL; + GList *sel_list = NULL; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -908,6 +962,8 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader g_printerr ("modest: cannot get folder for header\n"); return; } + if (modest_tny_folder_is_local_folder (folder)) + folder_type = modest_tny_folder_get_local_folder_type (folder); /* FIXME: make async?; check error */ msg = tny_folder_get_msg (folder, header, NULL); @@ -928,7 +984,24 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader if (!account) account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); - win = modest_msg_view_window_new (msg, account); + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view)); + sel_list = gtk_tree_selection_get_selected_rows (sel, &model); + if (sel_list != NULL) { + gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) sel_list->data); + + switch (folder_type) { + case TNY_FOLDER_TYPE_DRAFTS: + win = modest_msg_edit_window_new (msg, account); + break; + default: + win = modest_msg_view_window_new_with_header_model (msg, account, model, iter); + } + + g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL); + g_list_free (sel_list); + } else { + win = modest_msg_view_window_new (msg, account); + } modest_window_mgr_register_window (mgr, win); gtk_window_set_transient_for (GTK_WINDOW (win), @@ -969,9 +1042,9 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), TNY_FOLDER (folder_store)); modest_widget_memory_restore (conf, G_OBJECT(header_view), - "header-view"); + MODEST_CONF_HEADER_VIEW_KEY); } else { - modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view"); + modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY); modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); } } else if (TNY_IS_ACCOUNT (folder_store)) { @@ -1068,6 +1141,67 @@ modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview, } void +modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window) +{ + TnyTransportAccount *transport_account; + ModestMailOperation *mail_operation; + MsgData *data; + gchar *account_name, *from; + ModestAccountMgr *account_mgr; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window)); + + data = modest_msg_edit_window_get_msg_data (edit_window); + + account_mgr = modest_runtime_get_account_mgr(); + account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window))); + if (!account_name) + account_name = modest_account_mgr_get_default_account (account_mgr); + if (!account_name) { + g_printerr ("modest: no account found\n"); + modest_msg_edit_window_free_msg_data (edit_window, data); + return; + } + transport_account = + TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account + (modest_runtime_get_account_store(), + account_name, + TNY_ACCOUNT_TYPE_TRANSPORT)); + if (!transport_account) { + g_printerr ("modest: no transport account found for '%s'\n", account_name); + g_free (account_name); + modest_msg_edit_window_free_msg_data (edit_window, data); + return; + } + from = modest_account_mgr_get_from_string (account_mgr, account_name); + + /* Create the mail operation */ + mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(edit_window)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); + + modest_mail_operation_save_to_drafts (mail_operation, + transport_account, + from, + data->to, + data->cc, + data->bcc, + data->subject, + data->plain_body, + data->html_body, + data->attachments, + data->priority_flags); + /* Frees */ + g_free (from); + g_free (account_name); + g_object_unref (G_OBJECT (transport_account)); + g_object_unref (G_OBJECT (mail_operation)); + + modest_msg_edit_window_free_msg_data (edit_window, data); + + /* Save settings and close the window */ + gtk_widget_destroy (GTK_WIDGET (edit_window)); +} +void modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) { TnyTransportAccount *transport_account; @@ -1077,6 +1211,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) ModestAccountMgr *account_mgr; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window)); + + if (!modest_msg_edit_window_check_names (edit_window)) + return; data = modest_msg_edit_window_get_msg_data (edit_window); @@ -1105,7 +1242,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) from = modest_account_mgr_get_from_string (account_mgr, account_name); /* Create the mail operation */ - mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND); + mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND, G_OBJECT(edit_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_send_new_mail (mail_operation, @@ -1326,7 +1463,7 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo if (result == GTK_RESPONSE_REJECT) { finished = TRUE; } else { - ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window)); TnyFolder *new_folder = NULL; modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), @@ -1380,7 +1517,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, if (folder_name != NULL && strlen (folder_name) > 0) { ModestMailOperation *mail_op; - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -1420,7 +1557,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) g_free (message); if (response == GTK_RESPONSE_OK) { - ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(main_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -1691,17 +1828,19 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action, gtk_window_present (GTK_WINDOW (window)); } -/* - * Show the header details in a ModestDetailsDialog widget +/* + * Used by modest_ui_actions_on_details to call do_headers_action */ static void -show_header_details (TnyHeader *header, - GtkWindow *window) +headers_action_show_details (TnyHeader *header, + ModestWindow *window, + gpointer user_data) + { GtkWidget *dialog; /* Create dialog */ - dialog = modest_details_dialog_new_with_header (window, header); + dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header); /* Run dialog */ gtk_widget_show_all (dialog); @@ -1729,7 +1868,9 @@ show_folder_details (TnyFolder *folder, gtk_widget_destroy (dialog); } - +/* + * Show the header details in a ModestDetailsDialog widget + */ void modest_ui_actions_on_details (GtkAction *action, ModestWindow *win) @@ -1752,7 +1893,7 @@ modest_ui_actions_on_details (GtkAction *action, iter = tny_list_create_iterator (headers_list); header = TNY_HEADER (tny_iterator_get_current (iter)); - show_header_details (header, GTK_WINDOW (win)); + headers_action_show_details (header, win, NULL); g_object_unref (header); g_object_unref (iter); @@ -1777,23 +1918,8 @@ modest_ui_actions_on_details (GtkAction *action, } else { header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), MODEST_WIDGET_TYPE_HEADER_VIEW); - if (!gtk_widget_is_focus (header_view)) - return; - - headers_list = get_selected_headers (win); - if (!headers_list) - return; - - iter = tny_list_create_iterator (headers_list); - while (!tny_iterator_is_done (iter)) { - - header = TNY_HEADER (tny_iterator_get_current (iter)); - show_header_details (header, GTK_WINDOW (win)); - g_object_unref (header); - - tny_iterator_next (iter); - } - g_object_unref (iter); + /* Show details of each header */ + do_headers_action (win, headers_action_show_details, header_view); } } } @@ -1884,6 +2010,13 @@ modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *wi modest_msg_edit_window_select_contacts (window); } +void +modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + modest_msg_edit_window_check_names (window); +} + static GtkWidget* create_move_to_dialog (ModestWindow *win, @@ -2036,7 +2169,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); if (TNY_IS_FOLDER (src_folder)) { - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2066,7 +2199,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, /* Transfer messages */ if (response == GTK_RESPONSE_OK) { - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2133,7 +2266,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, ModestMailOperation *mail_op; /* Create mail op */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2165,3 +2298,33 @@ modest_ui_actions_on_move_to (GtkAction *action, modest_ui_actions_on_msg_view_window_move_to (action, MODEST_MSG_VIEW_WINDOW (win)); } + +/* + * Calls #HeadersFunc for each header already selected in the main + * window or the message currently being shown in the msg view window + */ +static void +do_headers_action (ModestWindow *win, + HeadersFunc func, + gpointer user_data) +{ + TnyList *headers_list; + TnyIterator *iter; + + /* Get headers */ + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + /* Call the function for each header */ + iter = tny_list_create_iterator (headers_list); + while (!tny_iterator_is_done (iter)) { + TnyHeader *header; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + func (header, win, user_data); + g_object_unref (header); + tny_iterator_next (iter); + } + g_object_unref (iter); +}