and don't forget to remove my experimental code
[claws.git] / src / summaryview.c
index 25fd4acd3821e9b33ad62f6585aa3ded1feb2d28..88a3b64f0186b14fec0bc96521a96b84435e524d 100644 (file)
@@ -910,8 +910,8 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item,
                           message, but do not display it */
                        node = summary_find_next_unread_msg(summaryview, NULL);
                        if (node == NULL && GTK_CLIST(ctree)->row_list != NULL)
-                               node = GTK_CTREE_NODE
-                                       (GTK_CLIST(ctree)->row_list_end);
+                               node = gtk_ctree_node_nth
+                                       (ctree, GTK_CLIST(ctree)->rows - 1);
                        summary_select_node(summaryview, node, FALSE);
                }
        } else {
@@ -922,10 +922,17 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item,
                else
                        node = summary_find_next_unread_msg(summaryview, NULL);
 
-               if (node == NULL && GTK_CLIST(ctree)->row_list != NULL)
-                       node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list_end);
-               summary_select_node(summaryview, node,
-                                   prefs_common.open_unread_on_enter);
+               if (node == NULL && GTK_CLIST(ctree)->row_list != NULL) {
+                       /* Get the last visible node on screen */
+                       /* FIXME: huh, what happens if node is null? that allowed?? */
+                       node = gtk_ctree_node_nth(ctree, GTK_CLIST(ctree)->rows - 1);
+               }       
+               if (prefs_common.open_unread_on_enter) {
+                       summary_unlock(summaryview);
+                       summary_select_node(summaryview, node, TRUE);
+                       summary_lock(summaryview);
+               } else
+                       summary_select_node(summaryview, node, FALSE);
        }
 
        summary_status_show(summaryview);
@@ -1061,8 +1068,7 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
        if (summaryview->folder_item->folder->type != F_NEWS) {
                menu_set_sensitive(ifactory, "/Move...", TRUE);
                menu_set_sensitive(ifactory, "/Copy...", TRUE);
-               if (summaryview->folder_item->stype != F_TRASH)
-                       menu_set_sensitive(ifactory, "/Delete", TRUE);
+               menu_set_sensitive(ifactory, "/Delete", TRUE);
        }
 
        menu_set_sensitive(ifactory, "/Execute", TRUE);
@@ -1374,7 +1380,7 @@ static GtkCTreeNode *summary_find_prev_unread_msg(SummaryView *summaryview,
        if (current_node)
                node = current_node;
        else
-               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list_end);
+               node = gtk_ctree_node_nth(ctree, GTK_CLIST(ctree)->rows - 1);
 
        for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
@@ -1414,7 +1420,7 @@ static GtkCTreeNode *summary_find_prev_marked_msg(SummaryView *summaryview,
        if (current_node)
                node = GTK_CTREE_NODE_PREV(current_node);
        else
-               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list_end);
+               node = gtk_ctree_node_nth(ctree, GTK_CLIST(ctree)->rows - 1);
 
        for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
@@ -1454,7 +1460,7 @@ static GtkCTreeNode *summary_find_prev_labeled_msg(SummaryView *summaryview,
        if (current_node)
                node = GTK_CTREE_NODE_PREV(current_node);
        else
-               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list_end);
+               node = gtk_ctree_node_nth(ctree, GTK_CLIST(ctree)->rows - 1);
 
        for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
@@ -2324,7 +2330,7 @@ void summary_step(SummaryView *summaryview, GtkScrollType type)
 
        gtk_signal_emit_by_name(GTK_OBJECT(ctree), "scroll_vertical",
                                type, 0.0);
-
+       
        if (summaryview->msg_is_toggled_on)
                summary_display_msg(summaryview, summaryview->selected, FALSE);
 }
@@ -2679,7 +2685,8 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
        CHANGE_FLAGS(msginfo);
        summaryview->deleted++;
 
-       if (!prefs_common.immediate_exec)
+       if (!prefs_common.immediate_exec && 
+           summaryview->folder_item->stype != F_TRASH)
                summary_set_row_marks(summaryview, row);
 
        debug_print(_("Message %s/%d is set to delete\n"),
@@ -2689,25 +2696,41 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
 void summary_delete(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       FolderItem *item = summaryview->folder_item;
        GList *cur;
+       GtkCTreeNode *dsp_last, *sel_last;
 
-       if (!summaryview->folder_item ||
-           summaryview->folder_item->folder->type == F_NEWS) return;
+       if (!item || item->folder->type == F_NEWS) return;
 
        if (summary_is_locked(summaryview)) return;
 
-       /* if current folder is trash, don't delete */
-       if (summaryview->folder_item->stype == F_TRASH) {
-               alertpanel_notice(_("Current folder is Trash."));
-               return;
+       /* if current folder is trash, ask for confirmation */
+       if (item->stype == F_TRASH) {
+               AlertValue aval;
+
+               aval = alertpanel(_("Delete message(s)"),
+                                 _("Do you really want to delete message(s) from the trash?"),
+                                 _("Yes"), _("No"), NULL);
+               if (aval != G_ALERTDEFAULT) return;
        }
 
-       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
-               summary_delete_row(summaryview, GTK_CTREE_NODE(cur->data));
+       /* next code sets current row focus right. if the last selection
+        * is also the last displayed row, we need to scroll backwards. 
+        * exception: if the last displayed row is an uncollapsed node,
+        * we don't scroll back. */
+       dsp_last = gtk_ctree_node_nth(ctree, GTK_CLIST(ctree)->rows - 1);
+       sel_last = NULL;
+       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
+               sel_last = GTK_CTREE_NODE(cur->data);
+               summary_delete_row(summaryview, GTK_CTREE_NODE(sel_last));
+       }
 
-       summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
+       if (dsp_last == sel_last && GTK_CTREE_ROW(sel_last)->expanded) 
+               summary_step(summaryview, GTK_SCROLL_STEP_BACKWARD);
+       else    
+               summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
 
-       if (prefs_common.immediate_exec)
+       if (prefs_common.immediate_exec || item->stype == F_TRASH)
                summary_execute(summaryview);
        else
                summary_status_show(summaryview);
@@ -3238,7 +3261,6 @@ static void summary_execute_delete(SummaryView *summaryview)
        if (summaryview->folder_item->folder->type == F_MH) {
                g_return_if_fail(trash != NULL);
        }
-       if (summaryview->folder_item == trash) return;
 
        /* search deleting messages and execute */
        gtk_ctree_pre_recursive
@@ -3246,12 +3268,10 @@ static void summary_execute_delete(SummaryView *summaryview)
 
        if (!summaryview->mlist) return;
 
-       for(cur = summaryview->mlist ; cur != NULL ; cur = cur->next) {
-               MsgInfo * msginfo = cur->data;
-               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
-       }
-
-       folder_item_move_msgs_with_dest(trash, summaryview->mlist);
+       if (summaryview->folder_item != trash)
+               folder_item_move_msgs_with_dest(trash, summaryview->mlist);
+       else
+               folder_item_remove_msgs(trash, summaryview->mlist);
 
        for (cur = summaryview->mlist; cur != NULL; cur = cur->next)
                procmsg_msginfo_free((MsgInfo *)cur->data);
@@ -3259,8 +3279,10 @@ static void summary_execute_delete(SummaryView *summaryview)
        g_slist_free(summaryview->mlist);
        summaryview->mlist = NULL;
 
-       folder_item_scan(trash);
-       folderview_update_item(trash, FALSE);
+       if (summaryview->folder_item != trash) {
+               folder_item_scan(trash);
+               folderview_update_item(trash, FALSE);
+       }
 }
 
 static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -4117,7 +4139,7 @@ static void summary_reply_cb(SummaryView *summaryview, guint action,
                break;
        case COMPOSE_REPLY_TO_ALL:
                compose_reply(msginfo, prefs_common.reply_with_quote,
-                             TRUE, FALSE);
+                             TRUE, TRUE);
                break;
        case COMPOSE_REPLY_TO_ALL_WITH_QUOTE:
                compose_reply(msginfo, TRUE, TRUE, FALSE);