add common prefs option '/Interface/Open next message on deletion'
[claws.git] / src / summaryview.c
index a05f0b59fd62180effd3b9fb3331da4069394cbb..6e3678c25755e75ed56b5a057ce0c27bb6982a99 100644 (file)
@@ -76,7 +76,6 @@
 #include "inc.h"
 #include "imap.h"
 #include "addressbook.h"
-#include "addr_compl.h"
 #include "scoring.h"
 #include "prefs_folder_item.h"
 #include "filtering.h"
@@ -192,6 +191,8 @@ static void summary_mark_row                (SummaryView            *summaryview,
                                         GtkCTreeNode           *row);
 static void summary_lock_row           (SummaryView            *summaryview,
                                         GtkCTreeNode           *row);
+static void summary_unlock_row         (SummaryView            *summaryview,
+                                        GtkCTreeNode           *row);
 static void summary_mark_row_as_read   (SummaryView            *summaryview,
                                         GtkCTreeNode           *row);
 static void summary_mark_row_as_unread (SummaryView            *summaryview,
@@ -430,6 +431,8 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_Mark/Mark all read"),    NULL, summary_mark_all_read, 0, NULL},
        {N_("/_Mark/Ignore thread"),    NULL, summary_ignore_thread, 0, NULL},
        {N_("/_Mark/Unignore thread"),  NULL, summary_unignore_thread, 0, NULL},
+       {N_("/_Mark/Lock"),             NULL, summary_msgs_lock, 0, NULL},
+       {N_("/_Mark/Unlock"),           NULL, summary_msgs_unlock, 0, NULL},
        {N_("/Color la_bel"),           NULL, NULL,             0, NULL},
 
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
@@ -1287,6 +1290,8 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
        menu_set_sensitive(ifactory, "/Mark/Mark all read", TRUE);
        menu_set_sensitive(ifactory, "/Mark/Ignore thread",   TRUE);
        menu_set_sensitive(ifactory, "/Mark/Unignore thread", TRUE);
+       menu_set_sensitive(ifactory, "/Mark/Lock", TRUE);
+       menu_set_sensitive(ifactory, "/Mark/Unlock", TRUE);
 
        menu_set_sensitive(ifactory, "/Color label", TRUE);
 
@@ -1979,18 +1984,12 @@ static void summary_status_show(SummaryView *summaryview)
        g_free(cp);
        g_free(itstr);
 
-       if (FOLDER_IS_LOCAL(summaryview->folder_item->folder)) {
-               str = g_strdup_printf(_("%d new, %d unread, %d total (%s)"),
-                                     summaryview->newmsgs,
-                                     summaryview->unread,
-                                     summaryview->messages,
-                                     to_human_readable(summaryview->total_size));
-       } else {
-               str = g_strdup_printf(_("%d new, %d unread, %d total"),
-                                     summaryview->newmsgs,
-                                     summaryview->unread,
-                                     summaryview->messages);
-       }
+       str = g_strdup_printf(_("%d new, %d unread, %d total (%s)"),
+                             summaryview->newmsgs,
+                             summaryview->unread,
+                             summaryview->messages,
+                             to_human_readable(summaryview->total_size));
+
        gtk_label_set(GTK_LABEL(summaryview->statlabel_msgs), str);
        g_free(str);
 }
@@ -2233,9 +2232,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        subject_table = g_hash_table_new(g_str_hash, g_str_equal);
        summaryview->subject_table = subject_table;
 
-       if (prefs_common.use_addr_book)
-               start_address_completion();
-       
        for (cur = mlist ; cur != NULL; cur = cur->next) {
                msginfo = (MsgInfo *)cur->data;
                msginfo->threadscore = msginfo->score;
@@ -2292,9 +2288,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                                           optimal_width);
        }
 
-       if (prefs_common.use_addr_book)
-               end_address_completion();
-
        debug_print("done.\n");
        STATUSBAR_POP(summaryview->mainwin);
        if (debug_get_mode()) {
@@ -2307,7 +2300,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
 static gchar *summary_complete_address(const gchar *addr)
 {
-       gint count;
        gchar *res, *tmp, *email_addr;
 
        Xstrdup_a(email_addr, addr, return NULL);
@@ -2318,12 +2310,12 @@ static gchar *summary_complete_address(const gchar *addr)
         * completion stuff must be already initialized
         */
        res = NULL;
-       if (1 < (count = complete_address(email_addr))) {
-               tmp = get_complete_address(1);
+       tmp = addressbook_lookup_name( email_addr );
+       if( tmp ) {
                res = procheader_get_fromname(tmp);
-               g_free(tmp);    
+               g_free(tmp);
        }
-       
+
        return res;
 }
 
@@ -2362,7 +2354,6 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
 
                Xstrdup_a(addr, msginfo->from, return);
                extract_address(addr);
-
                if (prefs_common.use_addr_book) {
                        if (account_find_from_address(addr)) {
                                addr = summary_complete_address(msginfo->to);
@@ -2778,7 +2769,6 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
 
 static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
-       /* almost verbatim summary_mark_row(); may want a menu action? */
        gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
@@ -2801,6 +2791,21 @@ static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
        debug_print("Message %d is locked\n", msginfo->msgnum);
 }
 
+static void summary_unlock_row(SummaryView *summaryview, GtkCTreeNode *row)
+{
+       gboolean changed = FALSE;
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       MsgInfo *msginfo;
+
+       msginfo = gtk_ctree_node_get_row_data(ctree, row);
+       if (!MSG_IS_LOCKED(msginfo->flags))
+               return;
+       procmsg_msginfo_set_to_folder(msginfo, NULL);
+       procmsg_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
+       summary_set_row_marks(summaryview, row);
+       debug_print("Message %d is unlocked\n", msginfo->msgnum);
+}
+
 void summary_mark(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -2852,6 +2857,34 @@ void summary_mark_as_read(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
+void summary_msgs_lock(SummaryView *summaryview)
+{
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       GList *cur;
+
+       folder_item_update_freeze();
+       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+               summary_lock_row(summaryview,
+                                        GTK_CTREE_NODE(cur->data));
+       folder_item_update_thaw();
+       
+       summary_status_show(summaryview);
+}
+
+void summary_msgs_unlock(SummaryView *summaryview)
+{
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       GList *cur;
+
+       folder_item_update_freeze();
+       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+               summary_unlock_row(summaryview,
+                                  GTK_CTREE_NODE(cur->data));
+       folder_item_update_thaw();
+       
+       summary_status_show(summaryview);
+}
+
 void summary_mark_all_read(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -3061,7 +3094,7 @@ void summary_delete(SummaryView *summaryview)
        if (!node)
                node = summary_find_prev_msg(summaryview, sel_last);
 
-       if (node) {
+       if (node && prefs_common.open_on_delete) {
                if (sel_last && node == gtkut_ctree_node_next(ctree, sel_last))
                        summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
                else if (sel_last && node == GTK_CTREE_NODE_PREV(sel_last))
@@ -3072,7 +3105,10 @@ void summary_delete(SummaryView *summaryview)
                                 messageview_is_visible(summaryview->messageview),
                                 FALSE);
        }
-
+       else {
+               summary_select_node(summaryview, node, FALSE, FALSE);
+       }
+       
        if (prefs_common.immediate_exec || item->stype == F_TRASH) {
                summary_execute(summaryview);
                /* after deleting, the anchor may be at an invalid row
@@ -3973,42 +4009,9 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
 {
-       static HeaderEntry hentry[] = {{"X-BeenThere:",    NULL, FALSE},
-                                      {"X-ML-Name:",      NULL, FALSE},
-                                      {"X-List:",         NULL, FALSE},
-                                      {"X-Mailing-list:", NULL, FALSE},
-                                      {"List-Id:",        NULL, FALSE},
-                                      {NULL,              NULL, FALSE}};
-
-       static gchar *header_strs[] = {"From", "from", "To", "to", "Subject", "subject"};
-
-       static gchar *hentry_strs[]   = {"X-BeenThere", "X-ML-Name", "X-List",
-                                        "X-Mailing-List", "List-Id",
-                                        "header \"X-BeenThere\"", "header \"X-ML-Name\"",
-                                        "header \"X-List\"", "header \"X-Mailing-List\"",
-                                        "header \"List-Id\""};
-       enum
-       {
-               H_X_BEENTHERE    = 0,
-               H_X_ML_NAME      = 1,
-               H_X_LIST         = 2,
-               H_X_MAILING_LIST = 3,
-               H_LIST_ID        = 4
-       };
-
-       enum
-       {
-               H_FROM    = 0,
-               H_TO      = 2,
-               H_SUBJECT = 4
-       };
-
        MsgInfo *msginfo;
        gchar *header = NULL;
        gchar *key = NULL;
-       FILE *fp;
-       int header_offset;
-       int hentry_offset;
 
        if (!summaryview->selected) return;
 
@@ -4016,72 +4019,11 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                                              summaryview->selected);
        if (!msginfo) return;
 
-       header_offset = 1;
-       hentry_offset = 5;
-
-       switch (type) {
-       case FILTER_BY_NONE:
-               break;
-       case FILTER_BY_AUTO:
-               if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-               procheader_get_header_fields(fp, hentry);
-               fclose(fp);
-
-               if (hentry[H_X_BEENTHERE].body != NULL) {
-                       header = hentry_strs[H_X_BEENTHERE + hentry_offset];
-                       Xstrdup_a(key, hentry[H_X_BEENTHERE].body, );
-               } else if (hentry[H_X_ML_NAME].body != NULL) {
-                       header = hentry_strs[H_X_ML_NAME + hentry_offset];
-                       Xstrdup_a(key, hentry[H_X_ML_NAME].body, );
-               } else if (hentry[H_X_LIST].body != NULL) {
-                       header = hentry_strs[H_X_LIST + hentry_offset];
-                       Xstrdup_a(key, hentry[H_X_LIST].body, );
-               } else if (hentry[H_X_MAILING_LIST].body != NULL) {
-                       header = hentry_strs[H_X_MAILING_LIST + hentry_offset];
-                       Xstrdup_a(key, hentry[H_X_MAILING_LIST].body, );
-               } else if (hentry[H_LIST_ID].body != NULL) {
-                       header = hentry_strs[H_LIST_ID + hentry_offset];
-                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
-               } else if (msginfo->subject) {
-                       header = header_strs[H_SUBJECT + header_offset];
-                       key = msginfo->subject;
-               }
-
-               g_free(hentry[H_X_BEENTHERE].body);
-               hentry[H_X_BEENTHERE].body = NULL;
-               g_free(hentry[H_X_ML_NAME].body);
-               hentry[H_X_ML_NAME].body = NULL;
-               g_free(hentry[H_X_LIST].body);
-               hentry[H_X_LIST].body = NULL;
-               g_free(hentry[H_X_MAILING_LIST].body);
-               hentry[H_X_MAILING_LIST].body = NULL;
-               g_free(hentry[H_LIST_ID].body);
-               hentry[H_LIST_ID].body = NULL;
-
-               break;
-       case FILTER_BY_FROM:
-               header = header_strs[H_FROM + header_offset];
-               key = msginfo->from;
-               break;
-       case FILTER_BY_TO:
-               header = header_strs[H_TO + header_offset];
-               key = msginfo->to;
-               break;
-       case FILTER_BY_SUBJECT:
-               header = header_strs[H_SUBJECT + header_offset];
-               key = msginfo->subject;
-               break;
-       default:
-               break;
-       }
-
-       /*
-        * NOTE: key may be allocated on the stack, so 
-        * prefs_filter[ing]_open() should have completed 
-        * and have set entries. Otherwise we're hosed.  
-        */
-
+       procmsg_get_filter_keyword(msginfo, &header, &key, type);
        prefs_filtering_open(NULL, header, key);
+
+       g_free(header);
+       g_free(key);
 }
 
 /* color label */