aboutsummaryrefslogtreecommitdiffstats
path: root/gtk/range_utils.c
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2006-02-11 11:21:38 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2006-02-11 11:21:38 +0000
commit4eeeb7d9231419272efd9b32edcdec2f0d1591c7 (patch)
treeff956e880115576e487829bce6a27e383a9fe274 /gtk/range_utils.c
parentc3453c37fb10d38d011f8d9b32092a74f2c08b8f (diff)
In "Save As", support only file types we can write to; that simplifies
the logic, making it easier to get it right (fewer interactions between components of the dialog - the file type doesn't affect whether we can save some but not all packets). It also means we don't offer a file type for saving, only to take it away if you choose anything other than saving all packets. If the capture file is a temporary file from a capture done in the current Ethereal session, it's libpcap format, which we can write to, so you would be able to save it. If it's a saved file we read in, saving the file in its entirety in its own format is just copying the file, and it's not clear supporting that adds enough useful functionality to justify the extra complication. Fix "range_update_dynamics()" to update all the rows of the range button/count table properly (make the button active iff there's a non-zero count in the currently-selected column, make a count active iff the column is selected), to select the "Captured" column if the count of displayed packets goes to zero, and to select the "Save all packets" row if the count of packets in the currently-selected row and column goes to zero. (XXX - we should perhaps do that with the "user-defined range" counts as well, which would involve updating the counts on every change to the range field.) git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@17251 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'gtk/range_utils.c')
-rw-r--r--gtk/range_utils.c144
1 files changed, 86 insertions, 58 deletions
diff --git a/gtk/range_utils.c b/gtk/range_utils.c
index 703826bd3a..12371f2ca4 100644
--- a/gtk/range_utils.c
+++ b/gtk/range_utils.c
@@ -44,6 +44,7 @@
#define RANGE_CAPTURED_BT_KEY "range_captured_button"
#define RANGE_DISPLAYED_BT_KEY "range_displayed_button"
+#define RANGE_SELECT_ALL_KEY "range_select_all_rb"
#define RANGE_SELECT_ALL_C_KEY "range_select_all_c_lb"
#define RANGE_SELECT_ALL_D_KEY "range_select_all_d_lb"
#define RANGE_SELECT_CURR_KEY "range_select_curr_rb"
@@ -86,65 +87,127 @@ range_check_validity(packet_range_t *range)
/* update all "dynamic" things */
void
-range_update_dynamics(gpointer data) {
+range_update_dynamics(gpointer data)
+{
+ packet_range_t *range;
+ GtkWidget *range_displayed_bt;
gboolean filtered_active;
- gchar label_text[100];
gint selected_num;
- GtkWidget *bt;
- packet_range_t *range;
+ gboolean can_select;
+ gchar label_text[100];
range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
- bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
- filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bt));
+ range_displayed_bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
+ filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(range_displayed_bt));
- gtk_widget_set_sensitive(bt, TRUE);
+ /* Enable saving only the displayed packets only if there *are*
+ displayed packets. */
+ if (range->displayed_cnt != 0)
+ gtk_widget_set_sensitive(range_displayed_bt, TRUE);
+ else {
+ /* If saving the displayed packets is selected, select saving the
+ captured packets. */
+ filtered_active = FALSE;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), FALSE);
+ gtk_widget_set_sensitive(range_displayed_bt, FALSE);
+ }
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", cfile.count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY)), label_text);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_cnt);
-
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY)), label_text);
+ /* Enable saving the currently-selected packet only if there *is* a
+ currently-selected packet. */
selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0;
+ can_select = (selected_num != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), filtered_active);
+ } else {
+ /* If "save selected packet" is selected, select "save all packets". */
+ if (range->process == range_process_selected) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), FALSE);
+ }
/* XXX: how to update the radio button label but keep the mnemonic? */
-/* g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
+/*g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
gtk_label_set_text(GTK_LABEL(GTK_BIN(select_curr_rb)->child), label_text);*/
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), selected_num);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), selected_num && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), selected_num && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), cfile.marked_count > 0);
+ /* Enable the buttons for saving marked packets only if there *are*
+ marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_marked_cnt != 0);
+ else
+ can_select = (cfile.marked_count > 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save marked packet" is selected, select "save all packets". */
+ if (range->process == range_process_marked) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), FALSE);
+ }
g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), cfile.marked_count > 0 && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), range->displayed_marked_cnt && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), range->mark_range_cnt);
- g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
+ /* Enable the buttons for saving the range of marked packets only if
+ there *is* a range of marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_mark_range_cnt != 0);
+ else
+ can_select = (range->mark_range_cnt != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save range between first and last marked packet" is selected,
+ select "save all packets". */
+ if (range->process == range_process_marked_range) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), FALSE);
+ }
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), range->mark_range_cnt && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_mark_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), range->displayed_mark_range_cnt && filtered_active);
+ g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
}
@@ -313,42 +376,6 @@ range_entry_in_event(GtkWidget *widget, GdkEventFocus *event _U_, gpointer user_
}
-/* set the "Process only marked packets" toggle button as appropriate */
-void
-range_set_marked_sensitive(gpointer data, gboolean marked_valid)
-{
- packet_range_t *range;
-
-
- range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
-
- /* We can request that only the marked packets be processed only if we
- if there *are* marked packets. */
- if (marked_valid) {
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
- }
- else {
- /* Force the "Process only marked packets" toggle to "false", turn
- off the flag it controls. */
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY)), FALSE);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY)), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
- }
-}
-
-
-/* set the "displayed" button as appropriate */
-void
-range_set_displayed_sensitive(gpointer data, gboolean displayed_valid)
-{
-
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY), displayed_valid);
-}
-
-
/* create a new range "widget" */
GtkWidget *range_new(packet_range_t *range
#if GTK_MAJOR_VERSION < 2
@@ -477,6 +504,7 @@ GtkWidget *range_new(packet_range_t *range
OBJECT_SET_DATA(range_tb, RANGE_CAPTURED_BT_KEY, captured_bt);
OBJECT_SET_DATA(range_tb, RANGE_DISPLAYED_BT_KEY, displayed_bt);
+ OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_KEY, select_all_rb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_C_KEY, select_all_c_lb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_D_KEY, select_all_d_lb);
@@ -515,7 +543,7 @@ GtkWidget *range_new(packet_range_t *range
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_user_range_rb), TRUE);
break;
default:
- g_assert_not_reached();
+ g_assert_not_reached();
}
return range_tb;