b924c0e7727072baf8dd7e2f77b5208fab76ef40
[obnox/wireshark/wip.git] / gtk / range_utils.c
1 /* range_utils.c
2  * Packet range routines (save, print, ...) for GTK things
3  *
4  * $Id$
5  *
6  * Ulf Lamping <ulf.lamping@web.de>
7  *
8  * Ethereal - Network traffic analyzer
9  * By Gerald Combs <gerald@ethereal.com>
10  * Copyright 1998 Gerald Combs
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  */
26
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30
31 #include <gtk/gtk.h>
32
33 #include "globals.h"
34
35 #include <epan/packet-range.h>
36 #include "ui_util.h"
37 #include "dlg_utils.h"
38 #include "compat_macros.h"
39
40
41 #define RANGE_VALUES_KEY                "range_values"
42 #define RANGE_CAPTURED_BT_KEY           "range_captured_button"
43 #define RANGE_DISPLAYED_BT_KEY          "range_displayed_button"
44
45 #define RANGE_SELECT_ALL_C_KEY          "range_select_all_c_lb"
46 #define RANGE_SELECT_ALL_D_KEY          "range_select_all_d_lb"
47 #define RANGE_SELECT_CURR_KEY           "range_select_curr_rb"
48 #define RANGE_SELECT_CURR_C_KEY         "range_select_curr_c_lb"
49 #define RANGE_SELECT_CURR_D_KEY         "range_select_curr_d_lb"
50 #define RANGE_SELECT_MARKED_KEY         "range_select_marked_only_rb"
51 #define RANGE_SELECT_MARKED_C_KEY       "range_select_marked_only_c_lb"
52 #define RANGE_SELECT_MARKED_D_KEY       "range_select_marked_only_d_lb"
53 #define RANGE_SELECT_MARKED_RANGE_KEY   "range_select_marked_range_rb"
54 #define RANGE_SELECT_MARKED_RANGE_C_KEY "range_select_marked_range_c_lb"
55 #define RANGE_SELECT_MARKED_RANGE_D_KEY "range_select_marked_range_d_lb"
56 #define RANGE_SELECT_USER_KEY           "range_select_user_range_rb"
57 #define RANGE_SELECT_USER_C_KEY         "range_select_user_range_c_lb"
58 #define RANGE_SELECT_USER_D_KEY         "range_select_user_range_d_lb"
59 #define RANGE_SELECT_USER_ENTRY_KEY     "range_select_user_range_entry"
60
61
62
63 /* update all "dynamic" things */
64 void
65 range_update_dynamics(gpointer data) {
66   gboolean      filtered_active;
67   gchar         label_text[100];
68   gint          selected_num;
69   GtkWidget     *bt;
70   packet_range_t *range;
71
72
73   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
74
75   
76   bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
77   filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bt));
78
79   gtk_widget_set_sensitive(bt, TRUE);
80
81   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY), !filtered_active);
82   g_snprintf(label_text, sizeof(label_text), "%u", cfile.count);
83   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY)), label_text);
84   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY), filtered_active);
85   g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_cnt);
86
87   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY)), label_text);
88
89   selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0;
90   /* XXX: how to update the radio button label but keep the mnemonic? */
91 /*  g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
92   gtk_label_set_text(GTK_LABEL(GTK_BIN(select_curr_rb)->child), label_text);*/
93   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), selected_num);
94   g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
95   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY)), label_text);
96   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), selected_num && !filtered_active);
97   g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
98   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY)), label_text);
99   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), selected_num && filtered_active);
100
101   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), cfile.marked_count > 0);
102   g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count);
103   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY)), label_text);
104   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), cfile.marked_count > 0 && !filtered_active);
105   g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt);
106   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY)), label_text);
107   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), range->displayed_marked_cnt && filtered_active);
108
109   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), range->mark_range_cnt);
110   g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
111   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY)), label_text);
112   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), range->mark_range_cnt && !filtered_active);
113   g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_mark_range_cnt);
114   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text);
115   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), range->displayed_mark_range_cnt && filtered_active);
116
117   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_KEY), TRUE);
118   g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt);
119   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY)), label_text);
120   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
121   g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_user_range_cnt);
122   gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY)), label_text);
123   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
124 }
125
126
127 static void
128 toggle_captured_cb(GtkWidget *widget, gpointer data)
129 {
130   GtkWidget *bt;
131   packet_range_t *range;
132
133
134   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
135
136   /* is the button now active? */
137   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
138     /* They changed the state of the "captured" button. */
139     range->process_filtered = FALSE;
140
141     bt = OBJECT_GET_DATA(data, RANGE_CAPTURED_BT_KEY);
142     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), TRUE);
143     bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
144     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), FALSE);
145
146     range_update_dynamics(data);
147   }
148 }
149
150 static void
151 toggle_filtered_cb(GtkWidget *widget, gpointer data)
152 {
153   GtkWidget *bt;
154   packet_range_t *range;
155
156
157   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
158   
159   /* is the button now active? */
160   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
161     range->process_filtered = TRUE;
162     bt = OBJECT_GET_DATA(data, RANGE_CAPTURED_BT_KEY);
163     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), FALSE);
164     bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
165     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), TRUE);
166     
167     range_update_dynamics(data);
168   }
169 }
170
171 static void
172 toggle_select_all(GtkWidget *widget, gpointer data)
173 {
174   packet_range_t *range;
175
176
177   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
178   
179   /* is the button now active? */
180   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
181     range->process = range_process_all;
182     range_update_dynamics(data);
183   }
184 }
185
186 static void
187 toggle_select_selected(GtkWidget *widget, gpointer data)
188 {
189   packet_range_t *range;
190
191
192   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
193   
194   /* is the button now active? */
195   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
196     range->process = range_process_selected;
197     range_update_dynamics(data);
198   }
199 }
200
201 static void
202 toggle_select_marked_only(GtkWidget *widget, gpointer data)
203 {
204   packet_range_t *range;
205
206
207   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
208   
209   /* is the button now active? */
210   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
211     range->process = range_process_marked;
212     range_update_dynamics(data);
213   }
214 }
215
216 static void
217 toggle_select_marked_range(GtkWidget *widget, gpointer data)
218 {
219   packet_range_t *range;
220
221
222   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
223   
224   /* is the button now active? */
225   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
226     range->process = range_process_marked_range;
227     range_update_dynamics(data);
228   }
229 }
230
231 static void
232 toggle_select_user_range(GtkWidget *widget, gpointer data)
233 {
234   packet_range_t *range;
235
236
237   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
238   
239   /* is the button now active? */
240   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
241     range->process = range_process_user_range;
242     range_update_dynamics(data);
243   }
244         
245   /* Make the entry widget sensitive or insensitive */
246   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_ENTRY_KEY), range->process == range_process_user_range);
247
248   /* When selecting user specified range, then focus on the entry */
249   if (range->process == range_process_user_range)
250       gtk_widget_grab_focus(OBJECT_GET_DATA(data, RANGE_SELECT_USER_ENTRY_KEY));
251
252 }
253
254
255 static void
256 range_entry(GtkWidget *widget _U_, gpointer data)
257 {
258   const gchar   *entry_text;
259   GtkWidget     *entry;
260   packet_range_t *range;
261
262
263   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);  
264   entry = OBJECT_GET_DATA(data, RANGE_SELECT_USER_ENTRY_KEY);
265
266   gtk_toggle_button_set_active(OBJECT_GET_DATA(data, RANGE_SELECT_USER_KEY), TRUE);
267   entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
268   packet_range_convert_str(range, entry_text);
269   range_update_dynamics(data);
270 }
271
272
273 static void
274 range_entry_in_event(GtkWidget *widget, GdkEventFocus *event _U_, gpointer user_data)
275 {
276     range_entry(widget, user_data);
277 }
278
279
280 /* set the "Process only marked packets" toggle button as appropriate */
281 void
282 range_set_marked_sensitive(gpointer data, gboolean marked_valid)
283 {
284   packet_range_t *range;
285
286
287   range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);  
288
289   /* We can request that only the marked packets be processed only if we
290      if there *are* marked packets. */
291   if (marked_valid) {
292     gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
293     gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);         
294   }
295   else {
296     /* Force the "Process only marked packets" toggle to "false", turn
297        off the flag it controls. */
298     range->process = range_process_all;
299     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY)), FALSE);
300     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY)), FALSE);         
301     gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY),  FALSE);
302     gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);        
303   }
304 }
305
306
307 /* set the "displayed" button as appropriate */
308 void
309 range_set_displayed_sensitive(gpointer data, gboolean displayed_valid)
310 {
311
312   gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY), displayed_valid);
313 }
314
315
316 /* create a new range "widget" */
317 GtkWidget *range_new(packet_range_t *range
318 #if GTK_MAJOR_VERSION < 2
319 , GtkAccelGroup *accel_group
320 #endif
321 ) {
322   GtkWidget     *range_tb;
323   GtkWidget     *captured_bt;
324   GtkWidget     *displayed_bt;
325
326   GtkWidget     *select_all_rb;
327   GtkWidget     *select_all_c_lb;
328   GtkWidget     *select_all_d_lb;
329   GtkWidget     *select_curr_rb;
330   GtkWidget     *select_curr_c_lb;
331   GtkWidget     *select_curr_d_lb;
332   GtkWidget     *select_marked_only_rb;
333   GtkWidget     *select_marked_only_c_lb;
334   GtkWidget     *select_marked_only_d_lb;
335   GtkWidget     *select_marked_range_rb;
336   GtkWidget     *select_marked_range_c_lb;
337   GtkWidget     *select_marked_range_d_lb;
338   GtkWidget     *select_user_range_rb;
339   GtkWidget     *select_user_range_c_lb;
340   GtkWidget     *select_user_range_d_lb;
341   GtkWidget     *select_user_range_entry;
342  
343   GtkTooltips   *tooltips;
344
345
346   /* Enable tooltips */
347   tooltips = gtk_tooltips_new();
348
349   /* range table */
350   range_tb = gtk_table_new(7, 3, FALSE);
351   gtk_container_border_width(GTK_CONTAINER(range_tb), 5);
352
353   /* captured button */
354   captured_bt = TOGGLE_BUTTON_NEW_WITH_MNEMONIC("_Captured", accel_group);
355   gtk_table_attach_defaults(GTK_TABLE(range_tb), captured_bt, 1, 2, 0, 1);
356   SIGNAL_CONNECT(captured_bt, "toggled", toggle_captured_cb, range_tb);
357   gtk_tooltips_set_tip (tooltips,captured_bt,("Process all the below chosen packets"), NULL);
358
359   /* displayed button */
360   displayed_bt = TOGGLE_BUTTON_NEW_WITH_MNEMONIC("_Displayed", accel_group);
361   gtk_table_attach_defaults(GTK_TABLE(range_tb), displayed_bt, 2, 3, 0, 1);
362   SIGNAL_CONNECT(displayed_bt, "toggled", toggle_filtered_cb, range_tb);
363   gtk_tooltips_set_tip (tooltips,displayed_bt,("Process only the below chosen packets, which also passes the current display filter"), NULL);
364
365
366   /* Process all packets */
367   select_all_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(NULL, "_All packets", accel_group);
368   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_all_rb, 0, 1, 1, 2);
369   gtk_tooltips_set_tip (tooltips, select_all_rb, 
370       ("Process all packets"), NULL);
371   SIGNAL_CONNECT(select_all_rb, "toggled", toggle_select_all, range_tb);
372
373   select_all_c_lb = gtk_label_new("?");
374   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_all_c_lb, 1, 2, 1, 2);
375   select_all_d_lb = gtk_label_new("?");
376   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_all_d_lb, 2, 3, 1, 2);
377
378
379   /* Process currently selected */
380   select_curr_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(select_all_rb, "_Selected packet only", accel_group);
381   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_curr_rb, 0, 1, 2, 3);
382   gtk_tooltips_set_tip (tooltips, select_curr_rb, ("Process the currently selected packet only"), NULL);
383   SIGNAL_CONNECT(select_curr_rb, "toggled", toggle_select_selected, range_tb);
384
385   select_curr_c_lb = gtk_label_new("?");
386   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_curr_c_lb, 1, 2, 2, 3);
387   select_curr_d_lb = gtk_label_new("?");
388   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_curr_d_lb, 2, 3, 2, 3);
389
390
391   /* Process marked packets */
392   select_marked_only_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(select_all_rb, "_Marked packets only", accel_group);
393   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_only_rb, 0, 1, 3, 4);
394   gtk_tooltips_set_tip (tooltips, select_marked_only_rb, ("Process marked packets only"), NULL);
395   SIGNAL_CONNECT(select_marked_only_rb, "toggled", toggle_select_marked_only, range_tb);
396
397   select_marked_only_c_lb = gtk_label_new("?");
398   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_only_c_lb, 1, 2, 3, 4);
399   select_marked_only_d_lb = gtk_label_new("?");
400   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_only_d_lb, 2, 3, 3, 4);
401
402
403   /* Process packet range between first and last packet */
404   select_marked_range_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(select_all_rb, "From first _to last marked packet", accel_group);
405   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_range_rb, 0, 1, 4, 5);
406   gtk_tooltips_set_tip (tooltips,select_marked_range_rb,("Process all packets between the first and last marker"), NULL);
407   SIGNAL_CONNECT(select_marked_range_rb, "toggled", toggle_select_marked_range, range_tb);
408
409   select_marked_range_c_lb = gtk_label_new("?");
410   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_range_c_lb, 1, 2, 4, 5);
411   select_marked_range_d_lb = gtk_label_new("?");
412   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_marked_range_d_lb, 2, 3, 4, 5);
413
414
415   /* Process a user specified provided packet range : -10,30,40-70,80- */
416   select_user_range_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(select_all_rb, "Specify a packet _range:", accel_group);
417   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_user_range_rb, 0, 1, 5, 6);
418   gtk_tooltips_set_tip (tooltips,select_user_range_rb,("Process a specified packet range"), NULL);
419   SIGNAL_CONNECT(select_user_range_rb, "toggled", toggle_select_user_range, range_tb);
420
421   select_user_range_c_lb = gtk_label_new("?");
422   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_user_range_c_lb, 1, 2, 5, 6);
423   select_user_range_d_lb = gtk_label_new("?");
424   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_user_range_d_lb, 2, 3, 5, 6);
425
426
427   /* The entry part */
428   select_user_range_entry = gtk_entry_new();
429   gtk_entry_set_max_length (GTK_ENTRY (select_user_range_entry), 254);
430   gtk_table_attach_defaults(GTK_TABLE(range_tb), select_user_range_entry, 0, 1, 6, 7);
431   gtk_tooltips_set_tip (tooltips,select_user_range_entry, 
432         ("Specify a range of packet numbers :     \nExample :  1-10,18,25-100,332-"), NULL);
433   SIGNAL_CONNECT(select_user_range_entry,"changed", range_entry, range_tb);
434   SIGNAL_CONNECT(select_user_range_entry,"activate", range_entry_in_event, range_tb);
435
436
437   gtk_widget_show_all(range_tb);
438
439
440   OBJECT_SET_DATA(range_tb, RANGE_VALUES_KEY,               range);
441   OBJECT_SET_DATA(range_tb, RANGE_CAPTURED_BT_KEY,          captured_bt);
442   OBJECT_SET_DATA(range_tb, RANGE_DISPLAYED_BT_KEY,         displayed_bt);
443
444   OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_C_KEY,         select_all_c_lb);
445   OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_D_KEY,         select_all_d_lb);
446
447   OBJECT_SET_DATA(range_tb, RANGE_SELECT_CURR_KEY,          select_curr_rb);
448   OBJECT_SET_DATA(range_tb, RANGE_SELECT_CURR_C_KEY,        select_curr_c_lb);
449   OBJECT_SET_DATA(range_tb, RANGE_SELECT_CURR_D_KEY,        select_curr_d_lb);
450   OBJECT_SET_DATA(range_tb, RANGE_SELECT_CURR_D_KEY,        select_curr_d_lb);
451   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_KEY,        select_marked_only_rb);
452   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_C_KEY,      select_marked_only_c_lb);
453   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_D_KEY,      select_marked_only_d_lb);
454   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_RANGE_KEY,  select_marked_range_rb);
455   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_RANGE_C_KEY,select_marked_range_c_lb);
456   OBJECT_SET_DATA(range_tb, RANGE_SELECT_MARKED_RANGE_D_KEY,select_marked_range_d_lb);
457   OBJECT_SET_DATA(range_tb, RANGE_SELECT_USER_KEY,          select_user_range_rb);
458   OBJECT_SET_DATA(range_tb, RANGE_SELECT_USER_C_KEY,        select_user_range_c_lb);
459   OBJECT_SET_DATA(range_tb, RANGE_SELECT_USER_D_KEY,        select_user_range_d_lb);
460   OBJECT_SET_DATA(range_tb, RANGE_SELECT_USER_ENTRY_KEY,    select_user_range_entry);
461
462   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(captured_bt), !range->process_filtered);
463   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(displayed_bt), range->process_filtered);
464
465   switch(range->process) {
466   case(range_process_all):
467     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_all_rb),  TRUE);
468     break;
469   case(range_process_selected):
470     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_curr_rb),  TRUE);
471     break;
472   case(range_process_marked):
473     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_marked_only_rb),  TRUE);
474     break;
475   case(range_process_marked_range):
476     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_marked_range_rb),  TRUE);
477     break;
478   case(range_process_user_range):
479     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_user_range_rb),  TRUE);
480     break;
481   default:
482       g_assert_not_reached();
483   }
484
485   return range_tb;
486 }