Don't add the menu item here, do this in the context_changed signal

2001-10-23  Jeffrey Stedfast  <fejj@ximian.com>

	* e-filter-bar.c (rule_editor_clicked): Don't add the menu item
	here, do this in the context_changed signal callback instead.
	(context_changed): rebuild the search menu.
	(set_menu): Copy the items into a default_items list so we can
	regenerate the menu when something changes. Then call
	generate_menu().
	(generate_menu): Do what set_menu() used to do.
	(e_filter_bar_new): Don't do a rule_context_load() anymore since
	we don't need to.
	(destroy): free the default_items list.

svn path=/trunk/; revision=13975
This commit is contained in:
Jeffrey Stedfast
2001-10-24 03:47:10 +00:00
committed by Jeffrey Stedfast
parent ce6360e786
commit 5c99202e0b
3 changed files with 115 additions and 28 deletions

View File

@ -1,3 +1,16 @@
2001-10-23 Jeffrey Stedfast <fejj@ximian.com>
* e-filter-bar.c (rule_editor_clicked): Don't add the menu item
here, do this in the context_changed signal callback instead.
(context_changed): rebuild the search menu.
(set_menu): Copy the items into a default_items list so we can
regenerate the menu when something changes. Then call
generate_menu().
(generate_menu): Do what set_menu() used to do.
(e_filter_bar_new): Don't do a rule_context_load() anymore since
we don't need to.
(destroy): free the default_items list.
2001-10-23 Damon Chaplin <damon@ximian.com>
* e-search-bar.c (copy_subitems): copy the translate field over as

View File

@ -85,7 +85,6 @@ static void
rule_editor_clicked (GtkWidget *dialog, int button, void *data)
{
EFilterBar *efb = data;
ESearchBarItem item;
FilterRule *rule;
switch (button) {
@ -95,16 +94,9 @@ rule_editor_clicked (GtkWidget *dialog, int button, void *data)
if (!filter_rule_validate (rule))
return;
item.text = rule->name;
item.id = efb->menu_base + efb->menu_rules->len;
item.subitems = NULL;
g_ptr_array_add (efb->menu_rules, rule);
rule_context_add_rule (efb->context, rule);
/* FIXME: check return */
rule_context_save (efb->context, efb->userrules);
e_search_bar_add_menu ((ESearchBar *)efb, &item);
}
case 1:
gnome_dialog_close (GNOME_DIALOG (dialog));
@ -118,7 +110,7 @@ rule_advanced_clicked (GtkWidget *dialog, int button, void *data)
{
EFilterBar *efb = data;
FilterRule *rule;
switch (button) {
case 0: /* 'ok' */
case 1:
@ -154,7 +146,7 @@ menubar_activated (ESearchBar *esb, int id, void *data)
if (!efb->save_dialogue) {
GnomeDialog *gd;
gd = (GnomeDialog *) rule_editor_new (efb->context, NULL);
gd = (GnomeDialog *) rule_editor_new (efb->context, FILTER_SOURCE_INCOMING);
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);
@ -334,12 +326,11 @@ build_items (ESearchBar *esb, ESearchBarItem *items, int type, int *start, GPtrA
return menu;
}
/* Virtual methods */
static void
set_menu (ESearchBar *esb, ESearchBarItem *items)
generate_menu (ESearchBar *esb, ESearchBarItem *items)
{
GArray *menu;
EFilterBar *efb = (EFilterBar *)esb;
GArray *menu;
g_ptr_array_set_size (efb->menu_rules, 0);
menu = build_items (esb, items, 0, &efb->menu_base, efb->menu_rules);
@ -347,6 +338,72 @@ set_menu (ESearchBar *esb, ESearchBarItem *items)
g_array_free (menu, TRUE);
}
static ESearchBarSubitem *
copy_subitems (ESearchBarSubitem *subitems)
{
ESearchBarSubitem *items;
int i, num;
for (num = 0; subitems[num].id != -1; num++)
;
items = g_new (ESearchBarSubitem, num + 1);
for (i = 0; i < num + 1; i++) {
items[i].text = g_strdup (subitems[i].text);
items[i].id = subitems[i].id;
items[i].translate = subitems[i].translate;
}
return items;
}
static void
free_items (ESearchBarItem *items)
{
int i, j;
for (i = 0; items[i].id != -1; i++) {
g_free (items[i].text);
if (items[i].subitems) {
for (j = 0; items[i].subitems[j].id != -1; j++)
g_free (items[i].subitems[j].text);
g_free (items[i].subitems);
}
}
g_free (items);
}
/* Virtual methods */
static void
set_menu (ESearchBar *esb, ESearchBarItem *items)
{
EFilterBar *efb = E_FILTER_BAR (esb);
ESearchBarItem *default_items;
int i, num;
if (efb->default_items)
free_items (efb->default_items);
for (num = 0; items[num].id != -1; num++)
;
default_items = g_new (ESearchBarItem, num + 1);
for (i = 0; i < num + 1; i++) {
default_items[i].text = g_strdup (items[i].text);
default_items[i].id = items[i].id;
if (items[i].subitems)
default_items[i].subitems = copy_subitems (items[i].subitems);
else
default_items[i].subitems = NULL;
}
efb->default_items = default_items;
generate_menu (esb, default_items);
}
static void
set_option (ESearchBar *esb, ESearchBarItem *items)
{
@ -359,6 +416,15 @@ set_option (ESearchBar *esb, ESearchBarItem *items)
g_array_free (menu, TRUE);
}
static void
context_changed (RuleContext *context, gpointer user_data)
{
EFilterBar *efb = E_FILTER_BAR (user_data);
ESearchBar *esb = E_SEARCH_BAR (user_data);
generate_menu (esb, efb->default_items);
}
/* GtkObject methods. */
@ -392,10 +458,13 @@ destroy (GtkObject *object)
bar = E_FILTER_BAR (object);
gtk_object_unref (GTK_OBJECT (bar->context));
g_free (bar->userrules);
g_free (bar->systemrules);
g_ptr_array_free (bar->menu_rules, TRUE);
g_ptr_array_free (bar->option_rules, TRUE);
g_free (bar->systemrules);
g_free (bar->userrules);
if (bar->default_items)
free_items (bar->default_items);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
@ -466,15 +535,18 @@ e_filter_bar_new (RuleContext *context, const char *systemrules, const char *use
bar->context = context;
gtk_object_ref (GTK_OBJECT (context));
bar->systemrules = g_strdup (systemrules);
bar->userrules = g_strdup (userrules);
rule_context_load (context, systemrules, userrules);
bar->config = config;
bar->config_data = data;
bar->systemrules = g_strdup (systemrules);
bar->userrules = g_strdup (userrules);
e_search_bar_construct ((ESearchBar *)bar, &item, &item);
gtk_signal_connect (GTK_OBJECT (context), "changed",
context_changed, bar);
return bar;
}

View File

@ -53,22 +53,23 @@ typedef struct _EFilterBarClass EFilterBarClass;
typedef void (*EFilterBarConfigRule)(EFilterBar *, FilterRule *rule, int id, const char *query, void *data);
struct _EFilterBar
{
struct _EFilterBar {
ESearchBar parent;
int menu_base, option_base;
GPtrArray *menu_rules, *option_rules;
ESearchBarItem *default_items;
GtkWidget *save_dialogue; /* current save dialogue (so we dont pop up multiple ones) */
FilterRule *current_query; /* as it says */
int setquery; /* true when we're setting a query directly to advanced, so dont popup the dialogue */
RuleContext *context;
char *systemrules;
char *userrules;
EFilterBarConfigRule config;
void *config_data;
};
@ -105,9 +106,10 @@ const char * strings[] = {
};
#endif
GtkType e_filter_bar_get_type (void);
EFilterBar*e_filter_bar_new (RuleContext *, const char *sys, const char *user, EFilterBarConfigRule config, void *data);
GtkType e_filter_bar_get_type (void);
EFilterBar *e_filter_bar_new (RuleContext *context, const char *systemrules, const char *userrules,
EFilterBarConfigRule config, void *data);
#ifdef __cplusplus
}