#include "modest-tny-platform-factory.h"
#include "modest-platform.h"
+#include <tny-mime-part.h>
#ifdef MODEST_PLATFORM_MAEMO
#include "maemo/modest-osso-state-saving.h"
gpointer user_data)
{
ModestMailOperation *mail_op = NULL;
+ GtkTreeModel *model = NULL;
mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win));
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
/* 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));
+
+ /* refilter treemodel to hide marked-as-deleted rows */
+ if (MODEST_IS_HEADER_VIEW (user_data)) {
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model));
+ }
}
void
GtkWidget *header_view;
g_return_if_fail (MODEST_IS_WINDOW(win));
-
+ header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+ MODEST_WIDGET_TYPE_HEADER_VIEW);
+
/* Check first if the header view has the focus */
if (MODEST_IS_MAIN_WINDOW (win)) {
- 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;
}
-
+
header_list = get_selected_headers (win);
if (!header_list) return;
- /* Check if any of the headers is already opened */
+ /* Check if any of the headers is already opened, or in the process of being 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;
+ found = modest_window_mgr_find_registered_header (mgr, header, NULL);
g_object_unref (header);
tny_iterator_next (iter);
}
}
/* Remove each header */
- do_headers_action (win, headers_action_delete, NULL);
+ do_headers_action (win, headers_action_delete, header_view);
if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
gtk_widget_destroy (GTK_WIDGET(win));
}
}
+ /* Update toolbar dimming state */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (win));
+
/* free */
g_free(message);
g_free(desc);
modest_osso_save_state();
#endif /* MODEST_PLATFORM_MAEMO */
- /* FIXME: we need to cancel all actions/threads here,
- so we really quit */
+ g_debug ("closing down, clearing %d item(s) from operation queue",
+ modest_mail_operation_queue_num_elements
+ (modest_runtime_get_mail_operation_queue()));
+
+ /* cancel all outstanding operations */
+ modest_mail_operation_queue_cancel_all
+ (modest_runtime_get_mail_operation_queue());
+
+ g_debug ("queue has been cleared");
+
+ /* note: when modest-tny-account-store is finalized,
+ it will automatically set all network connections
+ to offline */
gtk_main_quit ();
}
void
modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
{
- if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
- gtk_widget_destroy (GTK_WIDGET (win));
- } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
- gboolean ret_value;
- g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
- } else if (MODEST_IS_WINDOW (win)) {
- gtk_widget_destroy (GTK_WIDGET (win));
- } else {
- g_return_if_reached ();
- }
+ gboolean ret_value;
+ g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
+
+/* if (MODEST_IS_MSG_VIEW_WINDOW (win)) { */
+/* gtk_widget_destroy (GTK_WIDGET (win)); */
+/* } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) { */
+/* gboolean ret_value; */
+/* g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); */
+/* } else if (MODEST_IS_WINDOW (win)) { */
+/* gtk_widget_destroy (GTK_WIDGET (win)); */
+/* } else { */
+/* g_return_if_reached (); */
+/* } */
}
void
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;
GList *sel_list = NULL;
GtkTreeModel *model;
-
+
header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
MODEST_WIDGET_TYPE_HEADER_VIEW);
not_opened_headers = tny_simple_list_new ();
not_opened_cached_headers = tny_simple_list_new ();
while (!tny_iterator_is_done (iter)) {
+
ModestWindow *window;
TnyHeader *header;
+ gboolean found;
header = TNY_HEADER (tny_iterator_get_current (iter));
flags = tny_header_get_flags (header);
- window = modest_window_mgr_find_window_by_header (mgr, header);
+ window = NULL;
+ found = modest_window_mgr_find_registered_header (mgr, header, &window);
+
/* Do not open again the message and present the
window to the user */
- if (window)
- gtk_window_present (GTK_WINDOW (window));
- else if (!(flags & TNY_HEADER_FLAG_CACHED))
- tny_list_append (not_opened_headers, G_OBJECT (header));
- /* Check if msg has already been retreived */
- else
- tny_list_append (not_opened_cached_headers, G_OBJECT (header));
-
+ if (found) {
+ if (window)
+ gtk_window_present (GTK_WINDOW (window));
+ else
+ /* the header has been registered already, we don't do
+ * anything but wait for the window to come up*/
+ g_warning ("debug: header %p already registered, waiting for window",
+ header);
+ } else {
+ /* register the header before actually creating the window */
+ modest_window_mgr_register_header (mgr, header);
+
+ if (!(flags & TNY_HEADER_FLAG_CACHED))
+ tny_list_append (not_opened_headers, G_OBJECT (header));
+ /* Check if msg has already been retreived */
+ else
+ tny_list_append (not_opened_cached_headers, G_OBJECT (header));
+ }
g_object_unref (header);
tny_iterator_next (iter);
}
/* Open each cached message */
if (tny_list_get_length (not_opened_cached_headers) > 0) {
- mail_op2 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_OPEN,
+ mail_op2 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
G_OBJECT (win),
modest_ui_actions_get_msgs_full_error_handler,
NULL);
g_object_unref (G_OBJECT (account));
/* g_object_unref (msg); */
g_object_unref (header);
+ free_reply_forward_helper (rf_helper);
}
/*
} else
reply_forward_cb (NULL, header, msg, rf_helper);
} else {
+ TnyHeader *header;
+ TnyIterator *iter;
+
/* Retrieve messages */
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,
- reply_forward_cb,
- rf_helper,
- free_reply_forward_helper);
+
+ /* Only reply/forward to one message */
+ iter = tny_list_create_iterator (header_list);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ g_object_unref (iter);
+
+ modest_mail_operation_get_msg (mail_op,
+ header,
+ reply_forward_cb,
+ rf_helper);
+
+/* modest_mail_operation_get_msgs_full (mail_op, */
+/* header_list, */
+/* reply_forward_cb, */
+/* rf_helper, */
+/* free_reply_forward_helper); */
/* Clean */
g_object_unref(mail_op);
/* 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));
+ mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
+ G_OBJECT (win),
+ modest_ui_actions_send_receive_error_handler,
+ NULL);
+
g_signal_connect (G_OBJECT(mail_op), "progress-changed",
G_CALLBACK (_on_send_receive_progress_changed),
win);
gpointer user_data)
{
GObject *win = modest_mail_operation_get_source (mail_op);
-
- /* TODO: what should we do in case of this error ? */
- g_warning ("Invalid folder name");
-
+ const GError *error = NULL;
+ const gchar *message = NULL;
+
+ /* Get error message */
+ error = modest_mail_operation_get_error (mail_op);
+ if (error != NULL && error->message != NULL) {
+ message = error->message;
+ } else {
+ message = _("!!! FIXME: Unable to rename");
+ }
+
+ /* Show notification dialog */
+ modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
g_object_unref (win);
}
if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
- } if (MODEST_IS_MAIN_WINDOW (window)) {
+ } else if (MODEST_IS_MAIN_WINDOW (window)) {
/* Clear clipboard source */
clipboard = modest_runtime_get_email_clipboard ();
modest_email_clipboard_clear (clipboard);
transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
{
ModestMsgViewWindow *self = NULL;
+ gboolean last, first;
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
self = MODEST_MSG_VIEW_WINDOW (object);
-
- /* If there are not more messages don't do anything. The
- viewer will show the same message */
- if (!modest_msg_view_window_select_first_message (self))
- return;
+
+ last = modest_msg_view_window_last_message_selected (self);
+ first = modest_msg_view_window_first_message_selected (self);
+ if (last & first) {
+ /* No more messages to view, so close this window */
+/* gboolean ret_value; */
+/* g_signal_emit_by_name (G_OBJECT (self), "delete-event", NULL, &ret_value); */
+ modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
+ } else if (last)
+ modest_msg_view_window_select_previous_message (self);
+ else
+ modest_msg_view_window_select_next_message (self);
}
void
gpointer user_data)
{
GObject *win = modest_mail_operation_get_source (mail_op);
-
- /* TODO: show error message */
- modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
- _("mail_in_ui_folder_move_target_error"));
+ const GError *error = NULL;
+ const gchar *message = NULL;
+
+ /* Get error message */
+ error = modest_mail_operation_get_error (mail_op);
+ if (error != NULL && error->message != NULL) {
+ message = error->message;
+ } else {
+ message = _("mail_in_ui_folder_move_target_error");
+ }
+
+ /* Show notification dialog */
+ modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
g_object_unref (win);
}
+void
+modest_ui_actions_send_receive_error_handler (ModestMailOperation *mail_op,
+ gpointer user_data)
+{
+ GObject *win = modest_mail_operation_get_source (mail_op);
+ const GError *error = modest_mail_operation_get_error (mail_op);
+
+ g_return_if_fail (error != NULL);
+ if (error->message != NULL)
+ g_printerr ("modest: %s\n", error->message);
+ else
+ g_printerr ("modest: unkonw error on sedn&receive operation");
+
+ /* Show error message */
+ if (modest_mail_operation_get_id (mail_op) == MODEST_MAIL_OPERATION_TYPE_RECEIVE)
+ modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
+ _CS("sfil_ib_unable_to_receive"));
+ else
+ modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
+ _CS("sfil_ib_unable_to_send"));
+ g_object_unref (win);
+}
+
+static void
+open_msg_for_purge_cb (ModestMailOperation *mail_op,
+ TnyHeader *header,
+ TnyMsg *msg,
+ gpointer user_data)
+{
+ TnyList *parts;
+ TnyIterator *iter;
+ gint pending_purges = 0;
+ gboolean some_purged = FALSE;
+ ModestWindow *win = MODEST_WINDOW (user_data);
+ if (!msg)
+ return;
+
+ /* Once the message has been retrieved for purging, we check if
+ * it's all ok for purging */
+
+ parts = tny_simple_list_new ();
+ tny_mime_part_get_parts (TNY_MIME_PART (msg), parts);
+ iter = tny_list_create_iterator (parts);
+
+ while (!tny_iterator_is_done (iter)) {
+ TnyMimePart *part;
+ part = TNY_MIME_PART (tny_iterator_get_current (iter));
+ if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part)) {
+ if (tny_mime_part_is_purged (part))
+ some_purged = TRUE;
+ else
+ pending_purges++;
+ }
+ tny_iterator_next (iter);
+ }
+
+ if (pending_purges>0) {
+ gint response;
+ response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),_("mcen_nc_purge_file_text_inbox"));
+
+ if (response == GTK_RESPONSE_OK) {
+ modest_platform_information_banner (NULL, NULL, _("mcen_ib_removing_attachment"));
+ tny_iterator_first (iter);
+ while (!tny_iterator_is_done (iter)) {
+ TnyMimePart *part;
+
+ part = TNY_MIME_PART (tny_iterator_get_current (iter));
+ if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part))
+ tny_mime_part_set_purged (part);
+ tny_iterator_next (iter);
+ }
+
+ tny_msg_rewrite_cache (msg);
+ }
+ } else {
+ modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged"));
+ }
+
+ /* remove attachments */
+ tny_iterator_first (iter);
+ while (!tny_iterator_is_done (iter)) {
+ TnyMimePart *part;
+
+ part = TNY_MIME_PART (tny_iterator_get_current (iter));
+ g_object_unref (part);
+ tny_iterator_next (iter);
+ }
+
+ g_object_unref (iter);
+ g_object_unref (parts);
+}
+
+static void
+modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
+ ModestMainWindow *win)
+{
+ GtkWidget *header_view;
+ TnyList *header_list;
+ TnyIterator *iter;
+ TnyHeader *header;
+ TnyHeaderFlags flags;
+ ModestWindow *msg_view_window = NULL;
+ gboolean found;
+
+ g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
+
+ header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+ MODEST_WIDGET_TYPE_HEADER_VIEW);
+
+ header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
+
+ if (tny_list_get_length (header_list) == 1) {
+ iter = tny_list_create_iterator (header_list);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ g_object_unref (iter);
+ } else {
+ return;
+ }
+
+ found = modest_window_mgr_find_registered_header (modest_runtime_get_window_mgr (),
+ header, &msg_view_window);
+ flags = tny_header_get_flags (header);
+ if (!(flags & TNY_HEADER_FLAG_CACHED))
+ return;
+ if (found) {
+ if (msg_view_window != NULL)
+ modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
+ else {
+ /* do nothing; uid was registered before, so window is probably on it's way */
+ g_warning ("debug: header %p has already been registered", header);
+ }
+ } else {
+ ModestMailOperation *mail_op = NULL;
+ modest_window_mgr_register_header (modest_runtime_get_window_mgr (), header);
+ 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_msg (mail_op, header, open_msg_for_purge_cb, win);
+
+ g_object_unref (mail_op);
+ }
+ if (header)
+ g_object_unref (header);
+ if (header_list)
+ g_object_unref (header_list);
+}
+
/*
* UI handler for the "Move to" action when invoked from the
* ModestMainWindow
folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
- if (TNY_IS_ACCOUNT (folder_store))
+ if (TNY_IS_ACCOUNT (folder_store) &&
+ !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder_store))
goto end;
/* Get folder or messages to transfer */
/* Transfer messages */
if (response == GTK_RESPONSE_OK) {
- 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_move_folder_error_handler,
+ NULL);
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
mail_op);
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));
+ if (MODEST_IS_MAIN_WINDOW (window)) {
+ modest_ui_actions_on_main_window_remove_attachments (action, MODEST_MAIN_WINDOW (window));
+ } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
+ modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), FALSE);
} else {
/* not supported window for this action */
g_return_if_reached ();