X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodest-ui-actions.c;h=aeef9aa4afd065db5a2ebfe1d8966913901458b1;hb=2898ebc01fda4931d8c45e159dd86bd7b18f7315;hp=c0df163bdda6764ca4dbf80a70d378f9e3ef179b;hpb=cc36ea20ffc9bc9dbd884f511db9bae55f4d97ca;p=modest diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index c0df163..aeef9aa 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -44,18 +44,24 @@ #include "modest-tny-platform-factory.h" #include "modest-platform.h" +#ifdef MODEST_PLATFORM_MAEMO +#include "maemo/modest-osso-state-saving.h" +#endif /* MODEST_PLATFORM_MAEMO */ + +#include "widgets/modest-ui-constants.h" #include #include #include #include - +#include +#include "widgets/modest-global-settings-dialog.h" #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" -#endif /*MODEST_HAVE_EASYSETUP*/ +#endif /* MODEST_HAVE_EASYSETUP */ #include #include @@ -67,6 +73,7 @@ typedef struct _GetMsgAsyncHelper { ModestWindow *window; ModestMailOperation *mail_op; TnyIterator *iter; + guint num_ops; GFunc func; gpointer user_data; } GetMsgAsyncHelper; @@ -81,18 +88,35 @@ typedef struct _ReplyForwardHelper { guint reply_forward_type; ReplyForwardAction action; gchar *account_name; + guint pending_ops; } ReplyForwardHelper; +typedef struct _HeaderActivatedHelper { + GtkTreeModel *model; + GtkTreeIter iter; + TnyFolder *folder; +} HeaderActivatedHelper; + +/* + * The do_headers_action uses this kind of functions to perform some + * action to each member of a list of headers + */ +typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data); + +static void +do_headers_action (ModestWindow *win, + HeadersFunc func, + gpointer user_data); + + +static void open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data); + +static void reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data); -static void reply_forward_func (gpointer data, gpointer user_data); -static void read_msg_func (gpointer data, gpointer user_data); -static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, - gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); - void modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) { @@ -149,50 +173,66 @@ get_selected_headers (ModestWindow *win) return NULL; } -void -modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) +static void +headers_action_mark_as_read (TnyHeader *header, + ModestWindow *win, + gpointer user_data) { - TnyList *header_list; - TnyIterator *iter; + TnyHeaderFlags flags; - g_return_if_fail (MODEST_IS_WINDOW(win)); + g_return_if_fail (TNY_IS_HEADER(header)); - if (MODEST_IS_MSG_EDIT_WINDOW (win)) { - gboolean ret_value; - g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); - return; + 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); } - - header_list = get_selected_headers (win); - - if (header_list) { - iter = tny_list_create_iterator (header_list); - do { - TnyHeader *header; - ModestMailOperation *mail_op; +} - header = TNY_HEADER (tny_iterator_get_current (iter)); - /* TODO: thick grain mail operation involving - a list of objects. Composite pattern ??? */ - /* TODO: add confirmation dialog */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - /* Always delete. TODO: Move to trash still not supported */ - modest_mail_operation_remove_msg (mail_op, header, FALSE); +static void +headers_action_delete (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + ModestMailOperation *mail_op; - /* Frees */ - g_object_unref (G_OBJECT (mail_op)); - g_object_unref (G_OBJECT (header)); + /* TODO: add confirmation dialog */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(win)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); - tny_iterator_next (iter); + /* Always delete. TODO: Move to trash still not supported */ + modest_mail_operation_remove_msg (mail_op, header, FALSE); + g_object_unref (G_OBJECT (mail_op)); +} - } while (!tny_iterator_is_done (iter)); +void +modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_WINDOW(win)); - /* Free iter */ - g_object_unref (G_OBJECT (iter)); + if (MODEST_IS_MSG_EDIT_WINDOW (win)) { + gboolean ret_value; + g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); + return; } + + /* Remove each header */ + do_headers_action (win, headers_action_delete, NULL); if (MODEST_IS_MSG_VIEW_WINDOW (win)) { gtk_widget_destroy (GTK_WIDGET(win)); @@ -203,6 +243,10 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) { + #ifdef MODEST_PLATFORM_MAEMO + modest_osso_save_state(); + #endif /* MODEST_PLATFORM_MAEMO */ + gtk_main_quit (); } @@ -372,20 +416,84 @@ cleanup: g_object_unref (G_OBJECT(folder)); } +static void +headers_action_open (TnyHeader *header, + ModestWindow *win, + gpointer user_data) +{ + modest_ui_actions_on_header_activated (MODEST_HEADER_VIEW (user_data), + header, + MODEST_MAIN_WINDOW (win)); +} void modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) { - modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */ + GtkWidget *header_view; + + /* Get header view */ + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_HEADER_VIEW); + + /* Open each message */ + do_headers_action (win, headers_action_open, header_view); } +static void +open_msg_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) +{ + ModestWindowMgr *mgr = NULL; + ModestWindow *parent_win = NULL; + ModestWindow *win = NULL; + HeaderActivatedHelper *helper = NULL; + TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN; + gchar *account = NULL; + + g_return_if_fail (MODEST_IS_WINDOW(obj)); + g_return_if_fail (user_data != NULL); + parent_win = MODEST_WINDOW(obj); + helper = (HeaderActivatedHelper *) user_data; + + /* Get account */ + account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(parent_win))); + if (!account) + account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + + /* Gets foldert type (OUTBOX headers will be opened in edit window */ + if (modest_tny_folder_is_local_folder (helper->folder)) + folder_type = modest_tny_folder_get_local_folder_type (helper->folder); + + switch (folder_type) { + case TNY_FOLDER_TYPE_DRAFTS: + win = modest_msg_edit_window_new ((TnyMsg *) msg, account); + break; + default: + if (helper->model != NULL) + win = modest_msg_view_window_new_with_header_model ((TnyMsg *) msg, account, helper->model, helper->iter); + else + win = modest_msg_view_window_new ((TnyMsg *) msg, account); + } + + /* Register and show new window */ + if (win != NULL) { + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_register_window (mgr, win); + gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win)); + gtk_widget_show_all (GTK_WIDGET(win)); + } + + /* Free */ + g_free(account); +/* g_object_unref (G_OBJECT(msg)); */ + g_object_unref (G_OBJECT(helper->folder)); + g_slice_free (HeaderActivatedHelper, helper); +} static void -reply_forward_func (gpointer data, gpointer user_data) +reply_forward_func (const GObject *obj, const TnyMsg *msg, gpointer user_data) { - TnyMsg *msg, *new_msg; - GetMsgAsyncHelper *helper; + TnyMsg *new_msg; ReplyForwardHelper *rf_helper; ModestWindow *msg_win; ModestEditType edit_type; @@ -395,10 +503,11 @@ reply_forward_func (gpointer data, gpointer user_data) TnyAccount *account = NULL; ModestWindowMgr *mgr; gchar *signature = NULL; - - msg = TNY_MSG (data); - helper = (GetMsgAsyncHelper *) user_data; - rf_helper = (ReplyForwardHelper *) helper->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); @@ -409,23 +518,24 @@ reply_forward_func (gpointer data, gpointer user_data) 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, signature, + modest_tny_msg_create_reply_msg ((TnyMsg *) 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, signature, rf_helper->reply_forward_type, + modest_tny_msg_create_reply_msg ((TnyMsg *) 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, signature, rf_helper->reply_forward_type); + modest_tny_msg_create_forward_msg ((TnyMsg *) msg, from, signature, rf_helper->reply_forward_type); edit_type = MODEST_EDIT_TYPE_FORWARD; break; default: @@ -454,7 +564,7 @@ reply_forward_func (gpointer data, gpointer user_data) goto cleanup; } - tny_folder_add_msg (folder, msg, &err); + tny_folder_add_msg (folder, (TnyMsg *) msg, &err); if (err) { g_printerr ("modest: error adding msg to Drafts folder: %s", err->message); @@ -478,8 +588,10 @@ cleanup: if (account) g_object_unref (G_OBJECT (account)); - g_free (rf_helper->account_name); - g_slice_free (ReplyForwardHelper, rf_helper); + if (rf_helper->pending_ops == 0) { + g_free (rf_helper->account_name); + g_slice_free (ReplyForwardHelper, rf_helper); + } } /* * Common code for the reply and forward actions @@ -487,12 +599,10 @@ cleanup: static void reply_forward (ReplyForwardAction action, ModestWindow *win) { - TnyList *header_list; + ModestMailOperation *mail_op = NULL; + TnyList *header_list = NULL; + ReplyForwardHelper *rf_helper = NULL; guint reply_forward_type; - TnyHeader *header; -/* TnyFolder *folder; */ - GetMsgAsyncHelper *helper; - ReplyForwardHelper *rf_helper; g_return_if_fail (MODEST_IS_WINDOW(win)); @@ -512,18 +622,12 @@ 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 = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->window = win; - helper->func = reply_forward_func; - helper->iter = tny_list_create_iterator (header_list); - helper->user_data = rf_helper; - if (MODEST_IS_MSG_VIEW_WINDOW(win)) { TnyMsg *msg; msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win)); @@ -531,28 +635,18 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) g_printerr ("modest: no message found\n"); return; } else - reply_forward_func (msg, helper); + reply_forward_func (G_OBJECT(win), msg, rf_helper); } else { - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - -/* folder = tny_header_get_folder (header); */ -/* if (folder) { */ -/* /\* The callback will call it per each header *\/ */ -/* tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper); */ -/* g_object_unref (G_OBJECT (folder)); */ -/* } else */ -/* g_printerr ("modest: no folder for header\n"); */ - - helper->mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), helper->mail_op); - modest_mail_operation_process_msg (helper->mail_op, header, get_msg_cb, helper); + + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_mail_operation_process_msg (mail_op, header_list, reply_forward_func, rf_helper); /* Clean */ - g_object_unref (G_OBJECT (header)); + g_object_unref(mail_op); } } - void modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win) { @@ -663,7 +757,7 @@ action_send (const gchar* account_name) return FALSE; } - //modest_tny_send_queue_flush (send_queue); + modest_tny_send_queue_flush (send_queue); g_object_unref (G_OBJECT(send_queue)); g_object_unref (G_OBJECT(tny_account)); @@ -673,7 +767,8 @@ action_send (const gchar* account_name) static gboolean -action_receive (const gchar* account_name) +action_receive (const gchar* account_name, + ModestWindow *win) { TnyAccount *tny_account; ModestMailOperation *mail_op; @@ -691,7 +786,7 @@ action_receive (const gchar* account_name) /* Create the mail operation */ /* TODO: The spec wants us to first do any pending deletions, before receiving. */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account)); @@ -722,86 +817,75 @@ gboolean check_for_connection (const gchar *account_name) return TRUE; } } - -static void -do_send_receive_current_or_default (ModestWindow *win) + +/* + * 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 + * be more flexible. + */ +void +modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win) { - gchar *account_name; + gchar *acc_name = NULL; - 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 no account name was provided get the current account, if + there is none either then pick the default one */ if (!account_name) { - g_printerr ("modest: cannot get default account\n"); - return; + acc_name = g_strdup (modest_window_get_active_account(win)); + if (!acc_name) + acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + if (!acc_name) { + g_printerr ("modest: cannot get default account\n"); + return; + } + } else { + acc_name = g_strdup (account_name); } - - /* Do not continue if no suitable connection is open: */ - if (check_for_connection (account_name)) { + + /* Send & receive. Do not continue if no suitable connection + is open */ + if (check_for_connection (acc_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)) + if (!action_receive(acc_name, win)) g_printerr ("modest: failed to receive\n"); - if (!action_send(account_name)) + if (!action_send(acc_name)) g_printerr ("modest: failed to send\n"); - - g_free (account_name); } + /* Free */ + g_free (acc_name); } - -static void -do_send_receive_auto (ModestWindow *win) +/* + * Refreshes all accounts. This function will be used by automatic + * updates + */ +void +modest_ui_actions_do_send_receive_all (ModestWindow *win) { - g_message ("%s: online? %s", __FUNCTION__, - tny_device_is_online(modest_runtime_get_device()) ? "yes":"no"); + GSList *account_names, *iter; - /* 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; + account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(), + TRUE); + + 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); - } + modest_ui_actions_do_send_receive ((const char*) iter->data, win); + iter = g_slist_next (iter); } - + g_slist_foreach (account_names, (GFunc) g_free, NULL); 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); -} - +/* + * Handler of the click on Send&Receive button in the main toolbar + */ void modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) { @@ -812,16 +896,14 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) g_slist_free (account_names); /* If not, allow the user to create an account before trying to send/receive. */ - if (!accounts_exist) { + if (!accounts_exist) modest_ui_actions_on_accounts (NULL, win); - } - - do_send_receive (win); + + /* Refresh the active account */ + modest_ui_actions_do_send_receive (NULL, win); } - - void modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window) { @@ -855,113 +937,16 @@ modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow * } - -/* - * Marks a message as read and passes it to the msg preview widget - */ -static void -read_msg_func (gpointer data, gpointer user_data) -{ - TnyMsg *msg; - TnyHeader *header; - GetMsgAsyncHelper *helper; - TnyHeaderFlags header_flags; - GtkWidget *msg_preview; - - msg = TNY_MSG (data); - helper = (GetMsgAsyncHelper *) user_data; - - msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window), - MODEST_WIDGET_TYPE_MSG_PREVIEW); - if (!msg_preview) - return; - - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - header_flags = tny_header_get_flags (header); - tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN); - g_object_unref (G_OBJECT (header)); - - /* Set message on msg view */ - modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg); -} - -/* - * This function is a generic handler for the tny_folder_get_msg_async - * call. It expects as user_data a #GetMsgAsyncHelper. This helper - * contains a user provided function that is called inside this - * method. This will allow us to use this callback in many different - * places. This callback performs the common actions for the - * get_msg_async call, more specific actions will be done by the user - * function - */ -static void -get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) -{ - GetMsgAsyncHelper *helper; - - helper = (GetMsgAsyncHelper *) user_data; - - /* Check errors */ - if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) { - modest_ui_actions_on_item_not_found (NULL, - MODEST_ITEM_TYPE_MESSAGE, - helper->window); - return; - } - - /* Notify the queue (if neccesary) */ - if (helper->mail_op != NULL) - modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), helper->mail_op); - - /* Call user function */ - if (helper->func) - helper->func (msg, user_data); - - /* Process next element (if exists) */ - tny_iterator_next (helper->iter); - if (tny_iterator_is_done (helper->iter)) { - TnyList *headers; - headers = tny_iterator_get_list (helper->iter); - /* Free resources */ - g_object_unref (G_OBJECT (headers)); - g_object_unref (G_OBJECT (helper->iter)); - g_slice_free (GetMsgAsyncHelper, helper); - } else { - TnyHeader *header; - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); -/* tny_folder_get_msg_async (folder, header, */ -/* get_msg_cb, NULL, helper); */ - helper->mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), helper->mail_op); - modest_mail_operation_process_msg (helper->mail_op, header, get_msg_cb, helper); - - g_object_unref (G_OBJECT(header)); - } -} - void modest_ui_actions_on_header_selected (ModestHeaderView *header_view, TnyHeader *header, ModestMainWindow *main_window) { -/* TnyFolder *folder; */ - GetMsgAsyncHelper *helper; - TnyList *list; - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - /* when there's no header, clear the msgview */ - if (!header) { - GtkWidget *msg_preview; - - /* Clear msg preview if exists */ - msg_preview = modest_main_window_get_child_widget(main_window, - MODEST_WIDGET_TYPE_MSG_PREVIEW); - - if (msg_preview) - modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL); + /* If no header has been selected then exit */ + if (!header) return; - } /* Update Main window title */ if (GTK_WIDGET_HAS_FOCUS (header_view)) { @@ -971,99 +956,70 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view, else gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject")); } - - /* Create list */ - list = tny_simple_list_new (); - tny_list_prepend (list, G_OBJECT (header)); - - /* Fill helper data */ - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->window = MODEST_WINDOW (main_window); - helper->iter = tny_list_create_iterator (list); - helper->func = read_msg_func; - -/* folder = tny_header_get_folder (TNY_HEADER(header)); */ - -/* tny_folder_get_msg_async (TNY_FOLDER(folder), */ -/* header, get_msg_cb, */ -/* NULL, helper); */ - - helper->mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), helper->mail_op); - modest_mail_operation_process_msg (helper->mail_op, header, get_msg_cb, helper); - - /* Frees */ -/* g_object_unref (G_OBJECT (folder)); */ } - - -void -modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header, +void +modest_ui_actions_on_header_activated (ModestHeaderView *header_view, + TnyHeader *header, ModestMainWindow *main_window) { + ModestMailOperation *mail_op = NULL; + HeaderActivatedHelper *helper = NULL; + ModestWindowMgr *mgr = NULL; ModestWindow *win = NULL; - TnyFolder *folder = NULL; - TnyMsg *msg = NULL; - ModestWindowMgr *mgr; - GtkTreeModel *model; + GtkTreeModel *model = NULL; GtkTreeIter iter; GtkTreeSelection *sel = NULL; GList *sel_list = NULL; + GList *tmp = NULL; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); if (!header) return; - folder = tny_header_get_folder (header); - if (!folder) { - g_printerr ("modest: cannot get folder for header\n"); - return; - } - - /* FIXME: make async?; check error */ - msg = tny_folder_get_msg (folder, header, NULL); - if (!msg) { - g_printerr ("modest: cannot get msg for header\n"); - goto cleanup; - } - - /* Look if we already have a message view for that header */ + /* Look if we already have a message view for that header */ mgr = modest_runtime_get_window_mgr (); win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header)); + if (win) return; + + /* Build helper */ + helper = g_slice_new0 (HeaderActivatedHelper); + helper->folder = tny_header_get_folder (header); + helper->model = NULL; + + /* Get headers tree model and selected iter 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; - /* If not, create a new window */ - if (!win) { - gchar *account; + /* Mark as read */ + for (tmp=sel_list; tmp; tmp=g_list_next(tmp)) { + gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) tmp->data); + gtk_tree_model_get (model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, + &header, -1); - account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window))); - if (!account) - account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + headers_action_mark_as_read (header, MODEST_WINDOW(main_window), NULL); - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_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); - - win = modest_msg_view_window_new_with_header_model (msg, account, model, iter); - g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (sel_list); - } else { - win = modest_msg_view_window_new (msg, account); + g_object_unref(header); } - modest_window_mgr_register_window (mgr, win); - - gtk_window_set_transient_for (GTK_WINDOW (win), - GTK_WINDOW (main_window)); + + g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL); + g_list_free (sel_list); } - gtk_widget_show_all (GTK_WIDGET(win)); + /* New mail operation */ + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(main_window)); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_mail_operation_get_msg (mail_op, header, open_msg_func, helper); - g_object_unref (G_OBJECT (msg)); - -cleanup: - g_object_unref (G_OBJECT (folder)); + /* Free */ + g_object_unref (mail_op); } void @@ -1086,9 +1042,9 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, if (TNY_IS_FOLDER (folder_store)) { - modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); - if (selected) { + 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), @@ -1156,7 +1112,7 @@ void modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link, ModestWindow *win) { - g_message ("%s %s", __FUNCTION__, link); + /* g_message ("%s %s", __FUNCTION__, link); */ } @@ -1178,8 +1134,7 @@ void modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part, ModestWindow *win) { - g_message (__FUNCTION__); - + modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part); } void @@ -1187,7 +1142,7 @@ modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview, const gchar *address, ModestWindow *win) { - g_message ("%s %s", __FUNCTION__, address); + /* g_message ("%s %s", __FUNCTION__, address); */ } void @@ -1226,7 +1181,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi 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_RECEIVE); + mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(edit_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_save_to_drafts (mail_operation, @@ -1292,7 +1247,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) from = modest_account_mgr_get_from_string (account_mgr, account_name); /* Create the mail operation */ - mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND); + mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND, G_OBJECT(edit_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); modest_mail_operation_send_new_mail (mail_operation, @@ -1443,6 +1398,26 @@ modest_ui_actions_on_insert_image (GtkAction *action, modest_msg_edit_window_insert_image (window); } +void +modest_ui_actions_on_attach_file (GtkAction *action, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_ACTION (action)); + + modest_msg_edit_window_attach_file (window); +} + +void +modest_ui_actions_on_remove_attachments (GtkAction *action, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_ACTION (action)); + + modest_msg_edit_window_remove_attachments (window, NULL); +} + /* * Shows a dialog with an entry that asks for some text. The returned * value must be freed by the caller. The dialog window title will be @@ -1513,7 +1488,7 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo if (result == GTK_RESPONSE_REJECT) { finished = TRUE; } else { - ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window)); TnyFolder *new_folder = NULL; modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), @@ -1531,7 +1506,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); } @@ -1567,7 +1542,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, if (folder_name != NULL && strlen (folder_name) > 0) { ModestMailOperation *mail_op; - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -1607,7 +1582,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) g_free (message); if (response == GTK_RESPONSE_OK) { - ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE); + ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(main_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -1616,7 +1591,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)); } @@ -1643,16 +1618,30 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainW void modest_ui_actions_on_password_requested (TnyAccountStore *account_store, - const gchar* account_name, + const gchar* server_account_name, + gchar **username, gchar **password, gboolean *cancel, gboolean *remember, ModestMainWindow *main_window) { - gchar *txt; - GtkWidget *dialog, *entry, *remember_pass_check; - - dialog = gtk_dialog_new_with_buttons (_("Password requested"), + g_return_if_fail(server_account_name); + /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */ + +#ifdef MODEST_PLATFORM_MAEMO + /* Maemo uses a different (awkward) button order, + * It should probably just use gtk_alternative_dialog_button_order (). + */ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"), + NULL, + GTK_DIALOG_MODAL, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL); +#else + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"), NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, @@ -1660,38 +1649,138 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); +#endif /* MODEST_PLATFORM_MAEMO */ + gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window)); - txt = g_strdup_printf (_("Please enter your password for %s"), account_name); + gchar *server_name = modest_server_account_get_hostname ( + modest_runtime_get_account_mgr(), server_account_name); + + /* 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: */ + gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), FALSE, FALSE, 0); g_free (txt); - - entry = gtk_entry_new_with_max_length (40); - gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); - gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ - - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, - TRUE, FALSE, 0); - + g_free (server_name); + server_name = NULL; + + /* username: */ + gchar *initial_username = modest_server_account_get_username ( + modest_runtime_get_account_mgr(), server_account_name); + + GtkWidget *entry_username = gtk_entry_new (); + if (initial_username) + gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username); + /* Dim this if a connection has ever succeeded with this username, + * as per the UI spec: */ + const gboolean username_known = + modest_server_account_get_username_has_succeeded( + modest_runtime_get_account_mgr(), server_account_name); + gtk_widget_set_sensitive (entry_username, !username_known); + +#ifdef MODEST_PLATFORM_MAEMO + /* Auto-capitalization is the default, so let's turn it off: */ + hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL); + + /* Create a size group to be used by all captions. + * Note that HildonCaption does not create a default size group if we do not specify one. + * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */ + GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + + GtkWidget *caption = hildon_caption_new (sizegroup, + _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY); + gtk_widget_show (entry_username); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption, + FALSE, FALSE, MODEST_MARGIN_HALF); + gtk_widget_show (caption); +#else + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username, + TRUE, FALSE, 0); +#endif /* MODEST_PLATFORM_MAEMO */ + + /* 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), "*"); */ + +#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_INPUT_MODE_INVISIBLE); + + caption = hildon_caption_new (sizegroup, + _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY); + gtk_widget_show (entry_password); + 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); +#endif /* MODEST_PLATFORM_MAEMO */ + +/* This is not in the Maemo UI spec: remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, TRUE, FALSE, 0); +*/ gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))); - *cancel = FALSE; + if (username) { + *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username))); + + modest_server_account_set_username ( + modest_runtime_get_account_mgr(), server_account_name, + *username); + + const gboolean username_was_changed = + (strcmp (*username, initial_username) != 0); + if (username_was_changed) { + /* To actually use a changed username, + * we must reset the connection, according to pvanhoof. + * This _might_ be a sensible way to do that: */ + TnyDevice *device = modest_runtime_get_device(); + tny_device_force_offline (device); + tny_device_force_online (device); + } + } + + if (password) { + *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password))); + + /* We do not save the password in the configuration, + * because this function is only called for passwords that should + * not be remembered: + modest_server_account_set_password ( + modest_runtime_get_account_mgr(), server_account_name, + *password); + */ + } + + if (cancel) + *cancel = FALSE; + } else { - *password = NULL; - *cancel = TRUE; + if (username) + *username = NULL; + + if (password) + *password = NULL; + + if (cancel) + *cancel = TRUE; } +/* This is not in the Maemo UI spec: if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check))) *remember = TRUE; else *remember = FALSE; +*/ gtk_widget_destroy (dialog); } @@ -1773,7 +1862,9 @@ modest_ui_actions_on_select_all (GtkAction *action, GtkWidget *focused_widget; focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); - if (GTK_IS_LABEL (focused_widget)) { + if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) { + modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget)); + } else if (GTK_IS_LABEL (focused_widget)) { gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1); } else if (GTK_IS_EDITABLE (focused_widget)) { gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1); @@ -1789,6 +1880,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) @@ -1878,17 +1989,19 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action, gtk_window_present (GTK_WINDOW (window)); } -/* - * Show the header details in a ModestDetailsDialog widget +/* + * Used by modest_ui_actions_on_details to call do_headers_action */ static void -show_header_details (TnyHeader *header, - GtkWindow *window) +headers_action_show_details (TnyHeader *header, + ModestWindow *window, + gpointer user_data) + { GtkWidget *dialog; /* Create dialog */ - dialog = modest_details_dialog_new_with_header (window, header); + dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header); /* Run dialog */ gtk_widget_show_all (dialog); @@ -1916,7 +2029,9 @@ show_folder_details (TnyFolder *folder, gtk_widget_destroy (dialog); } - +/* + * Show the header details in a ModestDetailsDialog widget + */ void modest_ui_actions_on_details (GtkAction *action, ModestWindow *win) @@ -1939,7 +2054,7 @@ modest_ui_actions_on_details (GtkAction *action, iter = tny_list_create_iterator (headers_list); header = TNY_HEADER (tny_iterator_get_current (iter)); - show_header_details (header, GTK_WINDOW (win)); + headers_action_show_details (header, win, NULL); g_object_unref (header); g_object_unref (iter); @@ -1964,23 +2079,8 @@ modest_ui_actions_on_details (GtkAction *action, } else { header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), MODEST_WIDGET_TYPE_HEADER_VIEW); - if (!gtk_widget_is_focus (header_view)) - return; - - headers_list = get_selected_headers (win); - if (!headers_list) - return; - - iter = tny_list_create_iterator (headers_list); - while (!tny_iterator_is_done (iter)) { - - header = TNY_HEADER (tny_iterator_get_current (iter)); - show_header_details (header, GTK_WINDOW (win)); - g_object_unref (header); - - tny_iterator_next (iter); - } - g_object_unref (iter); + /* Show details of each header */ + do_headers_action (win, headers_action_show_details, header_view); } } } @@ -2230,7 +2330,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); if (TNY_IS_FOLDER (src_folder)) { - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2260,7 +2360,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, /* Transfer messages */ if (response == GTK_RESPONSE_OK) { - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2327,7 +2427,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, ModestMailOperation *mail_op; /* Create mail op */ - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE); + mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); @@ -2360,3 +2460,88 @@ modest_ui_actions_on_move_to (GtkAction *action, MODEST_MSG_VIEW_WINDOW (win)); } +/* + * Calls #HeadersFunc for each header already selected in the main + * window or the message currently being shown in the msg view window + */ +static void +do_headers_action (ModestWindow *win, + HeadersFunc func, + gpointer user_data) +{ + TnyList *headers_list; + TnyIterator *iter; + + /* Get headers */ + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + /* Call the function for each header */ + iter = tny_list_create_iterator (headers_list); + while (!tny_iterator_is_done (iter)) { + TnyHeader *header; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + func (header, win, user_data); + g_object_unref (header); + tny_iterator_next (iter); + } + g_object_unref (iter); +} + +void +modest_ui_actions_view_attachment (GtkAction *action, + ModestWindow *window) +{ + if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL); + } else { + /* not supported window for this action */ + g_return_if_reached (); + } +} + +void +modest_ui_actions_save_attachments (GtkAction *action, + ModestWindow *window) +{ + if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL); + } else { + /* not supported window for this action */ + g_return_if_reached (); + } +} + +void +modest_ui_actions_remove_attachments (GtkAction *action, + ModestWindow *window) +{ + if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL); + } else { + /* not supported window for this action */ + g_return_if_reached (); + } +} + +void +modest_ui_actions_on_settings (GtkAction *action, + ModestWindow *win) +{ + GtkWidget *dialog; + gint response; + + dialog = modest_platform_get_global_settings_dialog (); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win)); + gtk_widget_show (dialog); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (response == GTK_RESPONSE_ACCEPT) { + g_message ("YES"); + } + + gtk_widget_destroy (dialog); +}