diff options
Diffstat (limited to 'widgets/misc/e-filter-bar.c')
-rw-r--r-- | widgets/misc/e-filter-bar.c | 94 |
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)); |