X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=98593ab7fbafb8d283d5c0aea6733b0ef8aa3523;hp=3638194c90468cc0db8d2f024b78270c43b4207c;hb=d2766e0125d45ae66dbe70b51eb90e3b0e493982;hpb=478474a3ac38e088f438c26bd80f83b22321c127 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 3638194..98593ab 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -32,13 +32,14 @@ #endif /*HAVE_CONFIG_H*/ #include +#include #include #include #include #include #include #include - +#include "modest-error.h" #include "modest-ui-actions.h" #include "modest-tny-platform-factory.h" @@ -54,6 +55,7 @@ #include #include #include +#include "widgets/modest-folder-view.h" #include "widgets/modest-global-settings-dialog.h" #include "modest-connection-specific-smtp-window.h" #include "modest-account-mgr-helpers.h" @@ -90,6 +92,7 @@ typedef struct _ReplyForwardHelper { guint reply_forward_type; ReplyForwardAction action; gchar *account_name; + GtkWidget *parent_window; } ReplyForwardHelper; /* @@ -118,6 +121,13 @@ static void reply_forward (ReplyForwardAction action, ModestWindow static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); + +static void _on_send_receive_progress_changed (ModestMailOperation *mail_op, + ModestMailOperationState *state, + gpointer user_data); + + + void modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) { @@ -235,12 +245,41 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) gchar *message = NULL; gchar *desc = NULL; gint response; + gboolean found; + ModestWindowMgr *mgr; g_return_if_fail (MODEST_IS_WINDOW(win)); header_list = get_selected_headers (win); if (!header_list) return; + /* Check if any of the headers is already opened */ + iter = tny_list_create_iterator (header_list); + found = FALSE; + mgr = modest_runtime_get_window_mgr (); + while (!tny_iterator_is_done (iter) && !found) { + header = TNY_HEADER (tny_iterator_get_current (iter)); + if (modest_window_mgr_find_window_by_header (mgr, header)) + found = TRUE; + g_object_unref (header); + tny_iterator_next (iter); + } + g_object_unref (iter); + + if (found) { + gchar *num, *msg; + + num = g_strdup_printf ("%d", tny_list_get_length (header_list)); + msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num); + + modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg); + + g_free (msg); + g_free (num); + g_object_unref (header_list); + return; + } + /* Select message */ if (tny_list_get_length(header_list) > 1) message = g_strdup(_("emev_nc_delete_messages")); @@ -249,6 +288,8 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) header = TNY_HEADER (tny_iterator_get_current (iter)); desc = g_strdup_printf ("%s", tny_header_get_subject (header)); message = g_strdup_printf(_("emev_nc_delete_message"), desc); + g_object_unref (header); + g_object_unref (iter); } /* Confirmation dialog */ @@ -275,7 +316,6 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) g_free(message); g_free(desc); g_object_unref (header_list); - g_object_unref (iter); } @@ -313,8 +353,14 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); selection = gtk_clipboard_wait_for_text (clipboard); - modest_address_book_add_address (selection); - g_free (selection); + /* Question: why is the clipboard being used here? + * It doesn't really make a lot of sense. */ + + if (selection) + { + modest_address_book_add_address (selection); + g_free (selection); + } } void @@ -324,10 +370,8 @@ 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(), - TRUE /* enabled accounts only */); - gboolean accounts_exist = account_names != NULL; - g_slist_free (account_names); + gboolean accounts_exist = modest_account_mgr_has_accounts( + modest_runtime_get_account_mgr(), TRUE); if (!accounts_exist) { /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */ @@ -430,7 +474,7 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) /* GError *err = NULL; */ TnyAccount *account = NULL; ModestWindowMgr *mgr; - gchar *signature = NULL; + gchar *signature = NULL, *blank_and_signature = NULL; account_name = g_strdup(modest_window_get_active_account (win)); if (!account_name) @@ -440,7 +484,7 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) goto cleanup; } - account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), + account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(), account_name, TNY_ACCOUNT_TYPE_STORE); if (!account) { @@ -458,11 +502,13 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) { signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name, MODEST_ACCOUNT_SIGNATURE, FALSE); + blank_and_signature = g_strconcat ("\n", signature, NULL); + g_free (signature); } else { - signature = g_strdup (""); + blank_and_signature = g_strdup (""); } - msg = modest_tny_msg_new ("", from_str, "", "", "", signature, NULL); + msg = modest_tny_msg_new ("", from_str, "", "", "", blank_and_signature, NULL); if (!msg) { g_printerr ("modest: failed to create new msg\n"); goto cleanup; @@ -496,7 +542,7 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) cleanup: g_free (account_name); g_free (from_str); - g_free (signature); + g_free (blank_and_signature); if (account) g_object_unref (G_OBJECT(account)); if (msg) @@ -542,6 +588,8 @@ open_msg_cb (ModestMailOperation *mail_op, if (folder_type == TNY_FOLDER_TYPE_DRAFTS) { win = modest_msg_edit_window_new (msg, account); } else { + gchar *uid = modest_tny_folder_get_header_unique_id (header); + if (MODEST_IS_MAIN_WINDOW (parent_win)) { GtkWidget *header_view; GtkTreeSelection *sel; @@ -562,16 +610,18 @@ open_msg_cb (ModestMailOperation *mail_op, g_list_free (sel_list); win = modest_msg_view_window_new_with_header_model (msg, - account, + account, + (const gchar*) uid, model, row_reference); gtk_tree_row_reference_free (row_reference); } else { - win = modest_msg_view_window_new (msg, account); + win = modest_msg_view_window_new (msg, account, (const gchar*) uid); } } else { - win = modest_msg_view_window_new (msg, account); + win = modest_msg_view_window_new (msg, account, (const gchar*) uid); } + g_free (uid); } /* Register and show new window */ @@ -590,6 +640,25 @@ open_msg_cb (ModestMailOperation *mail_op, } /* + * This function is the error handler of the + * modest_mail_operation_get_msgs_full operation + */ +static void +modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op, + gpointer user_data) +{ + const GError *error; + + error = modest_mail_operation_get_error (mail_op); + if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) { + GObject *win = modest_mail_operation_get_source (mail_op); + + modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, + error->message); + } +} + +/* * 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. @@ -609,26 +678,34 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) while (!tny_iterator_is_done (iter)) { ModestWindow *window; TnyHeader *header; - + header = TNY_HEADER (tny_iterator_get_current (iter)); - window = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header)); - if (window) + window = modest_window_mgr_find_window_by_header (mgr, header); + if (window) { + /* Do not open again the message and present + the window to the user */ tny_list_remove (headers, G_OBJECT (header)); + gtk_window_present (GTK_WINDOW (window)); + } g_object_unref (header); tny_iterator_next (iter); } + /* Open each message */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT (win)); + mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, + G_OBJECT (win), + modest_ui_actions_get_msgs_full_error_handler, + NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_get_msgs_full (mail_op, headers, open_msg_cb, NULL, NULL); - /* Clean */ + g_object_unref (iter); g_object_unref(mail_op); } @@ -670,8 +747,6 @@ reply_forward_cb (ModestMailOperation *mail_op, ModestWindow *msg_win; ModestEditType edit_type; gchar *from; - GError *err = NULL; - TnyFolder *folder = NULL; TnyAccount *account = NULL; ModestWindowMgr *mgr; gchar *signature = NULL; @@ -720,7 +795,7 @@ reply_forward_cb (ModestMailOperation *mail_op, goto cleanup; } - account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), + account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(), rf_helper->account_name, TNY_ACCOUNT_TYPE_STORE); if (!account) { @@ -728,33 +803,24 @@ reply_forward_cb (ModestMailOperation *mail_op, goto cleanup; } - folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS); - if (!folder) { - g_printerr ("modest: failed to find Drafts folder\n"); - 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 the windows */ + /* Create and register the windows */ msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name); mgr = modest_runtime_get_window_mgr (); modest_window_mgr_register_window (mgr, msg_win); + if (rf_helper->parent_window != NULL) { + gdouble parent_zoom; + + parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window)); + modest_window_set_zoom (msg_win, parent_zoom); + } + /* Show edit window */ gtk_widget_show_all (GTK_WIDGET (msg_win)); cleanup: if (new_msg) g_object_unref (G_OBJECT (new_msg)); - if (folder) - g_object_unref (G_OBJECT (folder)); if (account) g_object_unref (G_OBJECT (account)); g_object_unref (msg); @@ -784,6 +850,9 @@ download_uncached_messages (TnyList *header_list, GtkWindow *win) header = TNY_HEADER (tny_iterator_get_current (iter)); flags = tny_header_get_flags (header); + /* TODO: is this the right flag?, it seems that some + headers that have been previously downloaded do not + come with it */ found = !(flags & TNY_HEADER_FLAG_CACHED); g_object_unref (header); tny_iterator_next (iter); @@ -843,6 +912,8 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) rf_helper->reply_forward_type = reply_forward_type; rf_helper->action = action; rf_helper->account_name = g_strdup (modest_window_get_active_account (win)); + if ((win != NULL) && (MODEST_IS_WINDOW (win))) + rf_helper->parent_window = GTK_WIDGET (win); if (!rf_helper->account_name) rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); @@ -854,7 +925,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) reply_forward_cb must do it */ msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win)); header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); - if (!msg || !header) { + if (!msg || !header) { if (msg) g_object_unref (msg); if (header) @@ -865,7 +936,10 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) reply_forward_cb (NULL, header, msg, rf_helper); } else { /* Retrieve messages */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win)); + mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, + G_OBJECT(win), + modest_ui_actions_get_msgs_full_error_handler, + NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_get_msgs_full (mail_op, header_list, @@ -964,41 +1038,20 @@ modest_ui_actions_on_sort (GtkAction *action, } } -/** Check that an appropriate connection is open. - */ -gboolean check_for_connection (const gchar *account_name) -{ - TnyDevice *device = modest_runtime_get_device (); - -/* - 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; - } -} - /* * This function performs the send & receive required actions. The - * window it's used to create the mail operation. Tipically it should - * be allways the main window, but we pass it as argument in order to + * window is used to create the mail operation. Typically it should + * always be the main window, but we pass it as argument in order to * be more flexible. */ void modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win) { gchar *acc_name = NULL; + ModestMailOperation *mail_op; - /* If no account name was provided get the current account, if - there is none either then pick the default one */ + /* If no account name was provided then get the current account, and if + there is no current account then pick the default one: */ if (!account_name) { acc_name = g_strdup (modest_window_get_active_account(win)); if (!acc_name) @@ -1011,32 +1064,21 @@ modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win) acc_name = g_strdup (account_name); } + /* Set send/receive operation in progress */ + modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win)); + + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win)); + g_signal_connect (G_OBJECT(mail_op), "progress-changed", + G_CALLBACK (_on_send_receive_progress_changed), + win); + /* Send & receive. */ - - /* Do not continue if no suitable connection - is open */ - if (!check_for_connection (acc_name)) { - g_free (acc_name); - return; - } - - /* TODO: Do not continue if an operation is already in progress: - * Maybe there are some operations that tinymail allows to - * happen simulatenously. - * TODO: Maybe a simple global gboolean is_updating is enough? - * murrayc. - */ - - /* 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: - */ - /* Create the mail operation */ /* TODO: The spec wants us to first do any pending deletions, before receiving. */ - ModestMailOperation *mail_op; - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win)); + /* Receive and then send. The operation is tagged initially as + a receive operation because the account update performs a + receive and then a send. The operation changes its type + internally, so the progress objects will receive the proper + progress information */ modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_update_account (mail_op, acc_name); g_object_unref (G_OBJECT (mail_op)); @@ -1073,11 +1115,9 @@ modest_ui_actions_do_send_receive_all (ModestWindow *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); + /* Check if accounts exist */ + gboolean accounts_exist = + modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE); /* If not, allow the user to create an account before trying to send/receive. */ if (!accounts_exist) @@ -1127,19 +1167,23 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view, ModestMainWindow *main_window) { g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - + g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view)); + /* If no header has been selected then exit */ if (!header) return; - + /* Update Main window title */ if (GTK_WIDGET_HAS_FOCUS (header_view)) { const gchar *subject = tny_header_get_subject (header); - if (subject && strcmp (subject, "")) + if (subject && strlen(subject) > 0) gtk_window_set_title (GTK_WINDOW (main_window), subject); else gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject")); } + + /* Update toolbar dimming state */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); } void @@ -1189,7 +1233,8 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, { ModestConf *conf; GtkWidget *header_view; - + gboolean folder_empty = FALSE; + g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); header_view = modest_main_window_get_child_widget(main_window, @@ -1204,27 +1249,33 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window)); /* Show account details */ modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); - } else if (modest_tny_folder_store_is_virtual_local_folders (folder_store )) { - printf ("DEBUG: %s: folder store.\n", __FUNCTION__); - //TODO: Set the virtual folder store as the "active account" somehow: - modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); } else { if (TNY_IS_FOLDER (folder_store) && selected) { if (!TNY_IS_MERGE_FOLDER (folder_store)) { /* TnyMergeFolder can have no get_account() implementation. */ /* Update the active account */ - TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder_store)); + TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store)); set_active_account_from_tny_account (account, MODEST_WINDOW (main_window)); g_object_unref (account); } + /* Set folder on header view */ - modest_main_window_set_contents_style (main_window, - MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), - TNY_FOLDER (folder_store)); - modest_widget_memory_restore (conf, G_OBJECT(header_view), - MODEST_CONF_HEADER_VIEW_KEY); + TNY_FOLDER (folder_store)); + + /* Set main view style */ + folder_empty = tny_folder_get_all_count (TNY_FOLDER (folder_store)) == 0; + if (folder_empty) { + modest_main_window_set_contents_style (main_window, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); + } + else { + modest_main_window_set_contents_style (main_window, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); + modest_widget_memory_restore (conf, G_OBJECT(header_view), + MODEST_CONF_HEADER_VIEW_KEY); + } } else { /* Update the active account */ modest_window_set_active_account (MODEST_WINDOW (main_window), NULL); @@ -1233,6 +1284,9 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); } } + + /* Update toolbar dimming state */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); } void @@ -1276,7 +1330,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) { -// modest_platform_connect_and_wait ();; +// modest_platform_connect_and_wait (); } } gtk_widget_destroy (dialog); @@ -1343,8 +1397,13 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_msg_edit_window_free_msg_data (edit_window, data); return; } + + if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) { + account_name = g_strdup (data->account_name); + } + transport_account = - TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account + TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account (modest_runtime_get_account_store(), account_name, TNY_ACCOUNT_TYPE_TRANSPORT)); @@ -1362,6 +1421,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_mail_operation_save_to_drafts (mail_operation, transport_account, + data->draft_msg, from, data->to, data->cc, @@ -1387,32 +1447,32 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi void modest_ui_actions_on_send (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)); if (!modest_msg_edit_window_check_names (edit_window)) return; - data = modest_msg_edit_window_get_msg_data (edit_window); - /* FIXME: Code added just for testing. The final version will use the send queue provided by tinymail and some classifier */ - account_mgr = modest_runtime_get_account_mgr(); - account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window))); + ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr(); + gchar *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 = + + MsgData *data = modest_msg_edit_window_get_msg_data (edit_window); + + if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) { + account_name = g_strdup (data->account_name); + } + + /* Get the currently-active transport account for this modest account: */ + TnyTransportAccount *transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(), account_name)); @@ -1422,14 +1482,43 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) modest_msg_edit_window_free_msg_data (edit_window, data); return; } - from = modest_account_mgr_get_from_string (account_mgr, account_name); + + gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name); - /* Create the mail operation */ - mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window)); + /* mail content checks and dialogs */ + if (data->subject == NULL || data->subject[0] == '\0') { + GtkResponseType response; + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window), + _("mcen_nc_subject_is_empty_send")); + if (response == GTK_RESPONSE_CANCEL) { + g_free (account_name); + return; + } + } + + if (data->plain_body == NULL || data->plain_body[0] == '\0') { + GtkResponseType response; + gchar *note_message; + gchar *note_subject = data->subject; + if (note_subject == NULL || note_subject[0] == '\0') + note_subject = _("mail_va_no_subject"); + note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject); + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window), + note_message); + g_free (note_message); + if (response == GTK_RESPONSE_CANCEL) { + g_free (account_name); + return; + } + } + + /* Create the mail operation */ + ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_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, transport_account, + data->draft_msg, from, data->to, data->cc, @@ -1439,7 +1528,8 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) data->html_body, data->attachments, data->priority_flags); - /* Frees */ + + /* Free data: */ g_free (from); g_free (account_name); g_object_unref (G_OBJECT (transport_account)); @@ -1447,7 +1537,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) modest_msg_edit_window_free_msg_data (edit_window, data); - /* Save settings and close the window */ + /* Save settings and close the window: */ gtk_widget_destroy (GTK_WIDGET (edit_window)); } @@ -1666,26 +1756,20 @@ 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_TYPE_INFO, G_OBJECT(main_window)); + ModestMailOperation *mail_op; TnyFolder *new_folder = NULL; + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, + G_OBJECT(main_window)); 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), */ -/* _("mail_in_ui_folder_create_error")); */ -/* } */ + } g_object_unref (mail_op); } g_free (folder_name); @@ -1745,6 +1829,16 @@ modest_ui_actions_on_rename_folder (GtkAction *action, } static void +modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op, + gpointer user_data) +{ + GObject *win = modest_mail_operation_get_source (mail_op); + + modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, + _("mail_in_ui_folder_delete_error")); +} + +static void delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) { TnyFolderStore *folder; @@ -1776,17 +1870,15 @@ 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_TYPE_DELETE, G_OBJECT(main_window)); + ModestMailOperation *mail_op = + modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE, + G_OBJECT(main_window), + modest_ui_actions_delete_folder_error_handler, + NULL); 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), - _("mail_in_ui_folder_delete_error")); - g_object_unref (G_OBJECT (mail_op)); } @@ -1856,6 +1948,11 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, gchar *server_name = modest_server_account_get_hostname ( modest_runtime_get_account_mgr(), server_account_name); + if (!server_name) {/* This happened once, though I don't know why. murrayc. */ + g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name); + *cancel = TRUE; + return; + } /* This causes a warning because the logical ID has no %s in it, * though the translation does, but there is not much we can do about that: */ @@ -1985,7 +2082,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, gtk_widget_destroy (dialog); - printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); + /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */ } void @@ -2001,7 +2098,7 @@ modest_ui_actions_on_cut (GtkAction *action, GtkTextBuffer *buffer; GtkClipboard *clipboard; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE); } @@ -2014,7 +2111,7 @@ modest_ui_actions_on_copy (GtkAction *action, GtkClipboard *clipboard; GtkWidget *focused_widget; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); if (GTK_IS_LABEL (focused_widget)) { gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1); @@ -2052,7 +2149,7 @@ modest_ui_actions_on_paste (GtkAction *action, GtkTextBuffer *buffer; GtkClipboard *clipboard; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE); } @@ -2080,6 +2177,21 @@ modest_ui_actions_on_select_all (GtkAction *action, gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_select_range (buffer, &start, &end); } + else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) || + (MODEST_IS_HEADER_VIEW (focused_widget))) { + + GtkTreeSelection *selection = NULL; + + /* Get header view */ + GtkWidget *header_view = focused_widget; + if (MODEST_IS_FOLDER_VIEW (focused_widget)) + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window), + MODEST_WIDGET_TYPE_HEADER_VIEW); + + /* Select all messages */ + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view)); + gtk_tree_selection_select_all (selection); + } } void @@ -2408,8 +2520,18 @@ create_move_to_dialog (ModestWindow *win, /* 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))); + + /* It could happen that we're trying to move a message from a + window (msg window for example) after the main window was + closed, so we can not just get the model of the folder + view */ + if (MODEST_IS_FOLDER_VIEW (folder_view)) + gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view), + gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view))); + else + modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view), + TNY_ACCOUNT_STORE (modest_runtime_get_account_store ())); + gtk_container_add (GTK_CONTAINER (scroll), *tree_view); /* Add scroll to dialog */ @@ -2512,17 +2634,15 @@ tranasfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data) g_return_if_fail (found); } -static void -move_to_error_checking (const GObject *obj, gpointer user_data) +void +modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, + gpointer user_data) { - ModestWindow *win = NULL; - - g_return_if_fail (MODEST_IS_WINDOW (obj)); - win = MODEST_WINDOW (obj); + GObject *win = modest_mail_operation_get_source (mail_op); /* TODO: show error message */ -/* modest_platform_run_information_dialog (GTK_WINDOW (win), */ -/* _("mail_in_ui_folder_move_target_error")); */ + modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, + _("mail_in_ui_folder_move_target_error")); } /* @@ -2551,6 +2671,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, /* Create and run the dialog */ dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); + modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view)); result = gtk_dialog_run (GTK_DIALOG(dialog)); g_object_ref (tree_view); @@ -2572,18 +2693,19 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), NULL); if (TNY_IS_FOLDER (src_folder)) { - mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, - G_OBJECT(win), - move_to_error_checking); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); + mail_op = + modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, + G_OBJECT(win), + modest_ui_actions_move_folder_error_handler, + NULL); + 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); + /* Unref mail operation */ g_object_unref (G_OBJECT (mail_op)); - } /* Frees */ @@ -2612,13 +2734,13 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, TRUE, NULL, NULL); + g_object_unref (G_OBJECT (mail_op)); } g_object_unref (headers); } } g_object_unref (folder_store); - end: gtk_widget_destroy (dialog); } @@ -2640,8 +2762,11 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, /* 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); + if (main_window) + folder_view = modest_main_window_get_child_widget (main_window, + MODEST_WIDGET_TYPE_FOLDER_VIEW); + else + folder_view = NULL; /* Create and run the dialog */ dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); @@ -2682,7 +2807,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, tranasfer_msgs_from_viewer_cb, NULL); g_object_unref (G_OBJECT (mail_op)); - } + } g_object_unref (headers); g_object_unref (folder_store); } @@ -2787,6 +2912,61 @@ modest_ui_actions_on_settings (GtkAction *action, } void +modest_ui_actions_on_help (GtkAction *action, + ModestWindow *win) +{ + const gchar *help_id = NULL; + + if (MODEST_IS_MAIN_WINDOW (win)) { + const gchar *action_name; + action_name = gtk_action_get_name (action); + + if (!strcmp (action_name, "FolderViewCSMHelp") || + !strcmp (action_name, "HeaderViewCSMHelp")) { + GtkWidget *folder_view; + TnyFolderStore *folder_store; + /* Get selected folder */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Switch help_id */ + if (TNY_IS_FOLDER (folder_store)) { + switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) { + case TNY_FOLDER_TYPE_NORMAL: + help_id = "applications_email_userfolder"; + break; + case TNY_FOLDER_TYPE_INBOX: + help_id = "applications_email_inbox"; + break; + case TNY_FOLDER_TYPE_OUTBOX: + help_id = "applications_email_outbox"; + break; + case TNY_FOLDER_TYPE_SENT: + help_id = "applications_email_sent"; + break; + case TNY_FOLDER_TYPE_DRAFTS: + help_id = "applications_email_drafts"; + break; + case TNY_FOLDER_TYPE_ARCHIVE: + help_id = "applications_email_archive"; + break; + default: + help_id = NULL; + } + } + } else { + help_id = "applications_email_mainview"; + } + } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + help_id = "applications_email_viewer"; + } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) + help_id = "applications_email_editor"; + + modest_platform_show_help (GTK_WINDOW (win), help_id); +} + +void modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, ModestWindow *window) { @@ -2799,7 +2979,10 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, return; /* Create mail operation */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT (window)); + mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, + G_OBJECT (window), + modest_ui_actions_get_msgs_full_error_handler, + NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL); @@ -2807,3 +2990,100 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, g_object_unref (headers); g_object_unref (mail_op); } + +void +modest_ui_actions_on_email_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_edit_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules"); +} + +void +modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_platform_show_search_messages (GTK_WINDOW (window)); +} + +void +modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_WINDOW (win)); + modest_platform_show_addressbook (GTK_WINDOW (win)); +} + + +void +modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action)); +} + +static void +_on_send_receive_progress_changed (ModestMailOperation *mail_op, + ModestMailOperationState *state, + gpointer user_data) +{ + g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data)); + + /* Set send/receive operation finished */ + if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS) + modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data)); + +}