2007-02-20 [colin] 2.7.2cvs53
[claws.git] / src / summaryview.c
index 77104d2b6f2425d34b130e8c6fca7c98fb95ecb1..2e13294cb14e110ae444da8208930a13c9ce0e93 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2007 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
@@ -551,6 +551,9 @@ SummaryView *summary_create(void)
        GtkWidget *ctree;
        GtkWidget *hbox;
        GtkWidget *hbox_l;
+       GtkWidget *stat_box;
+       GtkWidget *stat_box2;
+       GtkWidget *stat_vbox;
        GtkWidget *statlabel_folder;
        GtkWidget *statlabel_select;
        GtkWidget *statlabel_msgs;
@@ -574,6 +577,15 @@ SummaryView *summary_create(void)
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_widget_show(hbox);
 
+       stat_vbox = gtk_vbox_new(FALSE, 0);
+       gtk_widget_show(stat_vbox);
+
+       stat_box = gtk_hbox_new(FALSE, 0);
+       gtk_widget_show(stat_box);
+       
+       stat_box2 = gtk_hbox_new(FALSE, 0);
+       gtk_widget_show(stat_box2);
+       
        search_tip = gtk_tooltips_new();
        toggle_search = gtk_toggle_button_new();
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle_search),
@@ -586,9 +598,13 @@ SummaryView *summary_create(void)
        
        gtk_box_pack_start(GTK_BOX(hbox), toggle_search, FALSE, FALSE, 2);      
 
+       gtk_box_pack_start(GTK_BOX(hbox), stat_vbox, TRUE, TRUE, 0);    
+       gtk_box_pack_start(GTK_BOX(stat_vbox), stat_box, TRUE, TRUE, 0);        
+       gtk_box_pack_start(GTK_BOX(stat_vbox), stat_box2, TRUE, TRUE, 0);       
+
        hbox_l = gtk_hbox_new(FALSE, 0);
        gtk_widget_show(hbox_l);
-       gtk_box_pack_start(GTK_BOX(hbox), hbox_l, TRUE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(stat_box), hbox_l, TRUE, TRUE, 0);
  
        statlabel_folder = gtk_label_new("");
        gtk_widget_show(statlabel_folder);
@@ -611,7 +627,7 @@ SummaryView *summary_create(void)
        
        statlabel_msgs = gtk_label_new("");
        gtk_widget_show(statlabel_msgs);
-       gtk_box_pack_end(GTK_BOX(hbox), statlabel_msgs, FALSE, FALSE, 4);
+       gtk_box_pack_end(GTK_BOX(stat_box), statlabel_msgs, FALSE, FALSE, 4);
 
        hbox_spc = gtk_hbox_new(FALSE, 0);
        gtk_widget_show(hbox_spc);
@@ -637,6 +653,7 @@ SummaryView *summary_create(void)
        gtk_container_add(GTK_CONTAINER(scrolledwin), ctree);
 
        /* status label */
+       gtk_widget_show_all(stat_vbox);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
        /* quick search */
@@ -660,6 +677,9 @@ SummaryView *summary_create(void)
        summaryview->ctree = ctree;
        summaryview->hbox = hbox;
        summaryview->hbox_l = hbox_l;
+       summaryview->hbox_spc = hbox_spc;
+       summaryview->stat_box = stat_box;
+       summaryview->stat_box2 = stat_box2;
        summaryview->statlabel_folder = statlabel_folder;
        summaryview->statlabel_select = statlabel_select;
        summaryview->statlabel_msgs = statlabel_msgs;
@@ -693,9 +713,48 @@ SummaryView *summary_create(void)
        else
                quicksearch_hide(quicksearch);
        
+       if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT)
+               gtk_widget_hide(summaryview->toggle_eventbox);
+
        return summaryview;
 }
 
+void summary_relayout(SummaryView *summaryview)
+{
+       gtk_widget_realize(summaryview->stat_box);
+
+       gtk_widget_ref(summaryview->hbox_l);
+       gtk_widget_ref(summaryview->statlabel_msgs);
+       
+       gtkut_container_remove(GTK_CONTAINER(summaryview->hbox_l->parent), summaryview->hbox_l);
+       gtkut_container_remove(GTK_CONTAINER(summaryview->statlabel_msgs->parent), summaryview->statlabel_msgs);
+
+       switch (prefs_common.layout_mode) {
+       case NORMAL_LAYOUT:
+       case WIDE_LAYOUT:
+       case WIDE_MSGLIST_LAYOUT:
+               gtk_box_pack_start(GTK_BOX(summaryview->stat_box), summaryview->hbox_l, TRUE, TRUE, 0);
+               gtk_box_pack_end(GTK_BOX(summaryview->stat_box), summaryview->statlabel_msgs, FALSE, FALSE, 4);
+               gtk_widget_show_all(summaryview->stat_box);
+               gtk_widget_show_all(summaryview->stat_box2);
+               if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT)
+                       gtk_widget_hide(summaryview->toggle_eventbox);
+               else
+                       gtk_widget_show(summaryview->toggle_eventbox);
+               break;
+       case VERTICAL_LAYOUT:
+               gtk_box_pack_start(GTK_BOX(summaryview->stat_box), summaryview->hbox_l, TRUE, TRUE, 0);
+               gtk_box_pack_start(GTK_BOX(summaryview->stat_box2), summaryview->statlabel_msgs, FALSE, FALSE, 4);
+               gtk_widget_show_all(summaryview->stat_box);
+               gtk_widget_show_all(summaryview->stat_box2);
+               gtk_widget_show(summaryview->toggle_eventbox);
+               break;
+       }
+       gtk_widget_unref(summaryview->hbox_l);
+       gtk_widget_unref(summaryview->statlabel_msgs);
+       quicksearch_relayout(summaryview->quicksearch);
+}
+
 static void summary_set_fonts(SummaryView *summaryview)
 {
        PangoFontDescription *font_desc;
@@ -1393,26 +1452,6 @@ GSList *summary_get_selected_msg_list(SummaryView *summaryview)
        return mlist;
 }
 
-GSList *summary_get_msg_list(SummaryView *summaryview)
-{
-       GSList *mlist = NULL;
-       GtkCTree *ctree;
-       GtkCTreeNode *node;
-       MsgInfo *msginfo;
-
-       ctree = GTK_CTREE(summaryview->ctree);
-
-       for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
-            node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
-               msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
-               mlist = g_slist_prepend(mlist, msginfo);
-       }
-
-       mlist = g_slist_reverse(mlist);
-
-       return mlist;
-}
-
 void summary_set_menu_sensitive(SummaryView *summaryview)
 {
        GtkItemFactory *ifactory = summaryview->popupfactory;
@@ -2524,7 +2563,7 @@ unlock:
        END_TIMING();
 }
 
-gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
+static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
                                   GtkCTreeNode *cnode, gpointer data)
 {
        SummaryView *summaryview = (SummaryView *)data;
@@ -2935,7 +2974,6 @@ static void msginfo_mark_as_read (SummaryView *summaryview, MsgInfo *msginfo,
 typedef struct  {
        MsgInfo *msginfo;
        SummaryView *summaryview;
-       GtkCTreeNode *row;
 } MarkAsReadData;
 
 static int msginfo_mark_as_read_timeout(void *data)
@@ -2946,7 +2984,7 @@ static int msginfo_mark_as_read_timeout(void *data)
        
        if (mdata->msginfo == summary_get_selected_msg(mdata->summaryview))
                msginfo_mark_as_read(mdata->summaryview, mdata->msginfo,
-                                    mdata->row); 
+                                    mdata->summaryview->selected); 
 
        g_free(mdata);
 
@@ -3006,7 +3044,6 @@ static void summary_display_msg_full(SummaryView *summaryview,
                        MarkAsReadData *data = g_new0(MarkAsReadData, 1);
                        data->summaryview = summaryview;
                        data->msginfo = msginfo;
-                       data->row = row;
                        g_timeout_add(prefs_common.mark_as_read_delay * 1000,
                                msginfo_mark_as_read_timeout, data);
                } else if (new_window || !prefs_common.mark_as_read_on_new_window) {
@@ -3048,9 +3085,8 @@ void summary_open_msg(SummaryView *summaryview)
        
        /* CLAWS: if separate message view, don't open a new window
         * but rather use the current separated message view */
-       summary_display_msg_full(summaryview, summaryview->selected,
-                                prefs_common.sep_msg ? FALSE : TRUE, 
-                                FALSE);
+       summary_display_msg_full(summaryview, summaryview->selected, 
+                                TRUE, FALSE);
 }
 
 void summary_view_source(SummaryView * summaryview)
@@ -3508,8 +3544,9 @@ void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *wid
                                continue;
                        if (is_spam) {
                                summary_msginfo_change_flags(msginfo, MSG_SPAM, 0, MSG_NEW|MSG_UNREAD, 0);
-                               if (procmsg_spam_get_folder() != summaryview->folder_item) {
-                                       summary_move_row_to(summaryview, row, procmsg_spam_get_folder());
+                               if (procmsg_spam_get_folder(msginfo) != summaryview->folder_item) {
+                                       summary_move_row_to(summaryview, row,
+                                                       procmsg_spam_get_folder(msginfo));
                                        moved = TRUE;
                                }
                        } else {
@@ -4015,16 +4052,18 @@ void summary_unselect_all(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
-void summary_select_thread(SummaryView *summaryview)
+void summary_select_thread(SummaryView *summaryview, gboolean delete_thread)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCTreeNode *node = summaryview->selected;
+       gboolean froze = FALSE;
 
        if (!node) return;
 
        while (GTK_CTREE_ROW(node)->parent != NULL)
                node = GTK_CTREE_ROW(node)->parent;
 
+       START_LONG_OPERATION(summaryview, FALSE);
        if (node != summaryview->selected)
                summary_select_node
                        (summaryview, node,
@@ -4032,7 +4071,14 @@ void summary_select_thread(SummaryView *summaryview)
                         FALSE);
 
        gtk_ctree_select_recursive(ctree, node);
+       END_LONG_OPERATION(summaryview);
 
+       if (delete_thread) {
+               if (FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS)
+                       summary_delete(summaryview);
+               else
+                       summary_delete_trash(summaryview);
+       }
        summary_status_show(summaryview);
 }
 
@@ -4153,7 +4199,15 @@ void summary_print(SummaryView *summaryview)
                MsgInfo *msginfo = gtk_ctree_node_get_row_data(
                                        GTK_CTREE(summaryview->ctree),
                                        node);
-               messageview_print(msginfo, summaryview->messageview->all_headers);
+               gint sel_start = -1, sel_end = -1, partnum = 0;
+               
+               if (node == summaryview->displayed) {
+                       partnum = mimeview_get_selected_part_num(summaryview->messageview->mimeview);
+                       textview_get_selection_offsets(summaryview->messageview->mimeview->textview,
+                               &sel_start, &sel_end);
+               } 
+               messageview_print(msginfo, summaryview->messageview->all_headers,
+                       sel_start, sel_end, partnum);
        }
 #endif
 }
@@ -4619,12 +4673,12 @@ void summary_collapse_threads(SummaryView *summaryview)
        gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 }
 
-void account_rules_radio_button_toggled_cb(GtkToggleButton *btn, gpointer data)
+static void account_rules_radio_button_toggled_cb(GtkToggleButton *btn, gpointer data)
 {
        prefs_common.apply_per_account_filtering_rules = GPOINTER_TO_INT(data);
 }
 
-gboolean summary_filter_get_mode(void)
+static gboolean summary_filter_get_mode(void)
 /* ask what to do w/ them: skip them, apply them regardless to the account,
    use the current account */
 {
@@ -4864,9 +4918,9 @@ void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
                style->fg[GTK_STATE_NORMAL] = color;
                /* get the average of label color and selected fg color
                   for visibility */
-               style->fg[GTK_STATE_SELECTED].red   = (color.red   + ctree_style->fg[GTK_STATE_SELECTED].red  ) / 2;
-               style->fg[GTK_STATE_SELECTED].green = (color.green + ctree_style->fg[GTK_STATE_SELECTED].green) / 2;
-               style->fg[GTK_STATE_SELECTED].blue  = (color.blue  + ctree_style->fg[GTK_STATE_SELECTED].blue ) / 2;
+               style->fg[GTK_STATE_SELECTED].red   = (color.red   + 3*ctree_style->fg[GTK_STATE_SELECTED].red  ) / 4;
+               style->fg[GTK_STATE_SELECTED].green = (color.green + 3*ctree_style->fg[GTK_STATE_SELECTED].green) / 4;
+               style->fg[GTK_STATE_SELECTED].blue  = (color.blue  + 3*ctree_style->fg[GTK_STATE_SELECTED].blue ) / 4;
        }
 
        gtk_ctree_node_set_row_style(ctree, node, style);
@@ -5288,6 +5342,8 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                switch (event->keyval) {
                case GDK_space:         /* Page down or go to the next */
                        handled = TRUE;
+                       if (event->state & GDK_CONTROL_MASK) 
+                               event->state &= ~GDK_CONTROL_MASK;
                        if (event->state & GDK_SHIFT_MASK) 
                                mimeview_scroll_page(messageview->mimeview, TRUE);
                        else {
@@ -5409,12 +5465,18 @@ static void tog_searchbar_cb(GtkWidget *w, gpointer data)
        }
 }
 
-void summaryview_activate_quicksearch(SummaryView *summaryview) 
+void summaryview_activate_quicksearch(SummaryView *summaryview, gboolean show
 {
+       prefs_common.show_searchbar = show;
        gtk_toggle_button_set_active(
                GTK_TOGGLE_BUTTON(summaryview->toggle_search), 
-               TRUE);
-       quicksearch_show(summaryview->quicksearch);
+               show);
+       if (show) {
+               quicksearch_show(summaryview->quicksearch);
+       } else {
+               quicksearch_hide(summaryview->quicksearch);
+               summary_grab_focus(summaryview);
+       }
 }
 
 static void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
@@ -5882,7 +5944,8 @@ static gint func_name(GtkCList *clist,                                     \
 CMP_FUNC_DEF(summary_cmp_by_mark,
             MSG_IS_MARKED(msginfo1->flags) - MSG_IS_MARKED(msginfo2->flags))
 CMP_FUNC_DEF(summary_cmp_by_status,
-            MSG_IS_UNREAD(msginfo1->flags) - MSG_IS_UNREAD(msginfo2->flags))
+            (-(MSG_IS_SPAM(msginfo1->flags))+(MSG_IS_UNREAD(msginfo1->flags)<<1)+(MSG_IS_NEW(msginfo1->flags)<<2)) 
+            - (-(MSG_IS_SPAM(msginfo2->flags))+(MSG_IS_UNREAD(msginfo2->flags)<<1)+(MSG_IS_NEW(msginfo2->flags)<<2)) )
 CMP_FUNC_DEF(summary_cmp_by_mime,
             MSG_IS_WITH_ATTACHMENT(msginfo1->flags) - MSG_IS_WITH_ATTACHMENT(msginfo2->flags))
 CMP_FUNC_DEF(summary_cmp_by_label,
@@ -6245,13 +6308,14 @@ void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *ite
                summaryview->simplify_subject_preg = summary_compile_simplify_regexp(item->prefs->simplify_subject_regexp);
 
        /* Sorting */
-       if (folder_get_sort_type(item->folder, &sort_key, &sort_type)) {
-               summaryview->sort_key = sort_key;
-               summaryview->sort_type = sort_type;
-       } else {
-               summaryview->sort_key = item->sort_key;
-               summaryview->sort_type = item->sort_type;
-       }
+       sort_key = item->sort_key;
+       sort_type = item->sort_type;
+
+       folder_get_sort_type(item->folder, &sort_key, &sort_type);
+
+       summaryview->sort_key = sort_key;
+       summaryview->sort_type = sort_type;
+
        /* Threading */
        summaryview->threaded = item->threaded;
        summaryview->thread_collapsed = item->thread_collapsed;