X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-view-window.c;h=1baeaa2837efbc30ecb6ac00c3de7c40b20a65c5;hp=bbc2bc520731426f1a58fd56c8aa12b0bc981b1a;hb=362784ce756b3f0e31cd451d9ac5e69b909d4053;hpb=703965f6f52fab28c9762f1b5603c6feeec5a680 diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index bbc2bc5..1baeaa2 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -53,6 +53,7 @@ #include #include "modest-ui-dimming-manager.h" #include +#include #define DEFAULT_FOLDER "MyDocs/.documents" @@ -66,8 +67,9 @@ static void modest_msg_view_window_find_toolbar_close (GtkWidget *widget, static void modest_msg_view_window_find_toolbar_search (GtkWidget *widget, ModestMsgViewWindow *obj); -static void modest_msg_view_window_set_zoom (ModestWindow *window, - gdouble zoom); +static void modest_msg_view_window_disconnect_signals (ModestWindow *self); +static void modest_msg_view_window_set_zoom (ModestWindow *window, + gdouble zoom); static gdouble modest_msg_view_window_get_zoom (ModestWindow *window); static gboolean modest_msg_view_window_zoom_minus (ModestWindow *window); static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window); @@ -88,23 +90,30 @@ static void modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboa GdkEvent *event, ModestMsgViewWindow *window); -static void cancel_progressbar (GtkToolButton *toolbutton, - ModestMsgViewWindow *self); +static void cancel_progressbar (GtkToolButton *toolbutton, + ModestMsgViewWindow *self); -static void on_queue_changed (ModestMailOperationQueue *queue, - ModestMailOperation *mail_op, - ModestMailOperationQueueNotification type, - ModestMsgViewWindow *self); +static void on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestMsgViewWindow *self); -static void view_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, TnyMsg *msg, gpointer user_data); +static void on_account_removed (TnyAccountStore *account_store, + TnyAccount *account, + gpointer user_data); -static void set_toolbar_mode (ModestMsgViewWindow *self, - ModestToolBarModes mode); +static void view_msg_cb (ModestMailOperation *mail_op, + TnyHeader *header, + TnyMsg *msg, + gpointer user_data); -static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self); +static void set_toolbar_mode (ModestMsgViewWindow *self, + ModestToolBarModes mode); static void update_window_title (ModestMsgViewWindow *window); +static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self); + /* list my signals */ enum { @@ -154,6 +163,7 @@ struct _ModestMsgViewWindowPrivate { guint clipboard_change_handler; guint queue_change_handler; + guint account_removed_handler; guint progress_bar_timeout; @@ -226,6 +236,7 @@ modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass) modest_window_class->zoom_minus_func = modest_msg_view_window_zoom_minus; modest_window_class->zoom_plus_func = modest_msg_view_window_zoom_plus; modest_window_class->show_toolbar_func = modest_msg_view_window_show_toolbar; + modest_window_class->disconnect_signals_func = modest_msg_view_window_disconnect_signals; g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate)); @@ -250,6 +261,8 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) priv->msg_view = NULL; priv->header_model = NULL; priv->clipboard_change_handler = 0; + priv->queue_change_handler = 0; + priv->account_removed_handler = 0; priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL; priv->optimized_view = FALSE; @@ -420,16 +433,37 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) gtk_container_add (GTK_CONTAINER(obj), main_vbox); priv->find_toolbar = hildon_find_toolbar_new (NULL); + hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar)); gtk_widget_set_no_show_all (priv->find_toolbar, TRUE); g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj); g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj); priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj); gtk_widget_show_all (GTK_WIDGET(main_vbox)); - gtk_box_pack_end (GTK_BOX (main_vbox), priv->find_toolbar, FALSE, FALSE, 0); +} -} +static void +modest_msg_view_window_disconnect_signals (ModestWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + if (g_signal_handler_is_connected (gtk_clipboard_get (GDK_SELECTION_PRIMARY), + priv->clipboard_change_handler)) + g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), + priv->clipboard_change_handler); + + if (g_signal_handler_is_connected (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + priv->queue_change_handler)) + g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + priv->queue_change_handler); + + if (g_signal_handler_is_connected (G_OBJECT (modest_runtime_get_account_store ()), + priv->account_removed_handler)) + g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_account_store ()), + priv->account_removed_handler); +} static void modest_msg_view_window_finalize (GObject *obj) @@ -437,21 +471,16 @@ modest_msg_view_window_finalize (GObject *obj) ModestMsgViewWindowPrivate *priv; priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); - if (priv->clipboard_change_handler > 0) { - g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), priv->clipboard_change_handler); - priv->clipboard_change_handler = 0; - } - if (priv->queue_change_handler > 0) { - g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), priv->queue_change_handler); - priv->queue_change_handler = 0; - } + + /* Sanity check: shouldn't be needed, the window mgr should + call this function before */ + modest_msg_view_window_disconnect_signals (MODEST_WINDOW (obj)); + if (priv->header_model != NULL) { g_object_unref (priv->header_model); priv->header_model = NULL; } - /* disconnet operations queue observer */ - if (priv->progress_bar_timeout > 0) { g_source_remove (priv->progress_bar_timeout); priv->progress_bar_timeout = 0; @@ -665,6 +694,12 @@ modest_msg_view_window_new (TnyMsg *msg, G_CALLBACK (on_queue_changed), obj); + /* Account manager */ + priv->account_removed_handler = g_signal_connect (G_OBJECT (modest_runtime_get_account_store ()), + "account_removed", + G_CALLBACK(on_account_removed), + obj); + modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name); priv->last_search = NULL; @@ -755,28 +790,6 @@ modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self) return (const gchar*) priv->msg_uid; } -static void -toggle_action_set_active_block_notify (GtkToggleAction *action, - gboolean value) -{ - GSList *proxies = NULL; - - for (proxies = gtk_action_get_proxies (GTK_ACTION (action)); - proxies != NULL; proxies = g_slist_next (proxies)) { - GtkWidget *widget = (GtkWidget *) proxies->data; - gtk_action_block_activate_from (GTK_ACTION (action), widget); - } - - gtk_toggle_action_set_active (action, value); - - for (proxies = gtk_action_get_proxies (GTK_ACTION (action)); - proxies != NULL; proxies = g_slist_next (proxies)) { - GtkWidget *widget = (GtkWidget *) proxies->data; - gtk_action_unblock_activate_from (GTK_ACTION (action), widget); - } -} - - static void modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, gpointer data) @@ -798,9 +811,9 @@ modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, /* update the toggle buttons status */ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); - toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active); action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsFindInMessageMenu"); - toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active); } @@ -823,6 +836,11 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget, gchar *current_search; ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); + if (modest_msg_view_get_message_is_empty (MODEST_MSG_VIEW (priv->msg_view))) { + hildon_banner_show_information (NULL, NULL, _("mail_ib_nothing_to_find")); + return; + } + g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL); if ((current_search == NULL) || (strcmp (current_search, "") == 0)) { @@ -1091,11 +1109,25 @@ static gboolean message_reader (ModestMsgViewWindow *window, ModestMsgViewWindowPrivate *priv, TnyHeader *header, - GtkTreeIter iter) + GtkTreePath *path) { ModestMailOperation *mail_op = NULL; - GtkTreePath *path = NULL; ModestMailOperationTypeOperation op_type; + gboolean already_showing = FALSE; + ModestWindow *msg_window = NULL; + ModestWindowMgr *mgr; + + g_return_val_if_fail (path != NULL, FALSE); + + mgr = modest_runtime_get_window_mgr (); + already_showing = modest_window_mgr_find_registered_header (mgr, header, &msg_window); + if (already_showing && (msg_window != MODEST_WINDOW (window))) { + gboolean retval; + if (msg_window) + gtk_window_present (GTK_WINDOW (msg_window)); + g_signal_emit_by_name (G_OBJECT (window), "delete-event", NULL, &retval); + return TRUE; + } /* Msg download completed */ if (tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED) { @@ -1126,9 +1158,6 @@ message_reader (ModestMsgViewWindow *window, } } - /* Get the path, will be freed by the callback */ - path = gtk_tree_model_get_path (priv->header_model, &iter); - /* New mail operation */ mail_op = modest_mail_operation_new_with_error_handling (op_type, G_OBJECT(window), @@ -1157,8 +1186,21 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); - path = gtk_tree_row_reference_get_path (priv->next_row_reference); - if (path == NULL) + /* Update the next row reference if it's not valid. This could + happen if for example the header which it was pointing to, + was deleted. The best place to do it is in the row-deleted + handler but the tinymail model do not work like the glib + tree models and reports the deletion when the row is still + there */ + if (!gtk_tree_row_reference_valid (priv->next_row_reference)) { + if (gtk_tree_row_reference_valid (priv->row_reference)) { + priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference); + select_next_valid_row (priv->header_model, &(priv->next_row_reference), FALSE); + } + } + if (priv->next_row_reference) + path = gtk_tree_row_reference_get_path (priv->next_row_reference); + if (path == NULL) return FALSE; gtk_tree_model_get_iter (priv->header_model, @@ -1170,12 +1212,13 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) &header, -1); /* Read the message & show it */ - if (!message_reader (window, priv, header, tmp_iter)) + if (!message_reader (window, priv, header, path)) { retval = FALSE; + gtk_tree_path_free (path); + } /* Free */ g_object_unref (header); - gtk_tree_path_free (path); return retval; } @@ -1186,6 +1229,7 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self) ModestMsgViewWindowPrivate *priv = NULL; TnyHeader *header = NULL; GtkTreeIter iter; + GtkTreePath *path; g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); @@ -1199,15 +1243,16 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self) &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - g_return_val_if_fail (TNY_IS_HEADER (header), FALSE); if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) { g_object_unref (header); return modest_msg_view_window_select_next_message (self); } + path = gtk_tree_model_get_path (priv->header_model, &iter); + /* Read the message & show it */ - message_reader (self, priv, header, iter); + message_reader (self, priv, header, path); /* Free */ g_object_unref (header); @@ -1245,7 +1290,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) } /* Read the message & show it */ - if (!message_reader (window, priv, header, iter)) { + if (!message_reader (window, priv, header, path)) { g_object_unref (header); break; } @@ -1583,6 +1628,25 @@ observers_empty (ModestMsgViewWindow *self) return is_empty; } +static void +on_account_removed (TnyAccountStore *account_store, + TnyAccount *account, + gpointer user_data) +{ + /* Do nothing if it's a transport account, because we only + show the messages of a store account */ + if (tny_account_get_account_type(account) == TNY_ACCOUNT_TYPE_STORE) { + const gchar *parent_acc = NULL; + const gchar *our_acc = NULL; + + our_acc = modest_window_get_active_account (MODEST_WINDOW (user_data)); + parent_acc = modest_tny_account_get_parent_modest_account_name_for_server_account (account); + + /* Close this window if I'm showing a message of the removed account */ + if (strcmp (parent_acc, our_acc) == 0) + modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (user_data)); + } +} static void on_queue_changed (ModestMailOperationQueue *queue, @@ -1747,6 +1811,8 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart if (!account) account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ()); msg_win = modest_msg_view_window_new (TNY_MSG (mime_part), account, NULL); + modest_window_set_zoom (MODEST_WINDOW (msg_win), + modest_window_get_zoom (MODEST_WINDOW (window))); modest_window_mgr_register_window (mgr, msg_win); gtk_window_set_transient_for (GTK_WINDOW (msg_win), GTK_WINDOW (window)); gtk_widget_show_all (GTK_WIDGET (msg_win));