aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc/e-filter-bar.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc/e-filter-bar.c')
-rw-r--r--widgets/misc/e-filter-bar.c94
1 files changed, 27 insertions, 67 deletions
diff --git a/widgets/misc/e-filter-bar.c b/widgets/misc/e-filter-bar.c
index 6bc6d383e3..9ff4c55aa0 100644
--- a/widgets/misc/e-filter-bar.c
+++ b/widgets/misc/e-filter-bar.c
@@ -137,12 +137,19 @@ menubar_activated (ESearchBar *esb, int id, void *data)
EFilterBar *efb = (EFilterBar *)esb;
switch (id) {
+ case E_FILTERBAR_RESET_ID:
+ d(printf("Reset menu\n"));
+ efb->current_query = NULL;
+ e_search_bar_set_item_id (esb, efb->option_base);
+ e_search_bar_set_text (esb, NULL);
+ gtk_widget_set_sensitive (esb->entry, TRUE);
+ break;
case E_FILTERBAR_EDIT_ID:
if (!efb->save_dialogue) {
GnomeDialog *gd;
gd = (GnomeDialog *) rule_editor_new (efb->context, FILTER_SOURCE_INCOMING);
- efb->save_dialogue = (GtkWidget *) gd;
+ efb->save_dialogue = gd;
gtk_window_set_title (GTK_WINDOW (gd), _("Search Editor"));
gtk_signal_connect (GTK_OBJECT (gd), "clicked", full_rule_editor_clicked, efb);
gtk_signal_connect (GTK_OBJECT (gd), "destroy", rule_editor_destroyed, efb);
@@ -268,17 +275,6 @@ option_changed (ESearchBar *esb, void *data)
efb->setquery = FALSE;
}
-static void
-dup_item_no_subitems (ESearchBarItem *dest,
- const ESearchBarItem *src)
-{
- g_assert (src->subitems == NULL);
-
- dest->id = src->id;
- dest->text = g_strdup (src->text);
- dest->subitems = NULL;
-}
-
static GArray *
build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrArray *rules)
{
@@ -289,7 +285,6 @@ build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrA
ESearchBarItem item;
char *source;
GSList *gtksux = NULL;
- int num;
/* So gtk calls a signal again if you connect to it WHILE inside a changed event.
So this snot is to work around that shit fucked up situation */
@@ -300,42 +295,29 @@ build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrA
/* find a unique starting point for the id's of our items */
for (i = 0; items[i].id != -1; i++) {
- ESearchBarItem dup_item;
-
if (items[i].id >= id)
id = items[i].id + 1;
-
- dup_item_no_subitems (&dup_item, items + i);
- g_array_append_vals (menu, &dup_item, 1);
}
+ /* add the user menus */
+ g_array_append_vals (menu, items, i);
+
*start = id;
if (type == 0) {
+ /* and add ours */
+ item.id = 0;
+ item.text = NULL;
+ item.subitems = NULL;
+ g_array_append_vals (menu, &item, 1);
source = FILTER_SOURCE_INCOMING;
-
- /* Add a separator if there is at least one custom rule. */
- if (rule_context_next_rule (efb->context, rule, source) != NULL) {
- item.id = 0;
- item.text = NULL;
- item.subitems = NULL;
- g_array_append_vals (menu, &item, 1);
- }
} else {
source = FILTER_SOURCE_DEMAND;
}
-
- num = 1;
+
while ((rule = rule_context_next_rule (efb->context, rule, source))) {
item.id = id++;
-
- if (num <= 10) {
- item.text = g_strdup_printf ("_%d. %s", num % 10, rule->name);
- num ++;
- } else {
- item.text = g_strdup (rule->name);
- }
-
+ item.text = rule->name;
item.subitems = NULL;
g_array_append_vals (menu, &item, 1);
@@ -364,12 +346,8 @@ build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrA
/* always add on the advanced menu */
if (type == 1) {
- ESearchBarItem items[2] = { E_FILTERBAR_SEPARATOR, E_FILTERBAR_ADVANCED };
- ESearchBarItem dup_items[2];
-
- dup_item_no_subitems (&dup_items[0], &items[0]);
- dup_item_no_subitems (&dup_items[1], &items[1]);
- g_array_append_vals (menu, &dup_items, 2);
+ ESearchBarItem advanced_item = E_FILTERBAR_ADVANCED;
+ g_array_append_vals (menu, &advanced_item, 1);
}
item.id = -1;
@@ -381,23 +359,6 @@ build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrA
}
static void
-free_built_items (GArray *menu)
-{
- int i;
-
- for (i = 0; i < menu->len; i ++) {
- ESearchBarItem *item;
-
- item = & g_array_index (menu, ESearchBarItem, i);
- g_free (item->text);
-
- g_assert (item->subitems == NULL);
- }
-
- g_array_free (menu, TRUE);
-}
-
-static void
generate_menu (ESearchBar *esb, ESearchBarItem *items)
{
EFilterBar *efb = (EFilterBar *)esb;
@@ -405,7 +366,7 @@ generate_menu (ESearchBar *esb, ESearchBarItem *items)
menu = build_items (esb, items, 0, &efb->menu_base, efb->menu_rules);
((ESearchBarClass *)parent_class)->set_menu (esb, (ESearchBarItem *)menu->data);
- free_built_items (menu);
+ g_array_free (menu, TRUE);
}
static ESearchBarSubitem *
@@ -482,7 +443,7 @@ set_option (ESearchBar *esb, ESearchBarItem *items)
menu = build_items (esb, items, 1, &efb->option_base, efb->option_rules);
((ESearchBarClass *)parent_class)->set_option (esb, (ESearchBarItem *)menu->data);
- free_built_items (menu);
+ g_array_free (menu, TRUE);
e_search_bar_set_item_id (esb, efb->option_base);
}
@@ -499,6 +460,8 @@ context_changed (RuleContext *context, gpointer user_data)
static void
context_rule_removed (RuleContext *context, FilterRule *rule, gpointer user_data)
{
+ EFilterBar *efb = E_FILTER_BAR (user_data);
+
/*gtk_signal_disconnect_by_func((GtkObject *)rule, rule_changed, efb);*/
}
@@ -634,17 +597,14 @@ init (EFilterBar *efb)
/* Object construction. */
EFilterBar *
-e_filter_bar_new (RuleContext *context,
- const char *systemrules,
- const char *userrules,
- EFilterBarConfigRule config,
- void *data)
+e_filter_bar_new (RuleContext *context, const char *systemrules, const char *userrules,
+ EFilterBarConfigRule config, void *data)
{
EFilterBar *bar;
ESearchBarItem item = { NULL, -1, NULL };
bar = gtk_type_new (e_filter_bar_get_type ());
-
+
bar->context = context;
gtk_object_ref (GTK_OBJECT (context));