Make the routines internal to the filter-editing dialog box static.
[obnox/wireshark/wip.git] / gtk / find_dlg.c
1 /* find_dlg.c
2  * Routines for "find frame" window
3  *
4  * $Id: find_dlg.c,v 1.6 2000/02/12 06:46:53 guy Exp $
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@zing.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * 
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.
15  * 
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.
20  * 
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.
24  */
25
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <gtk/gtk.h>
32
33 #ifdef HAVE_UNISTD_H
34 #include <unistd.h>
35 #endif
36
37 #ifndef __G_LIB_H__
38 #include <glib.h>
39 #endif
40
41 #include "proto.h"
42 #include "dfilter.h"
43 #include "globals.h"
44
45 #include "find_dlg.h"
46 #include "filter_prefs.h"
47 #include "simple_dialog.h"
48
49 /* Capture callback data keys */
50 #define E_FIND_FILT_KEY     "find_filter_te"
51 #define E_FIND_BACKWARD_KEY "find_backward"
52
53 static void
54 find_frame_ok_cb(GtkWidget *ok_bt, gpointer parent_w);
55
56 static void
57 find_frame_close_cb(GtkWidget *close_bt, gpointer parent_w);
58
59 void
60 find_frame_cb(GtkWidget *w, gpointer d)
61 {
62   GtkWidget     *find_frame_w, *main_vb, *filter_hb, *filter_bt, *filter_te,
63                 *direction_hb, *forward_rb, *backward_rb,
64                 *bbox, *ok_bt, *cancel_bt;
65
66   find_frame_w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
67   gtk_window_set_title(GTK_WINDOW(find_frame_w), "Ethereal: Find Frame");
68   
69   /* Container for each row of widgets */
70   main_vb = gtk_vbox_new(FALSE, 3);
71   gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
72   gtk_container_add(GTK_CONTAINER(find_frame_w), main_vb);
73   gtk_widget_show(main_vb);
74   
75   /* Filter row */
76   filter_hb = gtk_hbox_new(FALSE, 3);
77   gtk_container_add(GTK_CONTAINER(main_vb), filter_hb);
78   gtk_widget_show(filter_hb);
79   
80   filter_bt = gtk_button_new_with_label("Filter:");
81   gtk_signal_connect(GTK_OBJECT(filter_bt), "clicked",
82     GTK_SIGNAL_FUNC(filter_dialog_cb), NULL);
83   gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, TRUE, 0);
84   gtk_widget_show(filter_bt);
85   
86   filter_te = gtk_entry_new();
87   if (cf.sfilter) gtk_entry_set_text(GTK_ENTRY(filter_te), cf.sfilter);
88   gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
89   gtk_box_pack_start(GTK_BOX(filter_hb), filter_te, TRUE, TRUE, 0);
90   gtk_widget_show(filter_te);
91   
92   /* Misc row: Forward and reverse radio buttons */
93   direction_hb = gtk_hbox_new(FALSE, 3);
94   gtk_container_add(GTK_CONTAINER(main_vb), direction_hb);
95   gtk_widget_show(direction_hb);
96
97   forward_rb = gtk_radio_button_new_with_label(NULL, "Forward");
98   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(forward_rb), !cf.sbackward);
99   gtk_box_pack_start(GTK_BOX(direction_hb), forward_rb, TRUE, TRUE, 0);
100   gtk_widget_show(forward_rb);
101
102   backward_rb = gtk_radio_button_new_with_label(
103                gtk_radio_button_group(GTK_RADIO_BUTTON(forward_rb)),
104                "Backward");
105   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(backward_rb), cf.sbackward);
106   gtk_box_pack_start(GTK_BOX(direction_hb), backward_rb, TRUE, TRUE, 0);
107   gtk_widget_show(backward_rb);
108
109   /* Button row: OK and cancel buttons */
110   bbox = gtk_hbutton_box_new();
111   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
112   gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
113   gtk_container_add(GTK_CONTAINER(main_vb), bbox);
114   gtk_widget_show(bbox);
115
116   ok_bt = gtk_button_new_with_label ("OK");
117   gtk_signal_connect(GTK_OBJECT(ok_bt), "clicked",
118     GTK_SIGNAL_FUNC(find_frame_ok_cb), GTK_OBJECT(find_frame_w));
119   GTK_WIDGET_SET_FLAGS(ok_bt, GTK_CAN_DEFAULT);
120   gtk_box_pack_start (GTK_BOX (bbox), ok_bt, TRUE, TRUE, 0);
121   gtk_widget_grab_default(ok_bt);
122   gtk_widget_show(ok_bt);
123
124   cancel_bt = gtk_button_new_with_label ("Cancel");
125   gtk_signal_connect(GTK_OBJECT(cancel_bt), "clicked",
126     GTK_SIGNAL_FUNC(find_frame_close_cb), GTK_OBJECT(find_frame_w));
127   GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT);
128   gtk_box_pack_start (GTK_BOX (bbox), cancel_bt, TRUE, TRUE, 0);
129   gtk_widget_show(cancel_bt);
130
131   /* Attach pointers to needed widgets to the capture prefs window/object */
132   gtk_object_set_data(GTK_OBJECT(find_frame_w), E_FIND_FILT_KEY, filter_te);
133   gtk_object_set_data(GTK_OBJECT(find_frame_w), E_FIND_BACKWARD_KEY, backward_rb);
134
135   gtk_widget_show(find_frame_w);
136 }
137
138 static void
139 find_frame_ok_cb(GtkWidget *ok_bt, gpointer parent_w)
140 {
141   GtkWidget *filter_te, *backward_rb;
142   gchar *filter_text;
143   dfilter *sfcode;
144
145   filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_FIND_FILT_KEY);
146   backward_rb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_FIND_BACKWARD_KEY);
147
148   filter_text = gtk_entry_get_text(GTK_ENTRY(filter_te));
149
150   /*
151    * Try to compile the filter.
152    */
153   if (dfilter_compile(filter_text, &sfcode) != 0) {
154     /* The attempt failed; report an error. */
155     simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg);
156     return;
157   }
158
159   /* Was it empty? */
160   if (sfcode == NULL) {
161     /* Yes - complain. */
162     simple_dialog(ESD_TYPE_WARN, NULL,
163        "You didn't specify a filter to use when searching for a frame.");
164     return;
165   }
166
167   /*
168    * Remember the filter.
169    */
170   if (cf.sfilter)
171     g_free(cf.sfilter);
172   cf.sfilter = g_strdup(filter_text);
173
174   cf.sbackward = GTK_TOGGLE_BUTTON (backward_rb)->active;
175
176   if (!find_packet(&cf, sfcode)) {
177     /* We didn't find the packet. */
178     simple_dialog(ESD_TYPE_WARN, NULL, "No packet matched that filter.");
179     return;
180   }
181
182   gtk_widget_destroy(GTK_WIDGET(parent_w));
183 }
184
185 static void
186 find_frame_close_cb(GtkWidget *close_bt, gpointer parent_w)
187 {
188   gtk_grab_remove(GTK_WIDGET(parent_w));
189   gtk_widget_destroy(GTK_WIDGET(parent_w));
190 }