2008-06-24 [colin] 3.4.0cvs109
[claws.git] / src / summaryview.c
index d06b52e9909a0c2fcde8cfdd447411d5e7b601ee..30cb660e8313b69ee294a79f3b98972b051b05bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2008 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -98,7 +98,7 @@
 #define SUMMARY_COL_LOCKED_WIDTH       13
 #define SUMMARY_COL_MIME_WIDTH         11
 
-
+static int normal_row_height = -1;
 static GtkStyle *bold_style;
 static GtkStyle *bold_marked_style;
 static GtkStyle *bold_deleted_style;
@@ -274,7 +274,7 @@ static GtkWidget *summary_ctree_create      (SummaryView    *summaryview);
 static gint summary_toggle_pressed     (GtkWidget              *eventbox,
                                         GdkEventButton         *event,
                                         SummaryView            *summaryview);
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
 static void summary_toggle_multiple_pressed
                                        (GtkWidget              *widget,
                                         SummaryView            *summaryview);
@@ -313,7 +313,7 @@ static void summary_col_resized             (GtkCList               *clist,
 static void summary_reply_cb           (SummaryView            *summaryview,
                                         guint                   action,
                                         GtkWidget              *widget);
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
 static void summary_show_all_header_cb (SummaryView            *summaryview,
                                         guint                   action,
                                         GtkWidget              *widget);
@@ -325,7 +325,7 @@ static void summary_add_address_cb  (SummaryView            *summaryview,
 static void summary_create_filter_cb   (SummaryView            *summaryview,
                                         guint                   action,
                                         GtkWidget              *widget);
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
 static void summary_create_processing_cb(SummaryView           *summaryview,
                                         guint                   action,
                                         GtkWidget              *widget);
@@ -458,7 +458,7 @@ GtkTargetEntry summary_drag_types[2] =
 static GtkItemFactoryEntry summary_popup_entries[] =
 {
        {N_("/_Reply"),                 "<control>R", summary_reply_cb, COMPOSE_REPLY, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/Repl_y to"),              NULL, NULL,             0, "<Branch>"},
        {N_("/Repl_y to/_all"),         "<shift><control>R", summary_reply_cb,  COMPOSE_REPLY_TO_ALL, NULL},
        {N_("/Repl_y to/_sender"),      NULL, summary_reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
@@ -467,7 +467,7 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {"/---",                        NULL, NULL,             0, "<Separator>"},
 #endif
        {N_("/_Forward"),               "<control><alt>F", summary_reply_cb, COMPOSE_FORWARD_INLINE, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/For_ward as attachment"), NULL, summary_reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
        {N_("/Redirect"),               NULL, summary_reply_cb, COMPOSE_REDIRECT, NULL},
 #endif
@@ -475,7 +475,7 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/M_ove..."),               "<control>O", summary_move_to,  0, NULL},
        {N_("/_Copy..."),               "<shift><control>O", summary_copy_to,   0, NULL},
        {N_("/Move to _trash"),         "<control>D", summary_delete_trash,     0, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/_Delete..."),             NULL, summary_delete, 0, NULL},
 #endif
        {"/---",                        NULL, NULL,             0, "<Separator>"},
@@ -500,7 +500,7 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/Ta_gs"),                  NULL, NULL,             0, NULL},
 
        {"/---",                        NULL, NULL,             0, "<Separator>"},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/Add sender to address boo_k"),
                                        NULL, summary_add_address_cb, 0, NULL},
 #endif
@@ -513,7 +513,7 @@ static GtkItemFactoryEntry summary_popup_entries[] =
                                        NULL, summary_create_filter_cb, FILTER_BY_TO, NULL},
        {N_("/Create f_ilter rule/by _Subject"),
                                        NULL, summary_create_filter_cb, FILTER_BY_SUBJECT, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/Create processing rule"), NULL, NULL,             0, "<Branch>"},
        {N_("/Create processing rule/_Automatically"),
                                        NULL, summary_create_processing_cb, FILTER_BY_AUTO, NULL},
@@ -529,12 +529,12 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_View/Open in new _window"),
                                        "<control><alt>N", summary_open_msg,    0, NULL},
        {N_("/_View/Message _source"),  "<control>U", summary_view_source, 0, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/_View/All _headers"),     "<control>H", summary_show_all_header_cb, 0, "<ToggleItem>"},
 #endif
        {"/---",                        NULL, NULL,             0, "<Separator>"},
        {N_("/_Save as..."),            "<control>S", summary_save_as,   0, NULL},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        {N_("/_Print..."),              "<control>P", summary_print,   0, NULL},
 #endif
 };  /* see also list in menu_connect_identical_items() in menu.c if this changes */
@@ -620,7 +620,7 @@ SummaryView *summary_create(void)
        GtkWidget *statlabel_msgs;
        GtkWidget *hbox_spc;
        GtkWidget *toggle_eventbox;
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        GtkWidget *multiple_sel_togbtn;
 #endif
        GtkWidget *toggle_arrow;
@@ -689,7 +689,7 @@ SummaryView *summary_create(void)
                         G_CALLBACK(summary_toggle_pressed),
                         summaryview);
 
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        multiple_sel_togbtn = gtk_toggle_button_new();
        gtk_widget_show(multiple_sel_togbtn);
        gtk_box_pack_end(GTK_BOX(hbox), multiple_sel_togbtn, FALSE, FALSE, 4);
@@ -714,10 +714,13 @@ SummaryView *summary_create(void)
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
                                       GTK_POLICY_AUTOMATIC,
                                       GTK_POLICY_AUTOMATIC);
-#ifndef MAEMO
-       summaryview->mainwidget_hbox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(summaryview->mainwidget_hbox), scrolledwin, TRUE, TRUE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), summaryview->mainwidget_hbox, TRUE, TRUE, 0);
+       summaryview->mainwidget_book = gtk_notebook_new();
+        gtk_notebook_set_show_tabs(GTK_NOTEBOOK(summaryview->mainwidget_book), FALSE);
+        gtk_notebook_set_show_border(GTK_NOTEBOOK(summaryview->mainwidget_book), FALSE);
+#ifndef GENERIC_UMPC
+       gtk_container_add(GTK_CONTAINER(summaryview->mainwidget_book),
+               scrolledwin);
+       gtk_box_pack_start(GTK_BOX(vbox), summaryview->mainwidget_book, TRUE, TRUE, 0);
 #endif
        gtk_widget_set_size_request(vbox,
                             prefs_common.summaryview_width,
@@ -740,10 +743,10 @@ SummaryView *summary_create(void)
        quicksearch = quicksearch_new();
        gtk_box_pack_start(GTK_BOX(vbox), quicksearch_get_widget(quicksearch), FALSE, FALSE, 0);
 
-#ifdef MAEMO
-       summaryview->mainwidget_hbox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(summaryview->mainwidget_hbox), scrolledwin, TRUE, TRUE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), summaryview->mainwidget_hbox, TRUE, TRUE, 0);
+#ifdef GENERIC_UMPC
+       gtk_container_add(GTK_CONTAINER(summaryview->mainwidget_book),
+               scrolledwin);
+       gtk_box_pack_start(GTK_BOX(vbox), summaryview->mainwidget_book, TRUE, TRUE, 0);
 #endif
        quicksearch_set_execute_callback(quicksearch, quicksearch_execute_cb, summaryview);
 
@@ -770,7 +773,7 @@ SummaryView *summary_create(void)
        summaryview->statlabel_msgs = statlabel_msgs;
        summaryview->toggle_eventbox = toggle_eventbox;
        summaryview->toggle_arrow = toggle_arrow;
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        summaryview->multiple_sel_togbtn = multiple_sel_togbtn;
 #endif
        summaryview->toggle_search = toggle_search;
@@ -852,6 +855,8 @@ void summary_relayout(SummaryView *summaryview)
                        
                break;
        }
+       summary_set_column_order(summaryview);
+
        gtk_widget_unref(summaryview->hbox_l);
        gtk_widget_unref(summaryview->statlabel_msgs);
        quicksearch_relayout(summaryview->quicksearch);
@@ -986,7 +991,7 @@ void summary_init(SummaryView *summaryview)
        gtk_widget_show(pixmap);
        summaryview->quick_search_pixmap = pixmap;
        
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_SELECTION);
        gtk_container_add(GTK_CONTAINER(summaryview->multiple_sel_togbtn), pixmap);
        gtk_widget_show(pixmap);
@@ -1014,9 +1019,9 @@ void summary_init(SummaryView *summaryview)
   && (!g_ascii_strcasecmp(m->folder->name,item->name)) )
 
 #define FOLDER_SHOWS_TO_HDR(i) \
-( folder_has_parent_of_type(i, F_OUTBOX) \
-  ||  folder_has_parent_of_type(i, F_DRAFT) \
-  ||  folder_has_parent_of_type(i, F_QUEUE) )
+( i && (folder_has_parent_of_type(i, F_OUTBOX) \
+        || folder_has_parent_of_type(i, F_DRAFT) \
+        || folder_has_parent_of_type(i, F_QUEUE)) )
   
 static void summary_switch_from_to(SummaryView *summaryview, FolderItem *item)
 {
@@ -1026,7 +1031,7 @@ static void summary_switch_from_to(SummaryView *summaryview, FolderItem *item)
        SummaryColumnState *col_state = summaryview->col_state;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        
-       if (!item)
+       if (!item || (prefs_common.layout_mode == VERTICAL_LAYOUT && prefs_common.two_line_vert) )
                return;
        if (FOLDER_SHOWS_TO_HDR(item))
                show_to = TRUE;
@@ -1090,7 +1095,7 @@ static gboolean summaryview_quicksearch_recurse(gpointer data)
 
 static gboolean summary_check_consistency(FolderItem *item, GSList *mlist)
 {
-       int u = 0, n = 0, m = 0, t = 0;
+       int u = 0, n = 0, m = 0, t = 0, r = 0, f = 0, l = 0, i = 0, w = 0;
        GSList *cur;
        START_TIMING("");
        for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
@@ -1102,11 +1107,26 @@ static gboolean summary_check_consistency(FolderItem *item, GSList *mlist)
                        u++;
                if (MSG_IS_MARKED(msginfo->flags))
                        m++;            
+               if (MSG_IS_REPLIED(msginfo->flags))
+                       r++;
+               if (MSG_IS_FORWARDED(msginfo->flags))
+                       f++;
+               if (MSG_IS_LOCKED(msginfo->flags))
+                       l++;
+               if (MSG_IS_IGNORE_THREAD(msginfo->flags))
+                       i++;
+               if (MSG_IS_WATCH_THREAD(msginfo->flags))
+                       w++;
        }
        if (t != item->total_msgs
        ||  n != item->new_msgs
        ||  u != item->unread_msgs
        ||  m != item->marked_msgs
+       ||  r != item->replied_msgs
+       ||  f != item->forwarded_msgs
+       ||  l != item->locked_msgs
+       ||  i != item->ignored_msgs
+       ||  w != item->watched_msgs
        ||  (m == 0 && item->unreadmarked_msgs != 0)
        ||  item->unreadmarked_msgs < 0) {
                debug_print("Inconsistency\n");
@@ -1146,6 +1166,10 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE;
 
+       if (item && item->folder->klass->item_opened) {
+               item->folder->klass->item_opened(item);
+       }
+
        if (!is_refresh) {
                main_create_mailing_list_menu (summaryview->mainwin, NULL);
                if (prefs_common.layout_mode == SMALL_LAYOUT) {
@@ -1611,7 +1635,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
        GtkItemFactory *ifactory = summaryview->popupfactory;
        SensitiveCond state;
        gboolean sensitive;
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        GtkWidget *menuitem;
 #endif
        gint i;
@@ -1621,7 +1645,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
                SensitiveCond cond;
        } entry[] = {
                {"/Reply"                       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Reply to"                    , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Reply to/all"                , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Reply to/sender"             , M_HAVE_ACCOUNT|M_TARGET_EXIST},
@@ -1629,7 +1653,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 #endif
 
                {"/Forward"                     , M_HAVE_ACCOUNT|M_TARGET_EXIST},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Forward as attachment"       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Redirect"                    , M_HAVE_ACCOUNT|M_TARGET_EXIST},
 #endif
@@ -1637,7 +1661,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/Move..."                     , M_TARGET_EXIST|M_ALLOW_DELETE|M_NOT_NEWS},
                {"/Copy..."                     , M_TARGET_EXIST|M_EXEC},
                {"/Move to trash"               , M_TARGET_EXIST|M_ALLOW_DELETE|M_NOT_NEWS},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Delete..."                   , M_TARGET_EXIST|M_ALLOW_DELETE},
 #endif
 
@@ -1655,22 +1679,22 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/Color label"                 , M_TARGET_EXIST},
                {"/Tags"                        , M_TARGET_EXIST},
 
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Add sender to address book"  , M_SINGLE_TARGET_EXIST},
 #endif
                {"/Create filter rule"          , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Create processing rule"      , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
 #endif
 
                {"/View"                        , M_SINGLE_TARGET_EXIST},
                {"/View/Open in new window"     , M_SINGLE_TARGET_EXIST},
                {"/View/Message source"         , M_SINGLE_TARGET_EXIST},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/View/All headers"            , M_SINGLE_TARGET_EXIST},
 #endif
                {"/Save as..."                  , M_TARGET_EXIST},
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                {"/Print..."                    , M_TARGET_EXIST},
 #endif
                {NULL, 0}
@@ -1687,7 +1711,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 
 
        summary_lock(summaryview);
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
        menuitem = gtk_item_factory_get_widget(ifactory, "/View/All headers");
        if (summaryview->messageview 
        &&  summaryview->messageview->mimeview
@@ -2413,9 +2437,13 @@ static void summary_status_show(SummaryView *summaryview)
        gchar *itstr;
        GList *rowlist, *cur;
        guint n_selected = 0, n_new = 0, n_unread = 0, n_total = 0;
-       off_t sel_size = 0, n_size = 0;
+       guint n_marked = 0, n_replied = 0, n_forwarded = 0, n_locked = 0, n_ignored = 0, n_watched = 0;
+       goffset sel_size = 0, n_size = 0;
        MsgInfo *msginfo;
        gchar *name;
+#if GTK_CHECK_VERSION(2, 12, 0)
+       gchar *tooltip;
+#endif
        
        if (!summaryview->folder_item) {
                gtk_label_set_text(GTK_LABEL(summaryview->statlabel_folder), "");
@@ -2450,11 +2478,29 @@ static void summary_status_show(SummaryView *summaryview)
                                        n_new++;
                                if (MSG_IS_UNREAD(msginfo->flags))
                                        n_unread++;
+                               if (MSG_IS_MARKED(msginfo->flags))
+                                       n_marked++;
+                               if (MSG_IS_REPLIED(msginfo->flags))
+                                       n_replied++;
+                               if (MSG_IS_FORWARDED(msginfo->flags))
+                                       n_forwarded++;
+                               if (MSG_IS_LOCKED(msginfo->flags))
+                                       n_locked++;
+                               if (MSG_IS_IGNORE_THREAD(msginfo->flags))
+                                       n_ignored++;
+                               if (MSG_IS_WATCH_THREAD(msginfo->flags))
+                                       n_watched++;
                        }
                }
        } else {
                n_new = summaryview->folder_item->new_msgs;
                n_unread = summaryview->folder_item->unread_msgs;
+               n_marked = summaryview->folder_item->marked_msgs;
+               n_replied = summaryview->folder_item->replied_msgs;
+               n_forwarded = summaryview->folder_item->forwarded_msgs;
+               n_locked = summaryview->folder_item->locked_msgs;
+               n_ignored = summaryview->folder_item->ignored_msgs;
+               n_watched = summaryview->folder_item->watched_msgs;
                n_total = summaryview->folder_item->total_msgs;
                n_size = summaryview->total_size;
        }
@@ -2487,7 +2533,7 @@ static void summary_status_show(SummaryView *summaryview)
                spc = "";
 
        if (n_selected) {
-               sel = g_strdup_printf(" (%s)", to_human_readable(sel_size));
+               sel = g_strdup_printf(" (%s)", to_human_readable((goffset)sel_size));
                if (n_selected == 1)
                        itstr = g_strdup(_(" item selected"));
                else
@@ -2510,24 +2556,45 @@ static void summary_status_show(SummaryView *summaryview)
                g_free(str);
 
                str = g_strdup_printf(_("%d new, %d unread, %d total (%s)"),
-
                                              n_new, n_unread, n_total,
-                                             to_human_readable(n_size));
+                                             to_human_readable((goffset)n_size));
+
 
                gtk_label_set_text(GTK_LABEL(summaryview->statlabel_msgs), str);
                g_free(str);
+#if GTK_CHECK_VERSION(2, 12, 0)
+               tooltip = g_strdup_printf(_("<b>Message summary</b>\n"
+                                           "<b>New:</b> %d\n"
+                                           "<b>Unread:</b> %d\n"
+                                           "<b>Total:</b> %d\n"
+                                           "<b>Size:</b> %s\n\n"
+                                           "<b>Marked:</b> %d\n"
+                                           "<b>Replied:</b> %d\n"
+                                           "<b>Forwarded:</b> %d\n"
+                                           "<b>Locked:</b> %d\n"
+                                           "<b>Ignored:</b> %d\n"
+                                           "<b>Watched:</b> %d"),
+                                             n_new, n_unread, n_total,
+                                             to_human_readable((goffset)n_size),
+                                             n_marked,n_replied,n_forwarded,
+                                             n_locked,n_ignored,n_watched);
+
+               gtk_widget_set_tooltip_markup(GTK_WIDGET(summaryview->statlabel_msgs),
+                                           tooltip); 
+               g_free(tooltip);
+#endif
        } else {
                gchar *ssize, *tsize;
                if (n_selected) {
-                       ssize = g_strdup(to_human_readable(sel_size));
-                       tsize = g_strdup(to_human_readable(n_size));
+                       ssize = g_strdup(to_human_readable((goffset)sel_size));
+                       tsize = g_strdup(to_human_readable((goffset)n_size));
                        str = g_strdup_printf(_("%d/%d selected (%s/%s), %d unread"),
                                n_selected, n_total, ssize, tsize, n_unread);
                        g_free(ssize);
                        g_free(tsize);
                } else
                        str = g_strdup_printf(_("%d new, %d unread, %d total (%s)"),
-                               n_new, n_unread, n_total, to_human_readable(n_size));
+                               n_new, n_unread, n_total, to_human_readable((goffset)n_size));
                g_free(sel);
                g_free(del);
                g_free(mv);
@@ -2621,7 +2688,7 @@ static void summary_set_column_titles(SummaryView *summaryview)
 
                hbox  = gtk_hbox_new(FALSE, 4);
                label = gtk_label_new(title);
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        gtk_widget_set_size_request(hbox, -1, 20);
 #endif
 
@@ -2850,7 +2917,8 @@ static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *g
        gint *col_pos = summaryview->col_pos;
        const gchar *msgid = msginfo->msgid;
        GHashTable *msgid_table = summaryview->msgid_table;
-       
+       gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT);
+
        summary_set_header(summaryview, text, msginfo);
 
        gtk_sctree_set_node_info(ctree, cnode, text[col_pos[S_COL_SUBJECT]], 2,
@@ -2875,6 +2943,9 @@ static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *g
        if (summaryview->col_state[summaryview->col_pos[S_COL_TAGS]].visible)
                SET_TEXT(S_COL_TAGS);
 
+       if (vert && prefs_common.two_line_vert)
+               g_free(text[summaryview->col_pos[S_COL_SUBJECT]]);
+
 #undef SET_TEXT
 
        GTKUT_CTREE_NODE_SET_ROW_DATA(cnode, msginfo);
@@ -2895,6 +2966,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        GHashTable *msgid_table;
        GHashTable *subject_table = NULL;
        GSList * cur;
+       gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT);
+
        START_TIMING("");
        
        if (!mlist) return;
@@ -2950,6 +3023,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                                (ctree, NULL, node, text, 2,
                                 NULL, NULL, NULL, NULL,
                                 FALSE, FALSE);
+                       if (vert && prefs_common.two_line_vert)
+                               g_free(text[summaryview->col_pos[S_COL_SUBJECT]]);
 
                        GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo);
                        summary_set_marks_func(ctree, node, summaryview);
@@ -3046,7 +3121,14 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[],
        gint *col_pos = summaryview->col_pos;
        gchar *from_text = NULL, *to_text = NULL, *tags_text = NULL;
        gboolean should_swap = FALSE;
-
+       gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT);
+#if GTK_CHECK_VERSION(2,12,0)
+       static const gchar *color_dim_rgb = NULL;
+       if (!color_dim_rgb)
+               color_dim_rgb = gdk_color_to_string(&summaryview->color_dim);
+#else
+       static const gchar *color_dim_rgb = "#888888";
+#endif
        text[col_pos[S_COL_FROM]]   = "";
        text[col_pos[S_COL_TO]]     = "";
        text[col_pos[S_COL_SUBJECT]]= "";
@@ -3086,7 +3168,8 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[],
                text[col_pos[S_COL_TAGS]] = "";
 
        /* slow! */
-       if (summaryview->col_state[summaryview->col_pos[S_COL_DATE]].visible) {
+       if (summaryview->col_state[summaryview->col_pos[S_COL_DATE]].visible || 
+           (vert && prefs_common.two_line_vert)) {
                if (msginfo->date_t) {
                        procheader_date_get_localtime(date_modified,
                                                      sizeof(date_modified),
@@ -3153,6 +3236,23 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[],
        else 
                text[col_pos[S_COL_SUBJECT]] = msginfo->subject ? msginfo->subject :
                        _("(No Subject)");
+       if (vert && prefs_common.two_line_vert) {
+               if (!FOLDER_SHOWS_TO_HDR(summaryview->folder_item)) {
+                       gchar *tmp = g_markup_printf_escaped(_("%s\n<span color='%s' style='italic'>From: %s, on %s</span>"),
+                                       text[col_pos[S_COL_SUBJECT]],
+                                       color_dim_rgb,
+                                       text[col_pos[S_COL_FROM]],
+                                       text[col_pos[S_COL_DATE]]);
+                       text[col_pos[S_COL_SUBJECT]] = tmp;
+               } else {
+                       gchar *tmp = g_markup_printf_escaped(_("%s\n<span color='%s' style='italic'>To: %s, on %s</span>"),
+                                       text[col_pos[S_COL_SUBJECT]],
+                                       color_dim_rgb,
+                                       text[col_pos[S_COL_TO]],
+                                       text[col_pos[S_COL_DATE]]);
+                       text[col_pos[S_COL_SUBJECT]] = tmp;
+               }
+       }
 }
 
 static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row)
@@ -3349,7 +3449,8 @@ static void summary_display_msg_full(SummaryView *summaryview,
        }
 
        if (val == 0 && MSG_IS_UNREAD(msginfo->flags)) {
-               if (prefs_common.mark_as_read_delay) {
+               if (!prefs_common.mark_as_read_on_new_window &&
+                   prefs_common.mark_as_read_delay) {
                        MarkAsReadData *data = g_new0(MarkAsReadData, 1);
                        data->summaryview = summaryview;
                        data->msginfo = msginfo;
@@ -3482,12 +3583,18 @@ gboolean summary_step(SummaryView *summaryview, GtkScrollType type)
        return TRUE;
 }
 
+gboolean summary_is_list(SummaryView *summaryview)
+{
+       return (gtk_notebook_get_current_page(
+               GTK_NOTEBOOK(summaryview->mainwidget_book)) == 0);
+}
+
 void summary_toggle_view(SummaryView *summaryview)
 {
        if (prefs_common.layout_mode == SMALL_LAYOUT)
                return;
        if (!messageview_is_visible(summaryview->messageview) &&
-           summaryview->selected)
+           summaryview->selected && summary_is_list(summaryview))
                summary_display_msg(summaryview,
                                    summaryview->selected);
        else
@@ -4093,7 +4200,7 @@ void summary_delete(SummaryView *summaryview)
                GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
                msginfo = gtk_ctree_node_get_row_data(ctree, row);
                if (msginfo && msginfo->total_size != 0 && 
-                   msginfo->size != (off_t)msginfo->total_size)
+                   msginfo->size != (goffset)msginfo->total_size)
                        partial_mark_for_delete(msginfo);
        }
 
@@ -5746,11 +5853,10 @@ static gboolean summary_popup_menu(GtkWidget *widget, gpointer data)
        return TRUE;
 }
 
-#if GTK_CHECK_VERSION(2,12,0) && !MAEMO
+#if GTK_CHECK_VERSION(2,12,0) && !GENERIC_UMPC
 static gchar *summaryview_get_tooltip_text(SummaryView *summaryview, MsgInfo *info, gint column)
 {
        MsgFlags flags;
-
        if (!info)
                return NULL;
 
@@ -5827,6 +5933,7 @@ static gboolean tooltip_cb (GtkWidget  *widget,
        gchar *formatted = NULL;
        MsgInfo *info = NULL;
        GdkRectangle rect;
+       gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT);
 
        if (!prefs_common.show_tooltips)
                return FALSE;
@@ -5864,8 +5971,11 @@ static gboolean tooltip_cb (GtkWidget  *widget,
 
        formatted = g_strdup(text);
        g_strstrip(formatted);
-       
-       gtk_tooltip_set_text (tooltip, formatted);
+
+       if (!vert)      
+               gtk_tooltip_set_text (tooltip, formatted);
+       else if (prefs_common.two_line_vert)
+               gtk_tooltip_set_markup (tooltip, formatted);
        g_free(formatted);
        
        rect.x = x - 2;
@@ -5885,6 +5995,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
        gchar *titles[N_SUMMARY_COLS];
        SummaryColumnType type;
        gint pos;
+       gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT);
 
        memset(titles, 0, sizeof(titles));
 
@@ -5900,6 +6011,10 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
        ctree = gtk_sctree_new_with_titles
                (N_SUMMARY_COLS, col_pos[S_COL_SUBJECT], titles);
 
+       /* get normal row height */
+       gtk_clist_set_row_height(GTK_CLIST(ctree), 0);
+       normal_row_height = GTK_CLIST(ctree)->row_height;
+
        if (prefs_common.show_col_headers == FALSE)
                gtk_clist_column_titles_hide(GTK_CLIST(ctree));
 
@@ -5961,9 +6076,18 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
        for (pos = 0; pos < N_SUMMARY_COLS; pos++) {
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(ctree)->column[pos].button,
                                       GTK_CAN_FOCUS);
-               gtk_clist_set_column_visibility
-                       (GTK_CLIST(ctree), pos, col_state[pos].visible);
+               if (((pos == summaryview->col_pos[S_COL_FROM] && !FOLDER_SHOWS_TO_HDR(summaryview->folder_item)) ||
+                    (pos == summaryview->col_pos[S_COL_TO] && FOLDER_SHOWS_TO_HDR(summaryview->folder_item)) ||
+                    pos == summaryview->col_pos[S_COL_DATE]) && vert &&
+                           prefs_common.two_line_vert)
+                       gtk_clist_set_column_visibility
+                               (GTK_CLIST(ctree), pos, FALSE);
+               else
+                       gtk_clist_set_column_visibility
+                               (GTK_CLIST(ctree), pos, col_state[pos].visible);
        }
+       if (prefs_common.two_line_vert)
+               gtk_sctree_set_use_markup(GTK_SCTREE(ctree), summaryview->col_pos[S_COL_SUBJECT], vert);
 
        /* connect signal to the buttons for sorting */
 #define CLIST_BUTTON_SIGNAL_CONNECT(col, func) \
@@ -6043,7 +6167,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                         G_CALLBACK(summary_drag_motion_cb),
                         summaryview);
 
-#if GTK_CHECK_VERSION(2,12,0) && !MAEMO
+#if GTK_CHECK_VERSION(2,12,0) && !GENERIC_UMPC
        g_object_set (G_OBJECT(ctree), "has-tooltip", TRUE, NULL);
        g_signal_connect(G_OBJECT(ctree), "query-tooltip", 
                         G_CALLBACK(tooltip_cb),
@@ -6079,12 +6203,20 @@ void summary_set_column_order(SummaryView *summaryview)
 
        summary_select_by_msgnum(summaryview, selected_msgnum);
 
+       summaryview->selected = summary_find_msg_by_msgnum(summaryview, selected_msgnum);
        summaryview->displayed = summary_find_msg_by_msgnum(summaryview, displayed_msgnum);
        summaryview->last_displayed = summaryview->displayed;
        if (!summaryview->displayed)
                messageview_clear(summaryview->messageview);
        else
                summary_redisplay_msg(summaryview);
+
+       if (prefs_common.layout_mode == VERTICAL_LAYOUT &&
+           prefs_common.two_line_vert) {
+               gtk_clist_set_row_height(GTK_CLIST(summaryview->ctree), 2*normal_row_height + 2);               
+       } else {
+               gtk_clist_set_row_height(GTK_CLIST(summaryview->ctree), 0);             
+       }
 }
 
 
@@ -6107,7 +6239,7 @@ static gint summary_toggle_pressed(GtkWidget *eventbox, GdkEventButton *event,
                summary_toggle_view(summaryview);
        return TRUE;
 }
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
 static void summary_toggle_multiple_pressed(GtkWidget *widget,
                                   SummaryView *summaryview)
 {
@@ -6144,7 +6276,10 @@ static gboolean summary_button_released(GtkWidget *ctree, GdkEventButton *event,
 
 gboolean summary_pass_key_press_event(SummaryView *summaryview, GdkEventKey *event)
 {
-       return summary_key_pressed(summaryview->ctree, event, summaryview);
+       if (summary_is_list(summaryview))
+               return summary_key_pressed(summaryview->ctree, event, summaryview);
+       else
+               return FALSE;
 }
 
 #define BREAK_ON_MODIFIER_KEY() \
@@ -6204,7 +6339,7 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                case GDK_KP_Enter:
                        handled = TRUE;
                        if (summaryview->displayed != summaryview->selected) {
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
                                summary_display_msg(summaryview,
                                                    summaryview->selected);
 #else
@@ -6419,8 +6554,10 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                    !MSG_IS_COPY(msginfo->flags)) {
                        if (MSG_IS_MARKED(msginfo->flags)) {
                                summary_unmark_row(summaryview, row);
+                               summary_status_show(summaryview);
                        } else {
                                summary_mark_row(summaryview, row);
+                               summary_status_show(summaryview);
                        }
                }
                break;
@@ -6443,11 +6580,13 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                break;
        case S_COL_LOCKED:
                if (MSG_IS_LOCKED(msginfo->flags)) {
-                       summary_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
-                       summary_set_row_marks(summaryview, row);
+                       summary_unlock_row(summaryview, row);
+                       summary_status_show(summaryview);
                }
-               else
+               else {
                        summary_lock_row(summaryview, row);
+                       summary_status_show(summaryview);
+               }
                break;
        default:
                break;
@@ -6524,7 +6663,7 @@ static void summary_reply_cb(SummaryView *summaryview, guint action,
        compose_reply_from_messageview(msgview, msginfo_list, action);
        g_slist_free(msginfo_list);
 }
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
 static void summary_show_all_header_cb(SummaryView *summaryview,
                                       guint action, GtkWidget *widget)
 {
@@ -6545,7 +6684,7 @@ static void summary_create_filter_cb(SummaryView *summaryview,
 {
        summary_filter_open(summaryview, (PrefsFilterType)action, 0);
 }
-#ifndef MAEMO
+#ifndef GENERIC_UMPC
 static void summary_create_processing_cb(SummaryView *summaryview,
                                         guint action, GtkWidget *widget)
 {
@@ -7238,7 +7377,7 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview)
        gtk_widget_show(pixmap);
        summaryview->quick_search_pixmap = pixmap;
 
-#ifdef MAEMO
+#ifdef GENERIC_UMPC
        pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_SELECTION);
        gtk_container_remove (GTK_CONTAINER(summaryview->multiple_sel_togbtn), 
                              summaryview->multiple_sel_image);
@@ -7380,6 +7519,7 @@ static gboolean summary_update_msg(gpointer source, gpointer data)
 void summary_update_unread(SummaryView *summaryview, FolderItem *removed_item)
 {
        guint new, unread, unreadmarked, marked, total;
+       guint replied, forwarded, locked, ignored, watched;
        static gboolean tips_initialized = FALSE;
 
        if (prefs_common.layout_mode != SMALL_LAYOUT) {
@@ -7392,7 +7532,9 @@ void summary_update_unread(SummaryView *summaryview, FolderItem *removed_item)
                } 
                return;
        }
-       folder_count_total_msgs(&new, &unread, &unreadmarked, &marked, &total);
+       folder_count_total_msgs(&new, &unread, &unreadmarked, &marked, &total,
+                               &replied, &forwarded, &locked, &ignored,
+                               &watched);
        if (removed_item) {
                total -= removed_item->total_msgs;
                new -= removed_item->new_msgs;