2005-10-13 [colin] 1.9.15cvs38
[claws.git] / src / summaryview.c
index 462b6aa7baccb0e714727165244ce05c26220bb0..b3d209791e547b9d0a17720f62e7acd0e1271858 100644 (file)
@@ -402,7 +402,8 @@ static GtkItemFactoryEntry summary_popup_entries[] =
                                        "<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, NULL},
+       {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},
        {N_("/Redirect"),               NULL, summary_reply_cb, COMPOSE_REDIRECT, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/M_ove..."),               "<control>O", summary_move_to,  0, NULL},
@@ -861,7 +862,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        gtk_clist_freeze(GTK_CLIST(ctree));
 
        summary_clear_list(summaryview);
-       summary_set_column_titles(summaryview);
 
        buf = NULL;
        if (!item || !item->path || !folder_item_parent(item) || item->no_select) {
@@ -983,8 +983,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        g_slist_free(mlist);
 
-       gtk_clist_thaw(GTK_CLIST(ctree));
-
        if (is_refresh) {
                summaryview->displayed =
                        summary_find_msg_by_msgnum(summaryview,
@@ -1041,10 +1039,11 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                summary_lock(summaryview);
        }
 
-       summary_set_column_titles(summaryview);
        summary_status_show(summaryview);
        summary_set_menu_sensitive(summaryview);
        toolbar_main_set_sensitive(summaryview->mainwin);
+       
+       gtk_clist_thaw(GTK_CLIST(ctree));
 
        debug_print("\n");
        STATUSBAR_PUSH(summaryview->mainwin, _("Done."));
@@ -1218,6 +1217,7 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/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},
@@ -1225,7 +1225,7 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/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|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},
 
                {"/Mark"                        , M_TARGET_EXIST},
@@ -1288,7 +1288,7 @@ void summary_select_prev_unread(SummaryView *summaryview)
        node = summary_find_prev_flagged_msg
                (summaryview, summaryview->selected, MSG_UNREAD, skip_cur);
 
-       if (!node) {
+       if (!node || node == summaryview->selected) {
                AlertValue val = 0;
 
                switch (prefs_common.next_unread_msg_dialog) {
@@ -1340,7 +1340,7 @@ void summary_select_next_unread(SummaryView *summaryview)
        else {
                node = summary_find_next_flagged_msg
                        (summaryview, NULL, MSG_UNREAD, FALSE);
-               if (node == NULL) {
+               if (node == NULL || node == summaryview->selected) {
                        AlertValue val = 0;
 
                        switch (prefs_common.next_unread_msg_dialog) {
@@ -1387,7 +1387,7 @@ void summary_select_prev_new(SummaryView *summaryview)
        node = summary_find_prev_flagged_msg
                (summaryview, summaryview->selected, MSG_NEW, skip_cur);
 
-       if (!node) {
+       if (!node || node == summaryview->selected) {
                AlertValue val = 0;
 
                switch (prefs_common.next_unread_msg_dialog) {
@@ -1439,7 +1439,7 @@ void summary_select_next_new(SummaryView *summaryview)
        else {
                node = summary_find_next_flagged_msg
                        (summaryview, NULL, MSG_NEW, FALSE);
-               if (node == NULL) {
+               if (node == NULL || node == summaryview->selected) {
                        AlertValue val = 0;
 
                        switch (prefs_common.next_unread_msg_dialog) {
@@ -1847,10 +1847,6 @@ static void summary_set_marks_func(GtkCTree *ctree, GtkCTreeNode *node,
            msginfo->folder->folder->klass->type == F_NEWS)
                news_flag_crosspost(msginfo);
 
-       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
-       && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked++;
-
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted++;
 
@@ -1872,9 +1868,6 @@ static void summary_update_status(SummaryView *summaryview)
             node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
                msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
 
-               if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
-               && procmsg_msg_has_marked_parent(msginfo))
-                       summaryview->unreadmarked++;
                if (MSG_IS_DELETED(msginfo->flags))
                        summaryview->deleted++;
                if (MSG_IS_MOVE(msginfo->flags))
@@ -2035,8 +2028,7 @@ static void summary_set_column_titles(SummaryView *summaryview)
                        gtk_widget_show(label);
                        gtk_clist_set_column_widget(clist, pos, label);
                        continue;
-               }
-               if (single_char) {
+               } else if (single_char) {
                        gtk_clist_set_column_title(clist, pos, title);
                        continue;
                }
@@ -2079,13 +2071,28 @@ static void summary_set_column_titles(SummaryView *summaryview)
 
 void summary_reflect_prefs(void)
 {
+       static gchar *last_font = NULL;
+       gboolean update_font = TRUE;
        SummaryView *summaryview = NULL;
+
        if (!mainwindow_get_mainwindow())
                return;
        summaryview = mainwindow_get_mainwindow()->summaryview;
-       bold_style = bold_marked_style = bold_deleted_style = 
-               small_style = small_marked_style = small_deleted_style = NULL;
-       summary_set_fonts(summaryview);
+
+       if (last_font && !strcmp(last_font, NORMAL_FONT))
+               update_font = FALSE;
+
+       if (last_font)
+               g_free(last_font);
+       
+       last_font = g_strdup(NORMAL_FONT);
+
+       if (update_font) {      
+               bold_style = bold_marked_style = bold_deleted_style = 
+                       small_style = small_marked_style = small_deleted_style = NULL;
+               summary_set_fonts(summaryview);
+       }
+
        summary_set_column_titles(summaryview);
        summary_show(summaryview, summaryview->folder_item);
 }
@@ -2208,7 +2215,7 @@ gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
        SET_TEXT(S_COL_DATE);
        SET_TEXT(S_COL_FROM);
        SET_TEXT(S_COL_TO);
-       SET_TEXT(S_COL_SUBJECT);
+       /* SET_TEXT(S_COL_SUBJECT);  already set by node info */
 
 #undef SET_TEXT
 
@@ -2317,11 +2324,13 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
        node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
 
-       while (prefs_common.bold_unread && node) {
-               GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
-               if (GTK_CTREE_ROW(node)->children)
-                       summary_set_row_marks(summaryview, node);
-               node = next;
+       if (prefs_common.bold_unread) {
+               while (node) {
+                       GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
+                       if (GTK_CTREE_ROW(node)->children)
+                               summary_set_row_marks(summaryview, node);
+                       node = next;
+               }
        }
 
        g_signal_handlers_unblock_by_func(G_OBJECT(ctree),
@@ -2361,14 +2370,17 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
        static gchar col_score[11];
        static gchar buf[BUFFSIZE];
        gint *col_pos = summaryview->col_pos;
-       FolderType ftype = F_UNKNOWN;
        gchar *from_text = NULL, *to_text = NULL;
        gboolean should_swap = FALSE;
 
-       text[col_pos[S_COL_MARK]]   = NULL;
-       text[col_pos[S_COL_STATUS]] = NULL;
-       text[col_pos[S_COL_MIME]]   = NULL;
-       text[col_pos[S_COL_LOCKED]] = NULL;
+       text[col_pos[S_COL_FROM]]   = "";
+       text[col_pos[S_COL_TO]]     = "";
+       text[col_pos[S_COL_SUBJECT]]= "";
+       text[col_pos[S_COL_MARK]]   = "";
+       text[col_pos[S_COL_STATUS]] = "";
+       text[col_pos[S_COL_MIME]]   = "";
+       text[col_pos[S_COL_LOCKED]] = "";
+       text[col_pos[S_COL_DATE]]   = "";
        text[col_pos[S_COL_NUMBER]] = itos(msginfo->msgnum);
        text[col_pos[S_COL_SIZE]]   = to_human_readable(msginfo->size);
        text[col_pos[S_COL_SCORE]]  = itos_buf(col_score, msginfo->score);
@@ -2383,7 +2395,7 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
        else
                text[col_pos[S_COL_DATE]] = _("(No Date)");
 
-       if (ftype != F_NEWS && prefs_common.swap_from && msginfo->from && msginfo->to) {
+       if (prefs_common.swap_from && msginfo->from && msginfo->to) {
                gchar *addr = NULL;
                
                addr = g_strdup(msginfo->from);
@@ -2425,9 +2437,6 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                text[col_pos[S_COL_TO]] = tmp;
        }
        
-       if (msginfo->folder && msginfo->folder->folder)
-               ftype = msginfo->folder->folder->klass->type; 
-               
        if (summaryview->simplify_subject_preg != NULL)
                text[col_pos[S_COL_SUBJECT]] = msginfo->subject ? 
                        string_remove_match(buf, BUFFSIZE, msginfo->subject, 
@@ -2443,6 +2452,96 @@ static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row)
        summary_display_msg_full(summaryview, row, FALSE, FALSE);
 }
 
+static gboolean defer_change(gpointer data);
+typedef struct _ChangeData {
+       MsgInfo *info;
+       gint op; /* 0, 1, 2 for unset, set, change */
+       MsgPermFlags set_flags;
+       MsgTmpFlags  set_tmp_flags;
+       MsgPermFlags unset_flags;
+       MsgTmpFlags  unset_tmp_flags;
+} ChangeData;
+
+static void summary_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags flags, MsgTmpFlags tmp_flags)
+{
+       if (!msginfo->folder || !msginfo->folder->processing_pending) {
+               debug_print("flags: doing unset now\n");
+               procmsg_msginfo_unset_flags(msginfo, flags, tmp_flags);
+       } else {
+               ChangeData *unset_data = g_new0(ChangeData, 1);
+               unset_data->info = msginfo;
+               unset_data->op = 0;
+               unset_data->unset_flags = flags;
+               unset_data->unset_tmp_flags = tmp_flags;
+               debug_print("flags: deferring unset\n");
+               g_timeout_add(100, defer_change, unset_data);
+       }
+}
+
+static void summary_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags flags, MsgTmpFlags tmp_flags)
+{
+       if (!msginfo->folder || !msginfo->folder->processing_pending) {
+               debug_print("flags: doing set now\n");
+               procmsg_msginfo_set_flags(msginfo, flags, tmp_flags);
+       } else {
+               ChangeData *set_data = g_new0(ChangeData, 1);
+               set_data->info = msginfo;
+               set_data->op = 1;
+               set_data->set_flags = flags;
+               set_data->set_tmp_flags = tmp_flags;
+               debug_print("flags: deferring set\n");
+               g_timeout_add(100, defer_change, set_data);
+       }
+}
+
+static void summary_msginfo_change_flags(MsgInfo *msginfo, 
+               MsgPermFlags add_flags, MsgTmpFlags add_tmp_flags,
+               MsgPermFlags rem_flags, MsgTmpFlags rem_tmp_flags)
+{
+       if (!msginfo->folder || !msginfo->folder->processing_pending) {
+               debug_print("flags: doing change now\n");
+               procmsg_msginfo_change_flags(msginfo, add_flags, add_tmp_flags,
+                       rem_flags, rem_tmp_flags);
+       } else {
+               ChangeData *change_data = g_new0(ChangeData, 1);
+               change_data->info = msginfo;
+               change_data->op = 2;
+               change_data->set_flags = add_flags;
+               change_data->set_tmp_flags = add_tmp_flags;
+               change_data->unset_flags = rem_flags;
+               change_data->unset_tmp_flags = rem_tmp_flags;
+               debug_print("flags: deferring change\n");
+               g_timeout_add(100, defer_change, change_data);
+       }
+}
+
+gboolean defer_change(gpointer data)
+{
+       ChangeData *chg = (ChangeData *)data;
+       if (chg->info->folder && chg->info->folder->processing_pending) {
+               debug_print("flags: trying later\n");
+               return TRUE; /* try again */
+       } else {
+               debug_print("flags: finally doing it\n");
+               switch(chg->op) {
+               case 0:
+                       procmsg_msginfo_unset_flags(chg->info, chg->unset_flags, chg->unset_tmp_flags);
+                       break;
+               case 1:
+                       procmsg_msginfo_set_flags(chg->info, chg->set_flags, chg->set_tmp_flags);
+                       break;
+               case 2:
+                       procmsg_msginfo_change_flags(chg->info, chg->set_flags, chg->set_tmp_flags,
+                               chg->unset_flags, chg->unset_tmp_flags);
+                       break;
+               default:
+                       g_warning("shouldn't happen\n");
+               }
+               g_free(chg);
+       }
+       return FALSE;
+}
+
 static void msginfo_mark_as_read (SummaryView *summaryview, MsgInfo *msginfo,
                                      GtkCTreeNode *row)
 {
@@ -2450,11 +2549,8 @@ static void msginfo_mark_as_read (SummaryView *summaryview, MsgInfo *msginfo,
        g_return_if_fail(msginfo != NULL);
        g_return_if_fail(row != NULL);
 
-       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) 
-       && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked--;
        if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
-               procmsg_msginfo_unset_flags
+               summary_msginfo_unset_flags
                        (msginfo, MSG_NEW | MSG_UNREAD, 0);
                summary_set_row_marks(summaryview, row);
                gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
@@ -2726,7 +2822,7 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                                          forwardedxpm, forwardedxpmmask);
        } else {
                gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_STATUS],
-                                       NULL);
+                                       "");
        }
 
        if (prefs_common.bold_unread &&
@@ -2778,7 +2874,7 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                                              &summaryview->color_important);
 #endif
        } else {
-               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_MARK], NULL);
+               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_MARK], "");
        }
 
        if (MSG_IS_LOCKED(flags)) {
@@ -2786,7 +2882,7 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                                          lockedxpm, lockedxpmmask);
        }
        else {
-               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_LOCKED], NULL);
+               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_LOCKED], "");
        }
 
        if (MSG_IS_WITH_ATTACHMENT(flags) && MSG_IS_SIGNED(flags)) {
@@ -2805,7 +2901,7 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                gtk_ctree_node_set_pixmap(ctree, row, col_pos[S_COL_MIME],
                                          clipxpm, clipxpmmask);
        } else {
-               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_MIME], NULL);
+               gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_MIME], "");
        }
        if (!style)
                style = small_style;
@@ -2816,16 +2912,6 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                summary_set_colorlabel_color(ctree, row, MSG_GET_COLORLABEL_VALUE(flags));
 }
 
-void summary_set_marks_selected(SummaryView *summaryview)
-{
-       GList *cur;
-       summary_lock(summaryview);
-       for (cur = GTK_CLIST(summaryview->ctree)->selection; cur != NULL && cur->data != NULL;
-            cur = cur->next)
-               summary_set_row_marks(summaryview, GTK_CTREE_NODE(cur->data));
-       summary_unlock(summaryview);
-}
-
 static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -2840,7 +2926,7 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->copied--;
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
-       procmsg_msginfo_change_flags(msginfo, MSG_MARKED, 0, MSG_DELETED, MSG_MOVE | MSG_COPY);
+       summary_msginfo_change_flags(msginfo, MSG_MARKED, 0, MSG_DELETED, MSG_MOVE | MSG_COPY);
        summary_set_row_marks(summaryview, row);
        debug_print("Message %s/%d is marked\n", msginfo->folder->path, msginfo->msgnum);
 }
@@ -2863,7 +2949,7 @@ static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
                changed = TRUE;
        }
        procmsg_msginfo_set_to_folder(msginfo, NULL);
-       procmsg_msginfo_change_flags(msginfo, MSG_LOCKED, 0, MSG_DELETED, MSG_MOVE | MSG_COPY);
+       summary_msginfo_change_flags(msginfo, MSG_LOCKED, 0, MSG_DELETED, MSG_MOVE | MSG_COPY);
        
        summary_set_row_marks(summaryview, row);
        debug_print("Message %d is locked\n", msginfo->msgnum);
@@ -2878,7 +2964,7 @@ static void summary_unlock_row(SummaryView *summaryview, GtkCTreeNode *row)
        if (!MSG_IS_LOCKED(msginfo->flags))
                return;
        procmsg_msginfo_set_to_folder(msginfo, NULL);
-       procmsg_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
+       summary_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
        summary_set_row_marks(summaryview, row);
        debug_print("Message %d is unlocked\n", msginfo->msgnum);
 }
@@ -2909,11 +2995,7 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
        if(!(MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)))
                return;
 
-       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
-       && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked--;
-
-       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
+       summary_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
        summary_set_row_marks(summaryview, row);
        debug_print("Message %d is marked as read\n",
                msginfo->msgnum);
@@ -2993,15 +3075,11 @@ static void summary_mark_row_as_unread(SummaryView *summaryview,
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
        if (MSG_IS_DELETED(msginfo->flags)) {
                procmsg_msginfo_set_to_folder(msginfo, NULL);
-               procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, 0);
+               summary_msginfo_unset_flags(msginfo, MSG_DELETED, 0);
                summaryview->deleted--;
        }
 
-       if (!MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
-       && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked++;
-
-       procmsg_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
+       summary_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
        debug_print("Message %d is marked as unread\n",
                msginfo->msgnum);
 
@@ -3064,7 +3142,7 @@ static gboolean check_permission(SummaryView *summaryview, MsgInfo * msginfo)
                }
 
                if (!found) {
-                       alertpanel_error(_("You're not the author of the article\n"));
+                       alertpanel_error(_("You're not the author of the article.\n"));
                }
                
                return found;
@@ -3081,9 +3159,6 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
 
-       if (!check_permission(summaryview, msginfo))
-               return;
-
        if (MSG_IS_LOCKED(msginfo->flags)) return;
 
        if (MSG_IS_DELETED(msginfo->flags)) return;
@@ -3094,7 +3169,7 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->copied--;
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
-       procmsg_msginfo_change_flags(msginfo, MSG_DELETED, 0, MSG_MARKED, MSG_MOVE | MSG_COPY);
+       summary_msginfo_change_flags(msginfo, MSG_DELETED, 0, MSG_MARKED, MSG_MOVE | MSG_COPY);
        summaryview->deleted++;
 
        if (!prefs_common.immediate_exec && 
@@ -3147,8 +3222,7 @@ void summary_delete(SummaryView *summaryview)
 
        if (summary_is_locked(summaryview)) return;
 
-       if (!summaryview->folder_item ||
-           FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS) return;
+       if (!summaryview->folder_item) return;
 
        aval = alertpanel(_("Delete message(s)"),
                          _("Do you really want to delete selected message(s)?"),
@@ -3168,16 +3242,14 @@ void summary_delete(SummaryView *summaryview)
 
        /* next code sets current row focus right. We need to find a row
         * that is not deleted. */
-       summary_lock(summaryview);
-       folder_item_update_freeze();
-       gtk_clist_freeze(GTK_CLIST(summaryview->ctree)); 
+       START_LONG_OPERATION(summaryview);
+       folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                sel_last = GTK_CTREE_NODE(cur->data);
                summary_delete_row(summaryview, sel_last);
        }
-       folder_item_update_thaw();
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
-       summary_unlock(summaryview);
+       folder_item_set_batch(summaryview->folder_item, FALSE);
+       END_LONG_OPERATION(summaryview);
 
        node = summary_find_next_msg(summaryview, sel_last);
        if (!node)
@@ -3192,6 +3264,7 @@ void summary_delete(SummaryView *summaryview)
                gtk_sctree_set_anchor_row(GTK_SCTREE(ctree), node);
        } else
                summary_status_show(summaryview);
+
                
        main_window_cursor_normal(summaryview->mainwin);
 }
@@ -3231,7 +3304,7 @@ static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->copied--;
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
+       summary_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
        summary_set_row_marks(summaryview, row);
 
        debug_print("Message %s/%d is unmarked\n",
@@ -3272,10 +3345,10 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                summaryview->copied--;
        }
        if (!MSG_IS_MOVE(msginfo->flags)) {
-               procmsg_msginfo_change_flags(msginfo, 0, MSG_MOVE, MSG_DELETED, MSG_COPY);
+               summary_msginfo_change_flags(msginfo, 0, MSG_MOVE, MSG_DELETED, MSG_COPY);
                summaryview->moved++;
        } else {
-               procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_COPY);
+               summary_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_COPY);
        }
        
        if (!prefs_common.immediate_exec) {
@@ -3354,10 +3427,10 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
        }
        
        if (!MSG_IS_COPY(msginfo->flags)) {
-               procmsg_msginfo_change_flags(msginfo, 0, MSG_COPY, MSG_DELETED, MSG_MOVE);
+               summary_msginfo_change_flags(msginfo, 0, MSG_COPY, MSG_DELETED, MSG_MOVE);
                summaryview->copied++;
        } else {
-               procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE);
+               summary_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE);
        }
        if (!prefs_common.immediate_exec) {
                summary_set_row_marks(summaryview, row);
@@ -3500,7 +3573,7 @@ void summary_save_as(SummaryView *summaryview)
        if (is_file_exist(dest)) {
                aval = alertpanel(_("Append or Overwrite"),
                                  _("Append or overwrite existing file?"),
-                                 _("Append"), _("Overwrite"),
+                                 _("_Append"), _("_Overwrite"),
                                  GTK_STOCK_CANCEL);
                if (aval != 0 && aval != 1)
                        return;
@@ -3770,7 +3843,7 @@ static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
                summaryview->mlist =
                        g_slist_prepend(summaryview->mlist, msginfo);
 
-               procmsg_msginfo_unset_flags(msginfo, 0, MSG_COPY);
+               summary_msginfo_unset_flags(msginfo, 0, MSG_COPY);
                summary_set_row_marks(summaryview, node);
        }
 }
@@ -4225,7 +4298,7 @@ static void summary_set_row_colorlabel(SummaryView *summaryview, GtkCTreeNode *r
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
 
-       procmsg_msginfo_change_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0, 
+       summary_msginfo_change_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0, 
                                        MSG_CLABEL_FLAG_MASK, 0);
 }
 
@@ -4369,6 +4442,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                summaryview->col_state[pos] = col_state[pos];
                type = col_state[pos].type;
                col_pos[type] = pos;
+               titles[pos] = "dummy";
        }
        col_state = summaryview->col_state;
 
@@ -4715,11 +4789,13 @@ static void summary_tree_expanded(GtkCTree *ctree, GtkCTreeNode *node,
                                  SummaryView *summaryview)
 {
        summary_set_row_marks(summaryview, node);
-       while (prefs_common.bold_unread && node) {
-               GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
-               if (GTK_CTREE_ROW(node)->children)
-                       summary_set_row_marks(summaryview, node);
-               node = next;
+       if (prefs_common.bold_unread) {
+               while (node) {
+                       GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
+                       if (GTK_CTREE_ROW(node)->children)
+                               summary_set_row_marks(summaryview, node);
+                       node = next;
+               }
        }
 }
 
@@ -4781,7 +4857,7 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                break;
        case S_COL_LOCKED:
                if (MSG_IS_LOCKED(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
+                       summary_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
                        summary_set_row_marks(summaryview, row);
                }
                else
@@ -4904,11 +4980,13 @@ static void summary_sort_by_column_click(SummaryView *summaryview,
 
        node = GTK_CTREE_NODE(GTK_CLIST(summaryview->ctree)->row_list);
 
-       while (prefs_common.bold_unread && node) {
-               GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
-               if (GTK_CTREE_ROW(node)->children)
-                       summary_set_row_marks(summaryview, node);
-               node = next;
+       if (prefs_common.bold_unread) {
+               while (node) {
+                       GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
+                       if (GTK_CTREE_ROW(node)->children)
+                               summary_set_row_marks(summaryview, node);
+                       node = next;
+               }
        }
        END_TIMING();
 }
@@ -5028,7 +5106,8 @@ static void summary_drag_data_get(GtkWidget        *widget,
                if (GTK_CLIST(summaryview->ctree)->selection)
                        gtk_selection_data_set(selection_data,
                                               selection_data->target, 8,
-                                              "Dummy", 6);
+                                              "Dummy-Summaryview", 
+                                              strlen("Dummy-Summaryview")+1);
        }
 }
 
@@ -5195,7 +5274,7 @@ static void news_flag_crosspost(MsgInfo *msginfo)
                    g_hash_table_lookup_extended(mff->newsart, line->str, &key, &value)) {
                        debug_print(" <%s>", (gchar *)value);
                        if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
-                               procmsg_msginfo_change_flags(msginfo, 
+                               summary_msginfo_change_flags(msginfo, 
                                        mff->account->crosspost_col, 0, MSG_NEW | MSG_UNREAD, 0);
                        }
                        g_hash_table_remove(mff->newsart, key);
@@ -5213,10 +5292,7 @@ static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpoin
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
 
-       if (MSG_IS_UNREAD(msginfo->flags) && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked--;
-
-       procmsg_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0, MSG_NEW | MSG_UNREAD, 0);
+       summary_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0, MSG_NEW | MSG_UNREAD, 0);
 
        summary_set_row_marks(summaryview, row);
        debug_print("Message %d is marked as ignore thread\n",
@@ -5246,10 +5322,7 @@ static void summary_unignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpo
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
 
-       if (MSG_IS_UNREAD(msginfo->flags) && procmsg_msg_has_marked_parent(msginfo))
-               summaryview->unreadmarked++;
-
-       procmsg_msginfo_unset_flags(msginfo, MSG_IGNORE_THREAD, 0);
+       summary_msginfo_unset_flags(msginfo, MSG_IGNORE_THREAD, 0);
 
        summary_set_row_marks(summaryview, row);
        debug_print("Message %d is marked as unignore thread\n",
@@ -5363,10 +5436,15 @@ void processing_apply(SummaryView * summaryview)
 
 void summary_toggle_show_read_messages(SummaryView *summaryview)
 {
-       if (summaryview->folder_item->hide_read_msgs)
+       FolderItemUpdateData source;
+       if (summaryview->folder_item->hide_read_msgs)
                summaryview->folder_item->hide_read_msgs = 0;
        else
                summaryview->folder_item->hide_read_msgs = 1;
+
+       source.item = summaryview->folder_item;
+       source.update_flags = F_ITEM_UPDATE_NAME;
+       hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
        summary_show(summaryview, summaryview->folder_item);
 }
  
@@ -5518,7 +5596,9 @@ static gboolean summary_update_msg(gpointer source, gpointer data)
        g_return_val_if_fail(summaryview != NULL, FALSE);
 
        if (msginfo_update->flags & MSGINFO_UPDATE_FLAGS) {
-               node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
+               node = gtk_ctree_find_by_row_data(
+                               GTK_CTREE(summaryview->ctree), NULL, 
+                               msginfo_update->msginfo);
 
                if (node) 
                        summary_set_row_marks(summaryview, node);