aboutsummaryrefslogtreecommitdiffstats
path: root/filter/vfolder-rule.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/vfolder-rule.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/vfolder-rule.c')
-rw-r--r--filter/vfolder-rule.c34
1 files changed, 33 insertions, 1 deletions
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,