aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-09-13 06:06:46 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2001-09-13 06:06:46 +0800
commite01b1d7c259f148847e97d4c3e609933e26a73cf (patch)
treeec8f29ab4a07dd9bb64ec8e4c3b2223c2fbe9346
parent8be7f276a292ba85e6bec20fd7d5a351f094296e (diff)
downloadgsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.gz
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.zst
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.zip
Clone the current rule before editing it so that changes can be undone.
2001-09-12 Jeffrey Stedfast <fejj@ximian.com> * rule-editor.c (rule_edit): Clone the current rule before editing it so that changes can be undone. (edit_editor_clicked): If the user hit OK, replace the original rule with the new one. * vfolder-rule.c (vfolder_rule_finalise): Free the sources list. (rule_copy): Implemented. * filter-filter.c (rule_copy): Implemented. * filter-rule.c (filter_rule_copy): New convenience function to copy one rule "into" another. (rule_copy): Default implementation. (filter_rule_clone): Use filter_rule_copy() internally to get rid of the nastiness/slowness of xml encoding and then decoding. svn path=/trunk/; revision=12787
-rw-r--r--filter/ChangeLog18
-rw-r--r--filter/filter-filter.c29
-rw-r--r--filter/filter-rule.c49
-rw-r--r--filter/filter-rule.h6
-rw-r--r--filter/libfilter-i18n.h36
-rw-r--r--filter/rule-editor.c8
-rw-r--r--filter/vfolder-rule.c34
7 files changed, 150 insertions, 30 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index 827efa6f0b..fcd6f22aed 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,21 @@
+2001-09-12 Jeffrey Stedfast <fejj@ximian.com>
+
+ * rule-editor.c (rule_edit): Clone the current rule before editing
+ it so that changes can be undone.
+ (edit_editor_clicked): If the user hit OK, replace the original
+ rule with the new one.
+
+ * vfolder-rule.c (vfolder_rule_finalise): Free the sources list.
+ (rule_copy): Implemented.
+
+ * filter-filter.c (rule_copy): Implemented.
+
+ * filter-rule.c (filter_rule_copy): New convenience function to
+ copy one rule "into" another.
+ (rule_copy): Default implementation.
+ (filter_rule_clone): Use filter_rule_copy() internally to get rid
+ of the nastiness/slowness of xml encoding and then decoding.
+
2001-09-12 <NotZed@Ximian.com>
* vfoldertypes.xml: Remove the match-all from the not
diff --git a/filter/filter-filter.c b/filter/filter-filter.c
index 145be391dd..50d29d2369 100644
--- a/filter/filter-filter.c
+++ b/filter/filter-filter.c
@@ -42,6 +42,7 @@
static int validate(FilterRule *);
static xmlNodePtr xml_encode (FilterRule *);
static int xml_decode (FilterRule *, xmlNodePtr, struct _RuleContext *f);
+static void rule_copy (FilterRule *dest, FilterRule *src);
/*static void build_code(FilterRule *, GString *out);*/
static GtkWidget *get_widget (FilterRule *fr, struct _RuleContext *f);
@@ -100,6 +101,7 @@ filter_filter_class_init (FilterFilterClass *class)
filter_rule->xml_encode = xml_encode;
filter_rule->xml_decode = xml_decode;
/*filter_rule->build_code = build_code;*/
+ filter_rule->copy = rule_copy;
filter_rule->get_widget = get_widget;
/* signals */
@@ -269,6 +271,33 @@ xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
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) gtk_object_unref, NULL);
+ g_list_free (fdest->actions);
+ fdest->actions = NULL;
+ }
+
+ node = fsrc->actions;
+ while (node) {
+ FilterPart *part = node->data;
+
+ gtk_object_ref (GTK_OBJECT (part));
+ fdest->actions = g_list_append (fdest->actions, part);
+ node = node->next;
+ }
+
+ ((FilterRuleClass *)(parent_class))->copy (dest, src);
+}
+
/*static void build_code(FilterRule *fr, GString *out)
{
return ((FilterRuleClass *)(parent_class))->build_code(fr, out);
diff --git a/filter/filter-rule.c b/filter/filter-rule.c
index aff01a0f25..bf948ba299 100644
--- a/filter/filter-rule.c
+++ b/filter/filter-rule.c
@@ -42,6 +42,7 @@ static int validate(FilterRule *);
static xmlNodePtr xml_encode (FilterRule *);
static int xml_decode (FilterRule *, xmlNodePtr, RuleContext *);
static void build_code (FilterRule *, GString * out);
+static void rule_copy (FilterRule *dest, FilterRule *src);
static GtkWidget *get_widget (FilterRule * fr, struct _RuleContext *f);
static void filter_rule_class_init (FilterRuleClass * class);
@@ -98,6 +99,7 @@ filter_rule_class_init (FilterRuleClass * class)
class->xml_encode = xml_encode;
class->xml_decode = xml_decode;
class->build_code = build_code;
+ class->copy = rule_copy;
class->get_widget = get_widget;
/* signals */
@@ -142,19 +144,14 @@ filter_rule_new ()
}
FilterRule *
-filter_rule_clone(FilterRule *base, RuleContext *f)
+filter_rule_clone (FilterRule *base)
{
- xmlNodePtr xml;
FilterRule *rule;
g_assert (IS_FILTER_RULE (base));
- g_assert (IS_RULE_CONTEXT (f));
- /* TODO: do this more directly/efficiently */
- xml = filter_rule_xml_encode (base);
rule = gtk_type_new (GTK_OBJECT (base)->klass->type);
- filter_rule_xml_decode (rule, xml, f);
- xmlFreeNodeList (xml);
+ filter_rule_copy (rule, base);
return rule;
}
@@ -340,6 +337,44 @@ xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f)
return 0;
}
+static void
+rule_copy (FilterRule *dest, FilterRule *src)
+{
+ GList *node;
+
+ g_free (dest->name);
+ dest->name = g_strdup (src->name);
+
+ g_free (dest->source);
+ dest->source = g_strdup (src->source);
+
+ dest->grouping = src->grouping;
+
+ if (dest->parts) {
+ g_list_foreach (dest->parts, (GFunc) gtk_object_unref, NULL);
+ g_list_free (dest->parts);
+ dest->parts = NULL;
+ }
+
+ node = src->parts;
+ while (node) {
+ FilterPart *part = node->data;
+
+ gtk_object_ref (GTK_OBJECT (part));
+ dest->parts = g_list_append (dest->parts, part);
+ node = node->next;
+ }
+}
+
+void
+filter_rule_copy (FilterRule *dest, FilterRule *src)
+{
+ g_assert (IS_FILTER_RULE (dest));
+ g_assert (IS_FILTER_RULE (src));
+
+ ((FilterRuleClass *) ((GtkObject *) dest)->klass)->copy (dest, src);
+}
+
void
filter_rule_add_part (FilterRule *fr, FilterPart *fp)
{
diff --git a/filter/filter-rule.h b/filter/filter-rule.h
index ffad99e627..41a10ca326 100644
--- a/filter/filter-rule.h
+++ b/filter/filter-rule.h
@@ -65,6 +65,8 @@ struct _FilterRuleClass {
int (*xml_decode)(FilterRule *, xmlNodePtr, struct _RuleContext *);
void (*build_code)(FilterRule *, GString *out);
+
+ void (*copy)(FilterRule *dest, FilterRule *src);
GtkWidget *(*get_widget)(FilterRule *fr, struct _RuleContext *f);
@@ -74,7 +76,7 @@ struct _FilterRuleClass {
guint filter_rule_get_type (void);
FilterRule *filter_rule_new (void);
-FilterRule *filter_rule_clone (FilterRule *base, struct _RuleContext *f);
+FilterRule *filter_rule_clone (FilterRule *base);
/* methods */
void filter_rule_set_name (FilterRule *fr, const char *name);
@@ -85,6 +87,8 @@ int filter_rule_validate (FilterRule *fr);
xmlNodePtr filter_rule_xml_encode (FilterRule *fr);
int filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f);
+void filter_rule_copy (FilterRule *dest, FilterRule *src);
+
void filter_rule_add_part (FilterRule *fr, FilterPart *fp);
void filter_rule_remove_part (FilterRule *fr, FilterPart *fp);
void filter_rule_replace_part(FilterRule *fr, FilterPart *fp, FilterPart *new);
diff --git a/filter/libfilter-i18n.h b/filter/libfilter-i18n.h
index 175eac2dc6..d3cc5cbb36 100644
--- a/filter/libfilter-i18n.h
+++ b/filter/libfilter-i18n.h
@@ -1,23 +1,39 @@
/* Automatically generated. Do not edit. */
+char *s = N_("after");
char *s = N_("Assign Color");
char *s = N_("Assign Score");
char *s = N_("Attachments");
+char *s = N_("before");
+char *s = N_("contains");
char *s = N_("Copy to Folder");
char *s = N_("Date received");
char *s = N_("Date sent");
char *s = N_("Delete");
char *s = N_("Deleted");
+char *s = N_("does not contain");
+char *s = N_("does not end with");
+char *s = N_("does not exist");
+char *s = N_("does not sound like");
+char *s = N_("does not start with");
char *s = N_("Do Not Exist");
char *s = N_("Draft");
+char *s = N_("ends with");
char *s = N_("Exist");
+char *s = N_("exists");
char *s = N_("Expression");
char *s = N_("Important");
+char *s = N_("is");
+char *s = N_("is greater than");
+char *s = N_("is less than");
+char *s = N_("is not");
char *s = N_("Mailing list");
char *s = N_("Message Body");
char *s = N_("Message Header");
char *s = N_("Message was received");
char *s = N_("Message was sent");
char *s = N_("Move to Folder");
+char *s = N_("on or after");
+char *s = N_("on or before");
char *s = N_("Read");
char *s = N_("Recipients");
char *s = N_("Regex Match");
@@ -26,28 +42,12 @@ char *s = N_("Score");
char *s = N_("Sender");
char *s = N_("Set Status");
char *s = N_("Size (kB)");
+char *s = N_("sounds like");
char *s = N_("Source Account");
char *s = N_("Specific header");
+char *s = N_("starts with");
char *s = N_("Status");
char *s = N_("Stop Processing");
char *s = N_("Subject");
-char *s = N_("after");
-char *s = N_("before");
-char *s = N_("contains");
-char *s = N_("does not contain");
-char *s = N_("does not end with");
-char *s = N_("does not exist");
-char *s = N_("does not sound like");
-char *s = N_("does not start with");
-char *s = N_("ends with");
-char *s = N_("exists");
-char *s = N_("is greater than");
-char *s = N_("is less than");
-char *s = N_("is not");
-char *s = N_("is");
-char *s = N_("on or after");
-char *s = N_("on or before");
-char *s = N_("sounds like");
-char *s = N_("starts with");
char *s = N_("was after");
char *s = N_("was before");
diff --git a/filter/rule-editor.c b/filter/rule-editor.c
index 5a6718660d..e966ef89ad 100644
--- a/filter/rule-editor.c
+++ b/filter/rule-editor.c
@@ -271,6 +271,9 @@ edit_editor_clicked (GtkWidget *dialog, int button, RuleEditor *re)
string = e_utf8_to_gtk_string (GTK_WIDGET (item), re->current->name);
gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), string);
g_free (string);
+
+ /* replace the old rule with the new rule */
+ filter_rule_copy (re->current, re->edit);
}
case 1:
default:
@@ -292,10 +295,9 @@ rule_edit (GtkWidget *widget, RuleEditor *re)
if (re->current == NULL)
return;
- re->edit = re->current;
- gtk_object_ref (GTK_OBJECT (re->edit));
+ re->edit = filter_rule_clone (re->current);
- rules = filter_rule_get_widget (re->current, re->context);
+ rules = filter_rule_get_widget (re->edit, re->context);
dialog = gnome_dialog_new (_("Edit Rule"),
GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL,
diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c
index 13e5337a18..5f122b5f1a 100644
--- a/filter/vfolder-rule.c
+++ b/filter/vfolder-rule.c
@@ -42,6 +42,7 @@
static gint validate(FilterRule *);
static xmlNodePtr xml_encode(FilterRule *);
static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f);
+static void rule_copy (FilterRule *dest, FilterRule *src);
/*static void build_code(FilterRule *, GString *out);*/
static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f);
@@ -95,6 +96,7 @@ vfolder_rule_class_init (VfolderRuleClass *class)
filter_rule->validate = validate;
filter_rule->xml_encode = xml_encode;
filter_rule->xml_decode = xml_decode;
+ filter_rule->copy = rule_copy;
/*filter_rule->build_code = build_code;*/
filter_rule->get_widget = get_widget;
}
@@ -109,7 +111,10 @@ static void
vfolder_rule_finalise(GtkObject *obj)
{
VfolderRule *o = (VfolderRule *)obj;
- o = o;
+
+ g_list_foreach (o->sources, (GFunc) g_free, NULL);
+ g_list_free (o->sources);
+
((GtkObjectClass *)(parent_class))->finalize(obj);
}
@@ -258,6 +263,33 @@ xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f)
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;
+ }
+
+ ((FilterRuleClass *)(parent_class))->copy (dest, src);
+}
+
+
enum {
BUTTON_ADD,
BUTTON_REMOVE,