setup filter-on-thread and vfolder-on-thread.

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

svn path=/trunk/; revision=23158
This commit is contained in:
Jeffrey Stedfast
2003-11-01 06:01:55 +00:00
committed by Jeffrey Stedfast
parent 2dfb262447
commit 2b8a138bef
4 changed files with 67 additions and 2 deletions

View File

@ -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

View File

@ -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 },

View File

@ -221,6 +221,25 @@ rule_match_mlist(RuleContext *context, FilterRule *rule, const char *mlist)
filter_input_set_value((FilterInput *)element, 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)
{
@ -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 *

View File

@ -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);