aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog7
-rw-r--r--mail/em-folder-view.c18
-rw-r--r--mail/mail-autofilter.c43
-rw-r--r--mail/mail-autofilter.h1
4 files changed, 67 insertions, 2 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 12df9b7510..89794c9e4a 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,10 @@
+2003-11-01 Jeffrey Stedfast <fejj@ximian.com>
+
+ * em-folder-view.c: setup filter-on-thread and vfolder-on-thread.
+
+ * mail-autofilter.c (rule_from_message): handle AUTO_THREAD
+ (rule_match_thread): new function to setup a filter on a msgid
+
2003-10-31 Not Zed <NotZed@Ximian.com>
* mail-config.glade: Rearranged smime config slightly, and added
diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c
index 94022c22b1..da015f976e 100644
--- a/mail/em-folder-view.c
+++ b/mail/em-folder-view.c
@@ -644,11 +644,13 @@ EMFV_POPUP_AUTO_TYPE(vfolder_type_current, emfv_popup_vfolder_subject, AUTO_SUBJ
EMFV_POPUP_AUTO_TYPE(vfolder_type_current, emfv_popup_vfolder_sender, AUTO_FROM)
EMFV_POPUP_AUTO_TYPE(vfolder_type_current, emfv_popup_vfolder_recipients, AUTO_TO)
EMFV_POPUP_AUTO_TYPE(vfolder_type_current, emfv_popup_vfolder_mlist, AUTO_MLIST)
+EMFV_POPUP_AUTO_TYPE(vfolder_type_current, emfv_popup_vfolder_thread, AUTO_THREAD)
EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_subject, AUTO_SUBJECT)
EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_sender, AUTO_FROM)
EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_recipients, AUTO_TO)
EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_mlist, AUTO_MLIST)
+EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_thread, AUTO_THREAD)
/* TODO: Move some of these to be 'standard' menu's */
@@ -701,13 +703,17 @@ static EMPopupItem emfv_popup_menu[] = {
{ EM_POPUP_ITEM, "90.filter.00/00.02", N_("VFolder on _Recipients"), G_CALLBACK(emfv_popup_vfolder_recipients), NULL, NULL, EM_POPUP_SELECT_ONE },
{ EM_POPUP_ITEM, "90.filter.00/00.03", N_("VFolder on Mailing _List"),
G_CALLBACK(emfv_popup_vfolder_mlist), NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST },
-
+ { EM_POPUP_ITEM, "90.filter.00/00.04", N_("VFolder on Thread"),
+ G_CALLBACK(emfv_popup_vfolder_thread), NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_THREAD },
+
{ EM_POPUP_BAR, "90.filter.00/10", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_ONE },
{ EM_POPUP_ITEM, "90.filter.00/10.00", N_("Filter on Sub_ject"), G_CALLBACK(emfv_popup_filter_subject), NULL, NULL, EM_POPUP_SELECT_ONE },
{ EM_POPUP_ITEM, "90.filter.00/10.01", N_("Filter on Sen_der"), G_CALLBACK(emfv_popup_filter_sender), NULL, NULL, EM_POPUP_SELECT_ONE },
{ EM_POPUP_ITEM, "90.filter.00/10.02", N_("Filter on Re_cipients"), G_CALLBACK(emfv_popup_filter_recipients), NULL, NULL, EM_POPUP_SELECT_ONE },
{ EM_POPUP_ITEM, "90.filter.00/10.03", N_("Filter on _Mailing List"),
G_CALLBACK(emfv_popup_filter_mlist), NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST },
+ { EM_POPUP_ITEM, "90.filter.00/10.04", N_("Filter on Thread"),
+ G_CALLBACK(emfv_popup_filter_thread), NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_THREAD },
};
static void
@@ -1096,6 +1102,7 @@ struct _filter_data {
int type;
char *uri;
char *mlist;
+ char *references;
};
static void
@@ -1106,6 +1113,7 @@ filter_data_free (struct _filter_data *fdata)
if (fdata->folder)
camel_object_unref (fdata->folder);
g_free (fdata->mlist);
+ g_free (fdata->references);
g_free (fdata);
}
@@ -1156,6 +1164,7 @@ EMFV_MAP_CALLBACK(emfv_tools_filter_subject, emfv_popup_filter_subject)
EMFV_MAP_CALLBACK(emfv_tools_filter_sender, emfv_popup_filter_sender)
EMFV_MAP_CALLBACK(emfv_tools_filter_recipient, emfv_popup_filter_recipients)
EMFV_MAP_CALLBACK(emfv_tools_filter_mlist, emfv_popup_filter_mlist)
+EMFV_MAP_CALLBACK(emfv_tools_filter_thread, emfv_popup_filter_thread)
static void
vfolder_type_got_message (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *user_data)
@@ -1197,6 +1206,7 @@ EMFV_MAP_CALLBACK(emfv_tools_vfolder_subject, emfv_popup_vfolder_subject)
EMFV_MAP_CALLBACK(emfv_tools_vfolder_sender, emfv_popup_vfolder_sender)
EMFV_MAP_CALLBACK(emfv_tools_vfolder_recipient, emfv_popup_vfolder_recipients)
EMFV_MAP_CALLBACK(emfv_tools_vfolder_mlist, emfv_popup_vfolder_mlist)
+EMFV_MAP_CALLBACK(emfv_tools_vfolder_thread, emfv_popup_vfolder_thread)
/* ********************************************************************** */
@@ -1260,10 +1270,12 @@ static BonoboUIVerb emfv_message_verbs[] = {
BONOBO_UI_UNSAFE_VERB ("ToolsFilterRecipient", emfv_tools_filter_recipient),
BONOBO_UI_UNSAFE_VERB ("ToolsFilterSender", emfv_tools_filter_sender),
BONOBO_UI_UNSAFE_VERB ("ToolsFilterSubject", emfv_tools_filter_subject),
+ BONOBO_UI_UNSAFE_VERB ("ToolsFilterThread", emfv_tools_filter_thread),
BONOBO_UI_UNSAFE_VERB ("ToolsVFolderMailingList", emfv_tools_vfolder_mlist),
BONOBO_UI_UNSAFE_VERB ("ToolsVFolderRecipient", emfv_tools_vfolder_recipient),
BONOBO_UI_UNSAFE_VERB ("ToolsVFolderSender", emfv_tools_vfolder_sender),
BONOBO_UI_UNSAFE_VERB ("ToolsVFolderSubject", emfv_tools_vfolder_subject),
+ BONOBO_UI_UNSAFE_VERB ("ToolsVFolderThread", emfv_tools_vfolder_thread),
BONOBO_UI_UNSAFE_VERB ("ViewLoadImages", emfv_view_load_images),
/* ViewHeaders stuff is a radio */
@@ -1357,11 +1369,13 @@ static const EMFolderViewEnable emfv_enable_map[] = {
{ "ToolsFilterMailingList", EM_POPUP_SELECT_ONE },
{ "ToolsFilterRecipient", EM_POPUP_SELECT_ONE },
{ "ToolsFilterSender", EM_POPUP_SELECT_ONE },
- { "ToolsFilterSubject", EM_POPUP_SELECT_ONE },
+ { "ToolsFilterSubject", EM_POPUP_SELECT_ONE },
+ { "ToolsFilterThread", EM_POPUP_SELECT_ONE },
{ "ToolsVFolderMailingList", EM_POPUP_SELECT_ONE },
{ "ToolsVFolderRecipient", EM_POPUP_SELECT_ONE },
{ "ToolsVFolderSender", EM_POPUP_SELECT_ONE },
{ "ToolsVFolderSubject", EM_POPUP_SELECT_ONE },
+ { "ToolsVFolderThread", EM_POPUP_SELECT_ONE },
{ "ViewLoadImages", EM_POPUP_SELECT_ONE },
diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c
index 9e98758700..dbf2002a3d 100644
--- a/mail/mail-autofilter.c
+++ b/mail/mail-autofilter.c
@@ -222,6 +222,25 @@ rule_match_mlist(RuleContext *context, FilterRule *rule, const char *mlist)
}
static void
+rule_match_thread (RuleContext *context, FilterRule *rule, const char *msgid)
+{
+ FilterElement *element;
+ FilterPart *part;
+
+ if (msgid[0] == 0)
+ return;
+
+ part = rule_context_create_part (context, "header");
+ filter_rule_add_part (rule, part);
+
+ element = filter_part_find_element (part, "header-type");
+ filter_option_set_current ((FilterOption *) element, "contains");
+
+ element = filter_part_find_element (part, "header");
+ filter_input_set_value ((FilterInput *) element, msgid);
+}
+
+static void
rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg, int flags)
{
CamelInternetAddress *addr;
@@ -273,6 +292,30 @@ rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg
}
g_free(mlist);
}
+ if (flags & AUTO_THREAD) {
+ char *name, *msgid = nULL;
+ const char *refs = NULL;
+
+ if (!(refs = camel_medium_get_header ((CamelMedium *) msg, "References"))) {
+ if (!(refs = camel_medium_get_header ((CamelMedium *) msg, "In-Reply-To")))
+ msgid = camel_message_get_message_id (msg);
+ }
+
+ if (refs || msgid) {
+ struct _camel_header_references *r = NULL;
+
+ if (refs) {
+ r = camel_header_references_decode (refs);
+ msgid = r->id;
+ }
+
+ rule_match_thread (context, rule, msgid);
+ name = g_strdup_printf (_("Replies to %s"), msgid);
+
+ if (r)
+ camel_header_references_list_clear (&r);
+ }
+ }
}
FilterRule *
diff --git a/mail/mail-autofilter.h b/mail/mail-autofilter.h
index 45f9d15863..a5c2575338 100644
--- a/mail/mail-autofilter.h
+++ b/mail/mail-autofilter.h
@@ -35,6 +35,7 @@ enum {
AUTO_FROM = 2,
AUTO_TO = 4,
AUTO_MLIST = 8,
+ AUTO_THREAD = 16,
};
FilterRule *vfolder_rule_from_message(VfolderContext *context, CamelMimeMessage *msg, int flags, const char *source);