aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog20
-rw-r--r--filter/filter-filter.c80
-rw-r--r--filter/filter-rule.c79
-rw-r--r--filter/libfilter-i18n.h36
4 files changed, 125 insertions, 90 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index 32d7683be3..c6111aadb2 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,23 @@
+2001-04-02 Jeffrey Stedfast <fejj@ximian.com>
+
+ * filter-filter.c (option_activate): Set the newpart on the
+ container object.
+ (less_parts): Remove the rule tht the user wants to remove.
+ (attach_rule): Attach a new rule and it's remove button to the end
+ of the table.
+ (more_parts): Fix to resize the table and such.
+ (get_widget): Don't have a remove action button, we are putting
+ this next to the rule part now.
+
+ * filter-rule.c (option_activate): Set the newpart on the
+ container object.
+ (less_parts): Remove the rule tht the user wants to remove.
+ (attach_rule): Attach a new rule and it's remove button to the end
+ of the table.
+ (more_parts): Fix to resize the table and such.
+ (get_widget): Don't have a remove action button, we are putting
+ this next to the rule part now.
+
2001-03-30 Kjartan Maraas <kmaraas@gnome.org>
* *.*: Fix headers. Remove unneccesary ones and replace
diff --git a/filter/filter-filter.c b/filter/filter-filter.c
index c939fa9b2c..9625b5cd59 100644
--- a/filter/filter-filter.c
+++ b/filter/filter-filter.c
@@ -1,8 +1,8 @@
/*
- * Copyright (C) 2000 Helix Code Inc.
+ * Copyright (C) 2000-2001 Ximian Inc.
*
- * Authors: Not Zed <notzed@lostzed.mmc.com.au>
- * Jeffrey Stedfast <fejj@helixcode.com>
+ * Authors: Not Zed <notzed@ximian.com>
+ * Jeffrey Stedfast <fejj@ximian.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
@@ -298,6 +298,8 @@ option_activate (GtkMenuItem *item, struct _part_data *data)
data->partwidget = filter_part_get_widget (newpart);
if (data->partwidget)
gtk_box_pack_start (GTK_BOX (data->container), data->partwidget, FALSE, FALSE, 0);
+
+ gtk_object_set_data (GTK_OBJECT (data->container), "part", newpart);
}
static GtkWidget *
@@ -361,49 +363,64 @@ struct _rule_data {
static void
less_parts (GtkWidget *button, struct _rule_data *data)
{
- GList *l;
FilterPart *part;
- GtkWidget *w;
+ GtkWidget *rule;
+ GList *l;
l = ((FilterFilter *)data->fr)->actions;
if (g_list_length (l) < 2)
return;
- /* remove the last one from the list */
- l = g_list_last (l);
- part = l->data;
+ rule = gtk_object_get_data (GTK_OBJECT (button), "rule");
+ part = gtk_object_get_data (GTK_OBJECT (rule), "part");
+
+ /* remove the part from the list */
filter_filter_remove_action ((FilterFilter *)data->fr, part);
gtk_object_unref (GTK_OBJECT (part));
/* and from the display */
- l = g_list_last (GTK_BOX (data->parts)->children);
- w = ((GtkBoxChild *) l->data)->widget;
- gtk_container_remove (GTK_CONTAINER (data->parts), w);
+ gtk_container_remove (GTK_CONTAINER (data->parts), rule);
+ gtk_container_remove (GTK_CONTAINER (data->parts), button);
+}
+
+static void
+attach_rule (GtkWidget *rule, struct _rule_data *data, FilterPart *part, int row)
+{
+ GtkWidget *remove;
+ GtkWidget *pixmap;
- /* if there's only 1 action, we can't remove anymore so set insensitive */
- if (g_list_length (((FilterFilter *)data->fr)->actions) <= 1)
- gtk_widget_set_sensitive (button, FALSE);
+ gtk_table_attach (GTK_TABLE (data->parts), rule, 0, 1, row, row + 1,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+ pixmap = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_REMOVE);
+ remove = gnome_pixmap_button (pixmap, _("Remove"));
+ gtk_object_set_data (GTK_OBJECT (remove), "rule", rule);
+ gtk_object_set_data (GTK_OBJECT (rule), "part", part);
+ /*gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);*/
+ gtk_signal_connect (GTK_OBJECT (remove), "clicked", less_parts, data);
+ gtk_table_attach (GTK_TABLE (data->parts), remove, 1, 2, row, row + 1,
+ 0, 0, 0, 0);
+ gtk_widget_show (remove);
}
static void
more_parts (GtkWidget *button, struct _rule_data *data)
{
FilterPart *new;
- GtkWidget *w;
/* create a new rule entry, use the first type of rule */
new = filter_context_next_action ((FilterContext *)data->f, NULL);
if (new) {
+ GtkWidget *w;
+ guint16 rows;
+
new = filter_part_clone (new);
filter_filter_add_action ((FilterFilter *)data->fr, new);
w = get_rule_part_widget (data->f, new, data->fr);
- gtk_box_pack_start (GTK_BOX (data->parts), w, FALSE, FALSE, 0);
- }
-
- /* set the "Remove action" button sensitive */
- if (g_list_length (((FilterFilter *)data->fr)->actions) > 1) {
- w = gtk_object_get_data (GTK_OBJECT (button), "remove");
- gtk_widget_set_sensitive (w, TRUE);
+
+ rows = GTK_TABLE (data->parts)->nrows;
+ gtk_table_resize (GTK_TABLE (data->parts), rows + 1, 2);
+ attach_rule (w, data, new, rows);
}
}
@@ -413,7 +430,7 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
GtkWidget *widget;
GtkWidget *parts, *inframe;
GtkWidget *hbox;
- GtkWidget *add, *remove, *pixmap;
+ GtkWidget *add, *pixmap;
GtkWidget *w;
GtkWidget *frame;
GtkWidget *scrolledwindow;
@@ -422,6 +439,7 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
FilterPart *part;
struct _rule_data *data;
FilterFilter *ff = (FilterFilter *)fr;
+ gint rows, i = 0;
widget = ((FilterRuleClass *)(parent_class))->get_widget (fr, f);
@@ -430,7 +448,8 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
inframe = gtk_vbox_new (FALSE, 3);
gtk_container_add (GTK_CONTAINER (frame), inframe);
- parts = gtk_vbox_new (FALSE, 3);
+ rows = g_list_length (ff->actions);
+ parts = gtk_table_new (rows, 2, FALSE);
data = g_malloc0 (sizeof (*data));
data->f = (FilterContext *)f;
data->fr = fr;
@@ -444,17 +463,6 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
gtk_signal_connect (GTK_OBJECT (add), "clicked", more_parts, data);
gtk_box_pack_start (GTK_BOX (hbox), add, FALSE, FALSE, 3);
- pixmap = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_REMOVE);
- remove = gnome_pixmap_button (pixmap, _("Remove action"));
- gtk_object_set_data (GTK_OBJECT (add), "remove", remove);
- gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);
- gtk_signal_connect (GTK_OBJECT (remove), "clicked", less_parts, data);
- gtk_box_pack_start (GTK_BOX (hbox), remove, FALSE, FALSE, 3);
-
- /* if we only have 1 action, then we can't remove any more so disable this */
- if (g_list_length (ff->actions) <= 1)
- gtk_widget_set_sensitive (remove, FALSE);
-
gtk_box_pack_start (GTK_BOX (inframe), hbox, FALSE, FALSE, 3);
l = ff->actions;
@@ -462,7 +470,7 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
part = l->data;
d(printf ("adding action %s\n", part->title));
w = get_rule_part_widget ((FilterContext *)f, part, fr);
- gtk_box_pack_start (GTK_BOX (parts), w, FALSE, FALSE, 3);
+ attach_rule (w, data, part, i++);
l = g_list_next (l);
}
diff --git a/filter/filter-rule.c b/filter/filter-rule.c
index 8ad3262136..71590b1302 100644
--- a/filter/filter-rule.c
+++ b/filter/filter-rule.c
@@ -443,6 +443,8 @@ option_activate (GtkMenuItem *item, struct _part_data *data)
data->partwidget = filter_part_get_widget (newpart);
if (data->partwidget)
gtk_box_pack_start (GTK_BOX (data->container), data->partwidget, FALSE, FALSE, 0);
+
+ gtk_object_set_data (GTK_OBJECT (data->container), "part", newpart);
}
static GtkWidget *
@@ -508,35 +510,48 @@ struct _rule_data {
static void
less_parts (GtkWidget *button, struct _rule_data *data)
{
- GList *l;
FilterPart *part;
- GtkWidget *w;
+ GtkWidget *rule;
- l = data->fr->parts;
- if (g_list_length (l) < 2)
+ if (g_list_length (data->fr->parts) < 2)
return;
- /* remove the last one from the list */
- l = g_list_last (l);
- part = l->data;
+ rule = gtk_object_get_data (GTK_OBJECT (button), "rule");
+ part = gtk_object_get_data (GTK_OBJECT (rule), "part");
+
+ /* remove the part from the list */
filter_rule_remove_part (data->fr, part);
gtk_object_unref (GTK_OBJECT (part));
/* and from the display */
- l = g_list_last (GTK_BOX (data->parts)->children);
- w = ((GtkBoxChild *) l->data)->widget;
- gtk_container_remove (GTK_CONTAINER (data->parts), w);
+ gtk_container_remove (GTK_CONTAINER (data->parts), rule);
+ gtk_container_remove (GTK_CONTAINER (data->parts), button);
+}
+
+static void
+attach_rule (GtkWidget *rule, struct _rule_data *data, FilterPart *part, int row)
+{
+ GtkWidget *remove;
+ GtkWidget *pixmap;
- /* if there's only 1 criterion, we can't remove anymore so set insensitive */
- if (g_list_length (data->fr->parts) <= 1)
- gtk_widget_set_sensitive (button, FALSE);
+ gtk_table_attach (GTK_TABLE (data->parts), rule, 0, 1, row, row + 1,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+ pixmap = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_REMOVE);
+ remove = gnome_pixmap_button (pixmap, _("Remove"));
+ gtk_object_set_data (GTK_OBJECT (remove), "rule", rule);
+ gtk_object_set_data (GTK_OBJECT (rule), "part", part);
+ /*gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);*/
+ gtk_signal_connect (GTK_OBJECT (remove), "clicked", less_parts, data);
+ gtk_table_attach (GTK_TABLE (data->parts), remove, 1, 2, row, row + 1,
+ 0, 0, 0, 0);
+ gtk_widget_show (remove);
}
static void
more_parts (GtkWidget *button, struct _rule_data *data)
{
FilterPart *new;
- GtkWidget *w;
/* first make sure that the last part is ok */
if (data->fr->parts) {
@@ -552,16 +567,16 @@ more_parts (GtkWidget *button, struct _rule_data *data)
/* create a new rule entry, use the first type of rule */
new = rule_context_next_part (data->f, NULL);
if (new) {
+ GtkWidget *w;
+ int rows;
+
new = filter_part_clone (new);
filter_rule_add_part (data->fr, new);
w = get_rule_part_widget (data->f, new, data->fr);
- gtk_box_pack_start (GTK_BOX (data->parts), w, FALSE, FALSE, 0);
- }
-
- /* set the "Remove criterion" button sensitive */
- if (g_list_length (data->fr->parts) > 1) {
- w = gtk_object_get_data (GTK_OBJECT (button), "remove");
- gtk_widget_set_sensitive (w, TRUE);
+
+ rows = GTK_TABLE (data->parts)->nrows;
+ gtk_table_resize (GTK_TABLE (data->parts), rows + 1, 2);
+ attach_rule (w, data, new, rows);
}
}
@@ -583,7 +598,7 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
{
GtkWidget *vbox, *parts, *inframe;
GtkWidget *hbox;
- GtkWidget *add, *remove, *pixmap;
+ GtkWidget *add, *pixmap;
GtkWidget *w;
GtkWidget *menu, *item, *omenu;
GtkWidget *frame;
@@ -594,6 +609,7 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
GList *l;
FilterPart *part;
struct _rule_data *data;
+ gint rows, i = 0;
/* this stuff should probably be a table, but the
rule parts need to be a vbox */
@@ -623,8 +639,9 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
inframe = gtk_vbox_new (FALSE, 3);
gtk_container_add (GTK_CONTAINER (frame), inframe);
- /* this is the parts list, it should probably be inside a scrolling list */
- parts = gtk_vbox_new (FALSE, 3);
+ /* this is the parts table, it should probably be inside a scrolling list */
+ rows = g_list_length (fr->parts);
+ parts = gtk_table_new (rows, 2, FALSE);
/* data for the parts part of the display */
data = g_malloc0 (sizeof (*data));
@@ -661,17 +678,6 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
gtk_signal_connect (GTK_OBJECT (add), "clicked", more_parts, data);
gtk_box_pack_start (GTK_BOX (hbox), add, FALSE, FALSE, 3);
- pixmap = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_REMOVE);
- remove = gnome_pixmap_button (pixmap, _("Remove criterion"));
- gtk_object_set_data (GTK_OBJECT (add), "remove", remove);
- gtk_button_set_relief (GTK_BUTTON (remove), GTK_RELIEF_NONE);
- gtk_signal_connect (GTK_OBJECT (remove), "clicked", less_parts, data);
- gtk_box_pack_start (GTK_BOX (hbox), remove, FALSE, FALSE, 3);
-
- /* if we only have 1 criterion, then we can't remove any more so disable this */
- if (g_list_length (fr->parts) <= 1)
- gtk_widget_set_sensitive (remove, FALSE);
-
gtk_box_pack_end (GTK_BOX (hbox), omenu, FALSE, FALSE, 0);
gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
@@ -680,8 +686,9 @@ get_widget (FilterRule *fr, struct _RuleContext *f)
l = fr->parts;
while (l) {
part = l->data;
+ d(printf ("adding rule %s\n", part->title));
w = get_rule_part_widget (f, part, fr);
- gtk_box_pack_start (GTK_BOX (parts), w, FALSE, FALSE, 3);
+ attach_rule (w, data, part, i++);
l = g_list_next (l);
}
diff --git a/filter/libfilter-i18n.h b/filter/libfilter-i18n.h
index 3bf6f96f4f..e561ee8071 100644
--- a/filter/libfilter-i18n.h
+++ b/filter/libfilter-i18n.h
@@ -1,40 +1,24 @@
/* Automatically generated. Do not edit. */
-char *s = N_("after");
char *s = N_("Assign Colour");
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_("Forward to Address");
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");
@@ -42,11 +26,27 @@ char *s = N_("Replied to");
char *s = N_("Score");
char *s = N_("Sender");
char *s = N_("Set Status");
-char *s = N_("sounds like");
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");