From e01b1d7c259f148847e97d4c3e609933e26a73cf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 12 Sep 2001 22:06:46 +0000 Subject: Clone the current rule before editing it so that changes can be undone. 2001-09-12 Jeffrey Stedfast * 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 --- filter/filter-filter.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'filter/filter-filter.c') 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); -- cgit v1.2.3