diff options
author | Guy Harris <guy@alum.mit.edu> | 2001-01-02 01:32:21 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2001-01-02 01:32:21 +0000 |
commit | 88d157ef96f4d17df2a718523a53cd5e717aa76a (patch) | |
tree | d3a1e2dec9c0891b2089916f71da1b1b83797568 /gtk/filter_prefs.c | |
parent | d2f2cc6bf6b80f113c50c5ed75a5918c6390c7be (diff) |
Add a dialog box for constructing expressions that test a field in the
display tree, based on Jeff Foster's dialog box for selecting fields.
Make the dialog box for browsing filters into a dialog box for
constructing filters; make the "Apply" button and the "OK" button apply
the filter in the text entry box in the dialog, not the currently
selected filter (selecting a filter puts it in that text entry box, but
the user may edit it afterwards, or may use the aforementioned dialog
box to construct a filter not in the list).
Get rid of extra declarations of "m_r_font" and "m_b_font" in
"proto_draw.c"; they're declared in "gtk/gtkglobals.h", which it includes.
svn path=/trunk/; revision=2805
Diffstat (limited to 'gtk/filter_prefs.c')
-rw-r--r-- | gtk/filter_prefs.c | 597 |
1 files changed, 346 insertions, 251 deletions
diff --git a/gtk/filter_prefs.c b/gtk/filter_prefs.c index 565b6e0bce..726cb6ffef 100644 --- a/gtk/filter_prefs.c +++ b/gtk/filter_prefs.c @@ -3,7 +3,7 @@ * (This used to be a notebook page under "Preferences", hence the * "prefs" in the file name.) * - * $Id: filter_prefs.c,v 1.19 2000/10/25 16:06:50 gram Exp $ + * $Id: filter_prefs.c,v 1.20 2001/01/02 01:32:21 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -55,6 +55,7 @@ #include "dlg_utils.h" #include "ui_util.h" #include "prefs_dlg.h" +#include "dfilter_expr_dlg.h" #define E_FILT_NAME_KEY "filter_name" #define E_FILT_LBL_KEY "filter_label" @@ -74,28 +75,28 @@ typedef struct _filter_cb_data { } filter_cb_data; -static GtkWidget *filter_l, *chg_bt, *copy_bt, *del_bt, *name_te, *filter_te, *apply_bt; +static GtkWidget *filter_l, *chg_bt, *copy_bt, *del_bt, *name_te, *filter_te; static GList *fl = NULL; static void get_filter_list(void); static GtkWidget *filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, - gboolean wants_apply_button); -static void filter_dlg_ok(GtkWidget *ok_bt, gpointer parent_w); -static void filter_dlg_save(GtkWidget *save_bt, gpointer parent_w); -static void filter_dlg_cancel(GtkWidget *cancel_bt, gpointer parent_w); + gboolean wants_apply_button, gboolean wants_add_expression_button); +static void filter_dlg_dclick(GtkWidget *dummy, gpointer main_w_arg); +static void filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer main_w_arg); +static void filter_dlg_apply_cb(GtkWidget *apply_bt, gpointer main_w_arg); +static void filter_dlg_save_cb(GtkWidget *save_bt, gpointer parent_w); +static void filter_dlg_cancel_cb(GtkWidget *cancel_bt, gpointer parent_w); static void filter_dlg_destroy(GtkWidget *win, gpointer data); -static void filter_sel_apply_cb(GtkWidget *cancel_bt, gpointer parent_w); -static GtkWidget *filter_prefs_show(GtkWidget *, gboolean, - GtkSignalFunc, GtkObject *); +static gint filter_sel_list_button_cb(GtkWidget *, GdkEventButton *, + gpointer); static void filter_sel_list_cb(GtkWidget *, gpointer); static void filter_sel_new_cb(GtkWidget *, gpointer); static void filter_sel_chg_cb(GtkWidget *, gpointer); static void filter_sel_copy_cb(GtkWidget *, gpointer); static void filter_sel_del_cb(GtkWidget *, gpointer); -static void filter_prefs_ok(GtkWidget *); +static void filter_expr_cb(GtkWidget *, gpointer); static void filter_prefs_save(GtkWidget *); -static void filter_prefs_cancel(GtkWidget *); static void filter_prefs_delete(GtkWidget *); #define FILTER_LINE_SIZE 2048 @@ -162,20 +163,72 @@ get_filter_list(void) arrange that if a change is made to the filter list, other dialog boxes get updated appropriately? */ -/* Create a filter dialog for browsing; this is to be used as a callback - for a button next to a text entry box, which, when clicked, allows - you to browse through the list of filters to select one to be put - into the text entry box, and, if you select a filter with this - dialog box, enters the text of the filter into a text entry box - associated with the button. - - If "wants_apply_button" is non-null, hitting <Enter> in the text entry - box causes the filter in that box to be applied to something, so - the filter dialog should have an "Apply" button that causes the - selected filter to be put into the text entry box and the text - entry box activated; otherwise, no "Apply" button need apply. */ +/* Create a filter dialog for constructing a capture filter. + + This is to be used as a callback for a button next to a text entry box, + which, when clicked, pops up this dialog to allow you to construct a + display filter by browsing the list of saved filters (the dialog + for constructing expressions assumes display filter syntax, not + capture filter syntax). The "OK" button sets the text entry box to the + constructed filter and activates that text entry box (which should have + no effect in the main capture dialog); this dialog is then dismissed. + + XXX - we probably want to have separate capture and display filter + lists, but we don't yet have that, so the list of filters this + shows is a list of all filters. */ +void +capture_filter_construct_cb(GtkWidget *w, gpointer user_data) +{ + GtkWidget *caller = gtk_widget_get_toplevel(w); + GtkWidget *filter_browse_w; + GtkWidget *filter_te; + + /* Has a filter dialog box already been opened for that top-level + widget? */ + filter_browse_w = gtk_object_get_data(GTK_OBJECT(caller), + E_FILT_DIALOG_PTR_KEY); + + if (filter_browse_w != NULL) { + /* Yes. Just re-activate that dialog box. */ + reactivate_window(filter_browse_w); + return; + } + + /* No. Get the text entry attached to the button. */ + filter_te = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); + + /* Now create a new dialog, without either an "Apply" or "Add + Expression..." button. */ + filter_browse_w = filter_dialog_new(caller, filter_te, FALSE, FALSE); + + /* Set the E_FILT_CALLER_PTR_KEY for the new dialog to point to + our caller. */ + gtk_object_set_data(GTK_OBJECT(filter_browse_w), E_FILT_CALLER_PTR_KEY, + caller); + + /* Set the E_FILT_DIALOG_PTR_KEY for the caller to point to us */ + gtk_object_set_data(GTK_OBJECT(caller), E_FILT_DIALOG_PTR_KEY, + filter_browse_w); +} + +/* Create a filter dialog for constructing a display filter. + + This is to be used as a callback for a button next to a text entry box, + which, when clicked, pops up this dialog to allow you to construct a + display filter by browsing the list of saved filters and/or by adding + test expressions constructed with another dialog. The "OK" button + sets the text entry box to the constructed filter and activates that + text entry box, causing the filter to be used; this dialog is then + dismissed. + + If "wants_apply_button" is non-null, we add an "Apply" button that + acts like "OK" but doesn't dismiss this dialog. + + XXX - we probably want to have separate capture and display filter + lists, but we don't yet have that, so the list of filters this + shows is a list of all filters. */ void -filter_browse_cb(GtkWidget *w, gpointer wants_apply_button) +display_filter_construct_cb(GtkWidget *w, gpointer wants_apply_button) { GtkWidget *caller = gtk_widget_get_toplevel(w); GtkWidget *filter_browse_w; @@ -195,9 +248,10 @@ filter_browse_cb(GtkWidget *w, gpointer wants_apply_button) /* No. Get the text entry attached to the button. */ filter_te = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); - /* Now create a new dialog. */ + /* Now create a new dialog, possibly with an "Apply" button, and + definitely with an "Add Expression..." button. */ filter_browse_w = filter_dialog_new(caller, filter_te, - (wants_apply_button != NULL)); + (wants_apply_button != NULL), TRUE); /* Set the E_FILT_CALLER_PTR_KEY for the new dialog to point to our caller. */ @@ -216,8 +270,6 @@ static GtkWidget *global_filter_w; void filter_dialog_cb(GtkWidget *w) { - GtkWidget *filter_te; - /* Has a filter dialog box already been opened for editing? */ if (global_filter_w != NULL) { /* Yes. Just reactivate it. */ @@ -225,23 +277,41 @@ filter_dialog_cb(GtkWidget *w) return; } - /* No. Create one. */ - /* But first, get the text entry attached to the button. */ - filter_te = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); - global_filter_w = filter_dialog_new(NULL, filter_te, TRUE); + /* + * No. Create one; we didn't pop this up as a result of pressing + * a button next to some text entry field, so don't associate it + * with a text entry field. + */ + global_filter_w = filter_dialog_new(NULL, NULL, FALSE, TRUE); } static GtkWidget * -filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, - gboolean wants_apply_button) +filter_dialog_new(GtkWidget *caller, GtkWidget *parent_filter_te, + gboolean wants_apply_button, gboolean wants_add_expression_button) { - GtkWidget *main_w, /* main window */ - *main_vb, /* main container */ - *bbox, /* button container */ - *ok_bt, /* ok button */ - *save_bt, /* save button */ - *cancel_bt; /* cancel button */ - GtkWidget *filter_pg = NULL; /* filter settings box */ + GtkWidget *main_w, /* main window */ + *main_vb, /* main container */ + *bbox, /* button container */ + *ok_bt, /* "OK" button */ + *apply_bt, /* "Apply" button */ + *save_bt, /* "Save" button */ + *cancel_bt; /* "Cancel" button */ + GtkWidget *filter_pg = NULL; /* filter settings box */ + GtkWidget *top_hb, + *list_bb, + *new_bt, + *filter_sc, + *nl_item, + *nl_lb, + *middle_hb, + *name_lb, + *bottom_hb, + *filter_lb, + *add_expression_bt; + GtkWidget *l_select = NULL; + GList *flp = NULL; + filter_def *filt; + gchar *filter_te_str = NULL; main_w = dlg_window_new("Ethereal: Filters"); @@ -255,11 +325,142 @@ filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, gtk_container_add(GTK_CONTAINER(main_w), main_vb); gtk_widget_show(main_vb); - filter_pg = filter_prefs_show(filter_te, wants_apply_button, - GTK_SIGNAL_FUNC(filter_dlg_ok), - GTK_OBJECT(main_w)); + /* Make sure everything is set up */ + get_filter_list(); + if (parent_filter_te) + filter_te_str = gtk_entry_get_text(GTK_ENTRY(parent_filter_te)); + + /* Container for each row of widgets */ + filter_pg = gtk_vbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(filter_pg), 5); + gtk_widget_show(filter_pg); + gtk_object_set_data(GTK_OBJECT(filter_pg), E_FILT_CM_KEY, (gpointer)FALSE); + + /* Top row: Filter list and buttons */ + top_hb = gtk_hbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(filter_pg), top_hb); + gtk_widget_show(top_hb); + + list_bb = gtk_vbutton_box_new(); + gtk_button_box_set_layout (GTK_BUTTON_BOX (list_bb), GTK_BUTTONBOX_START); + gtk_container_add(GTK_CONTAINER(top_hb), list_bb); + gtk_widget_show(list_bb); + + new_bt = gtk_button_new_with_label ("New"); + gtk_signal_connect(GTK_OBJECT(new_bt), "clicked", + GTK_SIGNAL_FUNC(filter_sel_new_cb), NULL); + gtk_container_add(GTK_CONTAINER(list_bb), new_bt); + gtk_widget_show(new_bt); + + chg_bt = gtk_button_new_with_label ("Change"); + gtk_widget_set_sensitive(chg_bt, FALSE); + gtk_signal_connect(GTK_OBJECT(chg_bt), "clicked", + GTK_SIGNAL_FUNC(filter_sel_chg_cb), NULL); + gtk_container_add(GTK_CONTAINER(list_bb), chg_bt); + gtk_widget_show(chg_bt); + + copy_bt = gtk_button_new_with_label ("Copy"); + gtk_widget_set_sensitive(copy_bt, FALSE); + gtk_signal_connect(GTK_OBJECT(copy_bt), "clicked", + GTK_SIGNAL_FUNC(filter_sel_copy_cb), NULL); + gtk_container_add(GTK_CONTAINER(list_bb), copy_bt); + gtk_widget_show(copy_bt); + + del_bt = gtk_button_new_with_label ("Delete"); + gtk_widget_set_sensitive(del_bt, FALSE); + gtk_signal_connect(GTK_OBJECT(del_bt), "clicked", + GTK_SIGNAL_FUNC(filter_sel_del_cb), NULL); + gtk_container_add(GTK_CONTAINER(list_bb), del_bt); + gtk_widget_show(del_bt); + + if (wants_add_expression_button) { + /* Create the "Add Expression..." button, to pop up a dialog + for constructing filter comparison expressions. */ + add_expression_bt = gtk_button_new_with_label("Add Expression..."); + gtk_signal_connect(GTK_OBJECT(add_expression_bt), "clicked", + GTK_SIGNAL_FUNC(filter_expr_cb), main_w); + gtk_container_add(GTK_CONTAINER(list_bb), add_expression_bt); + gtk_widget_show(add_expression_bt); + } + + filter_sc = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(filter_sc), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_set_usize(filter_sc, 250, 150); + gtk_container_add(GTK_CONTAINER(top_hb), filter_sc); + gtk_widget_show(filter_sc); + + filter_l = gtk_list_new(); + gtk_list_set_selection_mode(GTK_LIST(filter_l), GTK_SELECTION_SINGLE); + gtk_signal_connect(GTK_OBJECT(filter_l), "selection_changed", + GTK_SIGNAL_FUNC(filter_sel_list_cb), filter_pg); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(filter_sc), + filter_l); + gtk_widget_show(filter_l); + + gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLFUNC_KEY, filter_dlg_dclick); + gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLARG_KEY, main_w); + + flp = g_list_first(fl); + while (flp) { + filt = (filter_def *) flp->data; + nl_lb = gtk_label_new(filt->name); + nl_item = gtk_list_item_new(); + + gtk_signal_connect(GTK_OBJECT(nl_item), "button_press_event", + GTK_SIGNAL_FUNC(filter_sel_list_button_cb), filter_l); + + gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5); + gtk_container_add(GTK_CONTAINER(nl_item), nl_lb); + gtk_widget_show(nl_lb); + gtk_container_add(GTK_CONTAINER(filter_l), nl_item); + gtk_widget_show(nl_item); + gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LBL_KEY, nl_lb); + gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_NAME_KEY, flp); + + if (filter_te_str && filt->strval) { + if (strcmp(filter_te_str, filt->strval) == 0) + l_select = nl_item; + } + + flp = flp->next; + } + + /* Middle row: Filter name entry */ + middle_hb = gtk_hbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(filter_pg), middle_hb); + gtk_widget_show(middle_hb); + + name_lb = gtk_label_new("Filter name:"); + gtk_box_pack_start(GTK_BOX(middle_hb), name_lb, FALSE, FALSE, 3); + gtk_widget_show(name_lb); + + name_te = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(middle_hb), name_te, TRUE, TRUE, 3); + gtk_widget_show(name_te); + + /* Bottom row: Filter text entry */ + bottom_hb = gtk_hbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(filter_pg), bottom_hb); + gtk_widget_show(bottom_hb); + + filter_lb = gtk_label_new("Filter string:"); + gtk_box_pack_start(GTK_BOX(bottom_hb), filter_lb, FALSE, FALSE, 3); + gtk_widget_show(filter_lb); + + filter_te = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(bottom_hb), filter_te, TRUE, TRUE, 3); + gtk_widget_show(filter_te); + + if (l_select) { + gtk_list_select_child(GTK_LIST(filter_l), l_select); + } else if (filter_te_str && filter_te_str[0]) { + gtk_entry_set_text(GTK_ENTRY(name_te), "New filter"); + gtk_entry_set_text(GTK_ENTRY(filter_te), filter_te_str); + } + gtk_box_pack_start(GTK_BOX(main_vb), filter_pg, TRUE, TRUE, 0); - gtk_object_set_data(GTK_OBJECT(filter_pg), E_FILT_TE_PTR_KEY, filter_te); + gtk_object_set_data(GTK_OBJECT(filter_pg), E_FILT_TE_PTR_KEY, parent_filter_te); gtk_object_set_data(GTK_OBJECT(main_w), E_FILTER_WIDGET_KEY, filter_pg); bbox = gtk_hbutton_box_new(); @@ -270,27 +471,37 @@ filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, ok_bt = gtk_button_new_with_label ("OK"); gtk_signal_connect(GTK_OBJECT(ok_bt), "clicked", - GTK_SIGNAL_FUNC(filter_dlg_ok), GTK_OBJECT(main_w)); + GTK_SIGNAL_FUNC(filter_dlg_ok_cb), main_w); GTK_WIDGET_SET_FLAGS(ok_bt, GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bbox), ok_bt, TRUE, TRUE, 0); + gtk_object_set_data(GTK_OBJECT(main_w), E_FILT_TE_KEY, filter_te); gtk_widget_grab_default(ok_bt); gtk_widget_show(ok_bt); + if (wants_apply_button) { + apply_bt = gtk_button_new_with_label ("Apply"); + gtk_signal_connect(GTK_OBJECT(apply_bt), "clicked", + GTK_SIGNAL_FUNC(filter_dlg_apply_cb), main_w); + GTK_WIDGET_SET_FLAGS(apply_bt, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), apply_bt, TRUE, TRUE, 0); + gtk_widget_show(apply_bt); + } + save_bt = gtk_button_new_with_label ("Save"); gtk_signal_connect(GTK_OBJECT(save_bt), "clicked", - GTK_SIGNAL_FUNC(filter_dlg_save), GTK_OBJECT(main_w)); + GTK_SIGNAL_FUNC(filter_dlg_save_cb), GTK_OBJECT(main_w)); GTK_WIDGET_SET_FLAGS(save_bt, GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bbox), save_bt, TRUE, TRUE, 0); gtk_widget_show(save_bt); cancel_bt = gtk_button_new_with_label ("Cancel"); gtk_signal_connect(GTK_OBJECT(cancel_bt), "clicked", - GTK_SIGNAL_FUNC(filter_dlg_cancel), GTK_OBJECT(main_w)); + GTK_SIGNAL_FUNC(filter_dlg_cancel_cb), GTK_OBJECT(main_w)); GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(bbox), cancel_bt, TRUE, TRUE, 0); gtk_widget_show(cancel_bt); - dlg_set_cancel(main_w, cancel_bt); + dlg_set_cancel(main_w, cancel_bt); gtk_widget_show(main_w); @@ -298,22 +509,96 @@ filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, } static void -filter_dlg_ok(GtkWidget *ok_bt, gpointer parent_w) +filter_dlg_dclick(GtkWidget *dummy, gpointer main_w_arg) { - filter_prefs_ok(gtk_object_get_data(GTK_OBJECT(parent_w), E_FILTER_WIDGET_KEY)); - gtk_widget_destroy(GTK_WIDGET(parent_w)); + GtkWidget *main_w = GTK_WIDGET(main_w_arg); + GtkWidget *w = gtk_object_get_data(GTK_OBJECT(main_w), E_FILTER_WIDGET_KEY); + GList *flp, *sl; + GtkObject *l_item; + filter_def *filt; + GtkWidget *mw_filt = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); + + if (mw_filt != NULL) { + /* + * We have a text entry widget associated with this dialog + * box; is one of the filters in the list selected? + */ + sl = GTK_LIST(filter_l)->selection; + if (sl != NULL) { + /* + * Yes. Put it in the text entry widget, and then + * activate that widget to cause the filter we + * put there to be applied. + */ + l_item = GTK_OBJECT(sl->data); + flp = (GList *) gtk_object_get_data(l_item, E_FILT_NAME_KEY); + if (flp) { + filt = (filter_def *) flp->data; + gtk_entry_set_text(GTK_ENTRY(mw_filt), + filt->strval); + gtk_signal_emit_by_name(GTK_OBJECT(mw_filt), + "activate"); + } + } + } + + filter_prefs_delete(w); + + gtk_widget_destroy(main_w); } static void -filter_dlg_save(GtkWidget *save_bt, gpointer parent_w) +filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer main_w_arg) +{ + GtkWidget *main_w = GTK_WIDGET(main_w_arg); + GtkWidget *w = gtk_object_get_data(GTK_OBJECT(main_w), E_FILTER_WIDGET_KEY); + + /* + * Apply the filter. + */ + filter_dlg_apply_cb(NULL, main_w_arg); + + /* + * Now dismiss the dialog box. + */ + filter_prefs_delete(w); + gtk_widget_destroy(main_w); +} + +static void +filter_dlg_apply_cb(GtkWidget *apply_bt, gpointer main_w_arg) +{ + GtkWidget *main_w = GTK_WIDGET(main_w_arg); + GtkWidget *w = gtk_object_get_data(GTK_OBJECT(main_w), E_FILTER_WIDGET_KEY); + GtkWidget *mw_filt = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); + GtkWidget *filter_te; + gchar *filter_string; + + if (mw_filt != NULL) { + /* + * We have a text entry widget associated with this dialog + * box; put the filter in our text entry widget into that + * text entry widget, and then activate that widget to + * cause the filter we put there to be applied. + */ + filter_te = gtk_object_get_data(GTK_OBJECT(main_w), + E_FILT_TE_KEY); + filter_string = gtk_entry_get_text(GTK_ENTRY(filter_te)); + gtk_entry_set_text(GTK_ENTRY(mw_filt), filter_string); + gtk_signal_emit_by_name(GTK_OBJECT(mw_filt), "activate"); + } +} + +static void +filter_dlg_save_cb(GtkWidget *save_bt, gpointer parent_w) { filter_prefs_save(gtk_object_get_data(GTK_OBJECT(parent_w), E_FILTER_WIDGET_KEY)); } static void -filter_dlg_cancel(GtkWidget *cancel_bt, gpointer parent_w) +filter_dlg_cancel_cb(GtkWidget *cancel_bt, gpointer parent_w) { - filter_prefs_cancel(gtk_object_get_data(GTK_OBJECT(parent_w), E_FILTER_WIDGET_KEY)); + filter_prefs_delete(gtk_object_get_data(GTK_OBJECT(parent_w), E_FILTER_WIDGET_KEY)); gtk_widget_destroy(GTK_WIDGET(parent_w)); } @@ -362,158 +647,6 @@ filter_sel_list_button_cb (GtkWidget *widget, GdkEventButton *event, return FALSE; } -/* Create and display the filter selection widgets. */ -static GtkWidget * -filter_prefs_show(GtkWidget *w, gboolean wants_apply_button, - GtkSignalFunc func, GtkObject *func_arg) -{ - GtkWidget *main_vb, *top_hb, *list_bb, *new_bt, *filter_sc, - *nl_item, *nl_lb, *middle_hb, *name_lb, *bottom_hb, - *filter_lb; - GtkWidget *l_select = NULL; - GList *flp = NULL; - filter_def *filt; - gchar *filter_te_str = NULL; - - /* Make sure everything is set up */ - get_filter_list(); - if (w) - filter_te_str = gtk_entry_get_text(GTK_ENTRY(w)); - - /* Container for each row of widgets */ - main_vb = gtk_vbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(main_vb), 5); - gtk_widget_show(main_vb); - gtk_object_set_data(GTK_OBJECT(main_vb), E_FILT_CM_KEY, (gpointer)FALSE); - - /* Top row: Filter list and buttons */ - top_hb = gtk_hbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(main_vb), top_hb); - gtk_widget_show(top_hb); - - list_bb = gtk_vbutton_box_new(); - gtk_button_box_set_layout (GTK_BUTTON_BOX (list_bb), GTK_BUTTONBOX_START); - gtk_container_add(GTK_CONTAINER(top_hb), list_bb); - gtk_widget_show(list_bb); - - new_bt = gtk_button_new_with_label ("New"); - gtk_signal_connect(GTK_OBJECT(new_bt), "clicked", - GTK_SIGNAL_FUNC(filter_sel_new_cb), NULL); - gtk_container_add(GTK_CONTAINER(list_bb), new_bt); - gtk_widget_show(new_bt); - - chg_bt = gtk_button_new_with_label ("Change"); - gtk_widget_set_sensitive(chg_bt, FALSE); - gtk_signal_connect(GTK_OBJECT(chg_bt), "clicked", - GTK_SIGNAL_FUNC(filter_sel_chg_cb), NULL); - gtk_container_add(GTK_CONTAINER(list_bb), chg_bt); - gtk_widget_show(chg_bt); - - copy_bt = gtk_button_new_with_label ("Copy"); - gtk_widget_set_sensitive(copy_bt, FALSE); - gtk_signal_connect(GTK_OBJECT(copy_bt), "clicked", - GTK_SIGNAL_FUNC(filter_sel_copy_cb), NULL); - gtk_container_add(GTK_CONTAINER(list_bb), copy_bt); - gtk_widget_show(copy_bt); - - del_bt = gtk_button_new_with_label ("Delete"); - gtk_widget_set_sensitive(del_bt, FALSE); - gtk_signal_connect(GTK_OBJECT(del_bt), "clicked", - GTK_SIGNAL_FUNC(filter_sel_del_cb), NULL); - gtk_container_add(GTK_CONTAINER(list_bb), del_bt); - gtk_widget_show(del_bt); - - if (wants_apply_button) { - apply_bt = gtk_button_new_with_label("Apply"); - gtk_widget_set_sensitive(apply_bt, FALSE); - gtk_signal_connect(GTK_OBJECT(apply_bt), "clicked", - GTK_SIGNAL_FUNC(filter_sel_apply_cb), w); - gtk_container_add(GTK_CONTAINER(list_bb), apply_bt); - gtk_widget_show(apply_bt); - } else - apply_bt = NULL; - - filter_sc = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(filter_sc), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_widget_set_usize(filter_sc, 250, 150); - gtk_container_add(GTK_CONTAINER(top_hb), filter_sc); - gtk_widget_show(filter_sc); - - filter_l = gtk_list_new(); - gtk_list_set_selection_mode(GTK_LIST(filter_l), GTK_SELECTION_SINGLE); - gtk_signal_connect(GTK_OBJECT(filter_l), "selection_changed", - GTK_SIGNAL_FUNC(filter_sel_list_cb), main_vb); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(filter_sc), - filter_l); - gtk_widget_show(filter_l); - - gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLFUNC_KEY, func); - gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLARG_KEY, func_arg); - - flp = g_list_first(fl); - while (flp) { - filt = (filter_def *) flp->data; - nl_lb = gtk_label_new(filt->name); - nl_item = gtk_list_item_new(); - - gtk_signal_connect(GTK_OBJECT(nl_item), - "button_press_event", - GTK_SIGNAL_FUNC(filter_sel_list_button_cb), - filter_l); - - gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(nl_item), nl_lb); - gtk_widget_show(nl_lb); - gtk_container_add(GTK_CONTAINER(filter_l), nl_item); - gtk_widget_show(nl_item); - gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LBL_KEY, nl_lb); - gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_NAME_KEY, flp); - - if (filter_te_str && filt->strval) - if (strcmp(filter_te_str, filt->strval) == 0) - l_select = nl_item; - - flp = flp->next; - } - - /* Middle row: Filter name entry */ - middle_hb = gtk_hbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(main_vb), middle_hb); - gtk_widget_show(middle_hb); - - name_lb = gtk_label_new("Filter name:"); - gtk_box_pack_start(GTK_BOX(middle_hb), name_lb, FALSE, FALSE, 3); - gtk_widget_show(name_lb); - - name_te = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(middle_hb), name_te, TRUE, TRUE, 3); - gtk_widget_show(name_te); - - /* Bottom row: Filter text entry */ - bottom_hb = gtk_hbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(main_vb), bottom_hb); - gtk_widget_show(bottom_hb); - - filter_lb = gtk_label_new("Filter string:"); - gtk_box_pack_start(GTK_BOX(bottom_hb), filter_lb, FALSE, FALSE, 3); - gtk_widget_show(filter_lb); - - filter_te = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(bottom_hb), filter_te, TRUE, TRUE, 3); - gtk_widget_show(filter_te); - - if (l_select) - { - gtk_list_select_child(GTK_LIST(filter_l), l_select); - } else if (filter_te_str && filter_te_str[0]) { - gtk_entry_set_text(GTK_ENTRY(name_te), "New filter"); - gtk_entry_set_text(GTK_ENTRY(filter_te), filter_te_str); - } - - return(main_vb); -} - static void filter_sel_list_cb(GtkWidget *l, gpointer data) { filter_def *filt; @@ -546,8 +679,6 @@ filter_sel_list_cb(GtkWidget *l, gpointer data) { gtk_widget_set_sensitive(chg_bt, sensitivity); gtk_widget_set_sensitive(copy_bt, sensitivity); gtk_widget_set_sensitive(del_bt, sensitivity); - if (apply_bt != NULL) - gtk_widget_set_sensitive(apply_bt, sensitivity); } } @@ -667,44 +798,14 @@ filter_sel_del_cb(GtkWidget *w, gpointer data) { } } -void -filter_sel_apply_cb(GtkWidget *w, gpointer data) -{ - GList *flp, *sl; - GtkObject *l_item; - filter_def *filt; - GtkWidget *mw_filt = data; - - sl = GTK_LIST(filter_l)->selection; - if (sl != NULL && mw_filt != NULL) { /* Place something in the filter box. */ - l_item = GTK_OBJECT(sl->data); - flp = (GList *) gtk_object_get_data(l_item, E_FILT_NAME_KEY); - if (flp) { - filt = (filter_def *) flp->data; - gtk_entry_set_text(GTK_ENTRY(mw_filt), filt->strval); - gtk_signal_emit_by_name(GTK_OBJECT(mw_filt), "activate"); - } - } -} - static void -filter_prefs_ok(GtkWidget *w) { - GList *flp, *sl; - GtkObject *l_item; - filter_def *filt; - GtkWidget *mw_filt = gtk_object_get_data(GTK_OBJECT(w), E_FILT_TE_PTR_KEY); - - sl = GTK_LIST(filter_l)->selection; - if (sl && mw_filt) { /* Place something in the filter box. */ - l_item = GTK_OBJECT(sl->data); - flp = (GList *) gtk_object_get_data(l_item, E_FILT_NAME_KEY); - if (flp) { - filt = (filter_def *) flp->data; - gtk_entry_set_text(GTK_ENTRY(mw_filt), filt->strval); - } - } +filter_expr_cb(GtkWidget *w, gpointer main_w_arg) +{ + GtkWidget *main_w = GTK_WIDGET(main_w_arg); + GtkWidget *filter_te; - filter_prefs_delete(w); + filter_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_TE_KEY); + dfilter_expr_dlg_new(filter_te); } static void @@ -742,12 +843,6 @@ filter_prefs_save(GtkWidget *w) { } static void -filter_prefs_cancel(GtkWidget *w) { - - filter_prefs_delete(w); -} - -static void filter_prefs_delete(GtkWidget *w) { /* Let the list cb know we're about to destroy the widget tree, so it */ |