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
This commit is contained in:
committed by
Jeffrey Stedfast
parent
8be7f276a2
commit
e01b1d7c25
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user