2012-04-01 [colin] 3.8.0cvs36
[claws.git] / src / messageview.c
index 059d88ba78198215d66ce5838d9bfd75c826fca7..2b2f743906360d5844baa640593b7444028be4cd 100644 (file)
@@ -39,7 +39,6 @@
 #include "filesel.h"
 #include "foldersel.h"
 #include "sourcewindow.h"
-#include "addressbook.h"
 #include "alertpanel.h"
 #include "inputdialog.h"
 #include "mainwindow.h"
 #include "quoted-printable.h"
 #include "version.h"
 #include "statusbar.h"
-
+#ifndef USE_NEW_ADDRBOOK
+       #include "addressbook.h"
+#else
+       #include "addressadd.h"
+       #include "addressbook-dbus.h"
+#endif
 static GList *messageview_list = NULL;
 
 static gint messageview_delete_cb      (GtkWidget              *widget,
@@ -126,7 +130,9 @@ static void prev_labeled_cb         (GtkAction      *action,
                                         gpointer        data);
 static void next_labeled_cb            (GtkAction      *action,
                                         gpointer        data);
-static void last_read_cb               (GtkAction      *action,
+static void prev_history_cb            (GtkAction      *action,
+                                        gpointer        data);
+static void next_history_cb            (GtkAction      *action,
                                         gpointer        data);
 static void parent_cb                  (GtkAction      *action,
                                         gpointer        data);
@@ -135,6 +141,15 @@ static void goto_unread_folder_cb  (GtkAction      *action,
 static void goto_folder_cb             (GtkAction      *action,
                                         gpointer        data);
 
+static void scroll_prev_line_cb         (GtkAction      *action,
+                                         gpointer        data);
+static void scroll_next_line_cb         (GtkAction      *action,
+                                          gpointer        data);
+static void scroll_next_page_cb         (GtkAction      *action,
+                                         gpointer        data);
+static void scroll_prev_page_cb         (GtkAction      *action,
+                                         gpointer        data);
+
 static void set_charset_cb             (GtkAction *action, GtkRadioAction *current, gpointer data);
 static void set_decode_cb              (GtkAction *action, GtkRadioAction *current, gpointer data);
 
@@ -217,13 +232,21 @@ static GtkActionEntry msgview_entries[] =
        /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
        {"View/Goto/PrevLabeled",       NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
        {"View/Goto/NextLabeled",       NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
+       /* {"View/Goto/---",                    NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/PrevHistory",       NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
+       {"View/Goto/NextHistory",       NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
        /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/LastRead",          NULL, N_("Last read message"), NULL, NULL, G_CALLBACK(last_read_cb) },
        {"View/Goto/ParentMessage",     NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
        /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
        {"View/Goto/NextUnreadFolder",  NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
        {"View/Goto/OtherFolder",       NULL, N_("_Other folder..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
        /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
+        {"View/Scroll",                 NULL, N_("Message scroll") },
+        {"View/Scroll/PrevLine",        NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
+        {"View/Scroll/NextLine",        NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
+        {"View/Scroll/PrevPage",        NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
+        {"View/Scroll/NextPage",        NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
+        /* {"View/Scroll/---",          NULL, "---", NULL, NULL, NULL }, */
 
        {"View/Encoding",               NULL, N_("Character _encoding") }, /* set_charset_cb */
        {"View/Encoding/---",           NULL, "---" },
@@ -390,6 +413,7 @@ MessageView *messageview_create(MainWindow *mainwin)
        messageview->statusbar_cid = 0;
 
        messageview->show_full_text= FALSE;
+       messageview->update_needed = FALSE;
 
        messageview->msginfo_update_callback_id =
                hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, messageview_update_msg, (gpointer) messageview);
@@ -478,12 +502,20 @@ static void messageview_add_toolbar(MessageView *msgview, GtkWidget *window)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
-       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "LastRead", "View/Goto/LastRead", GTK_UI_MANAGER_MENUITEM)
-       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
+       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "OtherFolder", "View/Goto/OtherFolder", GTK_UI_MANAGER_MENUITEM)
 
+        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
+        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
+        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
+        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
+        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
+
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
 
        MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
@@ -610,6 +642,9 @@ static void messageview_add_toolbar(MessageView *msgview, GtkWidget *window)
        hildon_window_set_menu(HILDON_WINDOW(window), GTK_MENU(menubar));
 #endif
 
+       cm_toggle_menu_set_active_full(msgview->ui_manager, "Menu/View/AllHeaders",
+                                       prefs_common.show_all_headers);
+
        if (prefs_common.toolbar_detachable) {
                handlebox = gtk_handle_box_new();
        } else {
@@ -1045,7 +1080,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
 
        /* send it */
        path = folder_item_fetch_msg(queue, num);
-       ok = procmsg_send_message_queue(path, &foo, queue, num, &queued_removed);
+       ok = procmsg_send_message_queue_with_lock(path, &foo, queue, num, &queued_removed);
        g_free(path);
        g_free(foo);
        if (ok == 0 && !queued_removed)
@@ -1105,12 +1140,124 @@ static MimeInfo *find_broken_part(MimeInfo *rootinfo)
        return brokeninfo;
 }
 
+static void messageview_register_nav(MessageView *messageview)
+{
+       gchar *id;
+       gint pos = -1;
+       GList *existing;
+
+       cm_return_if_fail(messageview);
+       cm_return_if_fail(messageview->msginfo);
+
+       id = procmsg_msginfo_get_identifier(messageview->msginfo);
+       existing = g_list_find_custom(messageview->trail, id, (GCompareFunc)g_strcmp0);
+
+       if (existing != NULL)
+               pos = g_list_position(messageview->trail, existing);
+       else
+               pos = -1;
+
+       if (pos != -1) {
+               messageview->trail_pos = pos;
+               g_free(id);
+       } else {
+               /* Cut the end of the list */
+               GList *end = g_list_nth(messageview->trail, messageview->trail_pos + 1);
+               if (end) {
+                       if (end->prev) {
+                               end->prev->next = NULL;
+                               end->prev = NULL;
+                               list_free_strings(end);
+                               g_list_free(end);
+                       } else {
+                               list_free_strings(messageview->trail);
+                               g_list_free(messageview->trail);
+                               messageview->trail = NULL;
+                       }
+               }
+               messageview->trail = g_list_append(messageview->trail, id);
+               messageview->trail_pos = g_list_length(messageview->trail) - 1;
+               
+               /* Cut the beginning if needed */
+               while (messageview->trail_pos > prefs_common.nav_history_length) {
+                       g_free(messageview->trail->data);
+                       messageview->trail = g_list_delete_link(messageview->trail,
+                                               messageview->trail);
+                       messageview->trail_pos--;
+               }
+       }
+       messageview_set_menu_sensitive(messageview);
+}
+
+gboolean messageview_nav_has_prev(MessageView *messageview) {
+       return messageview->trail != NULL &&  messageview->trail_pos > 0;
+}
+
+gboolean messageview_nav_has_next(MessageView *messageview) {
+       if (!messageview->trail)
+               return FALSE;
+       
+       return sc_g_list_bigger(messageview->trail, messageview->trail_pos + 1);
+}
+
+MsgInfo *messageview_nav_get_prev(MessageView *messageview) {
+       GList *item;
+       MsgInfo *info;
+
+       cm_return_val_if_fail(messageview, NULL);
+       cm_return_val_if_fail(messageview->trail, NULL);
+
+       do {
+               if (!messageview_nav_has_prev(messageview))
+                       return NULL;
+
+               item = g_list_nth(messageview->trail, messageview->trail_pos - 1);
+               cm_return_val_if_fail(item != NULL, NULL);
+
+               info = procmsg_get_msginfo_from_identifier((const gchar *)item->data);
+               if (info != NULL)
+                       break;
+
+               g_free(item->data);
+               messageview->trail = g_list_delete_link(messageview->trail, item);
+               if (messageview->trail_pos > 0)
+                       messageview->trail_pos--;
+       } while (info == NULL);
+
+       return info;
+}
+
+MsgInfo *messageview_nav_get_next(MessageView *messageview) {
+       GList *item;
+       MsgInfo *info;
+
+       cm_return_val_if_fail(messageview, NULL);
+       cm_return_val_if_fail(messageview->trail, NULL);
+
+       do {
+               if (!messageview_nav_has_next(messageview))
+                       return NULL;
+
+               item = g_list_nth(messageview->trail, messageview->trail_pos + 1);
+               cm_return_val_if_fail(item != NULL, NULL);
+
+               info = procmsg_get_msginfo_from_identifier((const gchar *)item->data);
+               if (info != NULL)
+                       break;
+
+               g_free(item->data);
+               messageview->trail = g_list_delete_link(messageview->trail, item);
+       } while (info == NULL);
+       
+       return info;
+}
+
 gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                      gboolean all_headers)
 {
        gchar *text = NULL;
        gchar *file;
-       MimeInfo *mimeinfo, *encinfo, *brokeninfo;
+       MimeInfo *mimeinfo, *encinfo, *brokeninfo, *root;
        gchar *subject = NULL;
        cm_return_val_if_fail(msginfo != NULL, -1);
 
@@ -1216,11 +1363,9 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
        }
        headerview_show(messageview->headerview, messageview->msginfo);
 
+       messageview_register_nav(messageview);
        messageview_set_position(messageview, 0);
 
-       textview_set_all_headers(messageview->mimeview->textview, 
-                       messageview->all_headers);
-
 #ifdef MAEMO
        maemo_window_full_screen_if_needed(GTK_WINDOW(messageview->window));
 #endif
@@ -1289,6 +1434,7 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                noticeview_show(messageview->noticeview);
        }
                        
+       root = mimeinfo;
        mimeinfo = procmime_mimeinfo_next(mimeinfo);
        if (!all_headers && mimeinfo 
                        && (mimeinfo->type != MIMETYPE_TEXT || 
@@ -1360,7 +1506,8 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                        if (!mimeinfo) 
                                mimeinfo = saved_mimeinfo;
 
-                       mimeview_show_part(messageview->mimeview,mimeinfo);
+                       if (!mimeview_show_part(messageview->mimeview, mimeinfo))
+                               mimeview_select_mimepart_icon(messageview->mimeview, root);
                        goto done;
                } else if (prefs_common.invoke_plugin_on_html) {
                        mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
@@ -1380,6 +1527,8 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                        mimeinfo = procmime_mimeinfo_next(mimeinfo);
                }
        }
+
+       mimeview_select_mimepart_icon(messageview->mimeview, root);
 done:
        /* plugins may hook in here to work with the message view */
        hooks_invoke(MESSAGE_VIEW_SHOW_DONE_HOOKLIST, messageview);
@@ -1408,6 +1557,13 @@ void messageview_clear(MessageView *messageview)
        procmsg_msginfo_free(messageview->msginfo);
        messageview->msginfo = NULL;
        messageview->filtered = FALSE;
+
+       if (messageview->window) {
+               gtk_window_set_title(GTK_WINDOW(messageview->window), 
+                               _("Claws Mail - Message View"));
+               GTK_EVENTS_FLUSH();
+       }
+
        mimeview_clear(messageview->mimeview);
        headerview_clear(messageview->headerview);
        noticeview_hide(messageview->noticeview);
@@ -1426,10 +1582,9 @@ void messageview_destroy(MessageView *messageview)
                messageview->mainwin->summaryview->displayed = NULL;
                messageview->mainwin->summaryview->ext_messageview = NULL;
        }
-       if (!messageview->deferred_destroy) {
+       if (!messageview->deferred_destroy)
                hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
                              messageview->msginfo_update_callback_id);
-       }
 
        if (messageview->updating) {
                debug_print("uh oh, better not touch that now (fetching)\n");
@@ -1457,7 +1612,9 @@ void messageview_destroy(MessageView *messageview)
                toolbar_destroy(messageview->toolbar);
                g_free(messageview->toolbar);
        }
-       
+
+       list_free_strings(messageview->trail);
+       g_list_free(messageview->trail);
        msgview_list = g_list_remove(msgview_list, messageview); 
 
        if (messageview->window)
@@ -1696,20 +1853,17 @@ static void messageview_size_allocate_cb(GtkWidget *widget,
 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
                        MessageView *messageview)
 {
-       if (event && event->keyval == GDK_Escape && messageview->window) {
+       if (event && event->keyval == GDK_KEY_Escape && messageview->window) {
                messageview_destroy(messageview);
                return TRUE;
        }
 
        if (event && (event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0)
                return FALSE;
-       if (event && (event->state & GDK_SHIFT_MASK) && event->keyval != GDK_space) 
+       if (event && (event->state & GDK_SHIFT_MASK) && event->keyval != GDK_KEY_space) 
                return FALSE;
 
-       g_signal_stop_emission_by_name(G_OBJECT(widget),
-                                       "key_press_event");
-       mimeview_pass_key_press_event(messageview->mimeview, event);
-       return FALSE;
+       return mimeview_pass_key_press_event(messageview->mimeview, event);
 }
 #endif
 
@@ -2340,28 +2494,39 @@ static void next_labeled_cb(GtkAction *action, gpointer data)
        }
 }
 
-static void last_read_cb(GtkAction *action, gpointer data)
+static void prev_history_cb(GtkAction *action, gpointer data)
 {
        MessageView *messageview = (MessageView *)data;
-       messageview->updating = TRUE;
-       summary_select_last_read(messageview->mainwin->summaryview);
-       messageview->updating = FALSE;
-
-       if (messageview->deferred_destroy) {
-               debug_print("messageview got away!\n");
-               messageview_destroy(messageview);
-               return;
+       MsgInfo *info = messageview_nav_get_prev(messageview);
+       if (info) {
+               messageview->updating = TRUE;
+               messageview_show(messageview, info, 
+                                        messageview->all_headers);
+               messageview->updating = FALSE;
+               procmsg_msginfo_free(info);
+               if (messageview->deferred_destroy) {
+                       debug_print("messageview got away!\n");
+                       messageview_destroy(messageview);
+                       return;
+               }
        }
-       if (messageview->mainwin->summaryview->selected) {
-#ifndef GENERIC_UMPC
-               MsgInfo * msginfo = summary_get_selected_msg(messageview->mainwin->summaryview);
-                      
-               if (msginfo)
-                       messageview_show(messageview, msginfo, 
+}
+
+static void next_history_cb(GtkAction *action, gpointer data)
+{
+       MessageView *messageview = (MessageView *)data;
+       MsgInfo *info = messageview_nav_get_next(messageview);
+       if (info) {
+               messageview->updating = TRUE;
+               messageview_show(messageview, info, 
                                         messageview->all_headers);
-#endif
-       } else {
-               gtk_widget_destroy(messageview->window);
+               messageview->updating = FALSE;
+               procmsg_msginfo_free(info);
+               if (messageview->deferred_destroy) {
+                       debug_print("messageview got away!\n");
+                       messageview_destroy(messageview);
+                       return;
+               }
        }
 }
 
@@ -2446,6 +2611,30 @@ static void goto_folder_cb(GtkAction *action, gpointer data)
        }
 }
 
+static void scroll_prev_line_cb(GtkAction *action, gpointer data)
+{
+        MessageView *messageview = (MessageView *)data;
+        mimeview_scroll_one_line(messageview->mimeview,TRUE);
+}
+
+static void scroll_next_line_cb(GtkAction *action, gpointer data)
+{
+        MessageView *messageview = (MessageView *)data;
+        mimeview_scroll_one_line(messageview->mimeview,FALSE);
+}
+
+static void scroll_prev_page_cb(GtkAction *action, gpointer data)
+{
+        MessageView *messageview = (MessageView *)data;
+        mimeview_scroll_page(messageview->mimeview,TRUE);
+}
+
+static void scroll_next_page_cb(GtkAction *action, gpointer data)
+{
+        MessageView *messageview = (MessageView *)data;
+        mimeview_scroll_page(messageview->mimeview,FALSE);
+}
+
 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
 {
        MessageView *messageview = (MessageView *)data;
@@ -2502,13 +2691,14 @@ static void show_all_header_cb(GtkToggleAction *action, gpointer data)
        if (messageview->updating)
                return;
 
-       messageview->all_headers = 
+       messageview->all_headers = prefs_common.show_all_headers =
                        gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (!msginfo) return;
        messageview->msginfo = NULL;
-       messageview_show(messageview, msginfo,gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+       messageview_show(messageview, msginfo, messageview->all_headers);
        procmsg_msginfo_free(msginfo);
        main_window_set_menu_sensitive(messageview->mainwin);
+       summary_redisplay_msg(messageview->mainwin->summaryview);
 }
 
 static void msg_hide_quotes_cb(GtkToggleAction *action, gpointer data)
@@ -2593,7 +2783,18 @@ static void reply_cb(GtkAction *gaction, gpointer data)
 
 static void addressbook_open_cb(GtkAction *action, gpointer data)
 {
+#ifndef USE_NEW_ADDRBOOK
        addressbook_open(NULL);
+#else
+       GError* error = NULL;
+       
+       addressbook_dbus_open(FALSE, &error);
+       if (error) {
+               g_warning("Failed to open address book");
+               g_warning("%s", error->message);
+               g_error_free(error);
+       }
+#endif
 }
 
 static void add_address_cb(GtkAction *action, gpointer data)
@@ -2623,16 +2824,21 @@ static void add_address_cb(GtkAction *action, gpointer data)
                 full_msginfo->extradata &&
                 full_msginfo->extradata->xface) {
                image = xface_get_from_header(full_msginfo->extradata->xface,
-                               &messageview->mainwin->summaryview->ctree->style->white,
-                               messageview->window->window);   
+                               &(gtk_widget_get_style(messageview->mainwin->summaryview->ctree)->white),
+                               gtk_widget_get_window(messageview->window));
        }
 #endif
        procmsg_msginfo_free(full_msginfo);
        if (image)
                picture = gtk_image_get_pixbuf(GTK_IMAGE(image));
 
+#ifndef USE_NEW_ADDRBOOK
        addressbook_add_contact(msginfo->fromname, from, NULL, picture);
-
+#else
+       if (addressadd_selection(msginfo->fromname, from, NULL, picture)) {
+               debug_print( "addressbook_add_contact - added\n" );
+       }
+#endif
        if (image)
                gtk_widget_destroy(image);
 }
@@ -2690,15 +2896,36 @@ static gboolean messageview_update_msg(gpointer source, gpointer data)
 {
        MsgInfoUpdate *msginfo_update = (MsgInfoUpdate *) source;
        MessageView *messageview = (MessageView *)data;
+       MsgInfo *old_msginfo = messageview->msginfo;
 
        if (messageview->msginfo != msginfo_update->msginfo)
                return FALSE;
 
-       if (msginfo_update->flags & MSGINFO_UPDATE_DELETED) {
-               MsgInfo *old_msginfo = messageview->msginfo;
-               messageview_clear(messageview);
-               messageview_update(messageview, old_msginfo);
-       }
+       if ((msginfo_update->flags & MSGINFO_UPDATE_DELETED) ||
+           MSG_IS_DELETED(old_msginfo->flags))
+       {
+               if (messageview->new_window) {
+                       if (old_msginfo->folder && old_msginfo->folder->total_msgs == 0) {
+                               messageview_clear(messageview);
+                               textview_show_info(messageview->mimeview->textview,
+                                       _("\n  There are no messages in this folder"));
+                               return FALSE;
+                       }
+                       
+                       if (!prefs_common.always_show_msg) {
+                               messageview_clear(messageview);
+                               textview_show_info(messageview->mimeview->textview,
+                                       MSG_IS_DELETED(old_msginfo->flags) ?
+                                       _("\n  Message has been deleted") :
+                                       _("\n  Message has been moved to trash"));
+                       } else
+                               messageview->update_needed = TRUE;
+
+               } else {
+                       messageview_clear(messageview);
+                       messageview_update(messageview, old_msginfo);
+               }
+       } 
 
        return FALSE;
 }
@@ -2713,6 +2940,8 @@ void messageview_set_menu_sensitive(MessageView *messageview)
        cm_toggle_menu_set_active_full(messageview->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
        cm_toggle_menu_set_active_full(messageview->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
        cm_toggle_menu_set_active_full(messageview->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
+       cm_menu_set_sensitive_full(messageview->ui_manager, "Menu/View/Goto/PrevHistory", messageview_nav_has_prev(messageview));
+       cm_menu_set_sensitive_full(messageview->ui_manager, "Menu/View/Goto/NextHistory", messageview_nav_has_next(messageview));
 }
 
 void messageview_learn (MessageView *msgview, gboolean is_spam)