diff --git a/gtk/keys.h b/gtk/keys.h index 178053fb8c..2c86fcfbcd 100644 --- a/gtk/keys.h +++ b/gtk/keys.h @@ -31,6 +31,9 @@ #define E_DFILTER_TE_KEY "display_filter_entry" #define E_RFILTER_TE_KEY "read_filter_te" +#define E_MPACKET_LIST_COL_KEY "menu_packet_list_col" +#define E_MPACKET_LIST_COL_ID_KEY "menu_packet_list_col_id" +#define E_MPACKET_LIST_PREV_COL_KEY "menu_packet_list_prev_col" #define E_MPACKET_LIST_KEY "menu_packet_list" #define E_MPACKET_LIST_ROW_KEY "menu_packet_list_row" #define E_MPACKET_LIST_COL_KEY "menu_packet_list_col" @@ -43,6 +46,7 @@ #define PLUGINS_DFILTER_TE "plugins_dfilter_te" #define PM_MENU_LIST_KEY "popup_menu_menu_list" +#define PM_PACKET_LIST_COL_KEY "popup_menu_packet_list_column" #define PM_PACKET_LIST_KEY "popup_menu_packet_list" #define PM_TREE_VIEW_KEY "popup_menu_tree_view" #define PM_BYTES_VIEW_KEY "popup_menu_bytes_view" diff --git a/gtk/menus.c b/gtk/menus.c index 64d0aa1428..6380b1c3ef 100644 --- a/gtk/menus.c +++ b/gtk/menus.c @@ -532,7 +532,7 @@ static GtkItemFactoryEntry menu_items[] = {"/Edit/", NULL, NULL, 0, "", NULL,}, {"/Edit/_Configuration Profiles...", "A", GTK_MENU_FUNC(profile_dialog_cb), 0, NULL, NULL,}, {"/Edit/_Preferences...", "P", GTK_MENU_FUNC(prefs_cb), - 0, "", GTK_STOCK_PREFERENCES,}, + PREFS_PAGE_USER_INTERFACE, "", GTK_STOCK_PREFERENCES,}, {"/_View", NULL, NULL, 0, "", NULL,}, {"/View/_Main Toolbar", NULL, GTK_MENU_FUNC(show_hide_cb), SHOW_HIDE_MAIN_TOOLBAR, "", NULL,}, {"/View/_Filter Toolbar", NULL, GTK_MENU_FUNC(show_hide_cb), SHOW_HIDE_FILTER_TOOLBAR, "", NULL,}, @@ -760,6 +760,25 @@ static GtkItemFactoryEntry menu_items[] = /* calculate the number of menu_items */ static int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); +#ifdef NEW_PACKET_LIST +/* packet list heading popup */ +static GtkItemFactoryEntry packet_list_heading_items[] = +{ + {"/Sort Ascending", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_SORT_ASCENDING, "", GTK_STOCK_SORT_ASCENDING,}, + {"/Sort Descending", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_SORT_DESCENDING, "", GTK_STOCK_SORT_DESCENDING,}, + + {"/", NULL, NULL, 0, "", NULL,}, + + {"/Column Preferences", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "", GTK_STOCK_PREFERENCES,}, + {"/Resize Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_RESIZE, "", WIRESHARK_STOCK_RESIZE_COLUMNS,}, + {"/Rename Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_RENAME, "", GTK_STOCK_BOLD,}, + + {"/", NULL, NULL, 0, "", NULL,}, + + {"/Remove Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_REMOVE, "", GTK_STOCK_DELETE,} +}; +#endif + /* packet list popup */ static GtkItemFactoryEntry packet_list_menu_items[] = { @@ -1083,6 +1102,7 @@ static GtkItemFactoryEntry bytes_menu_items[] = static int initialize = TRUE; static GtkItemFactory *main_menu_factory = NULL; +static GtkItemFactory *packet_list_heading_factory = NULL; static GtkItemFactory *packet_list_menu_factory = NULL; static GtkItemFactory *tree_view_menu_factory = NULL; static GtkItemFactory *bytes_menu_factory = NULL; @@ -1200,9 +1220,17 @@ menus_init(void) { if (initialize) { initialize = FALSE; + popup_menu_object = gtk_menu_new(); + + /* packet list heading pop-up menu */ + packet_list_heading_factory = gtk_item_factory_new(GTK_TYPE_MENU, "
", NULL); + gtk_item_factory_create_items_ac(packet_list_heading_factory, sizeof(packet_list_heading_items)/sizeof(packet_list_heading_items[0]), packet_list_heading_items, popup_menu_object, 2); + g_object_set_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_COL_KEY, + packet_list_heading_factory->widget); + popup_menu_list = g_slist_append((GSList *)popup_menu_list, packet_list_heading_factory); + /* packet list pop-up menu */ packet_list_menu_factory = gtk_item_factory_new(GTK_TYPE_MENU, "
", NULL); - popup_menu_object = gtk_menu_new(); gtk_item_factory_create_items_ac(packet_list_menu_factory, sizeof(packet_list_menu_items)/sizeof(packet_list_menu_items[0]), packet_list_menu_items, popup_menu_object, 2); g_object_set_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_KEY, packet_list_menu_factory->widget); diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c index b9b3bfae0a..66c09b8c4d 100644 --- a/gtk/new_packet_list.c +++ b/gtk/new_packet_list.c @@ -63,6 +63,10 @@ #include "gtk/main_statusbar.h" #include "gtk/packet_win.h" #include "gtk/main.h" +#include "gtk/prefs_column.h" +#include "gtk/dlg_utils.h" + +#define COLUMN_WIDTH_MIN 40 static PacketList *packetlist; static gboolean last_at_end = FALSE; @@ -166,6 +170,139 @@ right_justify_column (gint col) return right_justify; } +static void +col_title_change_ok (GtkWidget *w, gpointer parent_w) +{ + GtkTreeViewColumn *col = g_object_get_data (G_OBJECT(w), "column"); + gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_ID_KEY)); + GtkWidget *entry = g_object_get_data (G_OBJECT(w), "entry"); + const gchar *title = gtk_entry_get_text(GTK_ENTRY(entry)); + + gtk_tree_view_column_set_title(col, title); + column_prefs_rename(col_id, title); + + window_destroy(GTK_WIDGET(parent_w)); +} + +static void +col_title_change_cancel (GtkWidget *w _U_, gpointer parent_w) +{ + window_destroy(GTK_WIDGET(parent_w)); +} + +static void +col_title_edit_dlg (GtkTreeViewColumn *col) +{ + const gchar *value = gtk_tree_view_column_get_title(col); + + GtkWidget *win, *main_tb, *main_vb, *bbox, *cancel_bt, *ok_bt; + GtkWidget *entry, *label; + + win = dlg_window_new("Column Title"); + + gtk_window_set_resizable(GTK_WINDOW(win),FALSE); + gtk_window_resize(GTK_WINDOW(win), 400, 100); + + main_vb = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(win), main_vb); + gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6); + + main_tb = gtk_table_new(2, 2, FALSE); + gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0); + gtk_table_set_col_spacings(GTK_TABLE(main_tb), 10); + + label = gtk_label_new(ep_strdup_printf("Title:")); + gtk_table_attach_defaults(GTK_TABLE(main_tb), label, 0, 1, 1, 2); + gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f); + + entry = gtk_entry_new(); + gtk_table_attach_defaults(GTK_TABLE(main_tb), entry, 1, 2, 1, 2); + gtk_entry_set_text(GTK_ENTRY(entry), value); + + bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_OK, NULL); + gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0); + + ok_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK); + g_object_set_data (G_OBJECT(ok_bt), "column", col); + g_object_set_data (G_OBJECT(ok_bt), "entry", entry); + g_signal_connect(ok_bt, "clicked", G_CALLBACK(col_title_change_ok), win); + + dlg_set_activate(entry, ok_bt); + + cancel_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL); + g_signal_connect(cancel_bt, "clicked", G_CALLBACK(col_title_change_cancel), win); + window_set_cancel_button(win, cancel_bt, NULL); + + gtk_widget_grab_default(ok_bt); + gtk_widget_show_all(win); +} + +static void +new_packet_list_sort_column (gint col_id, GtkTreeViewColumn *col, GtkSortType order) +{ + GtkTreeViewColumn *prev_col = (GtkTreeViewColumn *) + g_object_get_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COL_KEY); + + if (prev_col) { + gtk_tree_view_column_set_sort_indicator(prev_col, FALSE); + } + gtk_tree_view_column_set_sort_indicator(col, TRUE); + gtk_tree_view_column_set_sort_order (col, order); + g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COL_KEY, col); + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(packetlist), col_id, order); +} + +static void +new_packet_list_remove_column (gint col_id, GtkTreeViewColumn *col _U_) +{ + column_prefs_remove(col_id); + + if (!prefs.gui_use_pref_save) { + prefs_main_write(); + } + + new_packet_list_recreate(); +} + +void +new_packet_list_column_clicked (GtkWidget *w _U_, gpointer user_data _U_, COLUMN_SELECTED_E action) +{ + GtkTreeViewColumn *col = (GtkTreeViewColumn *) + g_object_get_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COL_KEY); + gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_ID_KEY)); + + switch (action) { + case COLUMN_SELECTED_SORT_ASCENDING: + new_packet_list_sort_column (col_id, col, GTK_SORT_ASCENDING); + break; + case COLUMN_SELECTED_SORT_DESCENDING: + new_packet_list_sort_column (col_id, col, GTK_SORT_DESCENDING); + break; + case COLUMN_SELECTED_RESIZE: + new_packet_list_resize_column (col_id); + break; + case COLUMN_SELECTED_RENAME: + col_title_edit_dlg (col); + break; + case COLUMN_SELECTED_REMOVE: + new_packet_list_remove_column (col_id, col); + break; + default: + g_assert_not_reached(); + break; + } +} + +static void +new_packet_list_column_clicked_cb (GtkTreeViewColumn *col, gpointer user_data _U_) +{ + GtkWidget *menu; + + menu = g_object_get_data (G_OBJECT(popup_menu_object), PM_PACKET_LIST_COL_KEY); + g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COL_KEY, col); + gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time()); +} + static GtkWidget * create_view_and_model(void) { @@ -216,15 +353,18 @@ create_view_and_model(void) GINT_TO_POINTER(i), NULL); gtk_tree_view_column_set_title(col, cfile.cinfo.col_title[i]); - gtk_tree_view_column_set_sort_column_id(col, i); + gtk_tree_view_column_set_clickable(col, TRUE); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_column_set_sizing(col,GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_reorderable(col, TRUE); /* XXX - Should this be saved in the prefs? */ + g_object_set_data(G_OBJECT(col), E_MPACKET_LIST_COL_ID_KEY, GINT_TO_POINTER(i)); + g_signal_connect(col, "clicked", G_CALLBACK(new_packet_list_column_clicked_cb), NULL); + /* The column can't be adjusted to a size smaller than this * XXX Should we use a different value for different column formats? */ - gtk_tree_view_column_set_min_width(col, 40); + gtk_tree_view_column_set_min_width(col, COLUMN_WIDTH_MIN); /* Set the size the column will be displayed with */ col_width = recent_get_column_width(i); @@ -249,6 +389,12 @@ create_view_and_model(void) gtk_tree_view_column_set_fixed_width(col, col_width); } gtk_tree_view_append_column(GTK_TREE_VIEW(packetlist->view), col); + + if (i == 0) { /* Default sort on first column */ + g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COL_KEY, col); + g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COL_KEY, col); + } + } return packetlist->view; diff --git a/gtk/new_packet_list.h b/gtk/new_packet_list.h index 8e085d2f38..ae411096d6 100644 --- a/gtk/new_packet_list.h +++ b/gtk/new_packet_list.h @@ -30,8 +30,17 @@ #define RECENT_KEY_COL_WIDTH "column.width" +typedef enum { + COLUMN_SELECTED_SORT_ASCENDING, + COLUMN_SELECTED_SORT_DESCENDING, + COLUMN_SELECTED_RESIZE, + COLUMN_SELECTED_RENAME, + COLUMN_SELECTED_REMOVE +} COLUMN_SELECTED_E; + GtkWidget *new_packet_list_create(void); void new_packet_list_recreate(void); +void new_packet_list_column_clicked (GtkWidget *w, gpointer data, COLUMN_SELECTED_E action); void new_packet_list_resize_columns_cb(GtkWidget *widget _U_, gpointer data _U_); gboolean new_packet_list_get_event_row_column(GdkEventButton *event_button, gint *physical_row, gint *row, gint *column);