X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=2fd335f476b1373fea54a907268730227ad5546d;hp=c48c9793076b74636e2c93b8680ac32315dbd53b;hb=556398d85f1803ab8d4871a107bc4b8938c444ae;hpb=f9e2e73a439ac085722228659bb9b12dc501a28d diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index c48c979..2fd335f 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -47,10 +47,11 @@ #include #include #include -#include +#include #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" +#include "modest-text-utils.h" #ifdef MODEST_HAVE_EASYSETUP #include "easysetup/modest-easysetup-wizard.h" @@ -87,8 +88,7 @@ static void read_msg_func (gpointer data, gpointer user_data); static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); -static void modest_ui_actions_message_details_cb (gpointer msg_data, - gpointer helper_data); + static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); @@ -109,7 +109,7 @@ modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about), _("a modest e-mail client\n\n" "design and implementation: Dirk-Jan C. Binnema\n" - "contributions from the fine people at KernelConcepts and Igalia\n" + "contributions from the fine people at KC and Ig\n" "uses the tinymail email framework written by Philip van Hoof")); gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); @@ -155,6 +155,12 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) TnyIterator *iter; g_return_if_fail (MODEST_IS_WINDOW(win)); + + if (MODEST_IS_MSG_EDIT_WINDOW (win)) { + gboolean ret_value; + g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); + return; + } header_list = get_selected_headers (win); @@ -168,7 +174,7 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) /* TODO: thick grain mail operation involving a list of objects. Composite pattern ??? */ /* TODO: add confirmation dialog */ - mail_op = modest_mail_operation_new (); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -204,6 +210,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 +241,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 +294,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 +321,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 +341,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 +362,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) @@ -374,6 +393,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 +401,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 +432,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; @@ -583,6 +612,24 @@ modest_ui_actions_on_prev (GtkAction *action, } } +void +modest_ui_actions_on_sort (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW(window)); + + if (MODEST_IS_MAIN_WINDOW (window)) { + GtkWidget *header_view; + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window), + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (!header_view) + return; + + /* Show sorting dialog */ + modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS); + } +} + static gboolean action_send (const gchar* account_name) @@ -592,14 +639,17 @@ action_send (const gchar* account_name) g_return_val_if_fail (account_name, FALSE); + /* Get the transport account according to the open connection, + * because the account might specify connection-specific SMTP servers. + */ tny_account = - modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), - account_name, - TNY_ACCOUNT_TYPE_TRANSPORT); + modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(), + account_name); if (!tny_account) { g_printerr ("modest: cannot get tny transport account for %s\n", account_name); return FALSE; } + send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account)); if (!send_queue) { g_object_unref (G_OBJECT(tny_account)); @@ -634,7 +684,8 @@ action_receive (const gchar* account_name) } /* Create the mail operation */ - mail_op = modest_mail_operation_new (); + /* TODO: The spec wants us to first do any pending deletions, before receiving. */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); 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)); @@ -644,34 +695,127 @@ action_receive (const gchar* account_name) return TRUE; } +/** Check that an appropriate connection is open. + */ +gboolean check_for_connection (const gchar *account_name) +{ + TnyDevice *device = modest_runtime_get_device (); - -void -modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) +/* + g_assert (TNY_IS_MAEMO_CONIC_DEVICE (device)); + + TnyMaemoConicDevice *maemo_device = TNY_MAEMO_CONIC_DEVICE (device); +*/ + + if (tny_device_is_online (device)) + return TRUE; + else { + modest_platform_connect_and_wait (NULL); + + /* TODO: Wait until a result. */ + return TRUE; + } +} + +static void +do_send_receive_current_or_default (ModestWindow *win) { gchar *account_name; - - g_message ("online? %s", + g_message ("%s: online? %s", __FUNCTION__, tny_device_is_online(modest_runtime_get_device()) ? "yes":"no"); - + + /* As per the UI spec, only the active account should be affected, + * else the default folder if there is no active account: */ account_name = g_strdup(modest_window_get_active_account(MODEST_WINDOW(win))); if (!account_name) account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); if (!account_name) { - g_printerr ("modest: cannot get account\n"); + g_printerr ("modest: cannot get default account\n"); return; } + + /* Do not continue if no suitable connection is open: */ + 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)) + g_printerr ("modest: failed to receive\n"); + if (!action_send(account_name)) + g_printerr ("modest: failed to send\n"); + + g_free (account_name); + } +} + - if (!action_send(account_name)) - g_printerr ("modest: failed to send\n"); - if (!action_receive(account_name)) - g_printerr ("modest: failed to receive\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)) + 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 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window) { @@ -690,7 +834,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) @@ -701,7 +845,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"); + MODEST_CONF_HEADER_VIEW_KEY); } @@ -911,23 +1055,17 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); if (selected) { - modest_header_view_set_folder (MODEST_HEADER_VIEW(header_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)) { modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); - -/* if (selected) { */ - -/* } else { */ -/* /\* TODO *\/ */ -/* } */ } } @@ -972,7 +1110,7 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { -// tny_device_force_online (modest_runtime_get_device()); +// modest_platform_connect_and_wait ();; } } gtk_widget_destroy (dialog); @@ -1019,6 +1157,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); + 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; @@ -1028,6 +1227,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); @@ -1044,10 +1246,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) return; } transport_account = - TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account + TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(), - account_name, - TNY_ACCOUNT_TYPE_TRANSPORT)); + account_name)); if (!transport_account) { g_printerr ("modest: no transport account found for '%s'\n", account_name); g_free (account_name); @@ -1057,7 +1258,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 (); + mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_send_new_mail (mail_operation, @@ -1264,27 +1465,46 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); if (parent_folder) { - gchar *folder_name; - - folder_name = ask_for_folder_name (GTK_WINDOW (main_window), - _("Please enter a name for the new folder")); - - if (folder_name != NULL && strlen (folder_name) > 0) { - TnyFolder *new_folder; - ModestMailOperation *mail_op; - - mail_op = modest_mail_operation_new (); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - new_folder = modest_mail_operation_create_folder (mail_op, - parent_folder, - (const gchar *) folder_name); - if (new_folder) - g_object_unref (new_folder); - g_object_unref (mail_op); + gboolean finished = FALSE; + gint result; + gchar *folder_name = NULL, *suggested_name = NULL; + + /* Run the new folder dialog */ + while (!finished) { + result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window), + parent_folder, + suggested_name, + &folder_name); + + if (result == GTK_RESPONSE_REJECT) { + finished = TRUE; + } else { + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); + TnyFolder *new_folder = NULL; + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + new_folder = modest_mail_operation_create_folder (mail_op, + parent_folder, + (const gchar *) folder_name); + if (new_folder) { + g_object_unref (new_folder); + finished = TRUE; + } +/* else { */ +/* /\* TODO: check error and follow proper actions *\/ */ +/* /\* suggested_name = X; *\/ */ +/* /\* Show error to the user *\/ */ +/* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */ +/* MODEST_INFORMATION_CREATE_FOLDER); */ +/* } */ + g_object_unref (mail_op); + } g_free (folder_name); + folder_name = NULL; } + g_object_unref (parent_folder); } } @@ -1313,7 +1533,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 (); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -1332,8 +1552,9 @@ static void delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) { TnyFolderStore *folder; - ModestMailOperation *mail_op; GtkWidget *folder_view; + gint response; + gchar *message; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1343,13 +1564,29 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) return; folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); - - mail_op = modest_mail_operation_new (); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash); - g_object_unref (G_OBJECT (mail_op)); + /* Ask the user */ + message = g_strdup_printf (_("mcen_nc_delete_folder_text"), + tny_folder_get_name (TNY_FOLDER (folder))); + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window), + (const gchar *) message); + g_free (message); + + if (response == GTK_RESPONSE_OK) { + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash); + + /* Show error if happened */ + if (modest_mail_operation_get_error (mail_op)) + modest_platform_run_information_dialog (GTK_WINDOW (main_window), + MODEST_INFORMATION_DELETE_FOLDER); + + g_object_unref (G_OBJECT (mail_op)); + } + g_object_unref (G_OBJECT (folder)); } @@ -1607,56 +1844,110 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action, gtk_window_present (GTK_WINDOW (window)); } +/* + * Show the header details in a ModestDetailsDialog widget + */ static void -modest_ui_actions_message_details_cb (gpointer msg_data, - gpointer helper_data) +show_header_details (TnyHeader *header, + GtkWindow *window) { GtkWidget *dialog; - TnyMsg *msg = (TnyMsg *) msg_data; - TnyHeader *header; - GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data; - - header = tny_msg_get_header (msg); - dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header); - g_object_unref (header); + /* Create dialog */ + dialog = modest_details_dialog_new_with_header (window, header); + + /* Run dialog */ gtk_widget_show_all (dialog); + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); +} + +/* + * Show the folder details in a ModestDetailsDialog widget + */ +static void +show_folder_details (TnyFolder *folder, + GtkWindow *window) +{ + GtkWidget *dialog; + + /* Create dialog */ + dialog = modest_details_dialog_new_with_folder (window, folder); + /* Run dialog */ + gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } + void -modest_ui_actions_on_message_details (GtkAction *action, - ModestWindow *win) +modest_ui_actions_on_details (GtkAction *action, + ModestWindow *win) { TnyList * headers_list; - GetMsgAsyncHelper *helper; - - headers_list = get_selected_headers (win); - if (!headers_list) - return; - - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->window = win; - helper->func = modest_ui_actions_message_details_cb; - helper->iter = tny_list_create_iterator (headers_list); - helper->user_data = NULL; + TnyIterator *iter; + TnyHeader *header; if (MODEST_IS_MSG_VIEW_WINDOW (win)) { TnyMsg *msg; msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win)); - if (!msg) + if (!msg) { return; - else { - modest_ui_actions_message_details_cb (msg, helper); + } else { + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + iter = tny_list_create_iterator (headers_list); + + header = TNY_HEADER (tny_iterator_get_current (iter)); + show_header_details (header, GTK_WINDOW (win)); + g_object_unref (header); + + g_object_unref (iter); + } + } else if (MODEST_IS_MAIN_WINDOW (win)) { + GtkWidget *folder_view, *header_view; + + /* Check which widget has the focus */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + if (gtk_widget_is_focus (folder_view)) { + TnyFolder *folder; + + folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Show only when it's a folder */ + if (!folder || !TNY_IS_FOLDER (folder)) + return; + + show_folder_details (folder, GTK_WINDOW (win)); + + } 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); } - } else { - /* here we should add an implementation to run the message details dialog - from the main window */ - g_return_if_reached (); } } @@ -1731,7 +2022,7 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view, the focus. This callback could be called even if the folder view has not the focus, because the handled signal could be emitted when the folder view is redrawn */ - if (GTK_WIDGET_HAS_FOCUS (folder_view)) { + if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) { if (display_name) gtk_window_set_title (window, display_name); else @@ -1745,3 +2036,292 @@ modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *wi g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); 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, + GtkWidget *folder_view, + GtkWidget **tree_view) +{ + GtkWidget *dialog, *scroll; + + dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"), + GTK_WINDOW (win), + GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL); + + /* Create scrolled window */ + scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + /* Create folder view */ + *tree_view = modest_folder_view_new (NULL); + gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view), + gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view))); + gtk_container_add (GTK_CONTAINER (scroll), *tree_view); + + /* Add scroll to dialog */ + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), + scroll, FALSE, FALSE, 0); + + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + + return dialog; +} + +/* + * Returns TRUE if at least one of the headers of the list belongs to + * a message that has been fully retrieved. + */ +static gboolean +has_retrieved_msgs (TnyList *list) +{ + TnyIterator *iter; + gboolean found = FALSE; + + iter = tny_list_create_iterator (list); + while (tny_iterator_is_done (iter) && !found) { + TnyHeader *header; + TnyHeaderFlags flags; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + flags = tny_header_get_flags (header); + if (!(flags & TNY_HEADER_FLAG_PARTIAL)) + found = TRUE; + + if (!found) + tny_iterator_next (iter); + } + g_object_unref (iter); + + return found; +} + +/* + * Shows a confirmation dialog to the user when we're moving messages + * from a remote server to the local storage. Returns the dialog + * response. If it's other kind of movement the it always returns + * GTK_RESPONSE_OK + */ +static gint +msgs_move_to_confirmation (GtkWindow *win, + TnyFolder *dest_folder, + TnyList *headers) +{ + gint response = GTK_RESPONSE_OK; + + /* If the destination is a local folder */ + if (modest_tny_folder_is_local_folder (dest_folder)) { + TnyFolder *src_folder; + TnyIterator *iter; + TnyHeader *header; + + /* Get source folder */ + iter = tny_list_create_iterator (headers); + header = TNY_HEADER (tny_iterator_get_current (iter)); + src_folder = tny_header_get_folder (header); + g_object_unref (header); + g_object_unref (iter); + + /* If the source is a remote folder */ + if (!modest_tny_folder_is_local_folder (src_folder)) { + const gchar *message; + + if (tny_list_get_length (headers) == 1) + if (has_retrieved_msgs (headers)) + message = _("mcen_nc_move_retrieve"); + else + message = _("mcen_nc_move_header"); + else + if (has_retrieved_msgs (headers)) + message = _("mcen_nc_move_retrieves"); + else + message = _("mcen_nc_move_headers"); + + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + (const gchar *) message); + } + } + return response; +} + +/* + * UI handler for the "Move to" action when invoked from the + * ModestMainWindow + */ +static void +modest_ui_actions_on_main_window_move_to (GtkAction *action, + ModestMainWindow *win) +{ + GtkWidget *dialog, *folder_view, *tree_view = NULL; + gint result; + TnyFolderStore *folder_store; + ModestMailOperation *mail_op = NULL; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW (win)); + + /* Get the folder view */ + folder_view = modest_main_window_get_child_widget (win, + MODEST_WIDGET_TYPE_FOLDER_VIEW); + + /* Create and run the dialog */ + dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); + result = gtk_dialog_run (GTK_DIALOG(dialog)); + + /* We do this to save an indentation level ;-) */ + if (result != GTK_RESPONSE_ACCEPT) + goto end; + + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view)); + + if (TNY_IS_ACCOUNT (folder_store)) + goto end; + + /* Get folder or messages to transfer */ + if (gtk_widget_is_focus (folder_view)) { + TnyFolderStore *src_folder; + 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); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + modest_mail_operation_xfer_folder (mail_op, + TNY_FOLDER (src_folder), + folder_store, + TRUE); + g_object_unref (G_OBJECT (mail_op)); + } + + /* Frees */ + g_object_unref (G_OBJECT (src_folder)); + } else { + GtkWidget *header_view; + header_view = modest_main_window_get_child_widget (win, + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (gtk_widget_is_focus (header_view)) { + TnyList *headers; + gint response; + + headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view)); + + /* Ask for user confirmation */ + response = msgs_move_to_confirmation (GTK_WINDOW (win), + TNY_FOLDER (folder_store), + headers); + + /* Transfer messages */ + if (response == GTK_RESPONSE_OK) { + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + modest_mail_operation_xfer_msgs (mail_op, + headers, + TNY_FOLDER (folder_store), + TRUE); + g_object_unref (G_OBJECT (mail_op)); + } + } + } + g_object_unref (folder_store); + + end: + gtk_widget_destroy (dialog); +} + + +/* + * UI handler for the "Move to" action when invoked from the + * ModestMsgViewWindow + */ +static void +modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, + ModestMsgViewWindow *win) +{ + GtkWidget *dialog, *folder_view, *tree_view = NULL; + gint result; + ModestMainWindow *main_window; + TnyMsg *msg; + TnyHeader *header; + TnyList *headers; + + /* Get the folder view */ + main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ())); + folder_view = modest_main_window_get_child_widget (main_window, + MODEST_WIDGET_TYPE_FOLDER_VIEW); + + /* Create and run the dialog */ + dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); + result = gtk_dialog_run (GTK_DIALOG(dialog)); + + if (result == GTK_RESPONSE_ACCEPT) { + TnyFolderStore *folder_store; + gint response; + + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view)); + + /* Create header list */ + msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win)); + header = tny_msg_get_header (msg); + headers = tny_simple_list_new (); + tny_list_prepend (headers, G_OBJECT (header)); + g_object_unref (header); + g_object_unref (msg); + + /* Ask user for confirmation. MSG-NOT404 */ + response = msgs_move_to_confirmation (GTK_WINDOW (win), + TNY_FOLDER (folder_store), + headers); + + /* Transfer current msg */ + if (response == GTK_RESPONSE_OK) { + ModestMailOperation *mail_op; + + /* Create mail op */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + /* Transfer messages */ + modest_mail_operation_xfer_msgs (mail_op, + headers, + TNY_FOLDER (folder_store), + TRUE); + g_object_unref (G_OBJECT (mail_op)); + } else { + g_object_unref (headers); + } + g_object_unref (folder_store); + } + gtk_widget_destroy (dialog); +} + +void +modest_ui_actions_on_move_to (GtkAction *action, + ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) || + MODEST_IS_MSG_VIEW_WINDOW (win)); + + if (MODEST_IS_MAIN_WINDOW (win)) + modest_ui_actions_on_main_window_move_to (action, + MODEST_MAIN_WINDOW (win)); + else + modest_ui_actions_on_msg_view_window_move_to (action, + MODEST_MSG_VIEW_WINDOW (win)); +}