diff options
author | Guy Harris <guy@alum.mit.edu> | 2006-02-11 11:21:38 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2006-02-11 11:21:38 +0000 |
commit | ca970e37571a3a39d6fc257c899ffacc25222269 (patch) | |
tree | ff956e880115576e487829bce6a27e383a9fe274 /gtk/range_utils.c | |
parent | 83aad499b42aaf5b004206f6b29989182716d5cb (diff) | |
download | wireshark-ca970e37571a3a39d6fc257c899ffacc25222269.tar.gz wireshark-ca970e37571a3a39d6fc257c899ffacc25222269.tar.bz2 wireshark-ca970e37571a3a39d6fc257c899ffacc25222269.zip |
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.)
svn path=/trunk/; revision=17251
Diffstat (limited to 'gtk/range_utils.c')
-rw-r--r-- | gtk/range_utils.c | 144 |
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; |