2 * Routines for parameter dialog used by gui taps
3 * Copyright 2003 Lars Roland
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33 #ifdef HAVE_SYS_TYPES_H
34 # include <sys/types.h>
39 #include <epan/stat_cmd_args.h>
41 #include "../simple_dialog.h"
43 #include "../globals.h"
44 #include "../stat_menu.h"
46 #include "gtk/stock_icons.h"
47 #include "gtk/dlg_utils.h"
48 #include "gtk/filter_dlg.h"
49 #include "gtk/gui_stat_menu.h"
50 #include "gtk/tap_param_dlg.h"
51 #include "gtk/gui_utils.h"
52 #include "gtk/gtkglobals.h"
53 #include "gtk/filter_autocomplete.h"
55 #include "gtk/old-gtk-compat.h"
57 typedef struct _tap_param_dlg_list_item {
60 construct_args_t args;
61 GtkWidget **param_items; /* items for params */
62 struct _tap_param_dlg_list_item *next;
63 } tap_param_dlg_list_item;
65 static tap_param_dlg_list_item *start_dlg_list=NULL;
66 static tap_param_dlg_list_item *end_dlg_list=NULL;
67 static tap_param_dlg_list_item *current_dlg = NULL;
70 tap_param_dlg_cb(GtkWidget *w, gpointer data);
73 * Register a stat that has a parameter dialog.
74 * We register it both as a command-line stat and a menu item stat.
77 register_dfilter_stat(tap_param_dlg *info, const char *name,
78 register_stat_group_t group)
82 register_stat_cmd_arg(info->init_string, info->tap_init_cb, NULL);
85 * This menu item will pop up a dialog box, so append "..."
88 full_name = g_strdup_printf("%s...", name);
89 register_stat_menu_item(full_name, group, tap_param_dlg_cb, NULL,
94 void tap_param_dlg_update (void)
96 tap_param_dlg_list_item *dialog = start_dlg_list;
99 while(dialog != NULL) {
101 title = g_strdup_printf("Wireshark: %s: %s", dialog->cont.win_title , cf_get_display_name(&cfile));
102 gtk_window_set_title(GTK_WINDOW(dialog->dlg), title);
105 dialog = dialog->next;
110 dlg_destroy_cb(GtkWidget *item _U_, gpointer dialog_data)
112 tap_param_dlg_list_item *dlg_data = (tap_param_dlg_list_item *) dialog_data;
113 dlg_data->dlg = NULL;
117 tap_param_dlg_start_button_clicked(GtkWidget *item _U_, gpointer dialog_data)
123 tap_param_dlg_list_item *dlg_data = (tap_param_dlg_list_item *) dialog_data;
125 params = g_string_new(dlg_data->cont.init_string);
126 for(i=0;i<dlg_data->cont.nparams;i++) {
127 g_string_append_c(params, ',');
128 switch (dlg_data->cont.params[i].type) {
131 j = gtk_combo_box_get_active(GTK_COMBO_BOX(dlg_data->param_items[i]));
132 g_string_append_printf(params,"%d",
133 dlg_data->cont.params[i].enum_vals[j].value);
139 g_string_append(params,
140 gtk_entry_get_text(GTK_ENTRY(dlg_data->param_items[i])));
144 (dlg_data->cont.tap_init_cb)(params->str,NULL);
145 g_string_free(params, TRUE);
150 tap_param_dlg_cb(GtkWidget *w _U_, gpointer data)
155 GtkWidget *item_box, *item, *label, *filter_bt;
156 GtkWidget *bbox, *start_button, *cancel_button;
158 char *label_with_colon;
160 tap_param_dlg *dlg_data = (tap_param_dlg *) data;
165 if(dlg_data->index==-1) {
166 /* Dialog is not registered */
167 if(start_dlg_list==NULL) {
168 start_dlg_list = (tap_param_dlg_list_item *) g_malloc(sizeof (tap_param_dlg_list_item));
169 end_dlg_list = start_dlg_list;
170 end_dlg_list->cont.index = 0; /* first entry in list -> index = 0 */
172 end_dlg_list->next = (tap_param_dlg_list_item *) g_malloc(sizeof (tap_param_dlg_list_item));
173 end_dlg_list->next->cont.index = end_dlg_list->cont.index + 1;
174 end_dlg_list = end_dlg_list->next;
176 end_dlg_list->dlg = NULL;
177 end_dlg_list->param_items = g_malloc(dlg_data->nparams * sizeof (GtkWidget *));
178 end_dlg_list->cont.win_title = dlg_data->win_title;
179 end_dlg_list->cont.init_string = dlg_data->init_string;
180 end_dlg_list->cont.tap_init_cb = dlg_data->tap_init_cb;
181 end_dlg_list->cont.nparams = dlg_data->nparams;
182 end_dlg_list->cont.params = dlg_data->params;
183 end_dlg_list->args.title = g_strdup_printf("%s Filter", dlg_data->win_title);
184 end_dlg_list->args.wants_apply_button = TRUE;
185 end_dlg_list->args.activate_on_ok = FALSE;
186 end_dlg_list->args.modal_and_transient = FALSE;
187 end_dlg_list->next = NULL;
188 dlg_data->index = end_dlg_list->cont.index;
189 current_dlg = end_dlg_list;
191 /* Dialog is registered, find it */
192 current_dlg = start_dlg_list;
193 while(dlg_data->index != current_dlg->cont.index)
195 if(current_dlg->next == NULL) {
196 /* could not find any dialog */
199 current_dlg = current_dlg->next;
203 /* if the window is already open, bring it to front */
204 if(current_dlg->dlg){
205 gdk_window_raise(gtk_widget_get_window(current_dlg->dlg));
209 title = g_strdup_printf("Wireshark: %s: %s", current_dlg->cont.win_title , cf_get_display_name(&cfile));
211 current_dlg->dlg=dlg_window_new(title);
212 gtk_window_set_default_size(GTK_WINDOW(current_dlg->dlg), 300, -1);
215 dlg_box=gtk_vbox_new(FALSE, 10);
216 gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
217 gtk_container_add(GTK_CONTAINER(current_dlg->dlg), dlg_box);
218 gtk_widget_show(dlg_box);
220 /* Parameter items */
221 for(i=0;i<current_dlg->cont.nparams;i++) {
223 item_box=gtk_hbox_new(FALSE, 3);
225 switch (current_dlg->cont.params[i].type) {
230 label_with_colon=g_strdup_printf("%s:", current_dlg->cont.params[i].title);
231 label=gtk_label_new(label_with_colon);
232 g_free(label_with_colon);
233 gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, TRUE, 0);
234 gtk_widget_show(label);
237 item=gtk_entry_new();
242 label_with_colon=g_strdup_printf("%s:", current_dlg->cont.params[i].title);
243 label=gtk_label_new(label_with_colon);
244 g_free(label_with_colon);
245 gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, TRUE, 0);
246 gtk_widget_show(label);
249 item=gtk_combo_box_text_new();
250 for (j = 0; current_dlg->cont.params[i].enum_vals[j].name != NULL;
252 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(item),
253 current_dlg->cont.params[i].enum_vals[j].description);
254 gtk_combo_box_set_active(GTK_COMBO_BOX(item), 0);
259 filter_bt=gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
260 g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &(current_dlg->args));
261 gtk_box_pack_start(GTK_BOX(item_box), filter_bt, FALSE, TRUE, 0);
262 gtk_widget_show(filter_bt);
265 item=gtk_entry_new();
266 filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
268 gtk_entry_set_text(GTK_ENTRY(item), filter);
270 colorize_filter_te_as_empty(item);
272 g_signal_connect(item, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
273 g_object_set_data(G_OBJECT(item_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
274 g_signal_connect(item, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
275 g_signal_connect(current_dlg->dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
276 g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, item);
280 g_assert_not_reached();
285 gtk_box_pack_start(GTK_BOX(item_box), item, TRUE, TRUE, 0);
286 current_dlg->param_items[i]=item;
287 gtk_widget_show(item);
289 gtk_box_pack_start(GTK_BOX(dlg_box), item_box, TRUE, TRUE, 0);
290 gtk_widget_show(item_box);
294 bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
295 gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
296 gtk_widget_show(bbox);
298 start_button = g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
299 g_signal_connect(start_button, "clicked",
300 G_CALLBACK(tap_param_dlg_start_button_clicked), current_dlg);
302 cancel_button = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
303 window_set_cancel_button(current_dlg->dlg, cancel_button, window_cancel_button_cb);
305 /* Catch the "activate" signal on all the text entries, so that
306 if the user types Return there, we act as if the "Create Stat"
307 button had been selected, as happens if Return is typed if
308 some widget that *doesn't* handle the Return key has the input
310 for(i=0;i<current_dlg->cont.nparams;i++){
311 switch (current_dlg->cont.params[i].type) {
319 dlg_set_activate(current_dlg->param_items[i], start_button);
324 /* Give the initial focus to the first entry box. */
325 if(current_dlg->cont.nparams>0){
326 gtk_widget_grab_focus(current_dlg->param_items[0]);
329 gtk_widget_grab_default(start_button );
331 g_signal_connect(current_dlg->dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
332 g_signal_connect(current_dlg->dlg, "destroy", G_CALLBACK(dlg_destroy_cb), current_dlg);
334 gtk_widget_show_all(current_dlg->dlg);
335 window_present(current_dlg->dlg);