X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=3445e47c85e1926affee6a0927ca89f61fb7dd34;hb=ab71824e3c4e16f5a6371895236f9d4055d21eca;hp=fd09f138f65cd46d7163a64ab222219f5b21680e;hpb=f0d8f53cb1a775d9caff277a4538c2aedb4e358b;p=modest diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index fd09f13..3445e47 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -55,6 +55,7 @@ #include #include #include "widgets/modest-global-settings-dialog.h" +#include "modest-connection-specific-smtp-window.h" #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" #include "modest-text-utils.h" @@ -85,16 +86,16 @@ typedef enum _ReplyForwardAction { } ReplyForwardAction; typedef struct _ReplyForwardHelper { -guint reply_forward_type; + guint reply_forward_type; ReplyForwardAction action; gchar *account_name; - guint pending_ops; } ReplyForwardHelper; typedef struct _HeaderActivatedHelper { GtkTreeModel *model; - GtkTreeIter iter; + GtkTreeRowReference *row_reference; TnyFolder *folder; + TnyHeader *header; } HeaderActivatedHelper; /* @@ -109,9 +110,9 @@ do_headers_action (ModestWindow *win, gpointer user_data); -static void open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data); +static void open_msg_func (const GObject *obj, TnyMsg *msg, gpointer user_data); -static void reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data); +static void reply_forward_func (const GObject *obj, TnyMsg *msg, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); @@ -156,17 +157,16 @@ get_selected_headers (ModestWindow *win) } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { /* for MsgViewWindows, we simply return a list with one element */ - TnyMsg *msg; TnyHeader *header; TnyList *list = NULL; - msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win)); - if (msg) { - header = tny_msg_get_header (msg); + header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win)); + if (header != NULL) { list = tny_simple_list_new (); tny_list_prepend (list, G_OBJECT(header)); g_object_unref (G_OBJECT(header)); } + return list; } else @@ -174,17 +174,46 @@ get_selected_headers (ModestWindow *win) } static void +headers_action_mark_as_read (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + TnyHeaderFlags flags; + + g_return_if_fail (TNY_IS_HEADER(header)); + + flags = tny_header_get_flags (header); + if (flags & TNY_HEADER_FLAG_SEEN) return; + tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); +} + +static void +headers_action_mark_as_unread (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + TnyHeaderFlags flags; + + g_return_if_fail (TNY_IS_HEADER(header)); + + flags = tny_header_get_flags (header); + if (flags & TNY_HEADER_FLAG_SEEN) { + tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN); + } +} + + +static void headers_action_delete (TnyHeader *header, ModestWindow *win, gpointer user_data) { - ModestMailOperation *mail_op; + ModestMailOperation *mail_op = NULL; - /* 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); - + /* 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)); @@ -193,20 +222,53 @@ headers_action_delete (TnyHeader *header, void modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) { + TnyList *header_list = NULL; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; + gchar *message = NULL; + gchar *desc = NULL; + gint response; + 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); + if (!header_list) return; + + /* Select message */ + if (tny_list_get_length(header_list) > 1) + message = g_strdup(_("emev_nc_delete_messages")); + else { + iter = tny_list_create_iterator (header_list); + 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); } + + /* Confirmation dialog */ + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + message); + + + if (response == GTK_RESPONSE_OK) { + 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); + /* Remove each header */ + do_headers_action (win, headers_action_delete, NULL); - if (MODEST_IS_MSG_VIEW_WINDOW (win)) { - gtk_widget_destroy (GTK_WIDGET(win)); - } + if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + gtk_widget_destroy (GTK_WIDGET(win)); + } + } + + /* free */ + g_free(message); + g_free(desc); + g_object_unref (header_list); + g_object_unref (iter); } @@ -251,7 +313,6 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) { - /* This is currently only implemented for Maemo, * because it requires a providers preset file which is not publically available. */ @@ -301,6 +362,45 @@ modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) #endif /* MODEST_PLATFORM_MAEMO */ } +static void +on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data) +{ + ModestWindow *main_window = MODEST_WINDOW (user_data); + + /* Save any changes. */ + modest_connection_specific_smtp_window_save_server_accounts ( + MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window), + modest_window_get_active_account (main_window)); + gtk_widget_destroy (GTK_WIDGET (window)); +} + +void +modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win) +{ + /* This is currently only implemented for Maemo, + * because it requires an API (libconic) to detect different connection + * possiblities. + */ +#ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ + + /* Create the window if necessary: */ + GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ()); + modest_connection_specific_smtp_window_fill_with_connections ( + MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window), + modest_runtime_get_account_mgr(), + modest_window_get_active_account (win)); + + /* Show the window: */ + gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win)); + gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE); + gtk_widget_show (specific_window); + + /* Save changes when the window is hidden: */ + g_signal_connect (specific_window, "hide", + G_CALLBACK (on_smtp_servers_window_hide), win); +#endif /* MODEST_PLATFORM_MAEMO */ +} + void modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) { @@ -411,7 +511,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) static void -open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) +open_msg_func (const GObject *obj, TnyMsg *msg, gpointer user_data) { ModestWindowMgr *mgr = NULL; ModestWindow *parent_win = NULL; @@ -422,9 +522,17 @@ open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) g_return_if_fail (MODEST_IS_WINDOW(obj)); g_return_if_fail (user_data != NULL); + + /* TODO: Show an error? (review the specs) */ + if (!msg) + return; + parent_win = MODEST_WINDOW(obj); helper = (HeaderActivatedHelper *) user_data; + /* Mark header as read */ + headers_action_mark_as_read (helper->header, MODEST_WINDOW(parent_win), NULL); + /* Get account */ account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(parent_win))); if (!account) @@ -440,7 +548,7 @@ open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) break; default: if (helper->model != NULL) - win = modest_msg_view_window_new_with_header_model ((TnyMsg *) msg, account, helper->model, helper->iter); + win = modest_msg_view_window_new_with_header_model ((TnyMsg *) msg, account, helper->model, helper->row_reference); else win = modest_msg_view_window_new ((TnyMsg *) msg, account); } @@ -457,11 +565,23 @@ open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) g_free(account); /* g_object_unref (G_OBJECT(msg)); */ g_object_unref (G_OBJECT(helper->folder)); + g_object_unref (G_OBJECT(helper->header)); + gtk_tree_row_reference_free (helper->row_reference); g_slice_free (HeaderActivatedHelper, helper); } static void -reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) +free_reply_forward_helper (gpointer data) +{ + ReplyForwardHelper *helper; + + helper = (ReplyForwardHelper *) data; + g_free (helper->account_name); + g_slice_free (ReplyForwardHelper, helper); +} + +static void +reply_forward_func (const GObject *obj, TnyMsg *msg, gpointer user_data) { TnyMsg *new_msg; ReplyForwardHelper *rf_helper; @@ -477,8 +597,6 @@ reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) g_return_if_fail (user_data != NULL); rf_helper = (ReplyForwardHelper *) user_data; - rf_helper->pending_ops--; - 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(), @@ -535,6 +653,7 @@ reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) } tny_folder_add_msg (folder, (TnyMsg *) msg, &err); + g_object_unref (msg); if (err) { g_printerr ("modest: error adding msg to Drafts folder: %s", err->message); @@ -556,13 +675,9 @@ cleanup: if (folder) g_object_unref (G_OBJECT (folder)); if (account) - g_object_unref (G_OBJECT (account)); - - if (rf_helper->pending_ops == 0) { - g_free (rf_helper->account_name); - g_slice_free (ReplyForwardHelper, rf_helper); - } + g_object_unref (G_OBJECT (account)); } + /* * Common code for the reply and forward actions */ @@ -592,7 +707,6 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) rf_helper = g_slice_new0 (ReplyForwardHelper); rf_helper->reply_forward_type = reply_forward_type; rf_helper->action = action; - rf_helper->pending_ops = tny_list_get_length (header_list); rf_helper->account_name = g_strdup (modest_window_get_active_account (win)); if (!rf_helper->account_name) rf_helper->account_name = @@ -605,12 +719,16 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) g_printerr ("modest: no message found\n"); return; } else - reply_forward_func (G_OBJECT(win), msg, rf_helper); + reply_forward_func (G_OBJECT(win), g_object_ref (msg), rf_helper); } else { - + /* Retrieve messages */ 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_process_msg (mail_op, header_list, reply_forward_func, rf_helper); + modest_mail_operation_get_msgs_full (mail_op, + header_list, + reply_forward_func, + rf_helper, + free_reply_forward_helper); /* Clean */ g_object_unref(mail_op); @@ -700,72 +818,6 @@ modest_ui_actions_on_sort (GtkAction *action, } } - -static gboolean -action_send (const gchar* account_name) -{ - TnyAccount *tny_account; - ModestTnySendQueue *send_queue; - - 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_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)); - g_printerr ("modest: cannot get send queue for %s\n", account_name); - return FALSE; - } - - modest_tny_send_queue_flush (send_queue); - - g_object_unref (G_OBJECT(send_queue)); - g_object_unref (G_OBJECT(tny_account)); - - return TRUE; -} - - -static gboolean -action_receive (const gchar* account_name, - ModestWindow *win) -{ - TnyAccount *tny_account; - ModestMailOperation *mail_op; - - g_return_val_if_fail (account_name, FALSE); - - tny_account = - modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), - account_name, - TNY_ACCOUNT_TYPE_STORE); - if (!tny_account) { - g_printerr ("modest: cannot get tny store account for %s\n", account_name); - return FALSE; - } - - /* 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_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)); - - g_object_unref (G_OBJECT(tny_account)); - g_object_unref (G_OBJECT (mail_op)); - - return TRUE; -} - /** Check that an appropriate connection is open. */ gboolean check_for_connection (const gchar *account_name) @@ -822,10 +874,13 @@ modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win) * for SMTP we should send, * first receiving, then sending: */ - if (!action_receive(acc_name, win)) - g_printerr ("modest: failed to receive\n"); - if (!action_send(acc_name)) - g_printerr ("modest: failed to send\n"); + /* 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_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, acc_name); + g_object_unref (G_OBJECT (mail_op)); } /* Free */ g_free (acc_name); @@ -938,7 +993,6 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, ModestWindowMgr *mgr = NULL; ModestWindow *win = NULL; GtkTreeModel *model = NULL; - GtkTreeIter iter; GtkTreeSelection *sel = NULL; GList *sel_list = NULL; @@ -955,17 +1009,17 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, /* Build helper */ helper = g_slice_new0 (HeaderActivatedHelper); helper->folder = tny_header_get_folder (header); + helper->header = g_object_ref(header); helper->model = NULL; - /* Get headers tree model and selected iter to build message view */ + /* Get headers tree model and selected row reference to build message view */ 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); /* Fill helpers */ helper->model = model; - helper->iter = iter; + helper->row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list->data); g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL); g_list_free (sel_list); @@ -980,6 +1034,26 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, g_object_unref (mail_op); } +static void +set_active_account_from_tny_account (TnyAccount *account, + ModestWindow *window) +{ + TnyAccount *modest_server_account; + const gchar *server_acc_name; + gchar *modest_acc_name; + + server_acc_name = tny_account_get_id (account); + /* We need the TnyAccount provided by the + account store because that is the one that + knows the name of the Modest account */ + modest_server_account = + modest_tny_account_store_get_tny_account_by_id (modest_runtime_get_account_store (), + server_acc_name); + modest_acc_name = (gchar *) g_object_get_data (G_OBJECT (modest_server_account), "modest_account"); + modest_window_set_active_account (window, modest_acc_name); + g_object_unref (modest_server_account); +} + void modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, TnyFolderStore *folder_store, @@ -988,6 +1062,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, { ModestConf *conf; GtkWidget *header_view; + TnyAccount *account; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -998,9 +1073,19 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, conf = modest_runtime_get_conf (); - if (TNY_IS_FOLDER (folder_store)) { - - if (selected) { + if (TNY_IS_ACCOUNT (folder_store)) { + /* Update active account */ + 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 (TNY_IS_FOLDER (folder_store) && selected) { + /* Update the active account */ + account = 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), @@ -1008,12 +1093,12 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, 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); + /* Do not show folder */ 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); } } @@ -1464,7 +1549,7 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo /* /\* suggested_name = X; *\/ */ /* /\* Show error to the user *\/ */ /* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */ -/* MODEST_INFORMATION_CREATE_FOLDER); */ +/* _("mail_in_ui_folder_create_error")); */ /* } */ g_object_unref (mail_op); } @@ -1482,14 +1567,21 @@ modest_ui_actions_on_rename_folder (GtkAction *action, { TnyFolderStore *folder; GtkWidget *folder_view; - + GtkWidget *header_view; + g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); folder_view = modest_main_window_get_child_widget (main_window, MODEST_WIDGET_TYPE_FOLDER_VIEW); if (!folder_view) return; + + header_view = modest_main_window_get_child_widget (main_window, + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (!header_view) + return; + folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); if (folder && TNY_IS_FOLDER (folder)) { @@ -1504,6 +1596,8 @@ modest_ui_actions_on_rename_folder (GtkAction *action, modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), NULL); + modest_mail_operation_rename_folder (mail_op, TNY_FOLDER (folder), (const gchar *) folder_name); @@ -1532,6 +1626,13 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + /* Show an error if it's an account */ + if (!TNY_IS_FOLDER (folder)) { + modest_platform_run_information_dialog (GTK_WINDOW (main_window), + _("mail_in_ui_folder_delete_error")); + return ; + } + /* Ask the user */ message = g_strdup_printf (_("mcen_nc_delete_folder_text"), tny_folder_get_name (TNY_FOLDER (folder))); @@ -1549,7 +1650,7 @@ delete_folder (ModestMainWindow *main_window, gboolean 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); + _("mail_in_ui_folder_delete_error")); g_object_unref (G_OBJECT (mail_op)); } @@ -1586,6 +1687,13 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, g_return_if_fail(server_account_name); /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */ + /* Initalize output parameters: */ + if (cancel) + *cancel = FALSE; + + if (remember) + *remember = TRUE; + #ifdef MODEST_PLATFORM_MAEMO /* Maemo uses a different (awkward) button order, * It should probably just use gtk_alternative_dialog_button_order (). @@ -1660,11 +1768,12 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, /* password: */ GtkWidget *entry_password = gtk_entry_new (); gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE); - gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), 0x2022); /* bullet unichar */ + /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */ #ifdef MODEST_PLATFORM_MAEMO /* Auto-capitalization is the default, so let's turn it off: */ - hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password), HILDON_GTK_INPUT_MODE_FULL); + hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password), + HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE); caption = hildon_caption_new (sizegroup, _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY); @@ -1672,6 +1781,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); + g_object_unref (sizegroup); #else gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password, TRUE, FALSE, 0); @@ -1739,6 +1849,8 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, */ gtk_widget_destroy (dialog); + + printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); } void @@ -1836,6 +1948,26 @@ modest_ui_actions_on_select_all (GtkAction *action, } void +modest_ui_actions_on_mark_as_read (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW(window)); + + /* Mark each header as read */ + do_headers_action (window, headers_action_mark_as_read, NULL); +} + +void +modest_ui_actions_on_mark_as_unread (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW(window)); + + /* Mark each header as read */ + do_headers_action (window, headers_action_mark_as_unread, NULL); +} + +void modest_ui_actions_on_change_zoom (GtkRadioAction *action, GtkRadioAction *selected, ModestWindow *window) @@ -2228,6 +2360,33 @@ msgs_move_to_confirmation (GtkWindow *win, return response; } + +static void +tranasfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data) +{ + ModestMsgViewWindow *self = NULL; + gboolean found = FALSE; + + g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object)); + self = MODEST_MSG_VIEW_WINDOW (object); + + found = modest_msg_view_window_select_first_message (self); + g_return_if_fail (found); +} + +static void +move_to_error_checking (const GObject *obj, gpointer user_data) +{ + ModestWindow *win = NULL; + + g_return_if_fail (MODEST_IS_WINDOW (obj)); + win = MODEST_WINDOW (obj); + + /* TODO: show error message */ +/* modest_platform_run_information_dialog (GTK_WINDOW (win), */ +/* _("mail_in_ui_folder_move_target_error")); */ +} + /* * UI handler for the "Move to" action when invoked from the * ModestMainWindow @@ -2236,9 +2395,10 @@ static void modest_ui_actions_on_main_window_move_to (GtkAction *action, ModestMainWindow *win) { - GtkWidget *dialog, *folder_view, *tree_view = NULL; + GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL; + GtkWidget *header_view = NULL; gint result; - TnyFolderStore *folder_store; + TnyFolderStore *folder_store = NULL; ModestMailOperation *mail_op = NULL; g_return_if_fail (MODEST_IS_MAIN_WINDOW (win)); @@ -2247,9 +2407,14 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, folder_view = modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_FOLDER_VIEW); + /* Get header view */ + header_view = modest_main_window_get_child_widget (win, + MODEST_WIDGET_TYPE_HEADER_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)); + g_object_ref (tree_view); /* We do this to save an indentation level ;-) */ if (result != GTK_RESPONSE_ACCEPT) @@ -2265,24 +2430,27 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, TnyFolderStore *src_folder; src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + /* Clean folder on header view before moving it */ + modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), NULL); + if (TNY_IS_FOLDER (src_folder)) { - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); + mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_ID_RECEIVE, + G_OBJECT(win), + move_to_error_checking); 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); + modest_mail_operation_xfer_folder_async (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; @@ -2303,13 +2471,16 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, modest_mail_operation_xfer_msgs (mail_op, headers, TNY_FOLDER (folder_store), - TRUE); + TRUE, + NULL, + NULL); g_object_unref (G_OBJECT (mail_op)); } + g_object_unref (headers); } } g_object_unref (folder_store); - + end: gtk_widget_destroy (dialog); } @@ -2326,7 +2497,6 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, GtkWidget *dialog, *folder_view, *tree_view = NULL; gint result; ModestMainWindow *main_window; - TnyMsg *msg; TnyHeader *header; TnyList *headers; @@ -2338,6 +2508,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, /* Create and run the dialog */ dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); result = gtk_dialog_run (GTK_DIALOG(dialog)); + g_object_ref (tree_view); if (result == GTK_RESPONSE_ACCEPT) { TnyFolderStore *folder_store; @@ -2346,12 +2517,10 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, 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); + header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win)); 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), @@ -2371,11 +2540,12 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, modest_mail_operation_xfer_msgs (mail_op, headers, TNY_FOLDER (folder_store), - TRUE); + TRUE, + tranasfer_msgs_from_viewer_cb, + NULL); g_object_unref (G_OBJECT (mail_op)); - } else { - g_object_unref (headers); - } + } + g_object_unref (headers); g_object_unref (folder_store); } gtk_widget_destroy (dialog); @@ -2468,8 +2638,11 @@ modest_ui_actions_on_settings (GtkAction *action, { GtkWidget *dialog; - dialog = modest_global_settings_dialog_new (); + dialog = modest_platform_get_global_settings_dialog (); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win)); gtk_widget_show (dialog); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); }