aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog10
-rw-r--r--filter/rule-context.c106
-rw-r--r--filter/rule-context.h1
-rw-r--r--filter/rule-editor.c2
4 files changed, 109 insertions, 10 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index 57b20f2916..c10072a9ca 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,13 @@
+2001-10-24 <NotZed@Ximian.com>
+
+ * rule-context.c (rule_context_class_init): Add a changed signal.
+ Emits if the order changes or if you add or remove a rule.
+ (rule_context_rank_rule): Fix rank rule to properly rank based on
+ source, not merely on list position.
+ (rule_context_add_rule): Also emit changed signal.
+ (rule_context_remove_rule): Same.
+ (rule_context_rank_rule): Emit changed signal.
+
2001-10-20 Jon Trowbridge <trow@ximian.com>
* rule-editor.c (set_source): Translate the rule names. (Bug
diff --git a/filter/rule-context.c b/filter/rule-context.c
index f77f77b9d0..96d07ede28 100644
--- a/filter/rule-context.c
+++ b/filter/rule-context.c
@@ -34,7 +34,7 @@
#include "rule-context.h"
-#define d(x)
+#define d(x)
static int load(RuleContext * f, const char *system, const char *user);
static int save(RuleContext * f, const char *user);
@@ -54,6 +54,7 @@ static GtkObjectClass *parent_class;
enum {
RULE_ADDED,
RULE_REMOVED,
+ CHANGED,
LAST_SIGNAL
};
@@ -111,6 +112,14 @@ rule_context_class_init (RuleContextClass * class)
GTK_SIGNAL_OFFSET (RuleContextClass, rule_removed),
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
+
+ signals[CHANGED] =
+ gtk_signal_new("changed",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (RuleContextClass, changed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL);
}
@@ -227,6 +236,8 @@ rule_context_add_rule_set (RuleContext * f, const char *setname, int rule_type,
static void
rule_context_set_error (RuleContext * f, char *error)
{
+ g_assert(f);
+
g_free (f->error);
f->error = error;
}
@@ -246,6 +257,8 @@ rule_context_load (RuleContext *f, const char *system, const char *user)
{
int res;
+ g_assert(f);
+
d(printf("rule_context: loading %s %s\n", system, user));
f->priv->frozen++;
@@ -349,6 +362,9 @@ load (RuleContext *f, const char *system, const char *user)
int
rule_context_save (RuleContext *f, const char *user)
{
+ g_assert(f);
+ g_assert(user);
+
return ((RuleContextClass *) ((GtkObject *) f)->klass)->save(f, user);
}
@@ -401,6 +417,9 @@ save (RuleContext *f, const char *user)
FilterPart *
rule_context_find_part (RuleContext *f, const char *name)
{
+ g_assert(f);
+ g_assert(name);
+
d(printf("find part : "));
return filter_part_find_list (f->parts, name);
}
@@ -409,7 +428,10 @@ FilterPart *
rule_context_create_part (RuleContext *f, const char *name)
{
FilterPart *part;
-
+
+ g_assert(f);
+ g_assert(name);
+
part = rule_context_find_part (f, name);
if (part)
part = filter_part_clone (part);
@@ -419,34 +441,51 @@ rule_context_create_part (RuleContext *f, const char *name)
FilterPart *
rule_context_next_part (RuleContext *f, FilterPart *last)
{
+ g_assert(f);
+
return filter_part_next_list (f->parts, last);
}
FilterRule *
rule_context_next_rule (RuleContext *f, FilterRule *last, const char *source)
{
+ g_assert(f);
+
return filter_rule_next_list (f->rules, last, source);
}
FilterRule *
rule_context_find_rule (RuleContext *f, const char *name, const char *source)
{
+ g_assert(name);
+ g_assert(f);
+
return filter_rule_find_list (f->rules, name, source);
}
void
rule_context_add_part (RuleContext *f, FilterPart *part)
{
+ g_assert(f);
+ g_assert(part);
+
f->parts = g_list_append (f->parts, part);
}
void
rule_context_add_rule (RuleContext *f, FilterRule *new)
{
+ g_assert(f);
+ g_assert(new);
+
+ d(printf("add rule '%s'\n", new->name));
+
f->rules = g_list_append (f->rules, new);
- if (f->priv->frozen == 0)
+ if (f->priv->frozen == 0) {
gtk_signal_emit((GtkObject *)f, signals[RULE_ADDED], new);
+ gtk_signal_emit((GtkObject *)f, signals[CHANGED]);
+ }
}
static void
@@ -478,6 +517,11 @@ void
rule_context_add_rule_gui (RuleContext *f, FilterRule *rule, const char *title, const char *path)
{
GtkWidget *dialog, *w;
+
+ d(printf("add rule gui '%s'\n", rule->name));
+
+ g_assert(f);
+ g_assert(rule);
w = filter_rule_get_widget (rule, f);
dialog = gnome_dialog_new (title, GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL);
@@ -498,31 +542,75 @@ rule_context_add_rule_gui (RuleContext *f, FilterRule *rule, const char *title,
void
rule_context_remove_rule (RuleContext *f, FilterRule *rule)
{
+ g_assert(f);
+ g_assert(rule);
+
+ d(printf("remove rule '%s'\n", rule->name));
+
f->rules = g_list_remove (f->rules, rule);
- if (f->priv->frozen == 0)
+ if (f->priv->frozen == 0) {
gtk_signal_emit((GtkObject *)f, signals[RULE_REMOVED], rule);
+ gtk_signal_emit((GtkObject *)f, signals[CHANGED]);
+ }
}
void
rule_context_rank_rule (RuleContext *f, FilterRule *rule, int rank)
{
- f->rules = g_list_remove (f->rules, rule);
- f->rules = g_list_insert (f->rules, rule, rank);
+ GList *node;
+ int i = 0, index = 0;
+
+ g_assert(f);
+ g_assert(rule);
+
+ if (rule_context_get_rank_rule(f, rule, rule->source) == rank)
+ return;
+
+ f->rules = g_list_remove(f->rules, rule);
+ node = f->rules;
+ while (node) {
+ FilterRule *r = node->data;
+
+ if (i == rank) {
+ f->rules = g_list_insert(f->rules, rule, index);
+ if (f->priv->frozen == 0)
+ gtk_signal_emit((GtkObject *)f, signals[CHANGED]);
+ return;
+ }
+
+ index++;
+ if (rule->source == NULL || (r->source && strcmp (r->source, rule->source) == 0))
+ i++;
+
+ node = node->next;
+ }
+
+ f->rules = g_list_append(f->rules, rule);
+ if (f->priv->frozen == 0)
+ gtk_signal_emit((GtkObject *)f, signals[CHANGED]);
}
int
rule_context_get_rank_rule (RuleContext *f, FilterRule *rule, const char *source)
{
- GList *node = f->rules;
+ GList *node;
int i = 0;
-
+
+ g_assert(f);
+ g_assert(rule);
+
+ d(printf("getting rank of rule '%s'\n", rule->name));
+
+ node = f->rules;
while (node) {
FilterRule *r = node->data;
+
+ d(printf(" checking against rule '%s' rank '%d'\n", r->name, i));
if (r == rule)
return i;
-
+
if (source == NULL || (r->source && strcmp (r->source, source) == 0))
i++;
diff --git a/filter/rule-context.h b/filter/rule-context.h
index 6f6a72f270..3f99838ea2 100644
--- a/filter/rule-context.h
+++ b/filter/rule-context.h
@@ -64,6 +64,7 @@ struct _RuleContextClass {
/* signals */
void (*rule_added)(RuleContext *f, FilterRule *rule);
void (*rule_removed)(RuleContext *f, FilterRule *rule);
+ void (*changed)(RuleContext *f);
};
typedef void (*RCPartFunc)(RuleContext *f, FilterPart *part);
diff --git a/filter/rule-editor.c b/filter/rule-editor.c
index decdee85a2..dd6df7f22c 100644
--- a/filter/rule-editor.c
+++ b/filter/rule-editor.c
@@ -34,7 +34,7 @@
#include "rule-context.h"
#include "filter-rule.h"
-#define d(x)
+#define d(x)
static void set_source(RuleEditor *re, const char *source);
static void set_sensitive(RuleEditor *re);