2005-12-05 [paul] 1.9.100cvs61
[claws.git] / src / summaryview.c
index b3d209791e547b9d0a17720f62e7acd0e1271858..bfb812cf63d5201713e3bdb5aaca3e8512e366a4 100644 (file)
@@ -275,6 +275,10 @@ static void summary_selected               (GtkCTree               *ctree,
                                         GtkCTreeNode           *row,
                                         gint                    column,
                                         SummaryView            *summaryview);
+static void summary_unselected         (GtkCTree               *ctree,
+                                        GtkCTreeNode           *row,
+                                        gint                    column,
+                                        SummaryView            *summaryview);
 static void summary_col_resized                (GtkCList               *clist,
                                         gint                    column,
                                         gint                    width,
@@ -400,7 +404,6 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/Repl_y to/_sender"),      NULL, summary_reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
        {N_("/Repl_y to/mailing _list"),
                                        "<control>L", summary_reply_cb, COMPOSE_REPLY_TO_LIST, NULL},
-       {N_("/Follow-up and reply to"), NULL, summary_reply_cb, COMPOSE_FOLLOWUP_AND_REPLY_TO, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/_Forward"),               "<control><alt>F", summary_reply_cb, COMPOSE_FORWARD_INLINE, NULL},
        {N_("/For_ward as attachment"), NULL, summary_reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
@@ -410,7 +413,6 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_Copy..."),               "<shift><control>O", summary_copy_to,   0, NULL},
        {N_("/Move to _trash"),         "<control>D", summary_delete_trash,     0, NULL},
        {N_("/_Delete..."),             NULL, summary_delete, 0, NULL},
-       {N_("/Cancel a news message"),  NULL, summary_cancel,   0, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/_Mark"),                  NULL, NULL,             0, "<Branch>"},
        {N_("/_Mark/_Mark"),            NULL, summary_mark,     0, NULL},
@@ -425,8 +427,6 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_Mark/Unlock"),           NULL, summary_msgs_unlock, 0, NULL},
        {N_("/Color la_bel"),           NULL, NULL,             0, NULL},
 
-       {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
-       {N_("/Re-_edit"),               NULL, summary_reedit,   0, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/Add sender to address boo_k"),
                                        NULL, summary_add_address_cb, 0, NULL},
@@ -454,10 +454,13 @@ static GtkItemFactoryEntry summary_popup_entries[] =
                                        "<control><alt>N", summary_open_msg,    0, NULL},
        {N_("/_View/_Source"),          "<control>U", summary_view_source, 0, NULL},
        {N_("/_View/All _header"),      "<control>H", summary_show_all_header_cb, 0, "<ToggleItem>"},
+       {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
+       {N_("/_Save as..."),            "<control>S", summary_save_as,   0, NULL},
+       {N_("/_Print..."),              "<control>P", summary_print,   0, NULL},
 };  /* see also list in menu_connect_identical_items() in menu.c if this changes */
 
 static const gchar *const col_label[N_SUMMARY_COLS] = {
-       N_("M"),        /* S_COL_MARK    */
+       "",             /* S_COL_MARK    */
        N_("S"),        /* S_COL_STATUS  */
        "",             /* S_COL_MIME    */
        N_("Subject"),  /* S_COL_SUBJECT */
@@ -465,9 +468,9 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
        N_("To"),       /* S_COL_TO      */
        N_("Date"),     /* S_COL_DATE    */
        N_("Size"),     /* S_COL_SIZE    */
-       N_("No."),      /* S_COL_NUMBER  */
+       N_("#"),        /* S_COL_NUMBER  */
        N_("Score"),    /* S_COL_SCORE   */
-       N_("L")         /* S_COL_LOCKED  */
+       "",             /* S_COL_LOCKED  */
 };
 
 #define START_LONG_OPERATION(summaryview) {                    \
@@ -524,7 +527,7 @@ SummaryView *summary_create(void)
 
        gtk_tooltips_set_tip(GTK_TOOLTIPS(search_tip),
                             toggle_search,
-                            _("Toggle quick-search bar"), NULL);
+                            _("Toggle quick search bar"), NULL);
        
        gtk_box_pack_start(GTK_BOX(hbox), toggle_search, FALSE, FALSE, 2);      
 
@@ -814,6 +817,9 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        if (summary_is_locked(summaryview)) return FALSE;
 
+       if (!summaryview->mainwin)
+               return FALSE;
+
        inc_lock();
        summary_lock(summaryview);
 
@@ -1214,19 +1220,15 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/Reply to/all"                , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
                {"/Reply to/sender"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
                {"/Reply to/mailing list"       , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Follow-up and reply to"      , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST|M_NEWS},
 
                {"/Forward"                     , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Forward as attachment"       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Redirect"                    , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
 
-               {"/Re-edit"                     , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
-
-               {"/Move..."                     , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NOT_NEWS},
-               {"/Copy..."                     , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
-               {"/Move to trash"               , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NOT_NEWS},
-               {"/Delete..."                   , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
-               {"/Cancel a news message"       , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NEWS},
+               {"/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},
+               {"/Delete..."                   , M_TARGET_EXIST|M_ALLOW_DELETE},
 
                {"/Mark"                        , M_TARGET_EXIST},
                {"/Mark/Mark"                   , M_TARGET_EXIST},
@@ -1246,13 +1248,8 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/View/Open in new window"     , M_SINGLE_TARGET_EXIST},
                {"/View/Source"                 , M_SINGLE_TARGET_EXIST},
                {"/View/All header"             , M_SINGLE_TARGET_EXIST},
-#if 0
-               {"/Save as..."                  , M_TARGET_EXIST|M_UNLOCKED},
-               {"/Print..."                    , M_TARGET_EXIST|M_UNLOCKED},
-
-               {"/Select thread"               , M_SINGLE_TARGET_EXIST},
-               {"/Select all"                  , M_TARGET_EXIST},
-#endif
+               {"/Save as..."                  , M_TARGET_EXIST},
+               {"/Print..."                    , M_TARGET_EXIST},
                {NULL, 0}
        };
 
@@ -1597,12 +1594,23 @@ void summary_select_node(SummaryView *summaryview, GtkCTreeNode *node,
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
 
+       if (!summaryview->folder_item)
+               return;
        if (node) {
                gtkut_ctree_expand_parent_all(ctree, node);
                if (do_refresh) {
                        GTK_EVENTS_FLUSH();
                        gtk_widget_grab_focus(GTK_WIDGET(ctree));
-                       gtk_ctree_node_moveto(ctree, node, -1, 0.5, 0);
+                       if (GTK_CTREE_ROW(node) == NULL) {
+                               g_warning("crash avoidance hack 1\n");
+                               return;
+                       }
+                       if (((GtkCListRow *)(GTK_CTREE_ROW(node)))->state < GTK_STATE_NORMAL
+                       ||  ((GtkCListRow *)(GTK_CTREE_ROW(node)))->state > GTK_STATE_INSENSITIVE) {
+                               g_warning("crash avoidance hack 2\n");
+                               return;
+                       }
+                       gtk_ctree_node_moveto(ctree, node, 0, 0.5, 0);
                }
                summary_unselect_all(summaryview);
                if (display_msg && summaryview->displayed == node)
@@ -1816,7 +1824,7 @@ void summary_attract_by_subject(SummaryView *summaryview)
 
        g_hash_table_destroy(subject_table);
 
-       gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
+       gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
        gtk_clist_thaw(clist);
 
@@ -1886,8 +1894,8 @@ static void summary_status_show(SummaryView *summaryview)
        gchar *spc;
        gchar *itstr;
        GList *rowlist, *cur;
-       guint n_selected = 0;
-       off_t sel_size = 0;
+       guint n_selected = 0, n_new = 0, n_unread = 0, n_total = 0;
+       off_t sel_size = 0, n_size = 0;
        MsgInfo *msginfo;
        gchar *name;
        
@@ -1908,7 +1916,33 @@ static void summary_status_show(SummaryView *summaryview)
                else {
                        sel_size += msginfo->size;
                        n_selected++;
+                       
+               }
+       }
+       
+       if (summaryview->folder_item->hide_read_msgs 
+       || quicksearch_is_active(summaryview->quicksearch)) {
+               rowlist = GTK_CLIST(summaryview->ctree)->row_list;
+               for (cur = rowlist; cur != NULL && cur->data != NULL; cur = cur->next) {
+                       msginfo = gtk_ctree_node_get_row_data
+                               (GTK_CTREE(summaryview->ctree),
+                                GTK_CTREE_NODE(cur));
+                       if (!msginfo)
+                               g_warning("summary_status_show(): msginfo == NULL\n");
+                       else {
+                               n_size += msginfo->size;
+                               n_total++;
+                               if (MSG_IS_NEW(msginfo->flags))
+                                       n_new++;
+                               if (MSG_IS_UNREAD(msginfo->flags))
+                                       n_unread++;
+                       }
                }
+       } else {
+               n_new = summaryview->folder_item->new_msgs;
+               n_unread = summaryview->folder_item->unread_msgs;
+               n_total = summaryview->folder_item->total_msgs;
+               n_size = summaryview->total_size;
        }
 
        name = folder_item_get_name(summaryview->folder_item);
@@ -1961,10 +1995,8 @@ static void summary_status_show(SummaryView *summaryview)
 
        str = g_strdup_printf(_("%d new, %d unread, %d total (%s)"),
 
-                                     summaryview->folder_item->new_msgs,
-                                     summaryview->folder_item->unread_msgs,
-                                     summaryview->folder_item->total_msgs,
-                                     to_human_readable(summaryview->total_size));
+                                     n_new, n_unread, n_total,
+                                     to_human_readable(n_size));
        gtk_label_set_text(GTK_LABEL(summaryview->statlabel_msgs), str);
        g_free(str);
 }
@@ -1978,7 +2010,6 @@ static void summary_set_column_titles(SummaryView *summaryview)
        gint pos;
        const gchar *title;
        SummaryColumnType type;
-       gboolean single_char;
        GtkJustification justify;
 
        static FolderSortKey sort_by[N_SUMMARY_COLS] = {
@@ -1999,7 +2030,6 @@ static void summary_set_column_titles(SummaryView *summaryview)
                type = summaryview->col_state[pos].type;
 
                /* CLAWS: mime and unread are single char headers */
-               single_char = (type == S_COL_MIME || type == S_COL_STATUS);
                justify = (type == S_COL_NUMBER || type == S_COL_SIZE)
                        ? GTK_JUSTIFY_RIGHT : GTK_JUSTIFY_LEFT;
 
@@ -2014,11 +2044,6 @@ static void summary_set_column_titles(SummaryView *summaryview)
                        else
                                title = col_label[type];
                        break;
-               /* CLAWS: dummies for mark and locked headers */        
-               case S_COL_MARK:        
-               case S_COL_LOCKED:
-                       title = "";
-                       break;
                default:
                        title = gettext(col_label[type]);
                }
@@ -2028,22 +2053,24 @@ static void summary_set_column_titles(SummaryView *summaryview)
                        gtk_widget_show(label);
                        gtk_clist_set_column_widget(clist, pos, label);
                        continue;
-               } else if (single_char) {
+               } else if (type == S_COL_MARK) {
+                       label = gtk_image_new_from_pixmap(markxpm, markxpmmask);
+                       gtk_widget_show(label);
+                       gtk_clist_set_column_widget(clist, pos, label);
+                       continue;
+               } else if (type == S_COL_LOCKED) {
+                       label = gtk_image_new_from_pixmap(lockedxpm, lockedxpmmask);
+                       gtk_widget_show(label);
+                       gtk_clist_set_column_widget(clist, pos, label);
+                       continue;
+               } else if (type == S_COL_STATUS) {
                        gtk_clist_set_column_title(clist, pos, title);
                        continue;
                }
 
-               /* CLAWS: changed so that locked and mark headers
-                * show a pixmap instead of single character */
                hbox  = gtk_hbox_new(FALSE, 4);
-               
-               if (type == S_COL_LOCKED)
-                       label = gtk_pixmap_new(lockedxpm, lockedxpmmask);
-               else if (type == S_COL_MARK) 
-                       label = gtk_pixmap_new(markxpm, markxpmmask);
-               else 
-                       label = gtk_label_new(title);
-               
+               label = gtk_label_new(title);
+
                if (justify == GTK_JUSTIFY_RIGHT)
                        gtk_box_pack_end(GTK_BOX(hbox), label,
                                         FALSE, FALSE, 0);
@@ -2176,7 +2203,7 @@ void summary_sort(SummaryView *summaryview,
 
                gtk_sctree_sort_recursive(ctree, NULL);
 
-               gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
+               gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
                main_window_cursor_normal(summaryview->mainwin);
                 gtk_clist_thaw(clist);
@@ -2202,7 +2229,7 @@ gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
 
        summary_set_header(summaryview, text, msginfo);
 
-       gtk_ctree_set_node_info(ctree, cnode, text[col_pos[S_COL_SUBJECT]], 2,
+       gtk_sctree_set_node_info(ctree, cnode, text[col_pos[S_COL_SUBJECT]], 2,
                                NULL, NULL, NULL, NULL, FALSE,
                                gnode->parent->parent ? TRUE : FALSE);
 #define SET_TEXT(col) \
@@ -2280,9 +2307,10 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
                        summary_set_header(summaryview, text, msginfo);
 
-                       node = gtk_ctree_insert_node
+                       node = gtk_sctree_insert_node
                                (ctree, NULL, node, text, 2,
-                                NULL, NULL, NULL, NULL, FALSE, FALSE);
+                                NULL, NULL, NULL, NULL,
+                                FALSE, FALSE);
                        GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo);
                        summary_set_marks_func(ctree, node, summaryview);
 
@@ -3764,7 +3792,7 @@ gboolean summary_execute(SummaryView *summaryview)
        summary_update_status(summaryview);
        summary_status_show(summaryview);
 
-       gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
+       gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
        summary_unlock(summaryview);
        
@@ -4108,7 +4136,7 @@ void summary_expand_threads(SummaryView *summaryview)
 
        summaryview->thread_collapsed = FALSE;
 
-       gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
+       gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 }
 
 void summary_collapse_threads(SummaryView *summaryview)
@@ -4128,7 +4156,7 @@ void summary_collapse_threads(SummaryView *summaryview)
        
        summaryview->thread_collapsed = TRUE;
 
-       gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
+       gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 }
 
 void summary_filter(SummaryView *summaryview, gboolean selected_only)
@@ -4495,7 +4523,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                                     GTK_CTREE_EXPANDER_TRIANGLE);
 #endif
        gtk_ctree_set_indent(GTK_CTREE(ctree), 12);
-       g_object_set_data(G_OBJECT(ctree), "user_data", summaryview);
+       g_object_set_data(G_OBJECT(ctree), "summaryview", (gpointer)summaryview); 
 
        for (pos = 0; pos < N_SUMMARY_COLS; pos++) {
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(ctree)->column[pos].button,
@@ -4528,6 +4556,8 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
 
        g_signal_connect(G_OBJECT(ctree), "tree_select_row",
                         G_CALLBACK(summary_selected), summaryview);
+       g_signal_connect(G_OBJECT(ctree), "tree_unselect_row",
+                        G_CALLBACK(summary_unselected), summaryview);
        g_signal_connect(G_OBJECT(ctree), "button_press_event",
                         G_CALLBACK(summary_button_pressed),
                         summaryview);
@@ -4562,7 +4592,6 @@ void summary_set_column_order(SummaryView *summaryview)
 {
        GtkWidget *ctree;
        GtkWidget *scrolledwin = summaryview->scrolledwin;
-       GtkWidget *pixmap;
        FolderItem *item;
        guint selected_msgnum = summary_get_msgnum(summaryview, summaryview->selected);
        guint displayed_msgnum = summary_get_msgnum(summaryview, summaryview->displayed);
@@ -4574,10 +4603,7 @@ void summary_set_column_order(SummaryView *summaryview)
 
        summaryview->ctree = ctree = summary_ctree_create(summaryview);
        summary_set_fonts(summaryview);
-       pixmap = gtk_image_new_from_pixmap(clipxpm, clipxpmmask);
-       gtk_clist_set_column_widget(GTK_CLIST(ctree),
-                                   summaryview->col_pos[S_COL_MIME], pixmap);
-       gtk_widget_show(pixmap);
+       summary_set_column_titles(summaryview);
        gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
                                            GTK_CLIST(ctree)->hadjustment);
        gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
@@ -4739,6 +4765,17 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                BREAK_ON_MODIFIER_KEY();
                summary_delete_trash(summaryview);
                break;
+       case GDK_y:
+       case GDK_t:
+       case GDK_l:
+       case GDK_c:
+               if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) == 0) {
+                       g_signal_stop_emission_by_name(G_OBJECT(widget), 
+                                       "key_press_event");
+                       mimeview_pass_key_press_event(messageview->mimeview,
+                                                     event);
+                       break;
+               }
        default:
                break;
        }
@@ -4805,6 +4842,17 @@ static void summary_tree_collapsed(GtkCTree *ctree, GtkCTreeNode *node,
        summary_set_row_marks(summaryview, node);
 }
 
+static void summary_unselected(GtkCTree *ctree, GtkCTreeNode *row,
+                              gint column, SummaryView *summaryview)
+{
+       if (summary_is_locked(summaryview)
+       ||  GTK_SCTREE(ctree)->selecting_range) {
+               return;
+       }
+
+       summary_status_show(summaryview);
+}
+
 static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                             gint column, SummaryView *summaryview)
 {
@@ -5444,6 +5492,7 @@ void summary_toggle_show_read_messages(SummaryView *summaryview)
 
        source.item = summaryview->folder_item;
        source.update_flags = F_ITEM_UPDATE_NAME;
+       source.msg = NULL;
        hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
        summary_show(summaryview, summaryview->folder_item);
 }