GtkTreeModel *header_model;
GtkTreeRowReference *row_reference;
+ GtkTreeRowReference *next_row_reference;
guint clipboard_change_handler;
guint queue_change_handler;
priv->row_reference = NULL;
}
+ if (priv->next_row_reference) {
+ gtk_tree_row_reference_free (priv->next_row_reference);
+ priv->next_row_reference = NULL;
+ }
+
if (priv->msg_uid) {
g_free (priv->msg_uid);
priv->msg_uid = NULL;
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
+static gboolean
+select_next_valid_row (GtkTreeModel *model,
+ GtkTreeRowReference **row_reference,
+ gboolean cycle)
+{
+ GtkTreeIter tmp_iter;
+ GtkTreePath *path, *next;
+ gboolean retval = FALSE;
+
+ g_return_val_if_fail (gtk_tree_row_reference_valid (*row_reference), FALSE);
+
+ path = gtk_tree_row_reference_get_path (*row_reference);
+ gtk_tree_model_get_iter (model, &tmp_iter, path);
+ gtk_tree_row_reference_free (*row_reference);
+ *row_reference = NULL;
+
+ if (gtk_tree_model_iter_next (model, &tmp_iter)) {
+ next = gtk_tree_model_get_path (model, &tmp_iter);
+ *row_reference = gtk_tree_row_reference_new (model, next);
+ retval = TRUE;
+ } else if (cycle && gtk_tree_model_get_iter_first (model, &tmp_iter)) {
+ next = gtk_tree_model_get_path (model, &tmp_iter);
+
+ /* Ensure that we are not selecting the same */
+ if (gtk_tree_path_compare (path, next) != 0) {
+ *row_reference = gtk_tree_row_reference_new (model, next);
+ retval = TRUE;
+ }
+ }
+ /* Free */
+ gtk_tree_path_free (path);
-/* static gboolean */
-/* on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgViewWindow *self) */
-/* { */
-/* modest_window_save_state (MODEST_WINDOW (self)); */
-/* return FALSE; */
-/* } */
+ return retval;
+}
ModestWindow *
modest_msg_view_window_new_with_header_model (TnyMsg *msg,
g_object_ref (model);
priv->header_model = model;
priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
+ select_next_valid_row (model, &(priv->next_row_reference), TRUE);
modest_msg_view_window_update_priority (window);
ModestMsgViewWindowPrivate *priv;
GtkTreePath *path= NULL;
GtkTreeIter tmp_iter;
+ TnyHeader *header;
+ gboolean retval = TRUE;
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- if (priv->header_model) {
- path = gtk_tree_row_reference_get_path (priv->row_reference);
- if (path == NULL) return FALSE;
-
- gtk_tree_model_get_iter (priv->header_model,
- &tmp_iter,
- path);
- while (gtk_tree_model_iter_next (priv->header_model, &tmp_iter)) {
- TnyHeader *header;
-
- gtk_tree_model_get (priv->header_model, &tmp_iter,
- TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
- &header, -1);
- if (!header)
- break;
+ path = gtk_tree_row_reference_get_path (priv->next_row_reference);
+ if (path == NULL)
+ return FALSE;
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) {
- g_object_unref (header);
- continue;
- }
+ gtk_tree_model_get_iter (priv->header_model,
+ &tmp_iter,
+ path);
- /* Read the message & show it */
- if (!message_reader (window, priv, header, tmp_iter)) {
- g_object_unref (header);
- break;
- }
+ gtk_tree_model_get (priv->header_model, &tmp_iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+
+ /* Read the message & show it */
+ if (!message_reader (window, priv, header, tmp_iter))
+ retval = FALSE;
- /* Free */
- g_object_unref (header);
+ /* Free */
+ g_object_unref (header);
+ gtk_tree_path_free (path);
- return TRUE;
- }
- gtk_tree_path_free (path);
- }
- return FALSE;
+ return retval;
}
gboolean
/* Update the row reference */
gtk_tree_row_reference_free (priv->row_reference);
priv->row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+ priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
+ select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
gtk_tree_path_free (path);
/* Mark header as read */
/* Free */
g_free(account);
g_object_unref (parent_win);
-/* g_object_unref (msg); */
g_object_unref (folder);
}
gint response;
gchar *message;
- g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
+ 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);
modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
- modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (*tree_view), FALSE);
+ modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (*tree_view), FALSE);
gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
- /* Select INBOX or local account */
- modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view));
-
return dialog;
}
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);
- 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);
+ if (!modest_msg_view_window_select_next_message (self))
+ if (!modest_msg_view_window_select_previous_message (self))
+ /* No more messages to view, so close this window */
+ modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
}
void
g_object_unref (header_list);
}
+/**
+ * Utility function that transfer messages from both the main window
+ * and the msg view window when using the "Move to" dialog
+ */
+static void
+modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
+ ModestWindow *win)
+{
+ TnyList *headers = NULL;
+ gint response = 0;
+
+ if (!TNY_IS_FOLDER (dst_folder)) {
+ modest_platform_information_banner (GTK_WIDGET (win),
+ NULL,
+ _CS("ckdg_ib_unable_to_move_to_current_location"));
+ return;
+ }
+
+ /* Get selected headers */
+ headers = get_selected_headers (MODEST_WINDOW (win));
+
+ /* Ask for user confirmation */
+ response = msgs_move_to_confirmation (GTK_WINDOW (win),
+ TNY_FOLDER (dst_folder),
+ headers);
+
+ /* Transfer messages */
+ if (response == GTK_RESPONSE_OK) {
+ ModestMailOperation *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_msgs (mail_op,
+ headers,
+ TNY_FOLDER (dst_folder),
+ TRUE,
+ (MODEST_IS_MSG_VIEW_WINDOW (win)) ? transfer_msgs_from_viewer_cb : NULL,
+ NULL);
+
+ g_object_unref (G_OBJECT (mail_op));
+ }
+ g_object_unref (headers);
+}
+
+
/*
* UI handler for the "Move to" action when invoked from the
* ModestMainWindow
*/
static void
modest_ui_actions_on_main_window_move_to (GtkAction *action,
+ GtkWidget *folder_view,
+ TnyFolderStore *dst_folder,
ModestMainWindow *win)
{
- GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
GtkWidget *header_view = NULL;
- gint result = 0;
- TnyFolderStore *folder_store = NULL;
ModestMailOperation *mail_op = NULL;
+ TnyFolderStore *src_folder;
g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
- /* Get the folder view */
- folder_view = modest_main_window_get_child_widget (win,
- MODEST_WIDGET_TYPE_FOLDER_VIEW);
-
- TnyFolderStore *src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+ /* Get the source folder */
+ src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
/* Offer the connection dialog if necessary, if the source folder is in a networked account: */
- if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) {
- if (src_folder) {
- g_object_unref (src_folder);
- }
-
- return;
- }
-
- /* 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 (GTK_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));
- modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (tree_view), TRUE);
- g_object_ref (tree_view);
-
- /* We do this to save an indentation level ;-) */
- if (result != GTK_RESPONSE_ACCEPT)
- goto end;
-
- folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
-
- if (TNY_IS_ACCOUNT (folder_store) &&
- !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder_store))
+ if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win),
+ src_folder))
goto end;
- /* Offer the connection dialog if necessary: */
- if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) {
- goto end;
- }
+ /* Get header view */
+ header_view =
+ modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_HEADER_VIEW);
/* Get folder or messages to transfer */
if (gtk_widget_is_focus (folder_view)) {
+
+ /* Allow only to transfer folders to the local root folder */
+ if (TNY_IS_ACCOUNT (dst_folder) &&
+ !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder))
+ goto end;
/* Clean folder on header view before moving it */
modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
if (TNY_IS_FOLDER (src_folder)) {
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);
+ 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,
+ dst_folder,
TRUE, NULL, NULL);
/* Unref mail operation */
g_object_unref (G_OBJECT (mail_op));
} else {
g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
}
- } else {
- if (gtk_widget_is_focus (header_view)) {
- TnyList *headers = NULL;
- gint response = 0;
-
- /* TODO: Check for connection if the headers are on a network account. */
- headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
-
- /* Ask for user confirmation */
- response = msgs_move_to_confirmation (GTK_WINDOW (win),
- TNY_FOLDER (folder_store),
- headers);
-
- /* Transfer messages */
- if (response == GTK_RESPONSE_OK) {
- mail_op =
- modest_mail_operation_new_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_msgs (mail_op,
- headers,
- TNY_FOLDER (folder_store),
- TRUE,
- NULL,
- NULL);
-
- g_object_unref (G_OBJECT (mail_op));
- }
- g_object_unref (headers);
- }
+ } else if (gtk_widget_is_focus (header_view)) {
+ /* Transfer messages */
+ modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
}
end:
if (src_folder)
g_object_unref (src_folder);
-
- if (folder_store)
- g_object_unref (folder_store);
-
- gtk_widget_destroy (dialog);
}
*/
static void
modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
+ TnyFolderStore *dst_folder,
ModestMsgViewWindow *win)
{
- GtkWidget *dialog, *folder_view, *tree_view = NULL;
- gint result = 0;
- ModestMainWindow *main_window = NULL;
TnyHeader *header = NULL;
- TnyList *headers = NULL;
-
- /* Get the folder view */
- main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
- if (main_window)
- folder_view = modest_main_window_get_child_widget (main_window,
- MODEST_WIDGET_TYPE_FOLDER_VIEW);
- else
- folder_view = NULL;
+ TnyFolder *src_folder;
- /* Create and run the dialog */
- dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view);
- result = gtk_dialog_run (GTK_DIALOG(dialog));
- modest_folder_view_show_non_move_folders(MODEST_FOLDER_VIEW (tree_view), TRUE);
-
- if (result == GTK_RESPONSE_ACCEPT) {
- TnyFolderStore *folder_store;
- gint response;
-
- /* Create header list */
- header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
- g_return_if_fail (header != NULL);
-
- /* Offer the connection dialog if necessary: */
- /* TODO: What's the extra g_object_ref() for? Isn't this leaking a ref? */
- folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (g_object_ref (tree_view)));
- TnyFolder *header_folder = tny_header_get_folder(header);
- if (modest_platform_connect_and_wait_if_network_folderstore (NULL, folder_store) &&
- modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (header_folder))) {
-
- headers = tny_simple_list_new ();
- tny_list_prepend (headers, G_OBJECT (header));
- g_object_unref (header);
-
- /* Ask user for confirmation. MSG-NOT404 */
- response = msgs_move_to_confirmation (GTK_WINDOW (win),
- TNY_FOLDER (folder_store),
- headers);
+ /* Create header list */
+ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
+ src_folder = tny_header_get_folder(header);
+ g_object_unref (header);
- /* Transfer current msg */
- if (response == GTK_RESPONSE_OK) {
- ModestMailOperation *mail_op;
+ /* Transfer the message */
+ if (modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (src_folder)))
+ modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
- /* Create mail op */
- mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
- modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
- mail_op);
-
- /* Transfer messages */
- modest_mail_operation_xfer_msgs (mail_op,
- headers,
- TNY_FOLDER (folder_store),
- TRUE,
- transfer_msgs_from_viewer_cb,
- NULL);
- g_object_unref (G_OBJECT (mail_op));
- }
- }
-
- if (header_folder)
- g_object_unref (header_folder);
-
- if (headers)
- g_object_unref (headers);
-
- if (folder_store)
- g_object_unref (folder_store);
- }
-
- gtk_widget_destroy (dialog);
+ g_object_unref (src_folder);
}
void
modest_ui_actions_on_move_to (GtkAction *action,
ModestWindow *win)
{
+ GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
+ gint result = 0;
+ TnyFolderStore *dst_folder = NULL;
+ ModestMainWindow *main_window;
+
g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
MODEST_IS_MSG_VIEW_WINDOW (win));
- if (MODEST_IS_MAIN_WINDOW (win))
- modest_ui_actions_on_main_window_move_to (action,
- MODEST_MAIN_WINDOW (win));
+ /* Get the main window if exists */
+ if (MODEST_IS_MAIN_WINDOW (win))
+ main_window = MODEST_MAIN_WINDOW (win);
+ else
+ main_window =
+ MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
+
+ /* Get the folder view widget if exists */
+ if (main_window)
+ folder_view = modest_main_window_get_child_widget (main_window,
+ MODEST_WIDGET_TYPE_FOLDER_VIEW);
else
- modest_ui_actions_on_msg_view_window_move_to (action,
- MODEST_MSG_VIEW_WINDOW (win));
+ folder_view = NULL;
+
+ /* Create and run the dialog */
+ dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view);
+ modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (tree_view), TRUE);
+ 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);
+ gtk_widget_destroy (dialog);
+
+ if (result != GTK_RESPONSE_ACCEPT)
+ return;
+
+ dst_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
+ /* Offer the connection dialog if necessary: */
+ if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win),
+ dst_folder)) {
+
+ /* Do window specific stuff */
+ if (MODEST_IS_MAIN_WINDOW (win))
+ modest_ui_actions_on_main_window_move_to (action,
+ folder_view,
+ dst_folder,
+ MODEST_MAIN_WINDOW (win));
+ else
+ modest_ui_actions_on_msg_view_window_move_to (action,
+ dst_folder,
+ MODEST_MSG_VIEW_WINDOW (win));
+ }
+ if (dst_folder)
+ g_object_unref (dst_folder);
}
/*