diff options
Diffstat (limited to 'gtk/dfilter_expr_dlg.c')
-rw-r--r-- | gtk/dfilter_expr_dlg.c | 1934 |
1 files changed, 1102 insertions, 832 deletions
diff --git a/gtk/dfilter_expr_dlg.c b/gtk/dfilter_expr_dlg.c index 91417f77ac..71e1cf4dcb 100644 --- a/gtk/dfilter_expr_dlg.c +++ b/gtk/dfilter_expr_dlg.c @@ -7,7 +7,7 @@ * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com> and * Guy Harris <guy@alum.mit.edu> * - * $Id: dfilter_expr_dlg.c,v 1.29 2002/10/09 23:03:11 jmayer Exp $ + * $Id: dfilter_expr_dlg.c,v 1.30 2002/11/03 17:38:33 oabad Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -79,155 +79,189 @@ typedef struct protocol_data { } protocol_data_t; static void show_relations(GtkWidget *relation_label, GtkWidget *relation_list, - ftenum_t ftype); + ftenum_t ftype); static gboolean relation_is_presence_test(const char *string); static void add_relation_list(GtkWidget *relation_list, char *relation); static void build_boolean_values(GtkWidget *value_list_scrolled_win, - GtkWidget *value_list, const true_false_string *values); + GtkWidget *value_list, + const true_false_string *values); static void build_enum_values(GtkWidget *value_list_scrolled_win, - GtkWidget *value_list, const value_string *values); + GtkWidget *value_list, + const value_string *values); static void add_value_list_item(GtkWidget *value_list, gchar *string, - gpointer data); + gpointer data); static void display_value_fields(header_field_info *hfinfo, - gboolean is_comparison, GtkWidget *value_label, GtkWidget *value_entry, - GtkWidget *value_list, GtkWidget *value_list_scrolled_win, - GtkWidget *range_label, GtkWidget *range_entry); + gboolean is_comparison, GtkWidget *value_label, + GtkWidget *value_entry, GtkWidget *value_list, + GtkWidget *value_list_scrolled_win, + GtkWidget *range_label, + GtkWidget *range_entry); /* * Note that this is called every time the user clicks on an item, * whether it is already selected or not. */ +#if GTK_MAJOR_VERSION < 2 static void field_select_row_cb(GtkWidget *tree, GList *node, gint column _U_, - gpointer user_data _U_) + gpointer user_data _U_) +#else +static void +field_select_row_cb(GtkTreeSelection *sel, gpointer user_data) +#endif { - GtkWidget *window = gtk_widget_get_toplevel(tree); - GtkWidget *relation_label = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RELATION_LABEL_KEY); - GtkWidget *relation_list = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RELATION_LIST_KEY); - GtkWidget *range_label = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_LABEL_KEY); - GtkWidget *range_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_ENTRY_KEY); - GtkWidget *value_label = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LABEL_KEY); - GtkWidget *value_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_ENTRY_KEY); - GtkWidget *value_list = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_KEY); - GtkWidget *value_list_scrolled_win = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_SW_KEY); - GtkWidget *accept_bt = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_ACCEPT_BT_KEY); - header_field_info *hfinfo, *cur_hfinfo; - const char *value_type; - char value_label_string[1024+1]; /* XXX - should be large enough */ - - hfinfo = gtk_ctree_node_get_row_data(GTK_CTREE(tree), - GTK_CTREE_NODE(node)); - - /* - * What was the item that was last selected? - */ - cur_hfinfo = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_CURRENT_VAR_KEY); - if (cur_hfinfo == hfinfo) { - /* - * It's still selected; no need to change anything. - */ - return; - } - - /* - * Mark it as currently selected. - */ - gtk_object_set_data(GTK_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY, - hfinfo); - - show_relations(relation_label, relation_list, hfinfo->type); - - /* - * Set the label for the value to indicate what type of value - * it is. - */ - value_type = ftype_pretty_name(hfinfo->type); - if (value_type != NULL) { - /* - * Indicate what type of value it is. - */ - snprintf(value_label_string, sizeof value_label_string, - "Value (%s)", value_type); - gtk_label_set_text(GTK_LABEL(value_label), value_label_string); - } - - /* - * Clear the entry widget for the value, as whatever - * was there before doesn't apply. - */ - gtk_entry_set_text(GTK_ENTRY(value_entry), ""); - - switch (hfinfo->type) { - - case FT_BOOLEAN: - /* - * The list of values should be the strings for "true" - * and "false"; show them in the value list. - */ - build_boolean_values(value_list_scrolled_win, value_list, - hfinfo->strings); - break; - - case FT_UINT8: - case FT_UINT16: - case FT_UINT24: - case FT_UINT32: - case FT_INT8: - case FT_INT16: - case FT_INT24: - case FT_INT32: - /* - * If this has a value_string table associated with it, - * fill up the list of values, otherwise clear the list - * of values. - */ - if (hfinfo->strings != NULL) { - build_enum_values(value_list_scrolled_win, value_list, - hfinfo->strings); - } else - gtk_list_clear_items(GTK_LIST(value_list), 0, -1); - break; - - default: - /* - * Clear the list of values. - */ - gtk_list_clear_items(GTK_LIST(value_list), 0, -1); - break; - } - - /* - * Display various items for the value, as appropriate. - * The relation we start out with is never a comparison. - */ - display_value_fields(hfinfo, FALSE, value_label, value_entry, - value_list, value_list_scrolled_win, range_label, range_entry); +#if GTK_MAJOR_VERSION < 2 + GtkWidget *window = gtk_widget_get_toplevel(tree); +#else + GtkWidget *window = gtk_widget_get_toplevel(user_data); +#endif + GtkWidget *relation_label = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RELATION_LABEL_KEY); + GtkWidget *relation_list = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RELATION_LIST_KEY); + GtkWidget *range_label = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RANGE_LABEL_KEY); + GtkWidget *range_entry = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RANGE_ENTRY_KEY); + GtkWidget *value_label = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LABEL_KEY); + GtkWidget *value_entry = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_ENTRY_KEY); + GtkWidget *value_list = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LIST_KEY); + GtkWidget *value_list_scrolled_win = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LIST_SW_KEY); + GtkWidget *accept_bt = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_ACCEPT_BT_KEY); + header_field_info *hfinfo, *cur_hfinfo; + const char *value_type; + char value_label_string[1024+1]; /* XXX - should be large enough */ +#if GTK_MAJOR_VERSION >= 2 + GtkTreeModel *model; + GtkTreeIter iter; + + if (!gtk_tree_selection_get_selected(sel, &model, &iter)) + return; + gtk_tree_model_get(model, &iter, 1, &hfinfo, -1); +#else + + hfinfo = gtk_ctree_node_get_row_data(GTK_CTREE(tree), + GTK_CTREE_NODE(node)); +#endif - /* - * XXX - in browse mode, there always has to be something - * selected, so this should always be sensitive. - */ - gtk_widget_set_sensitive(accept_bt, TRUE); + /* + * What was the item that was last selected? + */ + cur_hfinfo = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_CURRENT_VAR_KEY); + if (cur_hfinfo == hfinfo) { + /* + * It's still selected; no need to change anything. + */ + return; + } + + /* + * Mark it as currently selected. + */ + gtk_object_set_data(GTK_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY, + hfinfo); + + show_relations(relation_label, relation_list, hfinfo->type); + + /* + * Set the label for the value to indicate what type of value + * it is. + */ + value_type = ftype_pretty_name(hfinfo->type); + if (value_type != NULL) { + /* + * Indicate what type of value it is. + */ + snprintf(value_label_string, sizeof value_label_string, + "Value (%s)", value_type); + gtk_label_set_text(GTK_LABEL(value_label), value_label_string); + } + + /* + * Clear the entry widget for the value, as whatever + * was there before doesn't apply. + */ + gtk_entry_set_text(GTK_ENTRY(value_entry), ""); + + switch (hfinfo->type) { + + case FT_BOOLEAN: + /* + * The list of values should be the strings for "true" + * and "false"; show them in the value list. + */ + build_boolean_values(value_list_scrolled_win, value_list, + hfinfo->strings); + break; + + case FT_UINT8: + case FT_UINT16: + case FT_UINT24: + case FT_UINT32: + case FT_INT8: + case FT_INT16: + case FT_INT24: + case FT_INT32: + /* + * If this has a value_string table associated with it, + * fill up the list of values, otherwise clear the list + * of values. + */ + if (hfinfo->strings != NULL) { + build_enum_values(value_list_scrolled_win, value_list, + hfinfo->strings); + } else +#if GTK_MAJOR_VERSION < 2 + gtk_list_clear_items(GTK_LIST(value_list), 0, -1); +#else + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)))); +#endif + break; + + default: + /* + * Clear the list of values. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_clear_items(GTK_LIST(value_list), 0, -1); +#else + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)))); +#endif + break; + } + + /* + * Display various items for the value, as appropriate. + * The relation we start out with is never a comparison. + */ + display_value_fields(hfinfo, FALSE, value_label, value_entry, + value_list, value_list_scrolled_win, range_label, range_entry); + + /* + * XXX - in browse mode, there always has to be something + * selected, so this should always be sensitive. + */ + gtk_widget_set_sensitive(accept_bt, TRUE); } static void show_relations(GtkWidget *relation_label, GtkWidget *relation_list, - ftenum_t ftype) + ftenum_t ftype) { /* * Clear out the currently displayed list of relations. */ +#if GTK_MAJOR_VERSION < 2 gtk_list_clear_items(GTK_LIST(relation_list), 0, -1); +#else + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(relation_list)))); +#endif /* * Add the supported relations. @@ -272,145 +306,223 @@ relation_is_presence_test(const char *string) static void add_relation_list(GtkWidget *relation_list, char *relation) { - GtkWidget *label, *item; - - label = gtk_label_new(relation); - item = gtk_list_item_new(); - - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(item), label); - gtk_widget_show(label); - gtk_container_add(GTK_CONTAINER(relation_list), item); - gtk_widget_show(item); +#if GTK_MAJOR_VERSION < 2 + GtkWidget *label, *item; + + label = gtk_label_new(relation); + item = gtk_list_item_new(); + + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_container_add(GTK_CONTAINER(item), label); + gtk_widget_show(label); + gtk_container_add(GTK_CONTAINER(relation_list), item); + gtk_widget_show(item); +#else + GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(relation_list))); + GtkTreeIter iter; + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, relation, -1); +#endif } +#if GTK_MAJOR_VERSION < 2 static void relation_list_sel_cb(GtkList *relation_list, GtkWidget *child _U_, - gpointer user_data _U_) + gpointer user_data _U_) +#else +static void +relation_list_sel_cb(GtkTreeSelection *sel, gpointer user_data _U_) +#endif { - GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(relation_list)); - GtkWidget *range_label = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_LABEL_KEY); - GtkWidget *range_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_ENTRY_KEY); - GtkWidget *value_label = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LABEL_KEY); - GtkWidget *value_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_ENTRY_KEY); - GtkWidget *value_list = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_KEY); - GtkWidget *value_list_scrolled_win = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_SW_KEY); - header_field_info *hfinfo = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_CURRENT_VAR_KEY); - GList *sl; - GtkWidget *item, *item_label; - gchar *item_str; - - /* - * What's the relation? - */ - sl = GTK_LIST(relation_list)->selection; - item = GTK_WIDGET(sl->data); - item_label = GTK_BIN(item)->child; - gtk_label_get(GTK_LABEL(item_label), &item_str); +#if GTK_MAJOR_VERSION < 2 + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(relation_list)); +#else + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(gtk_tree_selection_get_tree_view(sel))); +#endif + GtkWidget *range_label = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_RANGE_LABEL_KEY); + GtkWidget *range_entry = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_RANGE_ENTRY_KEY); + GtkWidget *value_label = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_VALUE_LABEL_KEY); + GtkWidget *value_entry = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_VALUE_ENTRY_KEY); + GtkWidget *value_list = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_KEY); + GtkWidget *value_list_scrolled_win = + gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LIST_SW_KEY); + header_field_info *hfinfo = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY); + gchar *item_str; +#if GTK_MAJOR_VERSION < 2 + GList *sl; + GtkWidget *item, *item_label; + + /* + * What's the relation? + */ + sl = GTK_LIST(relation_list)->selection; + item = GTK_WIDGET(sl->data); + item_label = GTK_BIN(item)->child; + gtk_label_get(GTK_LABEL(item_label), &item_str); +#else + GtkTreeModel *model; + GtkTreeIter iter; + + /* + * What's the relation? + */ + if (!gtk_tree_selection_get_selected(sel, &model, &iter)) + return; + gtk_tree_model_get(model, &iter, 0, &item_str, -1); +#endif - /* - * Update the display of various items for the value, as appropriate. - */ - display_value_fields(hfinfo, - !relation_is_presence_test(item_str), - value_label, value_entry, value_list, value_list_scrolled_win, - range_label, range_entry); + /* + * Update the display of various items for the value, as appropriate. + */ + display_value_fields(hfinfo, + !relation_is_presence_test(item_str), + value_label, value_entry, value_list, + value_list_scrolled_win, range_label, range_entry); +#if GTK_MAJOR_VERSION >= 2 + g_free(item_str); +#endif } static void build_boolean_values(GtkWidget *value_list_scrolled_win, GtkWidget *value_list, - const true_false_string *values) + const true_false_string *values) { - static const true_false_string true_false = { "True", "False" }; + static const true_false_string true_false = { "True", "False" }; +#if GTK_MAJOR_VERSION >= 2 + GtkTreeSelection *sel; + GtkTreeIter iter; - /* - * Clear out the items for the list, and put in the names - * from the value_string list. - */ - gtk_list_clear_items(GTK_LIST(value_list), 0, -1); + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list)); +#endif - /* - * Put the list in single mode, so we don't get any selection - * events while we're building it (i.e., so we don't get any - * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST - * ITEM SO THAT THE HANDLER CAN HANDLE IT). - */ - gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); + /* + * Clear out the items for the list, and put in the names + * from the value_string list. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_clear_items(GTK_LIST(value_list), 0, -1); +#else + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)))); +#endif - /* - * Build the list. - */ - if (values == NULL) - values = &true_false; - add_value_list_item(value_list, values->true_string, (gpointer)values); - add_value_list_item(value_list, values->false_string, NULL); + /* + * Put the list in single mode, so we don't get any selection + * events while we're building it (i.e., so we don't get any + * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST + * ITEM SO THAT THE HANDLER CAN HANDLE IT). + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); +#else + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); +#endif - /* - * OK, we're done, so we can finally put it in browse mode. - * Select the first item, so that the user doesn't have to, under - * the assumption that they're most likely to test if something - * is true, not false. - */ - gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_BROWSE); - gtk_list_select_item(GTK_LIST(value_list), 0); + /* + * Build the list. + */ + if (values == NULL) + values = &true_false; + add_value_list_item(value_list, values->true_string, (gpointer)values); + add_value_list_item(value_list, values->false_string, NULL); + + /* + * OK, we're done, so we can finally put it in browse mode. + * Select the first item, so that the user doesn't have to, under + * the assumption that they're most likely to test if something + * is true, not false. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_BROWSE); + gtk_list_select_item(GTK_LIST(value_list), 0); +#else + gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE); + gtk_tree_model_get_iter_first(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)), &iter); + gtk_tree_selection_select_iter(sel, &iter); +#endif - gtk_widget_show_all(value_list_scrolled_win); + gtk_widget_show_all(value_list_scrolled_win); } static void -build_enum_values(GtkWidget *value_list_scrolled_win, GtkWidget *value_list, - const value_string *values) +build_enum_values(GtkWidget *value_list_scrolled_win _U_, GtkWidget *value_list, + const value_string *values) { - /* - * Clear out the items for the list, and put in the names - * from the value_string list. - */ - gtk_list_clear_items(GTK_LIST(value_list), 0, -1); +#if GTK_MAJOR_VERSION >= 2 + GtkTreeSelection *sel; - /* - * Put the list in single mode, so we don't get any selection - * events while we're building it (i.e., so we don't get any - * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST - * ITEM SO THAT THE HANDLER CAN HANDLE IT). - */ - gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list)); +#endif + /* + * Clear out the items for the list, and put in the names + * from the value_string list. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_clear_items(GTK_LIST(value_list), 0, -1); +#else + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)))); +#endif - /* - * Build the list. - */ - while (values->strptr != NULL) { - add_value_list_item(value_list, values->strptr, - (gpointer)values); - values++; - } + /* + * Put the list in single mode, so we don't get any selection + * events while we're building it (i.e., so we don't get any + * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST + * ITEM SO THAT THE HANDLER CAN HANDLE IT). + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); +#else + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); +#endif - /* - * OK, we're done, so we can finally put it in browse mode. - */ - gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_BROWSE); + /* + * Build the list. + */ + while (values->strptr != NULL) { + add_value_list_item(value_list, values->strptr, + (gpointer)values); + values++; + } + + /* + * OK, we're done, so we can finally put it in browse mode. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_BROWSE); +#else + gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE); +#endif } static void add_value_list_item(GtkWidget *value_list, gchar *string, gpointer data) { - GtkWidget *label, *item; - - label = gtk_label_new(string); - item = gtk_list_item_new(); - - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(item), label); - gtk_widget_show(label); - gtk_container_add(GTK_CONTAINER(value_list), item); - gtk_object_set_data(GTK_OBJECT(item), E_DFILTER_EXPR_VALUE_KEY, data); - gtk_widget_show(item); +#if GTK_MAJOR_VERSION < 2 + GtkWidget *label, *item; + + label = gtk_label_new(string); + item = gtk_list_item_new(); + + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_container_add(GTK_CONTAINER(item), label); + gtk_widget_show(label); + gtk_container_add(GTK_CONTAINER(value_list), item); + gtk_object_set_data(GTK_OBJECT(item), E_DFILTER_EXPR_VALUE_KEY, data); + gtk_widget_show(item); +#else + GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list))); + GtkTreeIter iter; + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, string, 1, data, -1); +#endif } /* @@ -419,9 +531,10 @@ add_value_list_item(GtkWidget *value_list, gchar *string, gpointer data) */ static void display_value_fields(header_field_info *hfinfo, gboolean is_comparison, - GtkWidget *value_label, GtkWidget *value_entry, GtkWidget *value_list, - GtkWidget *value_list_scrolled_win, GtkWidget *range_label, - GtkWidget *range_entry) + GtkWidget *value_label, GtkWidget *value_entry, + GtkWidget *value_list _U_, + GtkWidget *value_list_scrolled_win, GtkWidget *range_label, + GtkWidget *range_entry) { gboolean show_value_label = FALSE; @@ -564,81 +677,98 @@ display_value_fields(header_field_info *hfinfo, gboolean is_comparison, } } +#if GTK_MAJOR_VERSION < 2 static void value_list_sel_cb(GtkList *value_list, GtkWidget *child, - gpointer value_entry_arg) + gpointer value_entry_arg) +#else +static void +value_list_sel_cb(GtkTreeSelection *sel, gpointer value_entry_arg) +#endif { - GtkWidget *value_entry = value_entry_arg; - GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(value_list)); - header_field_info *hfinfo = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_CURRENT_VAR_KEY); - const value_string *value; - char value_string[11+1]; /* long enough for 32-bit octal value */ - - value = gtk_object_get_data(GTK_OBJECT(child), - E_DFILTER_EXPR_VALUE_KEY); - - /* - * This should either be a numeric type or a Boolean type. - */ - if (hfinfo->type == FT_BOOLEAN) { - /* - * Boolean type; if the value key for the selected item - * is non-null, it's the item for "true", otherwise it's - * the item for "false". Compare with 1 if we're - * testing for "true", and compare with 0 if we're - * testing for "false". - */ - if (value != NULL) - strcpy(value_string, "1"); - else - strcpy(value_string, "0"); - } else { - /* - * Numeric type; get the value corresponding to the - * selected item, and display it in the base for this - * field. - */ - switch (hfinfo->display) { - - case BASE_DEC: - case BASE_BIN: /* binary - treated as decimal, for now */ - switch (hfinfo->type) { - - case FT_UINT8: - case FT_UINT16: - case FT_UINT32: - snprintf(value_string, sizeof value_string, - "%u", value->value); - break; - - case FT_INT8: - case FT_INT16: - case FT_INT32: - snprintf(value_string, sizeof value_string, - "%d", value->value); - break; - - default: - g_assert_not_reached(); - } - break; - - case BASE_HEX: - snprintf(value_string, sizeof value_string, "0x%x", - value->value); - break; - - case BASE_OCT: - snprintf(value_string, sizeof value_string, "%#o", - value->value); - break; + GtkWidget *value_entry = value_entry_arg; +#if GTK_MAJOR_VERSION < 2 + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(value_list)); +#else + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(gtk_tree_selection_get_tree_view(sel))); + GtkTreeModel *model; + GtkTreeIter iter; +#endif + header_field_info *hfinfo = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_CURRENT_VAR_KEY); + const value_string *value = NULL; + char value_string[11+1]; /* long enough for 32-bit octal value */ + +#if GTK_MAJOR_VERSION < 2 + value = gtk_object_get_data(GTK_OBJECT(child), + E_DFILTER_EXPR_VALUE_KEY); +#else + if (!gtk_tree_selection_get_selected(sel, &model, &iter)) + return; + gtk_tree_model_get(model, &iter, 1, &value, -1); +#endif - default: - g_assert_not_reached(); - } - } - gtk_entry_set_text(GTK_ENTRY(value_entry), value_string); + /* + * This should either be a numeric type or a Boolean type. + */ + if (hfinfo->type == FT_BOOLEAN) { + /* + * Boolean type; if the value key for the selected item + * is non-null, it's the item for "true", otherwise it's + * the item for "false". Compare with 1 if we're + * testing for "true", and compare with 0 if we're + * testing for "false". + */ + if (value != NULL) + strcpy(value_string, "1"); + else + strcpy(value_string, "0"); + } else { + /* + * Numeric type; get the value corresponding to the + * selected item, and display it in the base for this + * field. + */ + switch (hfinfo->display) { + + case BASE_DEC: + case BASE_BIN: /* binary - treated as decimal, for now */ + switch (hfinfo->type) { + + case FT_UINT8: + case FT_UINT16: + case FT_UINT32: + snprintf(value_string, sizeof value_string, + "%u", value->value); + break; + + case FT_INT8: + case FT_INT16: + case FT_INT32: + snprintf(value_string, sizeof value_string, + "%d", value->value); + break; + + default: + g_assert_not_reached(); + } + break; + + case BASE_HEX: + snprintf(value_string, sizeof value_string, "0x%x", + value->value); + break; + + case BASE_OCT: + snprintf(value_string, sizeof value_string, "%#o", + value->value); + break; + + default: + g_assert_not_reached(); + } + } + gtk_entry_set_text(GTK_ENTRY(value_entry), value_string); } static void @@ -658,238 +788,255 @@ dfilter_report_bad_value(char *format, ...) static void dfilter_expr_dlg_accept_cb(GtkWidget *w, gpointer filter_te_arg) { - GtkWidget *filter_te = filter_te_arg; - GtkWidget *window = gtk_widget_get_toplevel(w); - GtkWidget *relation_list = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RELATION_LIST_KEY); - GtkWidget *range_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_ENTRY_KEY); - GtkWidget *value_entry = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_ENTRY_KEY); - header_field_info *hfinfo; - GList *sl; - GtkWidget *item, *item_label; - gchar *item_str; - gchar *range_str, *stripped_range_str; - gchar *value_str, *stripped_value_str; - int pos; - gchar *chars; - ftenum_t ftype; - gboolean can_compare; - fvalue_t *fvalue; - - /* - * Get the variable to be tested. - */ - hfinfo = gtk_object_get_data(GTK_OBJECT(window), - E_DFILTER_EXPR_CURRENT_VAR_KEY); - - /* - * Get the relation to use, if any. - */ - if (GTK_WIDGET_VISIBLE(relation_list)) { - /* - * The list of relations is visible, so we can get a - * relation operator from it. - */ - sl = GTK_LIST(relation_list)->selection; - item = GTK_WIDGET(sl->data); - item_label = GTK_BIN(item)->child; - gtk_label_get(GTK_LABEL(item_label), &item_str); - } else - item_str = NULL; /* no relation operator */ - - /* - * Get the range to use, if any. - */ - if (GTK_WIDGET_VISIBLE(range_entry)) { - range_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(range_entry))); - stripped_range_str = g_strstrip(range_str); - if (strcmp(stripped_range_str, "") == 0) { - /* - * No range was specified. - */ - g_free(range_str); - range_str = NULL; - stripped_range_str = NULL; - } - - /* - * XXX - check it for validity? - */ - } else { - range_str = NULL; - stripped_range_str = NULL; - } - - /* - * If a range was specified, the type of the LHS of the - * comparison is FT_BYTES; otherwise, it's the type of the field. - */ - if (range_str == NULL) - ftype = hfinfo->type; - else - ftype = FT_BYTES; - - /* - * Make sure the relation is valid for the type in question. - * We may be offering relations that the type of the field - * can't support, because the field's type supports slicing, - * and the relation *is* supported on byte strings. - */ - if (strcmp(item_str, "==") == 0) - can_compare = ftype_can_eq(ftype); - else if (strcmp(item_str, "!=") == 0) - can_compare = ftype_can_ne(ftype); - else if (strcmp(item_str, ">") == 0) - can_compare = ftype_can_gt(ftype); - else if (strcmp(item_str, "<") == 0) - can_compare = ftype_can_lt(ftype); - else if (strcmp(item_str, ">=") == 0) - can_compare = ftype_can_ge(ftype); - else if (strcmp(item_str, "<=") == 0) - can_compare = ftype_can_le(ftype); - else - can_compare = TRUE; /* not a comparison */ - if (!can_compare) { - if (range_str == NULL) { - simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, - "That field cannot be tested with \"%s\".", - item_str); - } else { - simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, - "Ranges of that field cannot be tested with \"%s\".", - item_str); - } - if (range_str != NULL) - g_free(range_str); - return; - } - - /* - * Get the value to use, if any. - */ - if (GTK_WIDGET_VISIBLE(value_entry)) { - value_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(value_entry))); - stripped_value_str = g_strstrip(value_str); - if (strcmp(stripped_value_str, "") == 0) { - /* - * This field takes a value, but they didn't supply - * one. - */ - simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, - "That field must be compared with a value, " - "but you didn't specify a value with which to " - "compare it."); - if (range_str != NULL) - g_free(range_str); - g_free(value_str); - return; - } - - /* - * Make sure the value is valid. - * - * If no range string was specified, it must be valid - * for the type of the field; if a range string was - * specified, must be valid for FT_BYTES. - */ - fvalue = fvalue_from_string(ftype, stripped_value_str, - dfilter_report_bad_value); - if (fvalue == NULL) { - /* - * It's not valid. - * - * The dialog box was already popped up by - * "dfilter_report_bad_value()". - */ - if (range_str != NULL) - g_free(range_str); - g_free(value_str); - return; - } - fvalue_free(fvalue); - } else { - value_str = NULL; - stripped_value_str = NULL; - } - - /* - * Insert the expression at the current cursor position. - * If there's a non-whitespace character to the left of it, - * insert a blank first; if there's a non-whitespace character - * to the right of it, insert a blank after it. - */ - pos = gtk_editable_get_position(GTK_EDITABLE(filter_te)); - chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos, pos + 1); - if (strcmp(chars, "") != 0 && !isspace((unsigned char)chars[0])) - gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); - g_free(chars); - - gtk_editable_insert_text(GTK_EDITABLE(filter_te), hfinfo->abbrev, - strlen(hfinfo->abbrev), &pos); - if (range_str != NULL) { - gtk_editable_insert_text(GTK_EDITABLE(filter_te), "[", 1, &pos); - gtk_editable_insert_text(GTK_EDITABLE(filter_te), - stripped_range_str, strlen(stripped_range_str), &pos); - gtk_editable_insert_text(GTK_EDITABLE(filter_te), "]", 1, &pos); - g_free(range_str); - } - if (item_str != NULL && !relation_is_presence_test(item_str)) { - gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); - gtk_editable_insert_text(GTK_EDITABLE(filter_te), item_str, - strlen(item_str), &pos); - } - if (value_str != NULL) { - gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); - switch (hfinfo->type) { - - case FT_STRING: - case FT_STRINGZ: - case FT_UINT_STRING: - /* - * Put quotes around the string. - */ - gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"", - 1, &pos); - - default: - break; - } - gtk_editable_insert_text(GTK_EDITABLE(filter_te), - stripped_value_str, strlen(stripped_value_str), &pos); - switch (hfinfo->type) { - - case FT_STRING: - case FT_STRINGZ: - case FT_UINT_STRING: - /* - * Put quotes around the string. - */ - gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"", - 1, &pos); - - default: - break; - } - g_free(value_str); - } - chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos + 1, pos + 2); - if (strcmp(chars, "") != 0 && !isspace((unsigned char)chars[0])) - gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); - g_free(chars); - - /* - * Put the cursor after the expression we just entered into - * the text entry widget. - */ - gtk_editable_set_position(GTK_EDITABLE(filter_te), pos); + GtkWidget *filter_te = filter_te_arg; + GtkWidget *window = gtk_widget_get_toplevel(w); + GtkWidget *relation_list = + gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RELATION_LIST_KEY); + GtkWidget *range_entry = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_RANGE_ENTRY_KEY); + GtkWidget *value_entry = + gtk_object_get_data(GTK_OBJECT(window), E_DFILTER_EXPR_VALUE_ENTRY_KEY); + header_field_info *hfinfo; + gchar *item_str; + gchar *range_str, *stripped_range_str; + gchar *value_str, *stripped_value_str; + int pos; + gchar *chars; + ftenum_t ftype; + gboolean can_compare; + fvalue_t *fvalue; +#if GTK_MAJOR_VERSION < 2 + GList *sl; + GtkWidget *item, *item_label; +#else + GtkTreeModel *model; + GtkTreeIter iter; +#endif - /* - * We're done; destroy the dialog box (which is the top-level - * widget for the "Accept" button). - */ - gtk_widget_destroy(window); + /* + * Get the variable to be tested. + */ + hfinfo = gtk_object_get_data(GTK_OBJECT(window), + E_DFILTER_EXPR_CURRENT_VAR_KEY); + + /* + * Get the relation to use, if any. + */ + if (GTK_WIDGET_VISIBLE(relation_list)) { + /* + * The list of relations is visible, so we can get a + * relation operator from it. + */ +#if GTK_MAJOR_VERSION < 2 + sl = GTK_LIST(relation_list)->selection; + item = GTK_WIDGET(sl->data); + item_label = GTK_BIN(item)->child; + gtk_label_get(GTK_LABEL(item_label), &item_str); +#else + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list)), + &model, &iter)) + gtk_tree_model_get(model, &iter, 0, &item_str, -1); + else + item_str = NULL; +#endif + } else + item_str = NULL; /* no relation operator */ + + /* + * Get the range to use, if any. + */ + if (GTK_WIDGET_VISIBLE(range_entry)) { + range_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(range_entry))); + stripped_range_str = g_strstrip(range_str); + if (strcmp(stripped_range_str, "") == 0) { + /* + * No range was specified. + */ + g_free(range_str); + range_str = NULL; + stripped_range_str = NULL; + } + + /* + * XXX - check it for validity? + */ + } else { + range_str = NULL; + stripped_range_str = NULL; + } + + /* + * If a range was specified, the type of the LHS of the + * comparison is FT_BYTES; otherwise, it's the type of the field. + */ + if (range_str == NULL) + ftype = hfinfo->type; + else + ftype = FT_BYTES; + + /* + * Make sure the relation is valid for the type in question. + * We may be offering relations that the type of the field + * can't support, because the field's type supports slicing, + * and the relation *is* supported on byte strings. + */ + if (strcmp(item_str, "==") == 0) + can_compare = ftype_can_eq(ftype); + else if (strcmp(item_str, "!=") == 0) + can_compare = ftype_can_ne(ftype); + else if (strcmp(item_str, ">") == 0) + can_compare = ftype_can_gt(ftype); + else if (strcmp(item_str, "<") == 0) + can_compare = ftype_can_lt(ftype); + else if (strcmp(item_str, ">=") == 0) + can_compare = ftype_can_ge(ftype); + else if (strcmp(item_str, "<=") == 0) + can_compare = ftype_can_le(ftype); + else + can_compare = TRUE; /* not a comparison */ + if (!can_compare) { + if (range_str == NULL) { + simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, + "That field cannot be tested with \"%s\".", + item_str); + } else { + simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, + "Ranges of that field cannot be tested with \"%s\".", + item_str); + } + if (range_str != NULL) + g_free(range_str); + return; + } + + /* + * Get the value to use, if any. + */ + if (GTK_WIDGET_VISIBLE(value_entry)) { + value_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(value_entry))); + stripped_value_str = g_strstrip(value_str); + if (strcmp(stripped_value_str, "") == 0) { + /* + * This field takes a value, but they didn't supply + * one. + */ + simple_dialog(ESD_TYPE_CRIT | ESD_TYPE_MODAL, NULL, + "That field must be compared with a value, " + "but you didn't specify a value with which to " + "compare it."); + if (range_str != NULL) + g_free(range_str); + g_free(value_str); + return; + } + + /* + * Make sure the value is valid. + * + * If no range string was specified, it must be valid + * for the type of the field; if a range string was + * specified, must be valid for FT_BYTES. + */ + fvalue = fvalue_from_string(ftype, stripped_value_str, + dfilter_report_bad_value); + if (fvalue == NULL) { + /* + * It's not valid. + * + * The dialog box was already popped up by + * "dfilter_report_bad_value()". + */ + if (range_str != NULL) + g_free(range_str); + g_free(value_str); + return; + } + fvalue_free(fvalue); + } else { + value_str = NULL; + stripped_value_str = NULL; + } + + /* + * Insert the expression at the current cursor position. + * If there's a non-whitespace character to the left of it, + * insert a blank first; if there's a non-whitespace character + * to the right of it, insert a blank after it. + */ + pos = gtk_editable_get_position(GTK_EDITABLE(filter_te)); + chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos, pos + 1); + if (strcmp(chars, "") != 0 && !isspace((unsigned char)chars[0])) + gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); + g_free(chars); + + gtk_editable_insert_text(GTK_EDITABLE(filter_te), hfinfo->abbrev, + strlen(hfinfo->abbrev), &pos); + if (range_str != NULL) { + gtk_editable_insert_text(GTK_EDITABLE(filter_te), "[", 1, &pos); + gtk_editable_insert_text(GTK_EDITABLE(filter_te), + stripped_range_str, strlen(stripped_range_str), &pos); + gtk_editable_insert_text(GTK_EDITABLE(filter_te), "]", 1, &pos); + g_free(range_str); + } + if (item_str != NULL && !relation_is_presence_test(item_str)) { + gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); + gtk_editable_insert_text(GTK_EDITABLE(filter_te), item_str, + strlen(item_str), &pos); + } + if (value_str != NULL) { + gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); + switch (hfinfo->type) { + + case FT_STRING: + case FT_STRINGZ: + case FT_UINT_STRING: + /* + * Put quotes around the string. + */ + gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"", + 1, &pos); + + default: + break; + } + gtk_editable_insert_text(GTK_EDITABLE(filter_te), + stripped_value_str, strlen(stripped_value_str), &pos); + switch (hfinfo->type) { + + case FT_STRING: + case FT_STRINGZ: + case FT_UINT_STRING: + /* + * Put quotes around the string. + */ + gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"", + 1, &pos); + + default: + break; + } + g_free(value_str); + } + chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos + 1, pos + 2); + if (strcmp(chars, "") != 0 && !isspace((unsigned char)chars[0])) + gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos); + g_free(chars); + + /* + * Put the cursor after the expression we just entered into + * the text entry widget. + */ + gtk_editable_set_position(GTK_EDITABLE(filter_te), pos); + + /* + * We're done; destroy the dialog box (which is the top-level + * widget for the "Accept" button). + */ + gtk_widget_destroy(window); +#if GTK_MAJOR_VERSION >= 2 + g_free(item_str); +#endif } static void @@ -910,310 +1057,433 @@ dfilter_expr_dlg_destroy_cb(GtkWidget *w, gpointer filter_te) * attached, as the handler for that signal is supposed * to destroy us, but we're already gone. */ +#if GTK_MAJOR_VERSION < 2 gtk_signal_disconnect_by_func(GTK_OBJECT(filter_te), - dfilter_expr_dlg_cancel_cb, w); + dfilter_expr_dlg_cancel_cb, w); +#else + g_signal_handlers_disconnect_by_func(G_OBJECT(filter_te), + dfilter_expr_dlg_cancel_cb, w); +#endif } void dfilter_expr_dlg_new(GtkWidget *filter_te) { - GtkWidget *window; - GtkWidget *main_vb; - GtkWidget *hb; - GtkWidget *col1_vb; - GtkWidget *tree_label, *tree, *tree_scrolled_win; - GtkWidget *col2_vb; - GtkWidget *relation_label, *relation_list; - GtkWidget *range_label, *range_entry; - GtkWidget *value_vb; - GtkWidget *value_label, *value_entry, *value_list_scrolled_win, *value_list; - GtkWidget *list_bb, *alignment, *accept_bt, *close_bt; - GtkCTreeNode *protocol_node, *item_node; - header_field_info *hfinfo; - int i, len; - void *cookie; - gchar *name; - GHashTable *proto_array; - - window = dlg_window_new("Ethereal: Filter Expression"); - gtk_container_set_border_width(GTK_CONTAINER(window), 5); - - main_vb = gtk_vbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(main_vb), 5); - gtk_container_add(GTK_CONTAINER(window), main_vb); - gtk_widget_show(main_vb); - - hb = gtk_hbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(hb), 5); - gtk_container_add(GTK_CONTAINER(main_vb), hb); - gtk_widget_show(hb); - - col1_vb = gtk_vbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(col1_vb), 5); - gtk_container_add(GTK_CONTAINER(hb), col1_vb); - gtk_widget_show(col1_vb); - - tree_label = gtk_label_new("Field name"); - gtk_misc_set_alignment(GTK_MISC(tree_label), 0.0, 0.0); - gtk_box_pack_start(GTK_BOX(col1_vb), tree_label, FALSE, FALSE, 0); - gtk_widget_show(tree_label); - - tree_scrolled_win = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tree_scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_usize(tree_scrolled_win, 300, 400); - gtk_box_pack_start(GTK_BOX(col1_vb), tree_scrolled_win, FALSE, FALSE, 0); - gtk_widget_show(tree_scrolled_win); - - tree = ctree_new(1, 0); - gtk_signal_connect(GTK_OBJECT(tree), "tree-select-row", - GTK_SIGNAL_FUNC(field_select_row_cb), tree); - gtk_container_add(GTK_CONTAINER(tree_scrolled_win), tree); - - /* - * GTK's annoying CTree widget will deliver a selection event - * the instant you add an item to the tree, *the fact that you - * haven't even had time to set the item's row data nonwithstanding*. - * - * We'll put the widget into GTK_SELECTION_SINGLE mode in the - * hopes that it's *STOP DOING THAT*. - */ - gtk_clist_set_selection_mode(GTK_CLIST(tree), - GTK_SELECTION_SINGLE); - - col2_vb = gtk_vbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(col2_vb), 5); - gtk_container_add(GTK_CONTAINER(hb), col2_vb); - gtk_widget_show(col2_vb); - - relation_label = gtk_label_new("Relation"); - gtk_misc_set_alignment(GTK_MISC(relation_label), 0.0, 0.0); - gtk_box_pack_start(GTK_BOX(col2_vb), relation_label, FALSE, FALSE, 0); - - relation_list = gtk_list_new(); - gtk_box_pack_start(GTK_BOX(col2_vb), relation_list, TRUE, TRUE, 0); - gtk_list_set_selection_mode(GTK_LIST(relation_list), - GTK_SELECTION_BROWSE); - - range_label = gtk_label_new("Range (offset:length)"); - gtk_misc_set_alignment(GTK_MISC(range_label), 0.0, 0.0); - gtk_box_pack_start(GTK_BOX(col2_vb), range_label, FALSE, FALSE, 0); - - range_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(col2_vb), range_entry, FALSE, FALSE, 0); - - /* - * OK, show the relation label and range stuff as it would be - * with everything turned on, so it'll request as much space - * as it'll ever need, so the dialog box and widgets start out - * with the right sizes. - * - * XXX - this doesn't work. It *doesn't* request as much space - * as it'll ever need. - * - * XXX - FT_UINT8 doesn't support ranges, so even if it did work, - * it wouldn't work right. - * - * XXX - this no longer affects the range stuff, as that's - * controlled both by the type and by the relational operator - * selected. - */ - show_relations(relation_label, relation_list, FT_UINT8); - - value_vb = gtk_vbox_new(FALSE, 5); - gtk_container_border_width(GTK_CONTAINER(value_vb), 5); - gtk_container_add(GTK_CONTAINER(hb), value_vb); - gtk_widget_show(value_vb); - - value_label = gtk_label_new("Value"); - gtk_misc_set_alignment(GTK_MISC(value_label), 0.0, 0.0); - gtk_box_pack_start(GTK_BOX(value_vb), value_label, FALSE, FALSE, 0); - gtk_widget_show(value_label); - - value_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(value_vb), value_entry, FALSE, FALSE, 0); - gtk_widget_show(value_entry); - - value_list_scrolled_win = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(value_list_scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start(GTK_BOX(value_vb), value_list_scrolled_win, TRUE, - TRUE, 0); - gtk_widget_show(value_list_scrolled_win); - - value_list = gtk_list_new(); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(value_list_scrolled_win), - value_list); - gtk_signal_connect(GTK_OBJECT(value_list), "select-child", - GTK_SIGNAL_FUNC(value_list_sel_cb), value_entry); - gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); - /* This remains hidden until an enumerated field is selected */ - - /* - * The value stuff may be hidden or shown depending on what - * relation was selected; connect to the "select-child" signal - * for the relation list, so we can make that happen. - */ - gtk_signal_connect(GTK_OBJECT(relation_list), "select-child", - GTK_SIGNAL_FUNC(relation_list_sel_cb), NULL); - - /* - * Put the items in the CTree; we don't want to do that until - * we've constructed the value list and set the tree's - * E_DFILTER_EXPR_VALUE_LIST_KEY data to point to it, and - * constructed the "Accept" button and set the tree's - * E_DFILTER_EXPR_ACCEPT_BT_KEY data to point to it, so that - * when the list item is "helpfully" automatically selected for us - * we're ready to cope with the selection signal. - */ + GtkWidget *window; + GtkWidget *main_vb; + GtkWidget *hb; + GtkWidget *col1_vb; + GtkWidget *tree_label, *tree, *tree_scrolled_win; + GtkWidget *col2_vb; + GtkWidget *relation_label, *relation_list; + GtkWidget *range_label, *range_entry; + GtkWidget *value_vb; + GtkWidget *value_label, *value_entry, *value_list_scrolled_win, *value_list; + GtkWidget *list_bb, *alignment, *accept_bt, *close_bt; + header_field_info *hfinfo; + int i, len; +#if GTK_MAJOR_VERSION < 2 + void *cookie; + gchar *name; + GHashTable *proto_array; + GtkCTreeNode *protocol_node, *item_node; +#else + GtkTreeStore *store; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeIter iter; + GtkListStore *l_store; + GtkTreeSelection *l_sel; +#endif - /* a hash table seems excessive, but I don't see support for a - sparse array in glib */ - proto_array = g_hash_table_new(g_direct_hash, g_direct_equal); - for (i = proto_get_first_protocol(&cookie); i != -1; - i = proto_get_next_protocol(&cookie)) { - hfinfo = proto_registrar_get_nth(i); - /* Create a node for the protocol, and remember it for - later use. */ - name = proto_get_protocol_short_name(i); - protocol_node = gtk_ctree_insert_node(GTK_CTREE(tree), - NULL, NULL, - &name, 5, - NULL, NULL, NULL, NULL, - FALSE, FALSE); - gtk_ctree_node_set_row_data(GTK_CTREE(tree), protocol_node, - hfinfo); - g_hash_table_insert(proto_array, (gpointer)i, protocol_node); - } + window = dlg_window_new("Ethereal: Filter Expression"); + gtk_container_set_border_width(GTK_CONTAINER(window), 5); + + main_vb = gtk_vbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(main_vb), 5); + gtk_container_add(GTK_CONTAINER(window), main_vb); + gtk_widget_show(main_vb); + + hb = gtk_hbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(hb), 5); + gtk_container_add(GTK_CONTAINER(main_vb), hb); + gtk_widget_show(hb); + + col1_vb = gtk_vbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(col1_vb), 5); + gtk_container_add(GTK_CONTAINER(hb), col1_vb); + gtk_widget_show(col1_vb); + + tree_label = gtk_label_new("Field name"); + gtk_misc_set_alignment(GTK_MISC(tree_label), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(col1_vb), tree_label, FALSE, FALSE, 0); + gtk_widget_show(tree_label); + + tree_scrolled_win = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tree_scrolled_win), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); +#if GTK_MAJOR_VERSION < 2 + gtk_widget_set_usize(tree_scrolled_win, 300, 400); +#else + gtk_widget_set_size_request(tree_scrolled_win, 300, 400); +#endif + gtk_box_pack_start(GTK_BOX(col1_vb), tree_scrolled_win, FALSE, FALSE, 0); + gtk_widget_show(tree_scrolled_win); + +#if GTK_MAJOR_VERSION < 2 + tree = ctree_new(1, 0); + gtk_signal_connect(GTK_OBJECT(tree), "tree-select-row", + GTK_SIGNAL_FUNC(field_select_row_cb), tree); +#else + store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); + tree = tree_view_new(GTK_TREE_MODEL(store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Field name", renderer, + "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_sort_column_id(column, 0); + g_signal_connect(G_OBJECT(selection), "changed", + G_CALLBACK(field_select_row_cb), tree); +#endif + gtk_container_add(GTK_CONTAINER(tree_scrolled_win), tree); + +#if GTK_MAJOR_VERSION < 2 + /* + * GTK's annoying CTree widget will deliver a selection event + * the instant you add an item to the tree, *the fact that you + * haven't even had time to set the item's row data nonwithstanding*. + * + * We'll put the widget into GTK_SELECTION_SINGLE mode in the + * hopes that it's *STOP DOING THAT*. + */ + gtk_clist_set_selection_mode(GTK_CLIST(tree), + GTK_SELECTION_SINGLE); +#endif - len = proto_registrar_n(); - for (i = 0; i < len; i++) { - /* - * If this field is a protocol, skip it - we already put - * it in above. - */ - if (proto_registrar_is_protocol(i)) - continue; + col2_vb = gtk_vbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(col2_vb), 5); + gtk_container_add(GTK_CONTAINER(hb), col2_vb); + gtk_widget_show(col2_vb); + + relation_label = gtk_label_new("Relation"); + gtk_misc_set_alignment(GTK_MISC(relation_label), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(col2_vb), relation_label, FALSE, FALSE, 0); + +#if GTK_MAJOR_VERSION < 2 + relation_list = gtk_list_new(); + gtk_list_set_selection_mode(GTK_LIST(relation_list), + GTK_SELECTION_BROWSE); +#else + l_store = gtk_list_store_new(1, G_TYPE_STRING); + relation_list = tree_view_new(GTK_TREE_MODEL(l_store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(relation_list), FALSE); + g_object_unref(G_OBJECT(l_store)); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("relation", renderer, + "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(relation_list), column); + l_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list)); + gtk_tree_selection_set_mode(l_sel, GTK_SELECTION_BROWSE); +#endif + gtk_box_pack_start(GTK_BOX(col2_vb), relation_list, TRUE, TRUE, 0); + + range_label = gtk_label_new("Range (offset:length)"); + gtk_misc_set_alignment(GTK_MISC(range_label), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(col2_vb), range_label, FALSE, FALSE, 0); + + range_entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(col2_vb), range_entry, FALSE, FALSE, 0); + + /* + * OK, show the relation label and range stuff as it would be + * with everything turned on, so it'll request as much space + * as it'll ever need, so the dialog box and widgets start out + * with the right sizes. + * + * XXX - this doesn't work. It *doesn't* request as much space + * as it'll ever need. + * + * XXX - FT_UINT8 doesn't support ranges, so even if it did work, + * it wouldn't work right. + * + * XXX - this no longer affects the range stuff, as that's + * controlled both by the type and by the relational operator + * selected. + */ + show_relations(relation_label, relation_list, FT_UINT8); + + value_vb = gtk_vbox_new(FALSE, 5); + gtk_container_border_width(GTK_CONTAINER(value_vb), 5); + gtk_container_add(GTK_CONTAINER(hb), value_vb); + gtk_widget_show(value_vb); + + value_label = gtk_label_new("Value"); + gtk_misc_set_alignment(GTK_MISC(value_label), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(value_vb), value_label, FALSE, FALSE, 0); + gtk_widget_show(value_label); + + value_entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(value_vb), value_entry, FALSE, FALSE, 0); + gtk_widget_show(value_entry); + + value_list_scrolled_win = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(value_list_scrolled_win), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_box_pack_start(GTK_BOX(value_vb), value_list_scrolled_win, TRUE, + TRUE, 0); + gtk_widget_show(value_list_scrolled_win); + +#if GTK_MAJOR_VERSION < 2 + value_list = gtk_list_new(); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(value_list_scrolled_win), + value_list); + gtk_signal_connect(GTK_OBJECT(value_list), "select-child", + GTK_SIGNAL_FUNC(value_list_sel_cb), value_entry); + gtk_list_set_selection_mode(GTK_LIST(value_list), GTK_SELECTION_SINGLE); + /* This remains hidden until an enumerated field is selected */ + + /* + * The value stuff may be hidden or shown depending on what + * relation was selected; connect to the "select-child" signal + * for the relation list, so we can make that happen. + */ + gtk_signal_connect(GTK_OBJECT(relation_list), "select-child", + GTK_SIGNAL_FUNC(relation_list_sel_cb), NULL); +#else + l_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); + value_list = tree_view_new(GTK_TREE_MODEL(l_store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(value_list), FALSE); + g_object_unref(G_OBJECT(l_store)); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("value", renderer, + "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(value_list), column); + g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list))), + "changed", G_CALLBACK(value_list_sel_cb), value_entry); + + /* + * The value stuff may be hidden or shown depending on what + * relation was selected; connect to the "changed" signal + * for the relation list, so we can make that happen. + */ + g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list))), + "changed", G_CALLBACK(relation_list_sel_cb), NULL); + l_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list)); + gtk_tree_selection_set_mode(l_sel, GTK_SELECTION_SINGLE); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(value_list_scrolled_win), + value_list); + /* This remains hidden until an enumerated field is selected */ +#endif - hfinfo = proto_registrar_get_nth(i); + /* + * Put the items in the Tree; we don't want to do that until + * we've constructed the value list and set the tree's + * E_DFILTER_EXPR_VALUE_LIST_KEY data to point to it, and + * constructed the "Accept" button and set the tree's + * E_DFILTER_EXPR_ACCEPT_BT_KEY data to point to it, so that + * when the list item is "helpfully" automatically selected for us + * we're ready to cope with the selection signal. + */ + +#if GTK_MAJOR_VERSION < 2 + /* a hash table seems excessive, but I don't see support for a + sparse array in glib */ + proto_array = g_hash_table_new(g_direct_hash, g_direct_equal); + for (i = proto_get_first_protocol(&cookie); i != -1; + i = proto_get_next_protocol(&cookie)) { + hfinfo = proto_registrar_get_nth(i); + /* Create a node for the protocol, and remember it for + later use. */ + name = proto_get_protocol_short_name(i); + protocol_node = gtk_ctree_insert_node(GTK_CTREE(tree), + NULL, NULL, + &name, 5, + NULL, NULL, NULL, NULL, + FALSE, FALSE); + gtk_ctree_node_set_row_data(GTK_CTREE(tree), protocol_node, + hfinfo); + g_hash_table_insert(proto_array, (gpointer)i, protocol_node); + } +#endif - /* - * If this field isn't at the head of the list of - * fields with this name, skip this field - all - * fields with the same name are really just versions - * of the same field stored in different bits, and - * should have the same type/radix/value list, and - * just differ in their bit masks. (If a field isn't - * a bitfield, but can be, say, 1 or 2 bytes long, - * it can just be made FT_UINT16, meaning the - * *maximum* length is 2 bytes, and be used - * for all lengths.) - */ - if (hfinfo->same_name_prev != NULL) - continue; - - /* Create a node for the item, and put it - under its parent protocol. */ - protocol_node = g_hash_table_lookup(proto_array, - (gpointer)proto_registrar_get_parent(i)); - item_node = gtk_ctree_insert_node(GTK_CTREE(tree), - protocol_node, NULL, - &hfinfo->name, 5, - NULL, NULL, NULL, NULL, - FALSE, FALSE); - gtk_ctree_node_set_row_data(GTK_CTREE(tree), - item_node, hfinfo); - } + len = proto_registrar_n(); + for (i = 0; i < len; i++) { +#if GTK_MAJOR_VERSION < 2 + /* + * If this field is a protocol, skip it - we already put + * it in above. + */ + if (proto_registrar_is_protocol(i)) + continue; +#else + GtkTreeIter child_iter; +#endif - g_hash_table_destroy(proto_array); - - gtk_widget_show_all(tree); - - list_bb = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(list_bb), GTK_BUTTONBOX_START); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(list_bb), 5); - gtk_container_add(GTK_CONTAINER(main_vb), list_bb); - gtk_widget_show(list_bb); - - accept_bt = gtk_button_new_with_label("Accept"); - gtk_widget_set_sensitive(accept_bt, FALSE); - gtk_signal_connect(GTK_OBJECT(accept_bt), "clicked", - GTK_SIGNAL_FUNC(dfilter_expr_dlg_accept_cb), filter_te); - GTK_WIDGET_SET_FLAGS(accept_bt, GTK_CAN_DEFAULT); - alignment = gtk_alignment_new(0.0, 0.5, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), accept_bt); - gtk_box_pack_start(GTK_BOX(list_bb), alignment, TRUE, TRUE, 0); - gtk_widget_grab_default(accept_bt); - gtk_widget_show(accept_bt); - gtk_widget_show(alignment); - - close_bt = gtk_button_new_with_label("Close"); - gtk_signal_connect(GTK_OBJECT(close_bt), "clicked", - GTK_SIGNAL_FUNC(dfilter_expr_dlg_cancel_cb), window); - alignment = gtk_alignment_new(0.0, 0.5, 1.0, 0.0); - gtk_container_add(GTK_CONTAINER(alignment), close_bt); - gtk_box_pack_start(GTK_BOX(list_bb), alignment, TRUE, TRUE, 0); - gtk_widget_show(close_bt); - gtk_widget_show(alignment); - - /* Catch the "activate" signal on the range and value text entries, - so that if the user types Return there, we act as if the "Accept" - button had been selected, as happens if Return is typed if some - widget that *doesn't* handle the Return key has the input focus. */ - dlg_set_activate(range_entry, accept_bt); - dlg_set_activate(value_entry, accept_bt); + hfinfo = proto_registrar_get_nth(i); - /* - * Catch the "key_press_event" signal in the window, so that we can - * catch the ESC key being pressed and act as if the "Close" button - * had been selected. - */ - dlg_set_cancel(window, close_bt); - - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RELATION_LABEL_KEY, relation_label); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RELATION_LIST_KEY, relation_list); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_LABEL_KEY, range_label); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_RANGE_ENTRY_KEY, range_entry); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LABEL_KEY, value_label); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_ENTRY_KEY, value_entry); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_KEY, value_list); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_VALUE_LIST_SW_KEY, value_list_scrolled_win); - gtk_object_set_data(GTK_OBJECT(window), - E_DFILTER_EXPR_ACCEPT_BT_KEY, accept_bt); +#if GTK_MAJOR_VERSION >= 2 + if (hfinfo->type == FT_PROTOCOL) + { + /* Create a node for the protocol */ + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, hfinfo->abbrev, 1, hfinfo, -1); + continue; + } +#endif - /* - * OK, we've finally built the entire list, complete with the row data, - * and attached to the top-level widget pointers to the relevant - * subwidgets, so it's safe to put the list in browse mode. - */ - gtk_clist_set_selection_mode (GTK_CLIST(tree), - GTK_SELECTION_BROWSE); + /* + * If this field isn't at the head of the list of + * fields with this name, skip this field - all + * fields with the same name are really just versions + * of the same field stored in different bits, and + * should have the same type/radix/value list, and + * just differ in their bit masks. (If a field isn't + * a bitfield, but can be, say, 1 or 2 bytes long, + * it can just be made FT_UINT16, meaning the + * *maximum* length is 2 bytes, and be used + * for all lengths.) + */ + if (hfinfo->same_name_prev != NULL) + continue; + + /* Create a node for the item, and put it + under its parent protocol. */ +#if GTK_MAJOR_VERSION < 2 + protocol_node = g_hash_table_lookup(proto_array, + (gpointer)proto_registrar_get_parent(i)); + item_node = gtk_ctree_insert_node(GTK_CTREE(tree), + protocol_node, NULL, + &hfinfo->name, 5, + NULL, NULL, NULL, NULL, + FALSE, FALSE); + gtk_ctree_node_set_row_data(GTK_CTREE(tree), + item_node, hfinfo); +#else + gtk_tree_store_append(store, &child_iter, &iter); + gtk_tree_store_set(store, &child_iter, 0, hfinfo->name, 1, hfinfo, -1); +#endif + } +#if GTK_MAJOR_VERSION < 2 + g_hash_table_destroy(proto_array); +#else + g_object_unref(G_OBJECT(store)); +#endif - /* - * Catch the "destroy" signal on our top-level window, and, - * when it's destroyed, disconnect the signal we'll be - * connecting below. - */ - gtk_signal_connect(GTK_OBJECT(window), "destroy", - GTK_SIGNAL_FUNC(dfilter_expr_dlg_destroy_cb), filter_te); + gtk_widget_show_all(tree); + + list_bb = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(list_bb), GTK_BUTTONBOX_START); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(list_bb), 5); + gtk_container_add(GTK_CONTAINER(main_vb), list_bb); + gtk_widget_show(list_bb); + +#if GTK_MAJOR_VERSION < 2 + accept_bt = gtk_button_new_with_label("Accept"); + gtk_widget_set_sensitive(accept_bt, FALSE); + gtk_signal_connect(GTK_OBJECT(accept_bt), "clicked", + GTK_SIGNAL_FUNC(dfilter_expr_dlg_accept_cb), filter_te); +#else + accept_bt = gtk_button_new_from_stock(GTK_STOCK_OK); + gtk_widget_set_sensitive(accept_bt, FALSE); + g_signal_connect(G_OBJECT(accept_bt), "clicked", + G_CALLBACK(dfilter_expr_dlg_accept_cb), filter_te); +#endif + GTK_WIDGET_SET_FLAGS(accept_bt, GTK_CAN_DEFAULT); + alignment = gtk_alignment_new(0.0, 0.5, 1.0, 0.0); + gtk_container_add(GTK_CONTAINER(alignment), accept_bt); + gtk_box_pack_start(GTK_BOX(list_bb), alignment, TRUE, TRUE, 0); + gtk_widget_grab_default(accept_bt); + gtk_widget_show(accept_bt); + gtk_widget_show(alignment); + +#if GTK_MAJOR_VERSION < 2 + close_bt = gtk_button_new_with_label("Close"); + gtk_signal_connect(GTK_OBJECT(close_bt), "clicked", + GTK_SIGNAL_FUNC(dfilter_expr_dlg_cancel_cb), window); +#else + close_bt = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + g_signal_connect(G_OBJECT(close_bt), "clicked", + G_CALLBACK(dfilter_expr_dlg_cancel_cb), window); +#endif + alignment = gtk_alignment_new(0.0, 0.5, 1.0, 0.0); + gtk_container_add(GTK_CONTAINER(alignment), close_bt); + gtk_box_pack_start(GTK_BOX(list_bb), alignment, TRUE, TRUE, 0); + gtk_widget_show(close_bt); + gtk_widget_show(alignment); + + /* Catch the "activate" signal on the range and value text entries, + so that if the user types Return there, we act as if the "Accept" + button had been selected, as happens if Return is typed if some + widget that *doesn't* handle the Return key has the input focus. */ + dlg_set_activate(range_entry, accept_bt); + dlg_set_activate(value_entry, accept_bt); + + /* + * Catch the "key_press_event" signal in the window, so that we can + * catch the ESC key being pressed and act as if the "Close" button + * had been selected. + */ + dlg_set_cancel(window, close_bt); + + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RELATION_LABEL_KEY, relation_label); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RELATION_LIST_KEY, relation_list); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RANGE_LABEL_KEY, range_label); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_RANGE_ENTRY_KEY, range_entry); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LABEL_KEY, value_label); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_ENTRY_KEY, value_entry); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LIST_KEY, value_list); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_VALUE_LIST_SW_KEY, value_list_scrolled_win); + gtk_object_set_data(GTK_OBJECT(window), + E_DFILTER_EXPR_ACCEPT_BT_KEY, accept_bt); + +#if GTK_MAJOR_VERSION < 2 + /* + * OK, we've finally built the entire list, complete with the row data, + * and attached to the top-level widget pointers to the relevant + * subwidgets, so it's safe to put the list in browse mode. + */ + gtk_clist_set_selection_mode (GTK_CLIST(tree), + GTK_SELECTION_BROWSE); + + /* + * Catch the "destroy" signal on our top-level window, and, + * when it's destroyed, disconnect the signal we'll be + * connecting below. + */ + gtk_signal_connect(GTK_OBJECT(window), "destroy", + GTK_SIGNAL_FUNC(dfilter_expr_dlg_destroy_cb), filter_te); +#else + g_signal_connect(G_OBJECT(window), "destroy", + G_CALLBACK(dfilter_expr_dlg_destroy_cb), filter_te); +#endif - /* - * Catch the "destroy" signal on the text entry widget to which - * we're attached; if it's destroyed, we should destroy ourselves - * as well. - */ - gtk_signal_connect(GTK_OBJECT(filter_te), "destroy", - GTK_SIGNAL_FUNC(dfilter_expr_dlg_cancel_cb), window); + /* + * Catch the "destroy" signal on the text entry widget to which + * we're attached; if it's destroyed, we should destroy ourselves + * as well. + */ +#if GTK_MAJOR_VERSION < 2 + gtk_signal_connect(GTK_OBJECT(filter_te), "destroy", + GTK_SIGNAL_FUNC(dfilter_expr_dlg_cancel_cb), window); +#else + g_signal_connect(G_OBJECT(filter_te), "destroy", + G_CALLBACK(dfilter_expr_dlg_cancel_cb), window); +#endif - gtk_widget_show(window); + gtk_widget_show(window); } |