#include "inc.h"
#include "imap.h"
#include "addressbook.h"
-#include "addr_compl.h"
#include "scoring.h"
#include "prefs_folder_item.h"
#include "filtering.h"
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,
{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>"},
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);
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);
}
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;
optimal_width);
}
- if (prefs_common.use_addr_book)
- end_address_completion();
-
debug_print("done.\n");
STATUSBAR_POP(summaryview->mainwin);
if (debug_get_mode()) {
static gchar *summary_complete_address(const gchar *addr)
{
- gint count;
gchar *res, *tmp, *email_addr;
Xstrdup_a(email_addr, addr, return NULL);
* 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;
}
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);
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;
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);
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);
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))
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
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;
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 */