X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-view-window.c;h=14deee823afca1bf6de1d7e85642ccf1c354454d;hp=a431f2a8894eb09968ce96fdfdd0085165baafe3;hb=8a3f4c540e48d964de9d885b463bc9aadba1394b;hpb=cc42e4f7bacf63f357ff1c59fb04e0748ad686e4 diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index a431f2a..14deee8 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -67,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); @@ -156,6 +157,10 @@ struct _ModestMsgViewWindowPrivate { /* Optimized view enabled */ gboolean optimized_view; + /* A reference to the @model of the header view + * to allow selecting previous/next messages, + * if the message is currently selected in the header view. + */ GtkTreeModel *header_model; GtkTreeRowReference *row_reference; GtkTreeRowReference *next_row_reference; @@ -235,6 +240,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)); @@ -438,31 +444,42 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) 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)); - -} - +} static void -modest_msg_view_window_finalize (GObject *obj) +modest_msg_view_window_disconnect_signals (ModestWindow *self) { ModestMsgViewWindowPrivate *priv; - priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); - if (priv->clipboard_change_handler > 0) { + 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); - priv->clipboard_change_handler = 0; - } - if (priv->queue_change_handler > 0) { + + 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); - priv->queue_change_handler = 0; - } - if (priv->account_removed_handler > 0) { + + 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); - priv->account_removed_handler = 0; - } +} + +static void +modest_msg_view_window_finalize (GObject *obj) +{ + ModestMsgViewWindowPrivate *priv; + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); + + /* 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; @@ -726,7 +743,9 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self) g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), NULL); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); - /* Message is not obtained from a treemodel (Attachment ?) */ + /* If the message ws not obtained from a treemodel, + * for instance if it was opened directly by the search UI: + */ if (priv->header_model == NULL) { msg = modest_msg_view_window_get_message (self); header = tny_msg_get_header (msg); @@ -734,7 +753,11 @@ modest_msg_view_window_get_header (ModestMsgViewWindow *self) return header; } - /* Get current message iter */ + /* Get iter of the currently selected message in the header view: */ + /* TODO: Why not just give this window a ref of the TnyHeader or TnyMessage, + * instead of sometimes retrieving it from the header view? + * Then we wouldn't be dependent on the message actually still being selected + * in the header view. murrayc. */ path = gtk_tree_row_reference_get_path (priv->row_reference); g_return_val_if_fail (path != NULL, NULL); gtk_tree_model_get_iter (priv->header_model, @@ -1002,7 +1025,7 @@ modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window) break; gtk_tree_model_get (priv->header_model, &tmp_iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - if (!(tny_header_get_flags(header)&TNY_HEADER_FLAG_DELETED)) { + if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED)) { has_next = TRUE; break; } @@ -1100,9 +1123,22 @@ message_reader (ModestMsgViewWindow *window, { ModestMailOperation *mail_op = 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) { op_type = MODEST_MAIL_OPERATION_TYPE_OPEN; @@ -1160,8 +1196,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, @@ -1772,6 +1821,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)); @@ -1927,7 +1978,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mim canceled = TRUE; } } else { - save_multiple_str = g_strdup_printf (_("FIXME: %d attachments"), + save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"), g_list_length (mime_parts)); }