aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-06-17 15:34:07 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-06-17 15:34:07 +0800
commit5d5f3b88c3ad76e0b81763f9c48b7fee84df2292 (patch)
tree09183c61366e096483b998752eb9eb37224c210f
parent7ca7b54a79f4abb9aa3e173e4ef245049d7c72bc (diff)
downloadgsoc2013-evolution-5d5f3b88c3ad76e0b81763f9c48b7fee84df2292.tar.gz
gsoc2013-evolution-5d5f3b88c3ad76e0b81763f9c48b7fee84df2292.tar.zst
gsoc2013-evolution-5d5f3b88c3ad76e0b81763f9c48b7fee84df2292.zip
** See #59885.
2004-06-17 Not Zed <NotZed@Ximian.com> ** See #59885. ** Moved all of the mailer specific filter stuff into mail/*. * filter-element.c (copy_value): implement for base types. * filter-element.c (filter_element_copy_value): do this as a virtual method. * filter.glade: moved the vfolder stuff to mail/ * libfilter-i18n.h: removed, moved to mailer. * filter-errors.xml: moved the vfolder/filtering errors to the mail error file. * Makefile.am (EXTRA_DIST): moved *types.xml to mail. (INCLUDES): removed a bunch of mail dependencies. * filter-*.[ch], vfolder-*.[ch]: Moved all mail related filter and vfolder stuff to mail directory. * score-*.[ch]: Removed all of it. * vfolder-context.c (vfolder_new_element): and for vfolders. * filter-context.c (filter_new_element): implement for filter element types. * rule-context.c (rc_new_element): replacement for old filter_element_new_type_name. only has the basics. * filter-part.c (filter_part_xml_create): take a rule context as an argument & and look up the element name off the context. * rule-context.c (rule_context_new_element): new virtual method to get an element for a given name. * filter-element.c (filter_element_new_type_name): removed. svn path=/trunk/; revision=26379
-rw-r--r--filter/ChangeLog42
-rw-r--r--filter/Makefile.am43
-rw-r--r--filter/filter-context.c279
-rw-r--r--filter/filter-context.h62
-rw-r--r--filter/filter-editor.c164
-rw-r--r--filter/filter-editor.h58
-rw-r--r--filter/filter-element.c104
-rw-r--r--filter/filter-element.h7
-rw-r--r--filter/filter-errors.xml17
-rw-r--r--filter/filter-errors.xml.h14
-rw-r--r--filter/filter-filter.c548
-rw-r--r--filter/filter-filter.h63
-rw-r--r--filter/filter-folder.c260
-rw-r--r--filter/filter-folder.h59
-rw-r--r--filter/filter-part.c6
-rw-r--r--filter/filter-part.h4
-rw-r--r--filter/filter-rule.c2
-rw-r--r--filter/filter-source.c377
-rw-r--r--filter/filter-source.h56
-rw-r--r--filter/filter.glade278
-rw-r--r--filter/filtertypes.xml746
-rw-r--r--filter/rule-context.c66
-rw-r--r--filter/rule-context.h11
-rw-r--r--filter/rule-editor.c2
-rw-r--r--filter/score-context.c101
-rw-r--r--filter/score-context.h58
-rw-r--r--filter/score-editor.c128
-rw-r--r--filter/score-editor.h58
-rw-r--r--filter/score-rule.c201
-rw-r--r--filter/score-rule.h60
-rw-r--r--filter/searchtypes.xml529
-rw-r--r--filter/vfolder-context.c102
-rw-r--r--filter/vfolder-context.h59
-rw-r--r--filter/vfolder-editor.c127
-rw-r--r--filter/vfolder-editor.h58
-rw-r--r--filter/vfolder-rule.c644
-rw-r--r--filter/vfolder-rule.h73
-rw-r--r--filter/vfoldertypes.xml424
38 files changed, 159 insertions, 5731 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index b085bdd673..ebacac378d 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,45 @@
+2004-06-17 Not Zed <NotZed@Ximian.com>
+
+ ** See #59885.
+
+ ** Moved all of the mailer specific filter stuff into mail/*.
+
+ * filter-element.c (copy_value): implement for base types.
+
+ * filter-element.c (filter_element_copy_value): do this as a
+ virtual method.
+
+ * filter.glade: moved the vfolder stuff to mail/
+
+ * libfilter-i18n.h: removed, moved to mailer.
+
+ * filter-errors.xml: moved the vfolder/filtering errors to the
+ mail error file.
+
+ * Makefile.am (EXTRA_DIST): moved *types.xml to mail.
+ (INCLUDES): removed a bunch of mail dependencies.
+
+ * filter-*.[ch], vfolder-*.[ch]: Moved all mail related filter and
+ vfolder stuff to mail directory.
+
+ * score-*.[ch]: Removed all of it.
+
+ * vfolder-context.c (vfolder_new_element): and for vfolders.
+
+ * filter-context.c (filter_new_element): implement for filter
+ element types.
+
+ * rule-context.c (rc_new_element): replacement for old
+ filter_element_new_type_name. only has the basics.
+
+ * filter-part.c (filter_part_xml_create): take a rule context
+ as an argument & and look up the element name off the context.
+
+ * rule-context.c (rule_context_new_element): new virtual method to
+ get an element for a given name.
+
+ * filter-element.c (filter_element_new_type_name): removed.
+
2004-06-08 Not Zed <NotZed@Ximian.com>
* filtertypes.xml: give the junk test a unique name. #59567.
diff --git a/filter/Makefile.am b/filter/Makefile.am
index 0e7fd2f4b7..f84be24c73 100644
--- a/filter/Makefile.am
+++ b/filter/Makefile.am
@@ -3,9 +3,7 @@ glade_DATA = filter.glade
INCLUDES = \
-I $(top_srcdir) \
- -I $(top_srcdir)/camel \
-I $(top_srcdir)/e-util \
- -I $(top_srcdir)/shell \
-I $(top_srcdir)/widgets/misc \
-DFILTER_GLADEDIR=\"$(gladedir)\" \
-DG_LOG_DOMAIN=\"filter\" \
@@ -19,20 +17,12 @@ libfilter_la_SOURCES = \
filter-code.h \
filter-colour.c \
filter-colour.h \
- filter-context.c \
- filter-context.h \
filter-datespec.c \
filter-datespec.h \
- filter-editor.c \
- filter-editor.h \
filter-element.c \
filter-element.h \
filter-file.c \
filter-file.h \
- filter-filter.c \
- filter-filter.h \
- filter-folder.c \
- filter-folder.h \
filter-input.c \
filter-input.h \
filter-int.c \
@@ -47,54 +37,25 @@ libfilter_la_SOURCES = \
filter-part.h \
filter-rule.c \
filter-rule.h \
- filter-source.h \
- filter-source.c \
rule-context.c \
rule-context.h \
rule-editor.c \
- rule-editor.h \
- score-context.c \
- score-context.h \
- score-editor.c \
- score-editor.h \
- score-rule.c \
- score-rule.h \
- vfolder-context.c \
- vfolder-context.h \
- vfolder-editor.c \
- vfolder-editor.h \
- vfolder-rule.c \
- vfolder-rule.h
-
-libfilter_la_DEPENDENCIES = libfilter-i18n.h
+ rule-editor.h
EXTRA_DIST = \
$(glade_DATA) \
$(error_DATA) \
$(error_i18n) \
ChangeLog.pre-1-4 \
- filter-marshal.list \
- filtertypes.xml \
- libfilter-i18n.h \
- vfoldertypes.xml \
- searchtypes.xml
+ filter-marshal.list
# basic rules.
-filterdir = $(privdatadir)
-filter_DATA = filtertypes.xml vfoldertypes.xml searchtypes.xml
-
error_DATA = filter-errors.xml
error_i18n = $(error_DATA:.xml=.xml.h)
errordir = $(privdatadir)/errors
%.xml.h: %.xml
$(top_builddir)/e-util/e-error-tool $^
-libfilter-i18n.h: filtertypes.xml vfoldertypes.xml
- echo "/* Automatically generated. Do not edit. */" > $@; \
- cat $(srcdir)/filtertypes.xml $(srcdir)/vfoldertypes.xml | \
- sed -n -e 's:.*<title>\(.*\)</title>:char *s = N_("\1");:p' | \
- sort -u >> $@
-
MARSHAL_GENERATED = filter-marshal.c filter-marshal.h
@EVO_MARSHAL_RULE@
diff --git a/filter/filter-context.c b/filter/filter-context.c
deleted file mode 100644
index 3e82bc4c39..0000000000
--- a/filter/filter-context.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include "filter-context.h"
-#include "filter-filter.h"
-
-/* For poking into filter-folder guts */
-#include "filter-folder.h"
-
-#define d(x)
-
-static void filter_context_class_init (FilterContextClass *klass);
-static void filter_context_init (FilterContext *fc);
-static void filter_context_finalise (GObject *obj);
-
-static GList *filter_rename_uri (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
-static GList *filter_delete_uri (RuleContext *rc, const char *uri, GCompareFunc cmp);
-
-
-static RuleContextClass *parent_class = NULL;
-
-
-GType
-filter_context_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterContextClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_context_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterContext),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_context_init,
- };
-
- type = g_type_register_static (RULE_TYPE_CONTEXT, "FilterContext", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_context_class_init (FilterContextClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- RuleContextClass *rc_class = RULE_CONTEXT_CLASS (klass);
-
- parent_class = g_type_class_ref (RULE_TYPE_CONTEXT);
-
- object_class->finalize = filter_context_finalise;
-
- /* override methods */
- rc_class->rename_uri = filter_rename_uri;
- rc_class->delete_uri = filter_delete_uri;
-}
-
-static void
-filter_context_init (FilterContext *fc)
-{
- rule_context_add_part_set ((RuleContext *) fc, "partset", filter_part_get_type (),
- rule_context_add_part, rule_context_next_part);
- rule_context_add_part_set ((RuleContext *) fc, "actionset", filter_part_get_type (),
- (RCPartFunc) filter_context_add_action,
- (RCNextPartFunc) filter_context_next_action);
-
- rule_context_add_rule_set ((RuleContext *) fc, "ruleset", filter_filter_get_type (),
- (RCRuleFunc) rule_context_add_rule, rule_context_next_rule);
-}
-
-static void
-filter_context_finalise (GObject *obj)
-{
- FilterContext *fc = (FilterContext *)obj;
-
- g_list_foreach (fc->actions, (GFunc)g_object_unref, NULL);
- g_list_free (fc->actions);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_context_new:
- *
- * Create a new FilterContext object.
- *
- * Return value: A new #FilterContext object.
- **/
-FilterContext *
-filter_context_new (void)
-{
- return (FilterContext *) g_object_new (FILTER_TYPE_CONTEXT, NULL, NULL);
-}
-
-void
-filter_context_add_action (FilterContext *fc, FilterPart *action)
-{
- d(printf("find action : "));
- fc->actions = g_list_append (fc->actions, action);
-}
-
-FilterPart *
-filter_context_find_action (FilterContext *fc, const char *name)
-{
- d(printf("find action : "));
- return filter_part_find_list (fc->actions, name);
-}
-
-FilterPart *
-filter_context_create_action (FilterContext *fc, const char *name)
-{
- FilterPart *part;
-
- if ((part = filter_context_find_action (fc, name)))
- return filter_part_clone (part);
-
- return NULL;
-}
-
-FilterPart *
-filter_context_next_action (FilterContext *fc, FilterPart *last)
-{
- return filter_part_next_list (fc->actions, last);
-}
-
-/* We search for any folders in our actions list that need updating, update them */
-static GList *
-filter_rename_uri (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp)
-{
- FilterRule *rule;
- GList *l, *el;
- FilterPart *action;
- FilterElement *element;
- int count = 0;
- GList *changed = NULL;
-
- d(printf("uri '%s' renamed to '%s'\n", olduri, newuri));
-
- /* For all rules, for all actions, for all elements, rename any folder elements */
- /* Yes we could do this inside each part itself, but not today */
- rule = NULL;
- while ((rule = rule_context_next_rule (rc, rule, NULL))) {
- int rulecount = 0;
-
- d(printf("checking rule '%s'\n", rule->name));
-
- l = FILTER_FILTER (rule)->actions;
- while (l) {
- action = l->data;
-
- d(printf("checking action '%s'\n", action->name));
-
- el = action->elements;
- while (el) {
- element = el->data;
-
- d(printf("checking element '%s'\n", element->name));
- if (IS_FILTER_FOLDER (element)) {
- d(printf(" is folder, existing uri = '%s'\n",
- FILTER_FOLDER (element)->uri));
- }
-
- if (IS_FILTER_FOLDER (element)
- && cmp(((FilterFolder *)element)->uri, olduri)) {
- d(printf(" Changed!\n"));
- filter_folder_set_value((FilterFolder *)element, newuri);
- rulecount++;
- }
- el = el->next;
- }
- l = l->next;
- }
-
- if (rulecount) {
- changed = g_list_append (changed, g_strdup (rule->name));
- filter_rule_emit_changed (rule);
- }
-
- count += rulecount;
- }
-
- /* might need to call parent class, if it did anything ... parent_class->rename_uri(f, olduri, newuri, cmp); */
-
- return changed;
-}
-
-static GList *
-filter_delete_uri (RuleContext *rc, const char *uri, GCompareFunc cmp)
-{
- /* We basically do similar to above, but when we find it,
- Remove the action, and if thats the last action, this might create an empty rule? remove the rule? */
-
- FilterRule *rule;
- GList *l, *el;
- FilterPart *action;
- FilterElement *element;
- int count = 0;
- GList *deleted = NULL;
-
- d(printf("uri '%s' deleted\n", uri));
-
- /* For all rules, for all actions, for all elements, check deleted folder elements */
- /* Yes we could do this inside each part itself, but not today */
- rule = NULL;
- while ((rule = rule_context_next_rule (rc, rule, NULL))) {
- int recorded = 0;
-
- d(printf("checking rule '%s'\n", rule->name));
-
- l = FILTER_FILTER (rule)->actions;
- while (l) {
- action = l->data;
-
- d(printf("checking action '%s'\n", action->name));
-
- el = action->elements;
- while (el) {
- element = el->data;
-
- d(printf("checking element '%s'\n", element->name));
- if (IS_FILTER_FOLDER (element)) {
- d(printf(" is folder, existing uri = '%s'\n",
- FILTER_FOLDER (element)->uri));
- }
-
- if (IS_FILTER_FOLDER (element)
- && cmp(((FilterFolder *)element)->uri, uri)) {
- d(printf(" Deleted!\n"));
- /* check if last action, if so, remove rule instead? */
- l = l->next;
- filter_filter_remove_action ((FilterFilter *)rule, action);
- g_object_unref (action);
- count++;
- if (!recorded)
- deleted = g_list_append (deleted, g_strdup (rule->name));
- goto next_action;
- }
- el = el->next;
- }
- l = l->next;
- next_action:
- ;
- }
- }
-
- /* TODO: could call parent and merge lists */
-
- return deleted;
-}
diff --git a/filter/filter-context.h b/filter/filter-context.h
deleted file mode 100644
index 157ee6f1de..0000000000
--- a/filter/filter-context.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_CONTEXT_H
-#define _FILTER_CONTEXT_H
-
-#include "rule-context.h"
-
-#define FILTER_TYPE_CONTEXT (filter_context_get_type ())
-#define FILTER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_CONTEXT, FilterContext))
-#define FILTER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_CONTEXT, FilterContextClass))
-#define IS_FILTER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_CONTEXT))
-#define IS_FILTER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_CONTEXT))
-#define FILTER_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_CONTEXT, FilterContextClass))
-
-typedef struct _FilterContext FilterContext;
-typedef struct _FilterContextClass FilterContextClass;
-
-struct _FilterContext {
- RuleContext parent_object;
-
- GList *actions;
-};
-
-struct _FilterContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_context_get_type (void);
-FilterContext *filter_context_new (void);
-
-/* methods */
-void filter_context_add_action (FilterContext *fc, FilterPart *action);
-FilterPart *filter_context_find_action (FilterContext *fc, const char *name);
-FilterPart *filter_context_create_action (FilterContext *fc, const char *name);
-FilterPart *filter_context_next_action (FilterContext *fc, FilterPart *last);
-
-#endif /* ! _FILTER_CONTEXT_H */
diff --git a/filter/filter-editor.c b/filter/filter-editor.c
deleted file mode 100644
index 884721f862..0000000000
--- a/filter/filter-editor.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-editor.h"
-#include "filter-filter.h"
-
-#define d(x)
-
-static FilterRule *create_rule (RuleEditor *re);
-
-static void filter_editor_class_init (FilterEditorClass *klass);
-static void filter_editor_init (FilterEditor *fe);
-static void filter_editor_finalise (GObject *obj);
-
-
-static RuleEditorClass *parent_class = NULL;
-
-
-GtkType
-filter_editor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterEditorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_editor_init,
- };
-
- type = g_type_register_static (RULE_TYPE_EDITOR, "FilterEditor", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_editor_class_init (FilterEditorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- RuleEditorClass *re_class = (RuleEditorClass *) klass;
-
- parent_class = g_type_class_ref (rule_editor_get_type ());
-
- gobject_class->finalize = filter_editor_finalise;
-
- /* override methods */
- re_class->create_rule = create_rule;
-}
-
-static void
-filter_editor_init (FilterEditor *fe)
-{
- ;
-}
-
-static void
-filter_editor_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_editor_new:
- *
- * Create a new FilterEditor object.
- *
- * Return value: A new #FilterEditor object.
- **/
-FilterEditor *
-filter_editor_new (FilterContext *fc, const char **source_names)
-{
- FilterEditor *fe = (FilterEditor *) g_object_new (FILTER_TYPE_EDITOR, NULL);
- GladeXML *gui;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor", NULL);
- filter_editor_construct (fe, fc, gui, source_names);
- g_object_unref (gui);
-
- return fe;
-}
-
-static void
-select_source (GtkMenuItem *mi, FilterEditor *fe)
-{
- char *source;
-
- source = g_object_get_data(G_OBJECT(mi), "source");
- g_assert (source);
-
- rule_editor_set_source ((RuleEditor *)fe, source);
-}
-
-void
-filter_editor_construct (FilterEditor *fe, FilterContext *fc, GladeXML *gui, const char **source_names)
-{
- GtkWidget *menu, *item, *omenu;
- int i;
-
- omenu = glade_xml_get_widget (gui, "filter_source");
- gtk_option_menu_remove_menu (GTK_OPTION_MENU (omenu));
- menu = gtk_menu_new ();
-
- for (i = 0; source_names[i]; i++) {
- item = gtk_menu_item_new_with_label (_(source_names[i]));
- g_object_set_data_full (G_OBJECT (item), "source", g_strdup (source_names[i]), g_free);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
- g_signal_connect (item, "activate", G_CALLBACK (select_source), fe);
- }
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_widget_show (omenu);
-
- rule_editor_construct ((RuleEditor *) fe, (RuleContext *) fc, gui, source_names[0], _("_Filter Rules"));
-}
-
-static FilterRule *
-create_rule (RuleEditor *re)
-{
- FilterRule *rule = filter_rule_new ();
- FilterPart *part;
-
- /* create a rule with 1 part & 1 action in it */
- rule = (FilterRule *)filter_filter_new ();
- part = rule_context_next_part (re->context, NULL);
- filter_rule_add_part (rule, filter_part_clone (part));
- part = filter_context_next_action ((FilterContext *)re->context, NULL);
- filter_filter_add_action ((FilterFilter *)rule, filter_part_clone (part));
-
- return rule;
-}
diff --git a/filter/filter-editor.h b/filter/filter-editor.h
deleted file mode 100644
index 4b01e3b877..0000000000
--- a/filter/filter-editor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_EDITOR_H
-#define _FILTER_EDITOR_H
-
-#include "rule-editor.h"
-#include "filter-context.h"
-
-#define FILTER_TYPE_EDITOR (filter_editor_get_type ())
-#define FILTER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_EDITOR, FilterEditor))
-#define FILTER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_EDITOR, FilterEditorClass))
-#define IS_FILTER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_EDITOR))
-#define IS_FILTER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_EDITOR))
-#define FILTER_EDITOR_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), FILTER_TYPE_EDITOR, FilterEditorClass))
-
-typedef struct _FilterEditor FilterEditor;
-typedef struct _FilterEditorClass FilterEditorClass;
-
-struct _FilterEditor {
- RuleEditor parent_object;
-
-};
-
-struct _FilterEditorClass {
- RuleEditorClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GtkType filter_editor_get_type (void);
-
-FilterEditor *filter_editor_new (FilterContext *f, const char **source_names);
-void filter_editor_construct (FilterEditor *fe, FilterContext *fc, GladeXML *gui, const char **source_names);
-
-#endif /* ! _FILTER_EDITOR_H */
diff --git a/filter/filter-element.c b/filter/filter-element.c
index 5f68f78804..14aef0a015 100644
--- a/filter/filter-element.c
+++ b/filter/filter-element.c
@@ -29,30 +29,26 @@
#include <stdlib.h>
#include "filter-element.h"
-#include "filter-input.h"
-#include "filter-option.h"
-#include "filter-code.h"
-#include "filter-colour.h"
-#include "filter-datespec.h"
-#include "filter-int.h"
-#include "filter-folder.h"
-#include "filter-source.h"
-#include "filter-file.h"
-#include "filter-label.h"
+struct _element_type {
+ char *name;
+
+ FilterElementFunc create;
+ void *data;
+};
static gboolean validate (FilterElement *fe);
static int element_eq(FilterElement *fe, FilterElement *cm);
static void xml_create(FilterElement *fe, xmlNodePtr node);
static FilterElement *clone(FilterElement *fe);
+static void copy_value(FilterElement *de, FilterElement *se);
static void filter_element_class_init (FilterElementClass *klass);
static void filter_element_init (FilterElement *fe);
static void filter_element_finalise (GObject *obj);
-
static GObjectClass *parent_class = NULL;
-
+static GHashTable *fe_table;
GType
filter_element_get_type (void)
@@ -71,7 +67,7 @@ filter_element_get_type (void)
0, /* n_preallocs */
(GInstanceInitFunc) filter_element_init,
};
-
+ fe_table = g_hash_table_new(g_str_hash, g_str_equal);
type = g_type_register_static (G_TYPE_OBJECT, "FilterElement", &info, 0);
}
@@ -81,17 +77,16 @@ filter_element_get_type (void)
static void
filter_element_class_init (FilterElementClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
parent_class = g_type_class_ref (G_TYPE_OBJECT);
- object_class->finalize = filter_element_finalise;
+ ((GObjectClass *)klass)->finalize = filter_element_finalise;
/* override methods */
klass->validate = validate;
klass->eq = element_eq;
klass->xml_create = xml_create;
klass->clone = clone;
+ klass->copy_value = copy_value;
}
static void
@@ -238,55 +233,6 @@ filter_element_format_sexp (FilterElement *fe, GString *out)
FILTER_ELEMENT_GET_CLASS (fe)->format_sexp (fe, out);
}
-/**
- * filter_element_new_type_name:
- * @type: filter element type
- *
- * Create a new filter element based on its type name.
- *
- * Return value:
- **/
-FilterElement *
-filter_element_new_type_name (const char *type)
-{
- if (type == NULL)
- return NULL;
-
- if (!strcmp (type, "string")) {
- return (FilterElement *) filter_input_new ();
- } else if (!strcmp (type, "folder")) {
- return (FilterElement *) filter_folder_new ();
- } else if (!strcmp (type, "address")) {
- /* FIXME: temporary ... need real address type */
- return (FilterElement *) filter_input_new_type_name (type);
- } else if (!strcmp (type, "code")) {
- return (FilterElement *) filter_code_new ();
- } else if (!strcmp (type, "colour")) {
- return (FilterElement *) filter_colour_new ();
- } else if (!strcmp (type, "optionlist") || !strcmp (type, "system-flag")) {
- return (FilterElement *) filter_option_new ();
- } else if (!strcmp (type, "datespec")) {
- return (FilterElement *) filter_datespec_new ();
- } else if (!strcmp (type, "score")) {
- return (FilterElement *) filter_int_new_type("score", -3, 3);
- } else if (!strcmp (type, "integer")) {
- return (FilterElement *) filter_int_new ();
- } else if (!strcmp (type, "regex")) {
- return (FilterElement *) filter_input_new_type_name (type);
- } else if (!strcmp (type, "source")) {
- return (FilterElement *) filter_source_new ();
- } else if (!strcmp (type, "command")) {
- return (FilterElement *) filter_file_new_type_name (type);
- } else if (!strcmp (type, "file")) {
- return (FilterElement *) filter_file_new_type_name (type);
- } else if (!strcmp (type, "label")) {
- return (FilterElement *) filter_label_new ();
- } else {
- g_warning("Unknown filter type '%s'", type);
- return NULL;
- }
-}
-
void
filter_element_set_data (FilterElement *fe, gpointer data)
{
@@ -327,12 +273,19 @@ clone (FilterElement *fe)
return new;
}
-/* only copies the value, not the name/type */
-void
-filter_element_copy_value (FilterElement *de, FilterElement *se)
-{
- /* bit of a hack, but saves having to do the same in each type ? */
+/* This is somewhat hackish, implement all the base cases in here */
+#include "filter-input.h"
+#include "filter-option.h"
+#include "filter-code.h"
+#include "filter-colour.h"
+#include "filter-datespec.h"
+#include "filter-int.h"
+#include "filter-file.h"
+#include "filter-label.h"
+static void
+copy_value(FilterElement *de, FilterElement *se)
+{
if (IS_FILTER_INPUT(se)) {
if (IS_FILTER_INPUT(de)) {
if (((FilterInput *)se)->values)
@@ -340,10 +293,6 @@ filter_element_copy_value (FilterElement *de, FilterElement *se)
} else if (IS_FILTER_INT(de)) {
((FilterInt *)de)->val = atoi((char *) ((FilterInput *)se)->values->data);
}
- } else if (IS_FILTER_FOLDER(se)) {
- if (IS_FILTER_FOLDER(de)) {
- filter_folder_set_value((FilterFolder *)de, ((FilterFolder *)se)->uri);
- }
} else if (IS_FILTER_COLOUR(se)) {
if (IS_FILTER_COLOUR(de)) {
FilterColour *s = (FilterColour *)se, *d = (FilterColour *)de;
@@ -383,3 +332,10 @@ filter_element_copy_value (FilterElement *de, FilterElement *se)
}
}
}
+
+/* only copies the value, not the name/type */
+void
+filter_element_copy_value (FilterElement *de, FilterElement *se)
+{
+ FILTER_ELEMENT_GET_CLASS (de)->copy_value(de, se);
+}
diff --git a/filter/filter-element.h b/filter/filter-element.h
index 75627686ae..12fb3b9251 100644
--- a/filter/filter-element.h
+++ b/filter/filter-element.h
@@ -39,6 +39,8 @@
typedef struct _FilterElement FilterElement;
typedef struct _FilterElementClass FilterElementClass;
+typedef FilterElement *(*FilterElementFunc)(void *data);
+
struct _FilterElement {
GObject parent_object;
@@ -60,7 +62,8 @@ struct _FilterElementClass {
int (*xml_decode) (FilterElement *, xmlNodePtr);
FilterElement *(*clone) (FilterElement *fe);
-
+ void (*copy_value)(FilterElement *fe, FilterElement *se);
+
GtkWidget *(*get_widget) (FilterElement *);
void (*build_code) (FilterElement *, GString *, struct _FilterPart *ff);
void (*format_sexp) (FilterElement *, GString *);
@@ -71,8 +74,6 @@ struct _FilterElementClass {
GType filter_element_get_type (void);
FilterElement *filter_element_new (void);
-FilterElement *filter_element_new_type_name (const char *type);
-
void filter_element_set_data (FilterElement *fe, gpointer data);
/* methods */
diff --git a/filter/filter-errors.xml b/filter/filter-errors.xml
index d7ad6ab55b..21487f04f7 100644
--- a/filter/filter-errors.xml
+++ b/filter/filter-errors.xml
@@ -16,11 +16,6 @@
<secondary>You must specify a file name.</secondary>
</error>
- <error id="no-folder" type="error">
- <primary>Missing folder.</primary>
- <secondary>You must specify a folder.</secondary>
- </error>
-
<error id="bad-regexp" type="error">
<primary>Bad regular expression &quot;{0}&quot;.</primary>
<secondary>Could not compile regular expression &quot;{1}&quot;.</secondary>
@@ -31,21 +26,9 @@
<secondary>You must name this filter.</secondary>
</error>
- <error id="no-name-vfolder" type="error">
- <primary>Missing name.</primary>
- <secondary>You must name this vFolder.</secondary>
- </error>
-
<error id="bad-name-notunique" type="error">
<primary>Name &quot;{0}&quot; already used.</primary>
<secondary>Please choose another name.</secondary>
</error>
- <error id="vfolder-no-source" type="error">
- <primary>No sources selected.</primary>
- <secondary>You must specify at least one folder as a source.
-Either by selecting the folders individually, and/or by selecting
-all local folders, all remote folders, or both.</secondary>
- </error>
-
</error-list> \ No newline at end of file
diff --git a/filter/filter-errors.xml.h b/filter/filter-errors.xml.h
index f8ed2d6ffb..f14c26698b 100644
--- a/filter/filter-errors.xml.h
+++ b/filter/filter-errors.xml.h
@@ -10,10 +10,6 @@ char *s = N_("You must specify a file name.");
char *s = N_("File \"{0}\" does not exist or is not a regular file.");
/* filter:bad-file secondary */
char *s = N_("You must specify a file name.");
-/* filter:no-folder primary */
-char *s = N_("Missing folder.");
-/* filter:no-folder secondary */
-char *s = N_("You must specify a folder.");
/* filter:bad-regexp primary */
char *s = N_("Bad regular expression \"{0}\".");
/* filter:bad-regexp secondary */
@@ -22,17 +18,7 @@ char *s = N_("Could not compile regular expression \"{1}\".");
char *s = N_("Missing name.");
/* filter:no-name secondary */
char *s = N_("You must name this filter.");
-/* filter:no-name-vfolder primary */
-char *s = N_("Missing name.");
-/* filter:no-name-vfolder secondary */
-char *s = N_("You must name this vFolder.");
/* filter:bad-name-notunique primary */
char *s = N_("Name \"{0}\" already used.");
/* filter:bad-name-notunique secondary */
char *s = N_("Please choose another name.");
-/* filter:vfolder-no-source primary */
-char *s = N_("No sources selected.");
-/* filter:vfolder-no-source secondary */
-char *s = N_("You must specify at least one folder as a source.\n"
- "Either by selecting the folders individually, and/or by selecting\n"
- "all local folders, all remote folders, or both.");
diff --git a/filter/filter-filter.c b/filter/filter-filter.c
deleted file mode 100644
index 6dc53d9593..0000000000
--- a/filter/filter-filter.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-filter.h"
-#include "filter-context.h"
-
-#define d(x)
-
-static int validate(FilterRule *fr);
-static int filter_eq(FilterRule *fr, FilterRule *cm);
-static xmlNodePtr xml_encode (FilterRule *fr);
-static int xml_decode (FilterRule *fr, xmlNodePtr, RuleContext *rc);
-static void rule_copy (FilterRule *dest, FilterRule *src);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget (FilterRule *fr, RuleContext *rc);
-
-static void filter_filter_class_init (FilterFilterClass *klass);
-static void filter_filter_init (FilterFilter *ff);
-static void filter_filter_finalise (GObject *obj);
-
-
-static FilterRuleClass *parent_class = NULL;
-
-
-GType
-filter_filter_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterFilterClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_filter_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterFilter),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_filter_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_RULE, "FilterFilter", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_filter_class_init (FilterFilterClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterRuleClass *fr_class = (FilterRuleClass *) klass;
-
- parent_class = g_type_class_ref (FILTER_TYPE_RULE);
-
- object_class->finalize = filter_filter_finalise;
-
- /* override methods */
- fr_class->validate = validate;
- fr_class->eq = filter_eq;
- fr_class->xml_encode = xml_encode;
- fr_class->xml_decode = xml_decode;
- /*fr_class->build_code = build_code;*/
- fr_class->copy = rule_copy;
- fr_class->get_widget = get_widget;
-}
-
-static void
-filter_filter_init (FilterFilter *ff)
-{
- ;
-}
-
-static void
-unref_list (GList *l)
-{
- while (l) {
- g_object_unref (l->data);
- l = l->next;
- }
-}
-
-static void
-filter_filter_finalise (GObject *obj)
-{
- FilterFilter *ff = (FilterFilter *) obj;
-
- unref_list (ff->actions);
- g_list_free (ff->actions);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_filter_new:
- *
- * Create a new FilterFilter object.
- *
- * Return value: A new #FilterFilter object.
- **/
-FilterFilter *
-filter_filter_new (void)
-{
- return (FilterFilter *) g_object_new (FILTER_TYPE_FILTER, NULL, NULL);
-}
-
-void
-filter_filter_add_action (FilterFilter *fr, FilterPart *fp)
-{
- fr->actions = g_list_append (fr->actions, fp);
-
- filter_rule_emit_changed ((FilterRule *) fr);
-}
-
-void
-filter_filter_remove_action (FilterFilter *fr, FilterPart *fp)
-{
- fr->actions = g_list_remove (fr->actions, fp);
-
- filter_rule_emit_changed ((FilterRule *) fr);
-}
-
-void
-filter_filter_replace_action (FilterFilter *fr, FilterPart *fp, FilterPart *new)
-{
- GList *l;
-
- l = g_list_find (fr->actions, fp);
- if (l) {
- l->data = new;
- } else {
- fr->actions = g_list_append (fr->actions, new);
- }
-
- filter_rule_emit_changed ((FilterRule *) fr);
-}
-
-void
-filter_filter_build_action (FilterFilter *fr, GString *out)
-{
- g_string_append (out, "(begin\n");
- filter_part_build_code_list (fr->actions, out);
- g_string_append (out, ")\n");
-}
-
-static int
-validate (FilterRule *fr)
-{
- FilterFilter *ff = (FilterFilter *) fr;
- GList *parts;
- int valid;
-
- valid = FILTER_RULE_CLASS (parent_class)->validate (fr);
-
- /* validate rule actions */
- parts = ff->actions;
- while (parts && valid) {
- valid = filter_part_validate ((FilterPart *) parts->data);
- parts = parts->next;
- }
-
- return valid;
-}
-
-static int
-list_eq (GList *al, GList *bl)
-{
- int truth = TRUE;
-
- while (truth && al && bl) {
- FilterPart *a = al->data, *b = bl->data;
-
- truth = filter_part_eq (a, b);
- al = al->next;
- bl = bl->next;
- }
-
- return truth && al == NULL && bl == NULL;
-}
-
-static int
-filter_eq (FilterRule *fr, FilterRule *cm)
-{
- return FILTER_RULE_CLASS (parent_class)->eq (fr, cm)
- && list_eq (((FilterFilter *) fr)->actions, ((FilterFilter *) cm)->actions);
-}
-
-static xmlNodePtr
-xml_encode (FilterRule *fr)
-{
- FilterFilter *ff = (FilterFilter *) fr;
- xmlNodePtr node, set, work;
- GList *l;
-
- node = FILTER_RULE_CLASS (parent_class)->xml_encode (fr);
- g_assert (node != NULL);
- set = xmlNewNode (NULL, "actionset");
- xmlAddChild (node, set);
- l = ff->actions;
- while (l) {
- work = filter_part_xml_encode ((FilterPart *) l->data);
- xmlAddChild (set, work);
- l = l->next;
- }
-
- return node;
-
-}
-
-static void
-load_set (xmlNodePtr node, FilterFilter *ff, RuleContext *rc)
-{
- xmlNodePtr work;
- char *rulename;
- FilterPart *part;
-
- work = node->children;
- while (work) {
- if (!strcmp (work->name, "part")) {
- rulename = xmlGetProp (work, "name");
- part = filter_context_find_action ((FilterContext *) rc, rulename);
- if (part) {
- part = filter_part_clone (part);
- filter_part_xml_decode (part, work);
- filter_filter_add_action (ff, part);
- } else {
- g_warning ("cannot find rule part '%s'\n", rulename);
- }
- xmlFree (rulename);
- } else if (work->type == XML_ELEMENT_NODE) {
- g_warning ("Unknown xml node in part: %s", work->name);
- }
- work = work->next;
- }
-}
-
-static int
-xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *rc)
-{
- FilterFilter *ff = (FilterFilter *) fr;
- xmlNodePtr work;
- int result;
-
- result = FILTER_RULE_CLASS (parent_class)->xml_decode (fr, node, rc);
- if (result != 0)
- return result;
-
- work = node->children;
- while (work) {
- if (!strcmp (work->name, "actionset")) {
- load_set (work, ff, rc);
- }
- work = work->next;
- }
-
- return 0;
-}
-
-static void
-rule_copy (FilterRule *dest, FilterRule *src)
-{
- FilterFilter *fdest, *fsrc;
- GList *node;
-
- fdest = (FilterFilter *) dest;
- fsrc = (FilterFilter *) src;
-
- if (fdest->actions) {
- g_list_foreach (fdest->actions, (GFunc) g_object_unref, NULL);
- g_list_free (fdest->actions);
- fdest->actions = NULL;
- }
-
- node = fsrc->actions;
- while (node) {
- FilterPart *part = node->data;
-
- g_object_ref (part);
- fdest->actions = g_list_append (fdest->actions, part);
- node = node->next;
- }
-
- FILTER_RULE_CLASS (parent_class)->copy (dest, src);
-}
-
-/*static void build_code(FilterRule *fr, GString *out)
-{
- return FILTER_RULE_CLASS (parent_class)->build_code (fr, out);
-}*/
-
-struct _part_data {
- FilterRule *fr;
- FilterContext *f;
- FilterPart *part;
- GtkWidget *partwidget, *container;
-};
-
-static void
-option_activate (GtkMenuItem *item, struct _part_data *data)
-{
- FilterPart *part = g_object_get_data ((GObject *) item, "part");
- FilterPart *newpart;
-
- /* dont update if we haven't changed */
- if (!strcmp (part->title, data->part->title))
- return;
-
- /* here we do a widget shuffle, throw away the old widget/rulepart,
- and create another */
- if (data->partwidget)
- gtk_container_remove (GTK_CONTAINER (data->container), data->partwidget);
-
- newpart = filter_part_clone (part);
- filter_part_copy_values (newpart, data->part);
- filter_filter_replace_action ((FilterFilter *) data->fr, data->part, newpart);
- g_object_unref (data->part);
- data->part = newpart;
- data->partwidget = filter_part_get_widget (newpart);
- if (data->partwidget)
- gtk_box_pack_start (GTK_BOX (data->container), data->partwidget, FALSE, FALSE, 0);
-
- g_object_set_data ((GObject *) data->container, "part", newpart);
-}
-
-static GtkWidget *
-get_rule_part_widget (FilterContext *f, FilterPart *newpart, FilterRule *fr)
-{
- FilterPart *part = NULL;
- GtkWidget *menu;
- GtkWidget *item;
- GtkWidget *omenu;
- GtkWidget *hbox;
- GtkWidget *p;
- int index = 0, current = 0;
- struct _part_data *data;
-
- data = g_malloc0 (sizeof (*data));
- data->fr = fr;
- data->f = f;
- data->part = newpart;
-
- hbox = gtk_hbox_new (FALSE, 0);
- p = filter_part_get_widget (newpart);
-
- data->partwidget = p;
- data->container = hbox;
-
- menu = gtk_menu_new ();
- while ((part = filter_context_next_action (f, part))) {
- item = gtk_menu_item_new_with_label (_(part->title));
-
- g_object_set_data ((GObject *) item, "part", part);
- g_signal_connect (item, "activate", G_CALLBACK (option_activate), data);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show (item);
-
- if (!strcmp (newpart->title, part->title))
- current = index;
-
- index++;
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
- gtk_widget_show (omenu);
-
- gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
- if (p)
- gtk_box_pack_start (GTK_BOX (hbox), p, FALSE, FALSE, 0);
-
- gtk_widget_show_all (hbox);
-
- return hbox;
-}
-
-struct _rule_data {
- FilterRule *fr;
- FilterContext *f;
- GtkWidget *parts;
-};
-
-static void
-less_parts (GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *part;
- GtkWidget *rule;
- GList *l;
-
- l = ((FilterFilter *) data->fr)->actions;
- if (g_list_length (l) < 2)
- return;
-
- rule = g_object_get_data ((GObject *) button, "rule");
- part = g_object_get_data ((GObject *) rule, "part");
-
- /* remove the part from the list */
- filter_filter_remove_action ((FilterFilter *) data->fr, part);
- g_object_unref (part);
-
- /* and from the display */
- gtk_container_remove (GTK_CONTAINER (data->parts), rule);
- gtk_container_remove (GTK_CONTAINER (data->parts), button);
-}
-
-static void
-attach_rule (GtkWidget *rule, struct _rule_data *data, FilterPart *part, int row)
-{
- GtkWidget *remove;
-
- gtk_table_attach (GTK_TABLE (data->parts), rule, 0, 1, row, row + 1,
- GTK_EXPAND | GTK_FILL, 0, 0, 0);
-
- remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
- g_object_set_data ((GObject *) remove, "rule", rule);
- g_object_set_data ((GObject *) rule, "part", part);
- /*gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);*/
- g_signal_connect (remove, "clicked", G_CALLBACK (less_parts), data);
- gtk_table_attach (GTK_TABLE (data->parts), remove, 1, 2, row, row + 1,
- 0, 0, 0, 0);
- gtk_widget_show (remove);
-}
-
-static void
-more_parts (GtkWidget *button, struct _rule_data *data)
-{
- FilterPart *new;
-
- /* create a new rule entry, use the first type of rule */
- new = filter_context_next_action ((FilterContext *) data->f, NULL);
- if (new) {
- GtkWidget *w;
- guint16 rows;
-
- new = filter_part_clone (new);
- filter_filter_add_action ((FilterFilter *) data->fr, new);
- w = get_rule_part_widget (data->f, new, data->fr);
-
- rows = GTK_TABLE (data->parts)->nrows;
- gtk_table_resize (GTK_TABLE (data->parts), rows + 1, 2);
- attach_rule (w, data, new, rows);
- }
-}
-
-static GtkWidget *
-get_widget (FilterRule *fr, RuleContext *rc)
-{
- GtkWidget *widget, *hbox, *add, *label;
- GtkWidget *parts, *inframe, *w;
- GtkWidget *scrolledwindow;
- GtkObject *hadj, *vadj;
- GList *l;
- FilterPart *part;
- struct _rule_data *data;
- FilterFilter *ff = (FilterFilter *)fr;
- int rows, i = 0;
-
- widget = FILTER_RULE_CLASS (parent_class)->get_widget (fr, rc);
-
- /* and now for the action area */
- label = gtk_label_new (_("<b>Then</b>"));
- gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
- gtk_box_pack_start (GTK_BOX (widget), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_box_pack_start (GTK_BOX (widget), hbox, TRUE, TRUE, 0);
- gtk_widget_show (hbox);
-
- label = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- inframe = gtk_vbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (hbox), inframe, TRUE, TRUE, 0);
-
- rows = g_list_length (ff->actions);
- parts = gtk_table_new (rows, 2, FALSE);
- data = g_malloc0 (sizeof (*data));
- data->f = (FilterContext *) rc;
- data->fr = fr;
- data->parts = parts;
-
- hbox = gtk_hbox_new (FALSE, 3);
-
- add = gtk_button_new_from_stock (GTK_STOCK_ADD);
- /* gtk_button_set_relief (GTK_BUTTON (add), GTK_RELIEF_NONE); */
- g_signal_connect (add, "clicked", G_CALLBACK (more_parts), data);
- gtk_box_pack_start (GTK_BOX (hbox), add, FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (inframe), hbox, FALSE, FALSE, 3);
-
- l = ff->actions;
- while (l) {
- part = l->data;
- d(printf ("adding action %s\n", part->title));
- w = get_rule_part_widget ((FilterContext *) rc, part, fr);
- attach_rule (w, data, part, i++);
- l = l->next;
- }
-
- hadj = gtk_adjustment_new (0.0, 0.0, 1.0, 1.0 ,1.0, 1.0);
- vadj = gtk_adjustment_new (0.0, 0.0, 1.0, 1.0 ,1.0, 1.0);
- scrolledwindow = gtk_scrolled_window_new (GTK_ADJUSTMENT (hadj), GTK_ADJUSTMENT (vadj));
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwindow), parts);
-
- gtk_box_pack_start (GTK_BOX (inframe), scrolledwindow, TRUE, TRUE, 0);
-
- /*gtk_box_pack_start (GTK_BOX (inframe), parts, FALSE, FALSE, 3);*/
-
- gtk_widget_show_all (widget);
-
- return widget;
-}
diff --git a/filter/filter-filter.h b/filter/filter-filter.h
deleted file mode 100644
index 1fcff3fa3a..0000000000
--- a/filter/filter-filter.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_FILTER_H
-#define _FILTER_FILTER_H
-
-#include "filter-rule.h"
-
-#define FILTER_TYPE_FILTER (filter_filter_get_type ())
-#define FILTER_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_FILTER, FilterFilter))
-#define FILTER_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_FILTER, FilterFilterClass))
-#define IS_FILTER_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_FILTER))
-#define IS_FILTER_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_FILTER))
-#define FILTER_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_FILTER, FilterFilterClass))
-
-typedef struct _FilterFilter FilterFilter;
-typedef struct _FilterFilterClass FilterFilterClass;
-
-struct _FilterFilter {
- FilterRule parent_object;
-
- GList *actions;
-};
-
-struct _FilterFilterClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_filter_get_type (void);
-FilterFilter *filter_filter_new (void);
-
-/* methods */
-void filter_filter_add_action (FilterFilter *fr, FilterPart *fp);
-void filter_filter_remove_action (FilterFilter *fr, FilterPart *fp);
-void filter_filter_replace_action (FilterFilter *fr, FilterPart *fp, FilterPart *new);
-
-void filter_filter_build_action (FilterFilter *fr, GString *out);
-
-#endif /* ! _FILTER_FILTER_H */
diff --git a/filter/filter-folder.c b/filter/filter-folder.c
deleted file mode 100644
index 7c6e56a247..0000000000
--- a/filter/filter-folder.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "filter-folder.h"
-#include "mail/em-folder-selection-button.h"
-#include "mail/mail-component.h"
-#include "mail/em-utils.h"
-#include "e-util/e-sexp.h"
-#include "widgets/misc/e-error.h"
-
-#define d(x)
-
-static gboolean validate (FilterElement *fe);
-static int folder_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_folder_class_init (FilterFolderClass *class);
-static void filter_folder_init (FilterFolder *ff);
-static void filter_folder_finalise (GObject *obj);
-
-
-static FilterElementClass *parent_class = NULL;
-
-
-GType
-filter_folder_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterFolderClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_folder_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterFolder),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_folder_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterFolder", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_folder_class_init (FilterFolderClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_folder_finalise;
-
- /* override methods */
- fe_class->validate = validate;
- fe_class->eq = folder_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_folder_init (FilterFolder *ff)
-{
- ;
-}
-
-static void
-filter_folder_finalise (GObject *obj)
-{
- FilterFolder *ff = (FilterFolder *) obj;
-
- g_free (ff->uri);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * filter_folder_new:
- *
- * Create a new FilterFolder object.
- *
- * Return value: A new #FilterFolder object.
- **/
-FilterFolder *
-filter_folder_new (void)
-{
- return (FilterFolder *) g_object_new (FILTER_TYPE_FOLDER, NULL, NULL);
-}
-
-void
-filter_folder_set_value (FilterFolder *ff, const char *uri)
-{
- g_free (ff->uri);
- ff->uri = g_strdup (uri);
-}
-
-static gboolean
-validate (FilterElement *fe)
-{
- FilterFolder *ff = (FilterFolder *) fe;
-
- if (ff->uri && *ff->uri) {
- return TRUE;
- } else {
- /* FIXME: FilterElement should probably have a
- GtkWidget member pointing to the value gotten with
- ::get_widget() so that we can get the parent window
- here. */
- e_error_run(NULL, "filter:no-folder", NULL);
-
- return FALSE;
- }
-}
-
-static int
-folder_eq (FilterElement *fe, FilterElement *cm)
-{
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && strcmp(((FilterFolder *)fe)->uri, ((FilterFolder *)cm)->uri) == 0;
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value, work;
- FilterFolder *ff = (FilterFolder *)fe;
-
- d(printf ("Encoding folder as xml\n"));
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", "folder");
-
- work = xmlNewChild (value, NULL, "folder", NULL);
- xmlSetProp (work, "uri", ff->uri);
-
- return value;
-}
-
-static int
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterFolder *ff = (FilterFolder *)fe;
- xmlNodePtr n;
-
- d(printf ("Decoding folder from xml %p\n", fe));
-
- xmlFree (fe->name);
- fe->name = xmlGetProp (node, "name");
-
- n = node->children;
- while (n) {
- if (!strcmp (n->name, "folder")) {
- char *uri;
-
- uri = xmlGetProp (n, "uri");
- g_free (ff->uri);
- ff->uri = g_strdup (uri);
- xmlFree (uri);
- break;
- }
- n = n->next;
- }
-
- return 0;
-}
-
-static void
-folder_selected(EMFolderSelectionButton *button, FilterFolder *ff)
-{
- const char *uri;
-
- uri = em_folder_selection_button_get_selection(button);
- g_free(ff->uri);
- ff->uri = uri!=NULL?em_uri_from_camel(uri):NULL;
-
- gdk_window_raise (GTK_WIDGET (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_WINDOW))->window);
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterFolder *ff = (FilterFolder *)fe;
- GtkWidget *button;
- char *uri;
-
- uri = em_uri_to_camel(ff->uri);
- button = em_folder_selection_button_new (_("Select Folder"), NULL);
- em_folder_selection_button_set_selection(EM_FOLDER_SELECTION_BUTTON(button), uri);
- g_free(uri);
-
- gtk_widget_show (button);
- g_signal_connect (button, "selected", G_CALLBACK (folder_selected), ff);
-
- return button;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- return;
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterFolder *ff = (FilterFolder *)fe;
-
- e_sexp_encode_string (out, ff->uri);
-}
diff --git a/filter/filter-folder.h b/filter/filter-folder.h
deleted file mode 100644
index 0e541a580b..0000000000
--- a/filter/filter-folder.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _FILTER_FOLDER_H
-#define _FILTER_FOLDER_H
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_FOLDER (filter_folder_get_type ())
-#define FILTER_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_FOLDER, FilterFolder))
-#define FILTER_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_FOLDER, FilterFolderClass))
-#define IS_FILTER_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_FOLDER))
-#define IS_FILTER_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_FOLDER))
-#define FILTER_FOLDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_FOLDER, FilterFolderClass))
-
-typedef struct _FilterFolder FilterFolder;
-typedef struct _FilterFolderClass FilterFolderClass;
-
-struct _FilterFolder {
- FilterElement parent_object;
-
- char *uri;
-};
-
-struct _FilterFolderClass {
- FilterElementClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType filter_folder_get_type (void);
-FilterFolder *filter_folder_new (void);
-
-/* methods */
-void filter_folder_set_value (FilterFolder *ff, const char *uri);
-
-#endif /* ! _FILTER_FOLDER_H */
diff --git a/filter/filter-part.c b/filter/filter-part.c
index f82d354dee..2ed6794876 100644
--- a/filter/filter-part.c
+++ b/filter/filter-part.c
@@ -33,7 +33,7 @@
#include <libgnome/gnome-i18n.h>
#include "filter-part.h"
-
+#include "rule-context.h"
#define d(x)
@@ -164,7 +164,7 @@ filter_part_eq (FilterPart *fp, FilterPart *fc)
}
int
-filter_part_xml_create (FilterPart *ff, xmlNodePtr node)
+filter_part_xml_create (FilterPart *ff, xmlNodePtr node, RuleContext *rc)
{
xmlNodePtr n;
char *type, *str;
@@ -181,7 +181,7 @@ filter_part_xml_create (FilterPart *ff, xmlNodePtr node)
type = xmlGetProp (n, "type");
d(printf ("creating new element type input '%s'\n", type));
if (type != NULL
- && (el = filter_element_new_type_name (type)) != NULL) {
+ && (el = rule_context_new_element(rc, type)) != NULL) {
filter_element_xml_create (el, n);
xmlFree (type);
d(printf ("adding element part %p %s\n", ff, el, el->name));
diff --git a/filter/filter-part.h b/filter/filter-part.h
index b1281522ea..1c7aa7dbb7 100644
--- a/filter/filter-part.h
+++ b/filter/filter-part.h
@@ -28,6 +28,8 @@
#include "filter-input.h"
+struct _RuleContext;
+
#define FILTER_TYPE_PART (filter_part_get_type ())
#define FILTER_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_PART, FilterPart))
#define FILTER_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_PART, FilterPartClass))
@@ -63,7 +65,7 @@ FilterPart *filter_part_new (void);
gboolean filter_part_validate (FilterPart *fp);
int filter_part_eq (FilterPart *fp, FilterPart *fc);
-int filter_part_xml_create (FilterPart *ff, xmlNodePtr node);
+int filter_part_xml_create (FilterPart *ff, xmlNodePtr node, struct _RuleContext *rc);
xmlNodePtr filter_part_xml_encode (FilterPart *fe);
int filter_part_xml_decode (FilterPart *fe, xmlNodePtr node);
diff --git a/filter/filter-rule.c b/filter/filter-rule.c
index 2088d7133c..bd48afeb2e 100644
--- a/filter/filter-rule.c
+++ b/filter/filter-rule.c
@@ -31,7 +31,7 @@
#include "widgets/misc/e-error.h"
#include "filter-rule.h"
-#include "filter-context.h"
+#include "rule-context.h"
#include "filter-marshal.h"
#define d(x)
diff --git a/filter/filter-source.c b/filter/filter-source.c
deleted file mode 100644
index c5955eb733..0000000000
--- a/filter/filter-source.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2001-2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include "filter-source.h"
-
-#include <gtk/gtk.h>
-#include <e-util/e-url.h>
-#include <e-util/e-sexp.h>
-#include <e-util/e-account-list.h>
-#include <camel/camel-url.h>
-
-
-static void filter_source_class_init (FilterSourceClass *klass);
-static void filter_source_init (FilterSource *fs);
-static void filter_source_finalize (GObject *obj);
-
-static int source_eq (FilterElement *fe, FilterElement *cm);
-static void xml_create (FilterElement *fe, xmlNodePtr node);
-static xmlNodePtr xml_encode (FilterElement *fe);
-static int xml_decode (FilterElement *fe, xmlNodePtr node);
-static FilterElement *clone (FilterElement *fe);
-static GtkWidget *get_widget (FilterElement *fe);
-static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
-static void format_sexp (FilterElement *, GString *);
-
-static void filter_source_add_source (FilterSource *fs, const char *account_name, const char *name,
- const char *addr, const char *url);
-static void filter_source_get_sources (FilterSource *fs);
-
-typedef struct _SourceInfo {
- char *account_name;
- char *name;
- char *address;
- char *url;
-} SourceInfo;
-
-struct _FilterSourcePrivate {
- GList *sources;
- char *current_url;
-};
-
-
-static FilterElementClass *parent_class = NULL;
-
-
-GType
-filter_source_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (FilterSourceClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) filter_source_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (FilterSource),
- 0, /* n_preallocs */
- (GInstanceInitFunc) filter_source_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_ELEMENT, "FilterSource", &info, 0);
- }
-
- return type;
-}
-
-static void
-filter_source_class_init (FilterSourceClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterElementClass *fe_class = FILTER_ELEMENT_CLASS (klass);
-
- parent_class = g_type_class_ref (FILTER_TYPE_ELEMENT);
-
- object_class->finalize = filter_source_finalize;
-
- /* override methods */
- fe_class->eq = source_eq;
- fe_class->xml_create = xml_create;
- fe_class->xml_encode = xml_encode;
- fe_class->xml_decode = xml_decode;
- fe_class->clone = clone;
- fe_class->get_widget = get_widget;
- fe_class->build_code = build_code;
- fe_class->format_sexp = format_sexp;
-}
-
-static void
-filter_source_init (FilterSource *fs)
-{
- fs->priv = g_new (struct _FilterSourcePrivate, 1);
- fs->priv->sources = NULL;
- fs->priv->current_url = NULL;
-}
-
-static void
-filter_source_finalize (GObject *obj)
-{
- FilterSource *fs = FILTER_SOURCE (obj);
- GList *i = fs->priv->sources;
-
- while (i) {
- SourceInfo *info = i->data;
- g_free (info->account_name);
- g_free (info->name);
- g_free (info->address);
- g_free (info->url);
- g_free (info);
- i = g_list_next (i);
- }
-
- g_list_free (fs->priv->sources);
- g_free (fs->priv->current_url);
-
- g_free (fs->priv);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-FilterSource *
-filter_source_new (void)
-{
- return (FilterSource *) g_object_new (FILTER_TYPE_SOURCE, NULL, NULL);
-}
-
-static int
-source_eq (FilterElement *fe, FilterElement *cm)
-{
- FilterSource *fs = (FilterSource *)fe, *cs = (FilterSource *)cm;
-
- return FILTER_ELEMENT_CLASS (parent_class)->eq (fe, cm)
- && ((fs->priv->current_url && cs->priv->current_url
- && strcmp (fs->priv->current_url, cs->priv->current_url) == 0)
- || (fs->priv->current_url == NULL && cs->priv->current_url == NULL));
-}
-
-static void
-xml_create (FilterElement *fe, xmlNodePtr node)
-{
- /* Call parent implementation */
- FILTER_ELEMENT_CLASS (parent_class)->xml_create (fe, node);
-}
-
-static xmlNodePtr
-xml_encode (FilterElement *fe)
-{
- xmlNodePtr value;
-
- FilterSource *fs = (FilterSource *) fe;
-
- value = xmlNewNode (NULL, "value");
- xmlSetProp (value, "name", fe->name);
- xmlSetProp (value, "type", "uri");
-
- if (fs->priv->current_url)
- xmlNewTextChild (value, NULL, "uri", fs->priv->current_url);
-
- return value;
-}
-
-static gint
-xml_decode (FilterElement *fe, xmlNodePtr node)
-{
- FilterSource *fs = (FilterSource *) fe;
- CamelURL *url;
- char *uri;
-
- node = node->children;
- while (node != NULL) {
- if (!strcmp (node->name, "uri")) {
- uri = xmlNodeGetContent (node);
- url = camel_url_new (uri, NULL);
- xmlFree (uri);
-
- g_free (fs->priv->current_url);
- fs->priv->current_url = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
- camel_url_free (url);
- break;
- }
-
- node = node->next;
- }
-
- return 0;
-}
-
-static FilterElement *
-clone (FilterElement *fe)
-{
- FilterSource *fs = (FilterSource *) fe;
- FilterSource *cpy = filter_source_new ();
- GList *i;
-
- ((FilterElement *) cpy)->name = xmlStrdup (fe->name);
-
- cpy->priv->current_url = g_strdup (fs->priv->current_url);
-
- for (i = fs->priv->sources; i != NULL; i = g_list_next (i)) {
- SourceInfo *info = (SourceInfo *) i->data;
- filter_source_add_source (cpy, info->account_name, info->name, info->address, info->url);
- }
-
- return (FilterElement *) cpy;
-}
-
-static void
-source_changed (GtkWidget *item, FilterSource *fs)
-{
- SourceInfo *info = (SourceInfo *) g_object_get_data ((GObject *) item, "source");
-
- g_free (fs->priv->current_url);
- fs->priv->current_url = g_strdup (info->url);
-}
-
-static GtkWidget *
-get_widget (FilterElement *fe)
-{
- FilterSource *fs = (FilterSource *) fe;
- GtkWidget *menu;
- GtkWidget *omenu;
- GtkWidget *item;
- GList *i;
- SourceInfo *first = NULL;
- int index, current_index;
-
- if (fs->priv->sources == NULL)
- filter_source_get_sources (fs);
-
- menu = gtk_menu_new ();
-
- index = 0;
- current_index = -1;
-
- for (i = fs->priv->sources; i != NULL; i = g_list_next (i)) {
- SourceInfo *info = (SourceInfo *) i->data;
- char *label;
-
- if (info->url != NULL) {
- if (first == NULL)
- first = info;
-
- if (info->account_name && strcmp (info->account_name, info->address))
- label = g_strdup_printf ("%s <%s> (%s)", info->name,
- info->address, info->account_name);
- else
- label = g_strdup_printf ("%s <%s>", info->name, info->address);
-
- item = gtk_menu_item_new_with_label (label);
- g_free (label);
-
- g_object_set_data ((GObject *) item, "source", info);
- g_signal_connect (item, "activate", G_CALLBACK (source_changed), fs);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- if (fs->priv->current_url && !strcmp (info->url, fs->priv->current_url))
- current_index = index;
-
- index++;
- }
- }
-
- omenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
-
- if (current_index >= 0) {
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current_index);
- } else {
- gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), 0);
- g_free (fs->priv->current_url);
-
- if (first)
- fs->priv->current_url = g_strdup (first->url);
- else
- fs->priv->current_url = NULL;
- }
-
- return omenu;
-}
-
-static void
-build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
-{
- /* We are doing nothing on purpose. */
-}
-
-static void
-format_sexp (FilterElement *fe, GString *out)
-{
- FilterSource *fs = (FilterSource *) fe;
-
- e_sexp_encode_string (out, fs->priv->current_url);
-}
-
-
-static void
-filter_source_add_source (FilterSource *fs, const char *account_name, const char *name,
- const char *addr, const char *url)
-{
- SourceInfo *info;
-
- g_return_if_fail (IS_FILTER_SOURCE (fs));
-
- info = g_new0 (SourceInfo, 1);
- info->account_name = g_strdup (account_name);
- info->name = g_strdup (name);
- info->address = g_strdup (addr);
- info->url = g_strdup (url);
-
- fs->priv->sources = g_list_append (fs->priv->sources, info);
-}
-
-static void
-filter_source_get_sources (FilterSource *fs)
-{
- EAccountList *accounts;
- const EAccount *account;
- GConfClient *gconf;
- EIterator *it;
- char *uri;
- CamelURL *url;
-
- /* should this get the global object from mail? */
- gconf = gconf_client_get_default ();
- accounts = e_account_list_new (gconf);
- g_object_unref (gconf);
-
- for (it = e_list_get_iterator((EList *)accounts);
- e_iterator_is_valid(it);
- e_iterator_next(it)) {
- account = (const EAccount *)e_iterator_get(it);
-
- if (account->source == NULL || account->source->url == NULL)
- continue;
-
- /* hide secret stuff */
- url = camel_url_new (account->source->url, NULL);
- uri = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
- camel_url_free (url);
-
- filter_source_add_source (fs, account->name, account->id->name, account->id->address, uri);
- g_free(uri);
- }
- g_object_unref(it);
- g_object_unref(accounts);
-}
diff --git a/filter/filter-source.h b/filter/filter-source.h
deleted file mode 100644
index 73bd63f503..0000000000
--- a/filter/filter-source.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Authors: Jon Trowbridge <trow@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * Copyright 2001-2002 Ximian, Inc. (www.ximian.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __FILTER_SOURCE_H__
-#define __FILTER_SOURCE_H__
-
-#include "filter-element.h"
-
-#define FILTER_TYPE_SOURCE (filter_source_get_type ())
-#define FILTER_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_SOURCE, FilterSource))
-#define FILTER_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_SOURCE, FilterSourceClass))
-#define IS_FILTER_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_SOURCE))
-#define IS_FILTER_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_SOURCE))
-#define FILTER_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_SOURCE, FilterSourceClass))
-
-typedef struct _FilterSource FilterSource;
-typedef struct _FilterSourceClass FilterSourceClass;
-
-struct _FilterSource {
- FilterElement parent_object;
- struct _FilterSourcePrivate *priv;
-};
-
-struct _FilterSourceClass {
- FilterElementClass parent_class;
-
-};
-
-
-GType filter_source_get_type (void);
-FilterSource *filter_source_new (void);
-
-void filter_source_set_current (FilterSource *src, const char *url);
-
-#endif /* __FILTER_SOURCE_H__ */
diff --git a/filter/filter.glade b/filter/filter.glade
index 7d9ee76d13..64a0d85375 100644
--- a/filter/filter.glade
+++ b/filter/filter.glade
@@ -4,284 +4,6 @@
<glade-interface>
<requires lib="gnome"/>
-<widget class="GtkDialog" id="vfolder-source">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="title" translatable="yes"></property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area3">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="cancel_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-6</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="apply_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">-5</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vfolder_source_frame">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkLabel" id="label13">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;vFolder Sources&lt;/b&gt;</property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox9">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="label14">
- <property name="visible">True</property>
- <property name="label" translatable="yes"> </property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkOptionMenu" id="source_option">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="convertwidget8">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget9">
- <property name="visible">True</property>
- <property name="label" translatable="yes">specific folders only</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">with all local folders</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget11">
- <property name="visible">True</property>
- <property name="label" translatable="yes">with all active remote folders</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="convertwidget12">
- <property name="visible">True</property>
- <property name="label" translatable="yes">with all local and active remote folders</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="Custom" id="source_list">
- <property name="visible">True</property>
- <property name="creation_function">vfolder_editor_sourcelist_new</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Fri, 13 Dec 2002 00:22:39 GMT</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">1</property>
-
- <child>
- <widget class="GtkVButtonBox" id="vbuttonbox3">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
- <property name="spacing">6</property>
-
- <child>
- <widget class="GtkButton" id="source_add">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-add</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="source_remove">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-remove</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">3</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
<widget class="GtkWindow" id="rule-editor">
<property name="visible">True</property>
<property name="title" translatable="yes">window1</property>
diff --git a/filter/filtertypes.xml b/filter/filtertypes.xml
deleted file mode 100644
index dffa4e965f..0000000000
--- a/filter/filtertypes.xml
+++ /dev/null
@@ -1,746 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="sender">
- <title>Sender</title>
- <input type="optionlist" name="sender-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "From" ${sender}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "From" ${sender})))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-matches "From" ${sender}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (header-matches "From" ${sender})))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "From" ${sender}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "From" ${sender})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "From" ${sender}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "From" ${sender})))
- </code>
- </option>
- <option value="matches soundex">
- <title>sounds like</title>
- <code>
- (match-all (header-soundex "From" ${sender}))
- </code>
- </option>
- <option value="not match soundex">
- <title>does not sound like</title>
- <code>
- (match-all (not (header-soundex "From" ${sender})))
- </code>
- </option>
- </input>
- <input type="string" name="sender"/>
- </part>
-
- <part name="to">
- <title>Recipients</title>
- <input type="optionlist" name="recipient-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (or (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient})))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (or
- (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient}))))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (or (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient})))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (or
- (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient}))))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (or (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (or
- (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient}))))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (or (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (or
- (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient}))))
- </code>
- </option>
- <option value="matches soundex">
- <title>sounds like</title>
- <code>
- (match-all (or (header-soundex "To" ${recipient})
- (header-soundex "Cc" ${recipient})))
- </code>
- </option>
- <option value="not match soundex">
- <title>does not sound like</title>
- <code>
- (match-all (not (or
- (header-soundex "To" ${recipient})
- (header-soundex "Cc" ${recipient}))))
- </code>
- </option>
- </input>
- <input type="address" name="recipient"/>
- </part>
-
- <part name="subject">
- <title>Subject</title>
- <input type="optionlist" name="subject-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "Subject" ${subject}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "Subject" ${subject})))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-matches "Subject" ${subject}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (header-matches "Subject" ${subject})))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "Subject" ${subject})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "Subject" ${subject})))
- </code>
- </option>
- <option value="matches soundex">
- <title>sounds like</title>
- <code>
- (match-all (header-soundex "Subject" ${subject}))
- </code>
- </option>
- <option value="not match soundex">
- <title>does not sound like</title>
- <code>
- (match-all (not (header-soundex "Subject" ${subject})))
- </code>
- </option>
- </input>
- <input type="string" name="subject"/>
- </part>
-
- <part name="header">
- <title>Specific header</title>
- <input type="string" name="header-field"/>
- <input type="optionlist" name="header-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains ${header-field} ${word}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains ${header-field} ${word})))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-matches ${header-field} ${word}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (header-matches ${header-field} ${word})))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with ${header-field} ${word}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with ${header-field} ${word})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with ${header-field} ${word}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with ${header-field} ${word})))
- </code>
- </option>
- <option value="exists">
- <title>exists</title>
- <code>
- (match-all (header-exists ${header-field}))
- </code>
- </option>
- <option value="not exists">
- <title>does not exist</title>
- <code>
- (match-all (not (header-exists ${header-field})))
- </code>
- </option>
- <option value="matches soundex">
- <title>sounds like</title>
- <code>
- (match-all (header-soundex ${header-field} ${word}))
- </code>
- </option>
- <option value="not match soundex">
- <title>does not sound like</title>
- <code>
- (match-all (not (header-soundex ${header-field} ${word})))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
-
- <part name="body">
- <title>Message Body</title>
- <input type="optionlist" name="body-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (body-contains ${word})
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (body-contains ${word})))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
-
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-
- <part name="sent-date">
- <title>Date sent</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-sent-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-sent-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="recv-date">
- <title>Date received</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-received-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-received-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-received-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="label">
- <title>Label</title>
- <input type="optionlist" name="label-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (user-tag "label") ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (user-tag "label") ${versus})))
- </code>
- </option>
- </input>
- <input type="label" name="versus"/>
- </part>
-
- <part name="score">
- <title>Score</title>
- <input type="optionlist" name="score-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (cast-int (user-tag "score")) ${versus})))
- </code>
- </option>
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- </input>
- <input type="score" name="versus"/>
- </part>
-
- <part name="size">
- <title>Size (kB)</title>
- <input type="optionlist" name="size-type">
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (get-size) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (get-size) ${versus}))
- </code>
- </option>
- </input>
- <input type="integer" name="versus"/>
- </part>
-
- <part name="status">
- <title>Status</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (system-flag ${flag}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (system-flag ${flag})))
- </code>
- </option>
- </input>
- <input type="optionlist" name="flag">
- <option value="Answered">
- <title>Replied to</title>
- </option>
- <option value="Draft">
- <title>Draft</title>
- </option>
- <option value="Flagged">
- <title>Important</title>
- </option>
- <option value="Seen">
- <title>Read</title>
- </option>
- <option value="Junk">
- <title>Junk</title>
- </option>
- </input>
- </part>
-
- <part name="follow-up">
- <title>Follow Up</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is Flagged</title>
- <code>
- (match-all (not (= (user-tag "follow-up") "")))
- </code>
- </option>
- <option value="is not">
- <title>is not Flagged</title>
- <code>
- (match-all (= (user-tag "follow-up") ""))
- </code>
- </option>
- </input>
- </part>
-
- <part name="attachments">
- <title>Attachments</title>
- <input type="optionlist" name="match-type">
- <option value="exist">
- <title>Exist</title>
- <code>
- (match-all (system-flag "Attachments"))
- </code>
- </option>
- <option value="not exist">
- <title>Do Not Exist</title>
- <code>
- (match-all (not (system-flag "Attachments")))
- </code>
- </option>
- </input>
- </part>
-
- <part name="mlist">
- <title>Mailing list</title>
- <input type="optionlist" name="mlist-type">
- <option value="is">
- <title>is</title>
- <code>(match-all (header-matches "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(match-all (not (header-matches "x-camel-mlist" ${mlist})))</code>
- </option>
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "x-camel-mlist" ${mlist})))</code>
- </option>
- </input>
- <input type="string" name="mlist"/>
- </part>
-
- <part name="regex">
- <title>Regex Match</title>
- <input type="optionlist" name="match-type">
- <option value="header">
- <title>Message Header</title>
- <code>
- (match-all (header-full-regex ${expression}))
- </code>
- </option>
- <option value="body">
- <title>Message Body</title>
- <code>
- (match-all (body-regex ${expression}))
- </code>
- </option>
- </input>
- <input type="regex" name="expression"/>
- </part>
-
- <part name="source">
- <title>Source Account</title>
- <input type="optionlist" name="srcmatch-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-source ${source}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (header-source ${source})))
- </code>
- </option>
- </input>
- <input type="source" name="source"/>
- </part>
-
- <part name="pipe">
- <title>Pipe to Program</title>
- <input type="command" name="command"/>
- <input type="optionlist" name="retval-type">
- <option value="is">
- <title>returns</title>
- <code>
- (match-all (= (pipe-message "/bin/sh" "-c" ${command}) ${retval}))
- </code>
- </option>
- <option value="is-not">
- <title>does not return</title>
- <code>
- (match-all (not (= (pipe-message "/bin/sh" "-c" ${command}) ${retval})))
- </code>
- </option>
- <option value="greater-than">
- <title>returns greater than</title>
- <code>
- (match-all (&gt; (pipe-message "/bin/sh" "-c" ${command}) ${retval}))
- </code>
- </option>
- <option value="less-than">
- <title>returns less than</title>
- <code>
- (match-all (&lt; (pipe-message "/bin/sh" "-c" ${command}) ${retval}))
- </code>
- </option>
- </input>
- <input type="integer" name="retval"/>
- </part>
-
- <part name="junk">
- <title>Junk Test</title>
- <input type="optionlist" name="retval-type">
- <option value="is-junk">
- <title>Message is Junk</title>
- <code>
- (match-all (junk-test))
- </code>
- </option>
- <option value="is-not-junk">
- <title>Message is not Junk</title>
- <code>
- (match-all (not (junk-test)))
- </code>
- </option>
- </input>
- </part>
-
-</partset>
-
-
-<actionset>
- <part name="move-to-folder">
- <title>Move to Folder</title>
- <code>(move-to ${folder})</code>
- <input type="folder" name="folder"/>
- </part>
- <part name="copy-to-folder">
- <title>Copy to Folder</title>
- <code>(copy-to ${folder})</code>
- <input type="folder" name="folder"/>
- </part>
- <part name="delete">
- <title>Delete</title>
- <code>(delete)</code>
- </part>
- <part name="stop">
- <title>Stop Processing</title>
- <code>(stop)</code>
- </part>
- <part name="colour">
- <title>Assign Color</title>
- <code>(set-colour ${colour})</code>
- <input type="colour" name="colour"/>
- </part>
- <part name="score">
- <title>Assign Score</title>
- <code>(set-score ${score})</code>
- <input type="score" name="score"/>
- </part>
- <part name="adj-score">
- <title>Adjust Score</title>
- <code>(adjust-score ${score})</code>
- <input type="score" name="score"/>
- </part>
- <part name="set-status">
- <title>Set Status</title>
- <code>
- (set-system-flag ${flag})
- </code>
- <input type="optionlist" name="flag">
- <option value="Answered">
- <title>Replied to</title>
- </option>
- <option value="Deleted">
- <title>Deleted</title>
- </option>
- <option value="Draft">
- <title>Draft</title>
- </option>
- <option value="Flagged">
- <title>Important</title>
- </option>
- <option value="Seen">
- <title>Read</title>
- </option>
- <option value="Junk">
- <title>Junk</title>
- </option>
- </input>
- </part>
- <part name="unset-status">
- <title>Unset Status</title>
- <code>
- (unset-system-flag ${flag})
- </code>
- <input type="optionlist" name="flag">
- <option value="Answered">
- <title>Replied to</title>
- </option>
- <option value="Deleted">
- <title>Deleted</title>
- </option>
- <option value="Draft">
- <title>Draft</title>
- </option>
- <option value="Flagged">
- <title>Important</title>
- </option>
- <option value="Seen">
- <title>Read</title>
- </option>
- <option value="Junk">
- <title>Junk</title>
- </option>
- </input>
- </part>
- <part name="beep">
- <title>Beep</title>
- <code>(beep)</code>
- </part>
- <part name="play-sound">
- <title>Play Sound</title>
- <code>(play-sound ${sound})</code>
- <input type="file" name="sound"/>
- </part>
- <part name="shell">
- <title>Run Program</title>
- <code>(shell "/bin/sh" "-c" ${command})</code>
- <input type="command" name="command"/>
- </part>
- <part name="pipe">
- <title>Pipe to Program</title>
- <code>(pipe-message "/bin/sh" "-c" ${command})</code>
- <input type="command" name="command"/>
- </part>
-</actionset>
-</filterdescription>
diff --git a/filter/rule-context.c b/filter/rule-context.c
index 291f9d303f..560e9100a4 100644
--- a/filter/rule-context.c
+++ b/filter/rule-context.c
@@ -41,6 +41,15 @@
#include "filter-rule.h"
#include "filter-marshal.h"
+#include "filter-input.h"
+#include "filter-option.h"
+#include "filter-code.h"
+#include "filter-colour.h"
+#include "filter-datespec.h"
+#include "filter-int.h"
+#include "filter-file.h"
+#include "filter-label.h"
+
#define d(x)
static int load(RuleContext *rc, const char *system, const char *user);
@@ -48,6 +57,7 @@ static int save(RuleContext *rc, const char *user);
static int revert(RuleContext *rc, const char *user);
static GList *rename_uri(RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
static GList *delete_uri(RuleContext *rc, const char *uri, GCompareFunc cmp);
+static FilterElement *new_element(RuleContext *rc, const char *name);
static void rule_context_class_init(RuleContextClass *klass);
static void rule_context_init(RuleContext *rc);
@@ -110,7 +120,8 @@ rule_context_class_init(RuleContextClass *klass)
klass->revert = revert;
klass->rename_uri = rename_uri;
klass->delete_uri = delete_uri;
-
+ klass->new_element = new_element;
+
/* signals */
signals[RULE_ADDED] =
g_signal_new("rule_added",
@@ -326,7 +337,7 @@ load(RuleContext *rc, const char *system, const char *user)
if (!strcmp(rule->name, "part")) {
FilterPart *part = FILTER_PART(g_object_new(part_map->type, NULL, NULL));
- if (filter_part_xml_create(part, rule) == 0) {
+ if (filter_part_xml_create(part, rule, rc) == 0) {
part_map->append(rc, part);
} else {
g_object_unref(part);
@@ -883,3 +894,54 @@ rule_context_free_uri_list(RuleContext *rc, GList *uris)
l = n;
}
}
+
+static FilterElement *
+new_element(RuleContext *rc, const char *type)
+{
+ if (!strcmp (type, "string")) {
+ return (FilterElement *) filter_input_new ();
+ } else if (!strcmp (type, "address")) {
+ /* FIXME: temporary ... need real address type */
+ return (FilterElement *) filter_input_new_type_name (type);
+ } else if (!strcmp (type, "code")) {
+ return (FilterElement *) filter_code_new ();
+ } else if (!strcmp (type, "colour")) {
+ return (FilterElement *) filter_colour_new ();
+ } else if (!strcmp (type, "optionlist")) {
+ return (FilterElement *) filter_option_new ();
+ } else if (!strcmp (type, "datespec")) {
+ return (FilterElement *) filter_datespec_new ();
+ } else if (!strcmp (type, "command")) {
+ return (FilterElement *) filter_file_new_type_name (type);
+ } else if (!strcmp (type, "file")) {
+ return (FilterElement *) filter_file_new_type_name (type);
+ } else if (!strcmp (type, "integer")) {
+ return (FilterElement *) filter_int_new ();
+ } else if (!strcmp (type, "regex")) {
+ return (FilterElement *) filter_input_new_type_name (type);
+ } else if (!strcmp (type, "label")) {
+ return (FilterElement *) filter_label_new ();
+ } else {
+ g_warning("Unknown filter type '%s'", type);
+ return NULL;
+ }
+}
+
+/**
+ * rule_context_new_element:
+ * @rc:
+ * @name:
+ *
+ * create a new filter element based on name.
+ *
+ * Return value:
+ **/
+FilterElement *
+rule_context_new_element(RuleContext *rc, const char *name)
+{
+ if (name == NULL)
+ return NULL;
+
+ return RULE_CONTEXT_GET_CLASS(rc)->new_element(rc, name);
+}
+
diff --git a/filter/rule-context.h b/filter/rule-context.h
index 2f54a574f8..25b0c0e4c9 100644
--- a/filter/rule-context.h
+++ b/filter/rule-context.h
@@ -68,7 +68,7 @@ typedef void (*RCRegisterFunc) (RuleContext *rc, FilterRule *rule, gpointer user
struct _RuleContextClass {
GObjectClass parent_class;
-
+
/* virtual methods */
int (*load) (RuleContext *rc, const char *system, const char *user);
int (*save) (RuleContext *rc, const char *user);
@@ -76,6 +76,8 @@ struct _RuleContextClass {
GList *(*delete_uri) (RuleContext *rc, const char *uri, GCompareFunc cmp);
GList *(*rename_uri) (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
+
+ FilterElement *(*new_element)(RuleContext *rc, const char *name);
/* signals */
void (*rule_added) (RuleContext *rc, FilterRule *rule);
@@ -103,9 +105,11 @@ struct _rule_set_map {
};
GType rule_context_get_type (void);
-RuleContext *rule_context_new (void);
/* methods */
+RuleContext *rule_context_new (void);
+
+/* io */
int rule_context_load (RuleContext *rc, const char *system, const char *user);
int rule_context_save (RuleContext *rc, const char *user);
int rule_context_revert (RuleContext *rc, const char *user);
@@ -132,6 +136,9 @@ void rule_context_add_part_set (RuleContext *rc, const char *setname, GType part
void rule_context_add_rule_set (RuleContext *rc, const char *setname, GType rule_type,
RCRuleFunc append, RCNextRuleFunc next);
+/* dynamic element types */
+FilterElement *rule_context_new_element(RuleContext *rc, const char *name);
+
/* uri's disappear/renamed externally */
GList *rule_context_delete_uri (RuleContext *rc, const char *uri, GCompareFunc cmp);
GList *rule_context_rename_uri (RuleContext *rc, const char *olduri, const char *newuri, GCompareFunc cmp);
diff --git a/filter/rule-editor.c b/filter/rule-editor.c
index 907f1f917e..f23edec8dc 100644
--- a/filter/rule-editor.c
+++ b/filter/rule-editor.c
@@ -718,7 +718,7 @@ rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, cons
gtk_box_pack_start((GtkBox *)((GtkDialog *)re)->vbox, w, TRUE, TRUE, 3);
for (i = 0; i < BUTTON_LAST; i++) {
- re->priv->buttons[i] = (GtkButton *) w = glade_xml_get_widget (gui, edit_buttons[i].name);
+ re->priv->buttons[i] = (GtkButton *) (w = glade_xml_get_widget (gui, edit_buttons[i].name));
g_signal_connect (w, "clicked", edit_buttons[i].func, re);
}
diff --git a/filter/score-context.c b/filter/score-context.c
deleted file mode 100644
index dd3663ffab..0000000000
--- a/filter/score-context.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "score-context.h"
-#include "score-rule.h"
-
-
-static void score_context_class_init (ScoreContextClass *klass);
-static void score_context_init (ScoreContext *sc);
-static void score_context_finalise (GObject *obj);
-
-
-static RuleContextClass *parent_class = NULL;
-
-
-GType
-score_context_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ScoreContextClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) score_context_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ScoreContext),
- 0, /* n_preallocs */
- (GInstanceInitFunc) score_context_init,
- };
-
- type = g_type_register_static (RULE_TYPE_CONTEXT, "ScoreContext", &info, 0);
- }
-
- return type;
-}
-
-static void
-score_context_class_init (ScoreContextClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (rule_context_get_type ());
-
- object_class->finalize = score_context_finalise;
-}
-
-static void
-score_context_init (ScoreContext *sc)
-{
- rule_context_add_part_set ((RuleContext *) sc, "partset", filter_part_get_type (),
- rule_context_add_part, rule_context_next_part);
-
- rule_context_add_rule_set ((RuleContext *) sc, "ruleset", score_rule_get_type (),
- rule_context_add_rule, rule_context_next_rule);
-}
-
-static void
-score_context_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * score_context_new:
- *
- * Create a new ScoreContext object.
- *
- * Return value: A new #ScoreContext object.
- **/
-ScoreContext *
-score_context_new (void)
-{
- return (ScoreContext *) g_object_new (SCORE_TYPE_CONTEXT, NULL, NULL);
-}
diff --git a/filter/score-context.h b/filter/score-context.h
deleted file mode 100644
index 7a76ac8d32..0000000000
--- a/filter/score-context.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _SCORE_CONTEXT_H
-#define _SCORE_CONTEXT_H
-
-#include "rule-context.h"
-
-#define SCORE_TYPE_CONTEXT (score_context_get_type ())
-#define SCORE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCORE_TYPE_CONTEXT, ScoreContext))
-#define SCORE_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCORE_TYPE_CONTEXT, ScoreContextClass))
-#define IS_SCORE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCORE_TYPE_CONTEXT))
-#define IS_SCORE_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCORE_TYPE_CONTEXT))
-#define SCORE_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SCORE_TYPE_CONTEXT, ScoreContextClass))
-
-typedef struct _ScoreContext ScoreContext;
-typedef struct _ScoreContextClass ScoreContextClass;
-
-struct _ScoreContext {
- RuleContext parent_object;
-
-};
-
-struct _ScoreContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GType score_context_get_type (void);
-
-ScoreContext *score_context_new (void);
-
-/* methods */
-
-#endif /* ! _SCORE_CONTEXT_H */
diff --git a/filter/score-editor.c b/filter/score-editor.c
deleted file mode 100644
index e52edf7c02..0000000000
--- a/filter/score-editor.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2001-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "score-editor.h"
-#include "score-rule.h"
-
-#define d(x)
-
-static FilterRule * create_rule(RuleEditor *re);
-
-static void score_editor_class_init (ScoreEditorClass *klass);
-static void score_editor_init (ScoreEditor *se);
-static void score_editor_finalise (GObject *obj);
-
-
-static RuleEditorClass *parent_class = NULL;
-
-
-GtkType
-score_editor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ScoreEditorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) score_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ScoreEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) score_editor_init,
- };
-
- type = g_type_register_static (RULE_TYPE_EDITOR, "ScoreEditor", &info, 0);
- }
-
- return type;
-}
-
-static void
-score_editor_class_init (ScoreEditorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- RuleEditorClass *re_class = (RuleEditorClass *) klass;
-
- parent_class = g_type_class_ref(rule_editor_get_type ());
-
- gobject_class->finalize = score_editor_finalise;
-
- /* override methods */
- re_class->create_rule = create_rule;
-}
-
-static void
-score_editor_init (ScoreEditor *se)
-{
- ;
-}
-
-static void
-score_editor_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * score_editor_new:
- *
- * Create a new ScoreEditor object.
- *
- * Return value: A new #ScoreEditor object.
- **/
-ScoreEditor *
-score_editor_new (ScoreContext *sc)
-{
- ScoreEditor *se = (ScoreEditor *) g_object_new (SCORE_TYPE_EDITOR, NULL);
- GladeXML *gui;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor", NULL);
- rule_editor_construct ((RuleEditor *) se, (RuleContext *) sc, gui, NULL, _("_Score Rules"));
- g_object_unref (gui);
-
- return se;
-}
-
-static FilterRule *
-create_rule (RuleEditor *re)
-{
- FilterRule *rule = filter_rule_new ();
- FilterPart *part;
-
- /* create a rule with 1 part in it */
- rule = (FilterRule *) score_rule_new ();
- part = rule_context_next_part (re->context, NULL);
- filter_rule_add_part (rule, filter_part_clone (part));
-
- return rule;
-}
diff --git a/filter/score-editor.h b/filter/score-editor.h
deleted file mode 100644
index 85bff02140..0000000000
--- a/filter/score-editor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _SCORE_EDITOR_H
-#define _SCORE_EDITOR_H
-
-#include "rule-editor.h"
-#include "score-context.h"
-
-#define SCORE_TYPE_EDITOR (score_editor_get_type ())
-#define SCORE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCORE_TYPE_EDITOR, ScoreEditor))
-#define SCORE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCORE_TYPE_EDITOR, ScoreEditorClass))
-#define IS_SCORE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCORE_TYPE_EDITOR))
-#define IS_SCORE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCORE_TYPE_EDITOR))
-#define SCORE_EDITOR_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), SCORE_TYPE_EDITOR, ScoreEditorClass))
-
-typedef struct _ScoreEditor ScoreEditor;
-typedef struct _ScoreEditorClass ScoreEditorClass;
-
-struct _ScoreEditor {
- RuleEditor parent_object;
-
-};
-
-struct _ScoreEditorClass {
- RuleEditorClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GType score_editor_get_type (void);
-
-ScoreEditor *score_editor_new (ScoreContext *sc);
-
-#endif /* ! _SCORE_EDITOR_H */
diff --git a/filter/score-rule.c b/filter/score-rule.c
deleted file mode 100644
index 9865b320cf..0000000000
--- a/filter/score-rule.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "score-rule.h"
-
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
-
-static void score_rule_class_init (ScoreRuleClass *klass);
-static void score_rule_init (ScoreRule *sr);
-static void score_rule_finalise (GObject *obj);
-
-
-static FilterRuleClass *parent_class = NULL;
-
-
-GType
-score_rule_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (ScoreRuleClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) score_rule_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ScoreRule),
- 0, /* n_preallocs */
- (GInstanceInitFunc) score_rule_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_RULE, "ScoreRule", &info, 0);
- }
-
- return type;
-}
-
-static void
-score_rule_class_init (ScoreRuleClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterRuleClass *rule_class = (FilterRuleClass *) klass;
-
- parent_class = g_type_class_ref (FILTER_TYPE_RULE);
-
- object_class->finalize = score_rule_finalise;
-
- /* override methods */
- rule_class->xml_encode = xml_encode;
- rule_class->xml_decode = xml_decode;
-/* rule_class->build_code = build_code;*/
- rule_class->get_widget = get_widget;
-}
-
-static void
-score_rule_init (ScoreRule *sr)
-{
- ;
-}
-
-static void
-score_rule_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * score_rule_new:
- *
- * Create a new ScoreRule object.
- *
- * Return value: A new #ScoreRule object.
- **/
-ScoreRule *
-score_rule_new (void)
-{
- return (ScoreRule *) g_object_new (SCORE_TYPE_RULE, NULL, NULL);
-}
-
-static xmlNodePtr
-xml_encode (FilterRule *fr)
-{
- ScoreRule *sr = (ScoreRule *)fr;
- xmlNodePtr node, value;
- char number[16];
-
- node = FILTER_RULE_CLASS (parent_class)->xml_encode (fr);
- sprintf (number, "%d", sr->score);
- value = xmlNewNode (NULL, "score");
- xmlSetProp (value, "value", number);
- xmlAddChild (node, value);
-
- return node;
-}
-
-static int
-xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
-{
- ScoreRule *sr = (ScoreRule *) fr;
- xmlNodePtr value;
- int result;
- char *str;
-
- result = FILTER_RULE_CLASS (parent_class)->xml_decode (fr, node, f);
- if (result != 0)
- return result;
-
- value = node->children;
- while (value) {
- if (!strcmp (value->name, "score")) {
- str = xmlGetProp (value, "value");
- sscanf (str, "%d", &sr->score);
- xmlFree (str);
-
- /* score range is -3 to +3 */
- if (sr->score > 3)
- sr->score = 3;
- else if (sr->score < -3)
- sr->score = -3;
- }
- value = value->next;
- }
-
- return 0;
-}
-
-/*static void build_code(FilterRule *fr, GString *out)
-{
-}*/
-
-static void
-spin_changed (GtkAdjustment *adj, ScoreRule *sr)
-{
- sr->score = adj->value;
-}
-
-static GtkWidget *
-get_widget (FilterRule *fr, struct _RuleContext *f)
-{
- GtkWidget *widget;
- GtkWidget *frame;
- GtkWidget *label;
- GtkWidget *hbox;
- GtkAdjustment *adj;
- ScoreRule *sr = (ScoreRule *)fr;
- GtkWidget *spin;
-
- widget = FILTER_RULE_CLASS (parent_class)->get_widget (fr, f);
-
- frame = gtk_frame_new (_("Score"));
- hbox = gtk_hbox_new (FALSE, 3);
- label = gtk_label_new (_("Score"));
-
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 3);
- adj = (GtkAdjustment *) gtk_adjustment_new ((float) sr->score, -3.0, 3.0, 1.0, 1.0, 1.0);
- g_signal_connect (adj, "value_changed", G_CALLBACK (spin_changed), sr);
-
- spin = gtk_spin_button_new (adj, 1.0, 0);
- gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 3);
- gtk_container_add (GTK_CONTAINER (frame), hbox);
-
- gtk_widget_show_all (frame);
-
- gtk_box_pack_start (GTK_BOX (widget), frame, FALSE, FALSE, 3);
-
- return widget;
-}
diff --git a/filter/score-rule.h b/filter/score-rule.h
deleted file mode 100644
index fbd8f649de..0000000000
--- a/filter/score-rule.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _SCORE_RULE_H
-#define _SCORE_RULE_H
-
-#include "filter-rule.h"
-
-#define SCORE_TYPE_RULE (score_rule_get_type ())
-#define SCORE_RULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCORE_TYPE_RULE, ScoreRule))
-#define SCORE_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCORE_TYPE_RULE, ScoreRuleClass))
-#define IS_SCORE_RULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCORE_TYPE_RULE))
-#define IS_SCORE_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCORE_TYPE_RULE))
-#define SCORE_RULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SCORE_TYPE_RULE, ScoreRuleClass))
-
-typedef struct _ScoreRule ScoreRule;
-typedef struct _ScoreRuleClass ScoreRuleClass;
-
-struct _ScoreRule {
- FilterRule parent_object;
-
- int score;
-};
-
-struct _ScoreRuleClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GType score_rule_get_type (void);
-
-ScoreRule *score_rule_new (void);
-
-/* methods */
-
-#endif /* ! _SCORE_RULE_H */
diff --git a/filter/searchtypes.xml b/filter/searchtypes.xml
deleted file mode 100644
index 8185b4a593..0000000000
--- a/filter/searchtypes.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="sender">
- <title>Sender</title>
- <input type="optionlist" name="sender-type">
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "From" ${sender}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "From" ${sender})))</code>
- </option>
- <option value="is">
- <title>is</title>
- <code>(match-all (header-matches "From" ${sender}))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(match-all (not (header-matches "From" ${sender})))</code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "From" ${sender}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "From" ${sender})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "From" ${sender}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "From" ${sender})))
- </code>
- </option>
- </input>
- <input type="string" name="sender"/>
- </part>
-
- <part name="to">
- <title>Recipients</title>
- <input type="optionlist" name="recipient-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (or (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient})))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (or
- (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient}))))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (or (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient})))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (or
- (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient}))))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (or (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (or
- (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient}))))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (or (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (or
- (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient}))))
- </code>
- </option>
- </input>
- <input type="address" name="recipient"/>
- </part>
-
- <part name="subject">
- <title>Subject</title>
- <input type="optionlist" name="subject-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "Subject" ${subject}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "Subject" ${subject})))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-matches "Subject" ${subject}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (header-matches "Subject" ${subject})))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "Subject" ${subject})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "Subject" ${subject})))
- </code>
- </option>
- </input>
- <input type="string" name="subject"/>
- </part>
- <part name="body">
- <title>Message Body</title>
- <input type="optionlist" name="body-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (body-contains ${word})
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (not (body-contains ${word}))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-
- <part name="sent-date">
- <title>Date sent</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-sent-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-sent-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="recv-date">
- <title>Date received</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-received-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-received-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-received-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="label">
- <title>Label</title>
- <input type="optionlist" name="label-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (user-tag "label") ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (user-tag "label") ${versus})))
- </code>
- </option>
- </input>
- <input type="label" name="versus"/>
- </part>
-
- <part name="score">
- <title>Score</title>
- <input type="optionlist" name="score-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (cast-int (user-tag "score")) ${versus})))
- </code>
- </option>
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- </input>
- <input type="score" name="versus"/>
- </part>
-
- <part name="size">
- <title>Size (kB)</title>
- <input type="optionlist" name="size-type">
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (get-size) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (get-size) ${versus}))
- </code>
- </option>
- </input>
- <input type="integer" name="versus"/>
- </part>
-
- <part name="status">
- <title>Status</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (system-flag ${flag}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (system-flag ${flag})))
- </code>
- </option>
- </input>
- <input type="optionlist" name="flag">
- <option value="Answered">
- <title>Replied to</title>
- </option>
- <option value="Deleted">
- <title>Deleted</title>
- </option>
- <option value="Draft">
- <title>Draft</title>
- </option>
- <option value="Flagged">
- <title>Important</title>
- </option>
- <option value="Seen">
- <title>Read</title>
- </option>
- </input>
- </part>
-
- <part name="follow-up">
- <title>Follow Up</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is Flagged</title>
- <code>
- (match-all (not (= (user-tag "follow-up") "")))
- </code>
- </option>
- <option value="is not">
- <title>is not Flagged</title>
- <code>
- (match-all (= (user-tag "follow-up") ""))
- </code>
- </option>
- </input>
- </part>
-
- <part name="attachments">
- <title>Attachments</title>
- <input type="optionlist" name="match-type">
- <option value="exist">
- <title>Exist</title>
- <code>
- (match-all (system-flag "Attachments"))
- </code>
- </option>
- <option value="not exist">
- <title>Do Not Exist</title>
- <code>
- (match-all (not (system-flag "Attachments")))
- </code>
- </option>
- </input>
- </part>
-
- <part name="mlist">
- <title>Mailing list</title>
- <input type="optionlist" name="mlist-type">
- <option value="is">
- <title>is</title>
- <code>(match-all (header-matches "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(match-all (not (header-matches "x-camel-mlist" ${mlist})))</code>
- </option>
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "x-camel-mlist" ${mlist})))</code>
- </option>
- </input>
- <input type="string" name="mlist"/>
- </part>
-
-</partset>
-
- <ruleset>
-
- <rule grouping="any" source="demand">
- <_title>Subject contains</_title>
- <partset>
- <part name="subject">
- <value name="subject-type" type="option" value="contains"/>
- <value name="subject" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Subject does not contain</_title>
- <partset>
- <part name="subject">
- <value name="subject-type" type="option" value="not contains"/>
- <value name="subject" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Sender contains</_title>
- <partset>
- <part name="sender">
- <value name="sender-type" type="option" value="contains"/>
- <value name="sender" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Recipients contain</_title>
- <partset>
- <part name="to">
- <value name="recipient-type" type="option" value="contains"/>
- <value name="recipient" type="address"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Body contains</_title>
- <partset>
- <part name="body">
- <value name="body-type" type="option" value="contains"/>
- <value name="word" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Body does not contain</_title>
- <partset>
- <part name="body">
- <value name="body-type" type="option" value="not contains"/>
- <value name="word" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Body or subject contains</_title>
- <partset>
- <part name="subject">
- <value name="subject-type" type="option" value="contains"/>
- <value name="subject" type="string"/>
- </part>
- <part name="body">
- <value name="body-type" type="option" value="contains"/>
- <value name="word" type="string"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- <rule grouping="any" source="demand">
- <_title>Message contains</_title>
- <partset>
- <part name="subject">
- <value name="subject-type" type="option" value="contains"/>
- <value name="subject" type="string"/>
- </part>
- <part name="body">
- <value name="body-type" type="option" value="contains"/>
- <value name="word" type="string"/>
- </part>
- <part name="sender">
- <value name="sender-type" type="option" value="contains"/>
- <value name="sender" type="string"/>
- </part>
- <part name="to">
- <value name="recipient-type" type="option" value="contains"/>
- <value name="recipient" type="address"/>
- </part>
- </partset>
- <sources/>
- </rule>
-
- </ruleset>
-</filterdescription>
diff --git a/filter/vfolder-context.c b/filter/vfolder-context.c
deleted file mode 100644
index a904305787..0000000000
--- a/filter/vfolder-context.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "vfolder-context.h"
-#include "vfolder-rule.h"
-
-static void vfolder_context_class_init (VfolderContextClass *klass);
-static void vfolder_context_init (VfolderContext *vc);
-static void vfolder_context_finalise (GObject *obj);
-
-
-static RuleContextClass *parent_class = NULL;
-
-
-GType
-vfolder_context_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (VfolderContextClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) vfolder_context_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (VfolderContext),
- 0, /* n_preallocs */
- (GInstanceInitFunc) vfolder_context_init,
- };
-
- type = g_type_register_static (RULE_TYPE_CONTEXT, "VfolderContext", &info, 0);
- }
-
- return type;
-}
-
-static void
-vfolder_context_class_init (VfolderContextClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_ref (RULE_TYPE_CONTEXT);
-
- object_class->finalize = vfolder_context_finalise;
-}
-
-static void
-vfolder_context_init (VfolderContext *vc)
-{
- rule_context_add_part_set ((RuleContext *) vc, "partset", filter_part_get_type (),
- rule_context_add_part, rule_context_next_part);
-
- rule_context_add_rule_set ((RuleContext *) vc, "ruleset", vfolder_rule_get_type (),
- rule_context_add_rule, rule_context_next_rule);
-
- ((RuleContext *)vc)->flags = RULE_CONTEXT_THREADING | RULE_CONTEXT_GROUPING;
-}
-
-static void
-vfolder_context_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * vfolder_context_new:
- *
- * Create a new VfolderContext object.
- *
- * Return value: A new #VfolderContext object.
- **/
-VfolderContext *
-vfolder_context_new (void)
-{
- return (VfolderContext *) g_object_new (VFOLDER_TYPE_CONTEXT, NULL, NULL);
-}
diff --git a/filter/vfolder-context.h b/filter/vfolder-context.h
deleted file mode 100644
index bed020127d..0000000000
--- a/filter/vfolder-context.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _VFOLDER_CONTEXT_H
-#define _VFOLDER_CONTEXT_H
-
-#include "rule-context.h"
-
-#define VFOLDER_TYPE_CONTEXT (vfolder_context_get_type ())
-#define VFOLDER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VFOLDER_TYPE_CONTEXT, VfolderContext))
-#define VFOLDER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VFOLDER_TYPE_CONTEXT, VfolderContextClass))
-#define IS_VFOLDER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VFOLDER_TYPE_CONTEXT))
-#define IS_VFOLDER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VFOLDER_TYPE_CONTEXT))
-#define VFOLDER_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VFOLDER_TYPE_CONTEXT, VfolderContextClass))
-
-typedef struct _VfolderContext VfolderContext;
-typedef struct _VfolderContextClass VfolderContextClass;
-
-struct _VfolderContext {
- RuleContext parent_object;
-
-};
-
-struct _VfolderContextClass {
- RuleContextClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GType vfolder_context_get_type (void);
-
-VfolderContext *vfolder_context_new (void);
-
-/* methods */
-
-#endif /* ! _VFOLDER_CONTEXT_H */
diff --git a/filter/vfolder-editor.c b/filter/vfolder-editor.c
deleted file mode 100644
index 84ebbc0f94..0000000000
--- a/filter/vfolder-editor.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2001-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "vfolder-editor.h"
-#include "vfolder-rule.h"
-
-#define d(x)
-
-static FilterRule *create_rule (RuleEditor *re);
-
-static void vfolder_editor_class_init (VfolderEditorClass *klass);
-static void vfolder_editor_init (VfolderEditor *ve);
-static void vfolder_editor_finalise (GObject *obj);
-
-static RuleEditorClass *parent_class = NULL;
-
-GtkType
-vfolder_editor_get_type (void)
-{
- static GtkType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (VfolderEditorClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) vfolder_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (VfolderEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) vfolder_editor_init,
- };
-
- type = g_type_register_static (RULE_TYPE_EDITOR, "VfolderEditor", &info, 0);
- }
-
- return type;
-}
-
-static void
-vfolder_editor_class_init (VfolderEditorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- RuleEditorClass *re_class = (RuleEditorClass *) klass;
-
- parent_class = g_type_class_ref (rule_editor_get_type ());
-
- gobject_class->finalize = vfolder_editor_finalise;
-
- /* override methods */
- re_class->create_rule = create_rule;
-}
-
-static void
-vfolder_editor_init (VfolderEditor *ve)
-{
- ;
-}
-
-static void
-vfolder_editor_finalise (GObject *obj)
-{
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * vfolder_editor_new:
- *
- * Create a new VfolderEditor object.
- *
- * Return value: A new #VfolderEditor object.
- **/
-VfolderEditor *
-vfolder_editor_new (VfolderContext *vc)
-{
- VfolderEditor *ve = (VfolderEditor *) g_object_new (VFOLDER_TYPE_EDITOR, NULL);
- GladeXML *gui;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor", NULL);
- rule_editor_construct ((RuleEditor *) ve, (RuleContext *) vc, gui, NULL, _("Virtual _Folders"));
- gtk_widget_hide(glade_xml_get_widget (gui, "filter_source"));
- g_object_unref (gui);
-
- return ve;
-}
-
-static FilterRule *
-create_rule (RuleEditor *re)
-{
- FilterRule *rule = filter_rule_new ();
- FilterPart *part;
-
- /* create a rule with 1 part in it */
- rule = (FilterRule *) vfolder_rule_new ();
- part = rule_context_next_part (re->context, NULL);
- filter_rule_add_part (rule, filter_part_clone (part));
-
- return rule;
-}
diff --git a/filter/vfolder-editor.h b/filter/vfolder-editor.h
deleted file mode 100644
index c33f896eb3..0000000000
--- a/filter/vfolder-editor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _VFOLDER_EDITOR_H
-#define _VFOLDER_EDITOR_H
-
-#include "rule-editor.h"
-#include "vfolder-context.h"
-
-#define VFOLDER_TYPE_EDITOR (vfolder_editor_get_type ())
-#define VFOLDER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VFOLDER_TYPE_EDITOR, VfolderEditor))
-#define VFOLDER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VFOLDER_TYPE_EDITOR, VfolderEditorClass))
-#define IS_VFOLDER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VFOLDER_TYPE_EDITOR))
-#define IS_VFOLDER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VFOLDER_TYPE_EDITOR))
-#define VFOLDER_EDITOR_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), VFOLDER_TYPE_EDITOR, VfolderEditorClass))
-
-typedef struct _VfolderEditor VfolderEditor;
-typedef struct _VfolderEditorClass VfolderEditorClass;
-
-struct _VfolderEditor {
- RuleEditor parent_object;
-
-};
-
-struct _VfolderEditorClass {
- RuleEditorClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-
-GtkType vfolder_editor_get_type (void);
-
-VfolderEditor *vfolder_editor_new (VfolderContext *vc);
-
-#endif /* ! _VFOLDER_EDITOR_H */
diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c
deleted file mode 100644
index d796b97d75..0000000000
--- a/filter/vfolder-rule.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Author: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include <libgnome/gnome-i18n.h>
-
-#include "camel/camel-url.h"
-#include "vfolder-context.h"
-#include "vfolder-rule.h"
-#include "mail/em-utils.h"
-#include "mail/em-folder-tree.h"
-#include "mail/em-folder-selector.h"
-#include "mail/mail-component.h"
-#include "widgets/misc/e-error.h"
-
-#define d(x)
-
-static int validate(FilterRule *);
-static int vfolder_eq(FilterRule *fr, FilterRule *cm);
-static xmlNodePtr xml_encode(FilterRule *);
-static int xml_decode(FilterRule *, xmlNodePtr, RuleContext *f);
-static void rule_copy (FilterRule *dest, FilterRule *src);
-/*static void build_code(FilterRule *, GString *out);*/
-static GtkWidget *get_widget(FilterRule *fr, RuleContext *f);
-
-static void vfolder_rule_class_init (VfolderRuleClass *klass);
-static void vfolder_rule_init (VfolderRule *vr);
-static void vfolder_rule_finalise (GObject *obj);
-
-/* DO NOT internationalise these strings */
-const char *with_names[] = {
- "specific",
- "local",
- "remote_active",
- "local_remote_active"
-};
-
-static FilterRuleClass *parent_class = NULL;
-
-GType
-vfolder_rule_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (VfolderRuleClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) vfolder_rule_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (VfolderRule),
- 0, /* n_preallocs */
- (GInstanceInitFunc) vfolder_rule_init,
- };
-
- type = g_type_register_static (FILTER_TYPE_RULE, "VfolderRule", &info, 0);
- }
-
- return type;
-}
-
-static void
-vfolder_rule_class_init (VfolderRuleClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- FilterRuleClass *fr_class = (FilterRuleClass *) klass;
-
- parent_class = g_type_class_ref (FILTER_TYPE_RULE);
-
- object_class->finalize = vfolder_rule_finalise;
-
- /* override methods */
- fr_class->validate = validate;
- fr_class->eq = vfolder_eq;
- fr_class->xml_encode = xml_encode;
- fr_class->xml_decode = xml_decode;
- fr_class->copy = rule_copy;
- /*fr_class->build_code = build_code;*/
- fr_class->get_widget = get_widget;
-}
-
-static void
-vfolder_rule_init (VfolderRule *vr)
-{
- vr->with = VFOLDER_RULE_WITH_SPECIFIC;
-}
-
-static void
-vfolder_rule_finalise (GObject *obj)
-{
- VfolderRule *vr = (VfolderRule *) obj;
-
- g_list_foreach (vr->sources, (GFunc) g_free, NULL);
- g_list_free (vr->sources);
-
- G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-
-/**
- * vfolder_rule_new:
- *
- * Create a new VfolderRule object.
- *
- * Return value: A new #VfolderRule object.
- **/
-VfolderRule *
-vfolder_rule_new (void)
-{
- return (VfolderRule *) g_object_new (VFOLDER_TYPE_RULE, NULL, NULL);
-}
-
-void
-vfolder_rule_add_source (VfolderRule *vr, const char *uri)
-{
- g_assert (IS_VFOLDER_RULE (vr));
-
- vr->sources = g_list_append (vr->sources, g_strdup (uri));
-
- filter_rule_emit_changed ((FilterRule *) vr);
-}
-
-const char *
-vfolder_rule_find_source (VfolderRule *vr, const char *uri)
-{
- GList *l;
-
- g_assert (IS_VFOLDER_RULE (vr));
-
- /* only does a simple string or address comparison, should
- probably do a decoded url comparison */
- l = vr->sources;
- while (l) {
- if (l->data == uri || !strcmp (l->data, uri))
- return l->data;
- l = l->next;
- }
-
- return NULL;
-}
-
-void
-vfolder_rule_remove_source (VfolderRule *vr, const char *uri)
-{
- char *found;
-
- g_assert (IS_VFOLDER_RULE (vr));
-
- found = (char *) vfolder_rule_find_source (vr, uri);
- if (found) {
- vr->sources = g_list_remove (vr->sources, found);
- g_free (found);
- filter_rule_emit_changed ((FilterRule *) vr);
- }
-}
-
-const char *
-vfolder_rule_next_source (VfolderRule *vr, const char *last)
-{
- GList *node;
-
- if (last == NULL) {
- node = vr->sources;
- } else {
- node = g_list_find (vr->sources, (char *) last);
- if (node == NULL)
- node = vr->sources;
- else
- node = g_list_next (node);
- }
-
- if (node)
- return (const char *) node->data;
-
- return NULL;
-}
-
-static int
-validate (FilterRule *fr)
-{
- g_return_val_if_fail (fr != NULL, FALSE);
-
- if (!fr->name || !*fr->name) {
- /* FIXME: set a aprent window? */
- e_error_run(NULL, "filter:no-name-vfolder", NULL);
- return 0;
- }
-
- /* We have to have at least one source set in the "specific" case.
- Do not translate this string! */
- if (((VfolderRule *)fr)->with == VFOLDER_RULE_WITH_SPECIFIC && ((VfolderRule *)fr)->sources == NULL) {
- /* FIXME: set a parent window? */
- e_error_run(NULL, "filter:vfolder-no-source", NULL);
- return 0;
- }
-
- return FILTER_RULE_CLASS (parent_class)->validate (fr);
-}
-
-static int
-list_eq (GList *al, GList *bl)
-{
- int truth = TRUE;
-
- while (truth && al && bl) {
- char *a = al->data, *b = bl->data;
-
- truth = strcmp (a, b) == 0;
- al = al->next;
- bl = bl->next;
- }
-
- return truth && al == NULL && bl == NULL;
-}
-
-static int
-vfolder_eq (FilterRule *fr, FilterRule *cm)
-{
- return FILTER_RULE_CLASS (parent_class)->eq (fr, cm)
- && list_eq (((VfolderRule *) fr)->sources, ((VfolderRule *) cm)->sources);
-}
-
-static xmlNodePtr
-xml_encode (FilterRule *fr)
-{
- VfolderRule *vr = (VfolderRule *) fr;
- xmlNodePtr node, set, work;
- GList *l;
-
- node = FILTER_RULE_CLASS (parent_class)->xml_encode (fr);
- g_assert(node != NULL);
- g_assert(vr->with >= 0 && vr->with < sizeof(with_names)/sizeof(with_names[0]));
- set = xmlNewNode (NULL, "sources");
- xmlAddChild (node, set);
- xmlSetProp(set, "with", with_names[vr->with]);
- l = vr->sources;
- while (l) {
- work = xmlNewNode (NULL, "folder");
- xmlSetProp (work, "uri", l->data);
- xmlAddChild (set, work);
- l = l->next;
- }
-
- return node;
-}
-
-static void
-set_with(VfolderRule *vr, const char *name)
-{
- int i;
-
- for (i=0;i<sizeof(with_names)/sizeof(with_names[0]);i++) {
- if (!strcmp(name, with_names[i])) {
- vr->with = i;
- return;
- }
- }
-
- vr->with = 0;
-}
-
-static int
-xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
-{
- xmlNodePtr set, work;
- int result;
- VfolderRule *vr = (VfolderRule *)fr;
- char *tmp;
-
- result = FILTER_RULE_CLASS (parent_class)->xml_decode (fr, node, f);
- if (result != 0)
- return result;
-
- /* handle old format file, vfolder source is in filterrule */
- if (strcmp(fr->source, "incoming") != 0) {
- set_with(vr, fr->source);
- g_free(fr->source);
- fr->source = g_strdup("incoming");
- }
-
- set = node->children;
- while (set) {
- if (!strcmp(set->name, "sources")) {
- tmp = xmlGetProp(set, "with");
- if (tmp) {
- set_with(vr, tmp);
- xmlFree(tmp);
- }
- work = set->children;
- while (work) {
- if (!strcmp(work->name, "folder")) {
- tmp = xmlGetProp(work, "uri");
- if (tmp) {
- vr->sources = g_list_append(vr->sources, g_strdup(tmp));
- xmlFree(tmp);
- }
- }
- work = work->next;
- }
- }
- set = set->next;
- }
- return 0;
-}
-
-static void
-rule_copy (FilterRule *dest, FilterRule *src)
-{
- VfolderRule *vdest, *vsrc;
- GList *node;
-
- vdest = (VfolderRule *) dest;
- vsrc = (VfolderRule *) src;
-
- if (vdest->sources) {
- g_list_foreach (vdest->sources, (GFunc) g_free, NULL);
- g_list_free (vdest->sources);
- vdest->sources = NULL;
- }
-
- node = vsrc->sources;
- while (node) {
- char *uri = node->data;
-
- vdest->sources = g_list_append (vdest->sources, g_strdup (uri));
- node = node->next;
- }
-
- vdest->with = vsrc->with;
-
- FILTER_RULE_CLASS (parent_class)->copy (dest, src);
-}
-
-enum {
- BUTTON_ADD,
- BUTTON_REMOVE,
- BUTTON_LAST,
-};
-
-struct _source_data {
- RuleContext *rc;
- VfolderRule *vr;
- const char *current;
- GtkListStore *model;
- GtkTreeView *list;
- GtkButton *buttons[BUTTON_LAST];
-};
-
-static void source_add(GtkWidget *widget, struct _source_data *data);
-static void source_remove(GtkWidget *widget, struct _source_data *data);
-
-static struct {
- char *name;
- GtkSignalFunc func;
-} edit_buttons[] = {
- { "source_add", G_CALLBACK (source_add) },
- { "source_remove", G_CALLBACK (source_remove) },
-};
-
-static void
-set_sensitive (struct _source_data *data)
-{
- gtk_widget_set_sensitive ((GtkWidget *) data->buttons[BUTTON_ADD], TRUE);
- gtk_widget_set_sensitive ((GtkWidget *) data->buttons[BUTTON_REMOVE], data->current != NULL);
-}
-
-static void
-select_source (GtkWidget *list, struct _source_data *data)
-{
- GtkTreeViewColumn *column;
- GtkTreePath *path;
- GtkTreeIter iter;
-
- gtk_tree_view_get_cursor (data->list, &path, &column);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path);
- gtk_tree_path_free (path);
-
- gtk_tree_model_get (GTK_TREE_MODEL (data->model), &iter, 0, &data->current, -1);
-
- set_sensitive (data);
-}
-
-static void
-select_source_with_changed(GtkWidget *widget, struct _source_data *data)
-{
- vfolder_rule_with_t with;
-
- with = gtk_option_menu_get_history((GtkOptionMenu *)widget);
- if (with < VFOLDER_RULE_WITH_SPECIFIC || with > VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
- with = 0;
- data->vr->with = with;
-}
-
-/* attempt to make a 'nice' folder name out of the raw uri */
-static char *format_source(const char *euri)
-{
- CamelURL *url;
- GString *out;
- char *res, *uri;
-
- /* This should really probably base it on the account name? */
- uri = em_uri_to_camel(euri);
- url = camel_url_new(uri, NULL);
-
- /* bad uri */
- if (url == NULL)
- return uri;
-
- g_free(uri);
-
- out = g_string_new(url->protocol);
- g_string_append_c(out, ':');
- if (url->user && url->host) {
- g_string_append_printf(out, "%s@%s", url->user, url->host);
- if (url->port)
- g_string_append_printf(out, ":%d", url->port);
- }
- if (url->fragment)
- g_string_append(out, url->fragment);
- else if (url->path)
- g_string_append(out, url->path);
-
- res = out->str;
- g_string_free(out, FALSE);
-
- return res;
-}
-
-static void
-vfr_folder_response(GtkWidget *dialog, gint button, struct _source_data *data)
-{
- const char *uri = em_folder_selector_get_selected_uri((EMFolderSelector *)dialog);
-
- if (button == GTK_RESPONSE_OK && uri != NULL) {
- char *urinice, *euri;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
-
- euri = em_uri_from_camel(uri);
-
- data->vr->sources = g_list_append (data->vr->sources, euri);
-
- gtk_list_store_append (data->model, &iter);
- urinice = format_source(euri);
- gtk_list_store_set(data->model, &iter, 0, urinice, 1, euri, -1);
- g_free(urinice);
- selection = gtk_tree_view_get_selection(data->list);
- gtk_tree_selection_select_iter(selection, &iter);
- data->current = euri;
-
- set_sensitive(data);
- }
-
- gtk_widget_destroy(dialog);
-}
-
-static void
-source_add(GtkWidget *widget, struct _source_data *data)
-{
- EMFolderTree *emft;
- GtkWidget *dialog;
-
- emft = (EMFolderTree *) em_folder_tree_new_with_model(mail_component_peek_tree_model(mail_component_peek()));
-
- dialog = em_folder_selector_new(emft, EM_FOLDER_SELECTOR_CAN_CREATE, _("Select Folder"), NULL, _("_Add"));
- gtk_window_set_transient_for((GtkWindow *)dialog, (GtkWindow *)gtk_widget_get_toplevel(widget));
- gtk_window_set_modal((GtkWindow *)dialog, TRUE);
- g_signal_connect(dialog, "response", G_CALLBACK(vfr_folder_response), data);
- gtk_widget_show(dialog);
-}
-
-static void
-source_remove (GtkWidget *widget, struct _source_data *data)
-{
- GtkTreeSelection *selection;
- const char *source;
- GtkTreePath *path;
- GtkTreeIter iter;
- int index = 0;
- int n;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->list));
-
- source = NULL;
- while ((source = vfolder_rule_next_source (data->vr, source))) {
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, index);
-
- if (gtk_tree_selection_path_is_selected (selection, path)) {
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path);
-
- vfolder_rule_remove_source (data->vr, source);
- gtk_list_store_remove (data->model, &iter);
- gtk_tree_path_free (path);
-
- /* now select the next rule */
- n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (data->model), NULL);
- index = index >= n ? n - 1 : index;
-
- if (index >= 0) {
- path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, index);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path);
- gtk_tree_path_free (path);
-
- gtk_tree_selection_select_iter (selection, &iter);
- gtk_tree_model_get (GTK_TREE_MODEL (data->model), &iter, 0, &data->current, -1);
- } else {
- data->current = NULL;
- }
-
- break;
- }
-
- index++;
- gtk_tree_path_free (path);
- }
-
- set_sensitive (data);
-}
-
-
-GtkWidget *vfolder_editor_sourcelist_new (char *widget_name, char *string1, char *string2,
- int int1, int int2);
-
-GtkWidget *
-vfolder_editor_sourcelist_new (char *widget_name, char *string1, char *string2, int int1, int int2)
-{
- GtkWidget *table, *scrolled;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkListStore *model;
-
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
- model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
- table = gtk_tree_view_new_with_model ((GtkTreeModel *) model);
- gtk_tree_view_set_headers_visible ((GtkTreeView *) table, FALSE);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes ((GtkTreeView *) table, -1,
- _("VFolder source"), renderer,
- "text", 0, NULL);
-
- selection = gtk_tree_view_get_selection ((GtkTreeView *) table);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-
- gtk_container_add (GTK_CONTAINER (scrolled), table);
-
- g_object_set_data ((GObject *) scrolled, "table", table);
- g_object_set_data ((GObject *) scrolled, "model", model);
-
- gtk_widget_show (scrolled);
- gtk_widget_show (table);
-
- return scrolled;
-}
-
-static GtkWidget *
-get_widget (FilterRule *fr, RuleContext *rc)
-{
- VfolderRule *vr = (VfolderRule *) fr;
- GtkWidget *widget, *frame, *list;
- struct _source_data *data;
- GtkOptionMenu *omenu;
- const char *source;
- GtkTreeIter iter;
- GladeXML *gui;
- int i;
-
- widget = FILTER_RULE_CLASS (parent_class)->get_widget (fr, rc);
-
- data = g_malloc0 (sizeof (*data));
- data->rc = rc;
- data->vr = vr;
-
- gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "vfolder_source_frame", NULL);
- frame = glade_xml_get_widget (gui, "vfolder_source_frame");
-
- g_object_set_data_full ((GObject *) frame, "data", data, g_free);
-
- for (i = 0; i < BUTTON_LAST; i++) {
- data->buttons[i] = (GtkButton *) glade_xml_get_widget (gui, edit_buttons[i].name);
- g_signal_connect (data->buttons[i], "clicked", edit_buttons[i].func, data);
- }
-
- list = glade_xml_get_widget (gui, "source_list");
- data->list = (GtkTreeView *) g_object_get_data ((GObject *) list, "table");
- data->model = (GtkListStore *) g_object_get_data ((GObject *) list, "model");
-
- source = NULL;
- while ((source = vfolder_rule_next_source (vr, source))) {
- char *nice = format_source(source);
-
- gtk_list_store_append (data->model, &iter);
- gtk_list_store_set (data->model, &iter, 0, nice, 1, source, -1);
- g_free(nice);
- }
-
- g_signal_connect (data->list, "cursor-changed", G_CALLBACK (select_source), data);
-
- omenu = (GtkOptionMenu *) glade_xml_get_widget (gui, "source_option");
- gtk_option_menu_set_history(omenu, vr->with);
- g_signal_connect(omenu, "changed", G_CALLBACK(select_source_with_changed), data);
-
- set_sensitive (data);
-
- g_object_unref (gui);
-
- gtk_box_pack_start (GTK_BOX (widget), frame, TRUE, TRUE, 3);
-
- return widget;
-}
diff --git a/filter/vfolder-rule.h b/filter/vfolder-rule.h
deleted file mode 100644
index 88604be5de..0000000000
--- a/filter/vfolder-rule.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2000-2002 Ximian Inc.
- *
- * Author: NotZed <notzed@ximian.com>
- * Jeffrey Stedfast <fejj@ximian.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef _VFOLDER_RULE_H
-#define _VFOLDER_RULE_H
-
-#include "filter-rule.h"
-
-#define VFOLDER_TYPE_RULE (vfolder_rule_get_type ())
-#define VFOLDER_RULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VFOLDER_TYPE_RULE, VfolderRule))
-#define VFOLDER_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VFOLDER_TYPE_RULE, VfolderRuleClass))
-#define IS_VFOLDER_RULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VFOLDER_TYPE_RULE))
-#define IS_VFOLDER_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VFOLDER_TYPE_RULE))
-#define VFOLDER_RULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VFOLDER_TYPE_RULE, VfolderRuleClass))
-
-/* perhaps should be bits? */
-enum _vfolder_rule_with_t {
- VFOLDER_RULE_WITH_SPECIFIC,
- VFOLDER_RULE_WITH_LOCAL,
- VFOLDER_RULE_WITH_REMOTE_ACTIVE,
- VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE,
-};
-
-typedef struct _VfolderRule VfolderRule;
-typedef struct _VfolderRuleClass VfolderRuleClass;
-
-typedef enum _vfolder_rule_with_t vfolder_rule_with_t;
-
-struct _VfolderRule {
- FilterRule rule;
-
- vfolder_rule_with_t with;
- GList *sources; /* uri's of the source folders */
-};
-
-struct _VfolderRuleClass {
- FilterRuleClass parent_class;
-
- /* virtual methods */
-
- /* signals */
-};
-
-GType vfolder_rule_get_type (void);
-VfolderRule *vfolder_rule_new (void);
-
-/* methods */
-void vfolder_rule_add_source (VfolderRule *vr, const char *uri);
-void vfolder_rule_remove_source (VfolderRule *vr, const char *uri);
-const char *vfolder_rule_find_source (VfolderRule *vr, const char *uri);
-const char *vfolder_rule_next_source (VfolderRule *vr, const char *last);
-
-#endif /* ! _VFOLDER_RULE_H */
diff --git a/filter/vfoldertypes.xml b/filter/vfoldertypes.xml
deleted file mode 100644
index d9e2b86841..0000000000
--- a/filter/vfoldertypes.xml
+++ /dev/null
@@ -1,424 +0,0 @@
-<?xml version="1.0"?>
-<filterdescription>
-<partset>
- <part name="sender">
- <title>Sender</title>
- <input type="optionlist" name="sender-type">
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "From" ${sender}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "From" ${sender})))</code>
- </option>
- <option value="is">
- <title>is</title>
- <code>(match-all (header-matches "From" ${sender}))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(match-all (not (header-matches "From" ${sender})))</code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "From" ${sender}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "From" ${sender})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "From" ${sender}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "From" ${sender})))
- </code>
- </option>
- </input>
- <input type="string" name="sender"/>
- </part>
-
- <part name="to">
- <title>Recipients</title>
- <input type="optionlist" name="recipient-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (or (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient})))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (or
- (header-contains "To" ${recipient})
- (header-contains "Cc" ${recipient}))))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (or (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient})))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (or
- (header-matches "To" ${recipient})
- (header-matches "Cc" ${recipient}))))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (or (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (or
- (header-starts-with "To" ${recipient})
- (header-starts-with "Cc" ${recipient}))))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (or (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient})))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (or
- (header-ends-with "To" ${recipient})
- (header-ends-with "Cc" ${recipient}))))
- </code>
- </option>
- </input>
- <input type="address" name="recipient"/>
- </part>
-
- <part name="subject">
- <title>Subject</title>
- <input type="optionlist" name="subject-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (match-all (header-contains "Subject" ${subject}))
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (match-all (not (header-contains "Subject" ${subject})))
- </code>
- </option>
- <option value="is">
- <title>is</title>
- <code>
- (match-all (header-matches "Subject" ${subject}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (header-matches "Subject" ${subject})))
- </code>
- </option>
- <option value="starts with">
- <title>starts with</title>
- <code>
- (match-all (header-starts-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not starts with">
- <title>does not start with</title>
- <code>
- (match-all (not (header-starts-with "Subject" ${subject})))
- </code>
- </option>
- <option value="ends with">
- <title>ends with</title>
- <code>
- (match-all (header-ends-with "Subject" ${subject}))
- </code>
- </option>
- <option value="not ends with">
- <title>does not end with</title>
- <code>
- (match-all (not (header-ends-with "Subject" ${subject})))
- </code>
- </option>
- </input>
- <input type="string" name="subject"/>
- </part>
- <part name="body">
- <title>Message Body</title>
- <input type="optionlist" name="body-type">
- <option value="contains">
- <title>contains</title>
- <code>
- (body-contains ${word})
- </code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>
- (not (body-contains ${word}))
- </code>
- </option>
- </input>
- <input type="string" name="word"/>
- </part>
- <part name="sexp">
- <title>Expression</title>
- <input type="code" name="code"/>
- </part>
-
- <part name="sent-date">
- <title>Date sent</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-sent-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-sent-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-sent-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="recv-date">
- <title>Date received</title>
- <input type="optionlist" name="date-spec-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (get-received-date) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (get-received-date) ${versus})))
- </code>
- </option>
- <option value="before">
- <title>is before</title>
- <code>
- (match-all (&lt; (get-received-date) ${versus}))
- </code>
- </option>
- <option value="after">
- <title>is after</title>
- <code>
- (match-all (&gt; (get-received-date) ${versus}))
- </code>
- </option>
- </input>
- <input type="datespec" name="versus"/>
- </part>
-
- <part name="label">
- <title>Label</title>
- <input type="optionlist" name="label-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (user-tag "label") ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (user-tag "label") ${versus})))
- </code>
- </option>
- </input>
- <input type="label" name="versus"/>
- </part>
-
- <part name="score">
- <title>Score</title>
- <input type="optionlist" name="score-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (= (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="is-not">
- <title>is not</title>
- <code>
- (match-all (not (= (cast-int (user-tag "score")) ${versus})))
- </code>
- </option>
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (cast-int (user-tag "score")) ${versus}))
- </code>
- </option>
- </input>
- <input type="score" name="versus"/>
- </part>
-
- <part name="size">
- <title>Size (kB)</title>
- <input type="optionlist" name="size-type">
- <option value="greater-than">
- <title>is greater than</title>
- <code>
- (match-all (&gt; (get-size) ${versus}))
- </code>
- </option>
- <option value="less-than">
- <title>is less than</title>
- <code>
- (match-all (&lt; (get-size) ${versus}))
- </code>
- </option>
- </input>
- <input type="integer" name="versus"/>
- </part>
-
- <part name="status">
- <title>Status</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is</title>
- <code>
- (match-all (system-flag ${flag}))
- </code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>
- (match-all (not (system-flag ${flag})))
- </code>
- </option>
- </input>
- <input type="optionlist" name="flag">
- <option value="Answered">
- <title>Replied to</title>
- </option>
- <option value="Deleted">
- <title>Deleted</title>
- </option>
- <option value="Draft">
- <title>Draft</title>
- </option>
- <option value="Flagged">
- <title>Important</title>
- </option>
- <option value="Seen">
- <title>Read</title>
- </option>
- <option value="Junk">
- <title>Junk</title>
- </option>
- </input>
- </part>
-
- <part name="follow-up">
- <title>Follow Up</title>
- <input type="optionlist" name="match-type">
- <option value="is">
- <title>is Flagged</title>
- <code>
- (match-all (not (= (user-tag "follow-up") "")))
- </code>
- </option>
- <option value="is not">
- <title>is not Flagged</title>
- <code>
- (match-all (= (user-tag "follow-up") ""))
- </code>
- </option>
- </input>
- </part>
-
- <part name="attachments">
- <title>Attachments</title>
- <input type="optionlist" name="match-type">
- <option value="exist">
- <title>Exist</title>
- <code>
- (match-all (system-flag "Attachments"))
- </code>
- </option>
- <option value="not exist">
- <title>Do Not Exist</title>
- <code>
- (match-all (not (system-flag "Attachments")))
- </code>
- </option>
- </input>
- </part>
-
- <part name="mlist">
- <title>Mailing list</title>
- <input type="optionlist" name="mlist-type">
- <option value="is">
- <title>is</title>
- <code>(match-all (header-matches "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="is not">
- <title>is not</title>
- <code>(match-all (not (header-matches "x-camel-mlist" ${mlist})))</code>
- </option>
- <option value="contains">
- <title>contains</title>
- <code>(match-all (header-contains "x-camel-mlist" ${mlist}))</code>
- </option>
- <option value="not contains">
- <title>does not contain</title>
- <code>(match-all (not (header-contains "x-camel-mlist" ${mlist})))</code>
- </option>
- </input>
- <input type="string" name="mlist"/>
- </part>
-
-</partset>
-</filterdescription>