aboutsummaryrefslogtreecommitdiffstats
path: root/filter/filter-filter.c
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 /filter/filter-filter.c
parent8be7f276a292ba85e6bec20fd7d5a351f094296e (diff)
downloadgsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.gz
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.bz2
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.lz
gsoc2013-evolution-e01b1d7c259f148847e97d4c3e609933e26a73cf.tar.xz
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
Diffstat (limited to 'filter/filter-filter.c')
-rw-r--r--filter/filter-filter.c29
1 files changed, 29 insertions, 0 deletions
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);