forked from osmocom/wireshark
Added a popup menu in the packet list heading to set sort order and some
functions to rename column title, resize a single column and remove a column. svn path=/trunk/; revision=31086
This commit is contained in:
parent
7322057d66
commit
43de696a6c
|
@ -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"
|
||||
|
|
32
gtk/menus.c
32
gtk/menus.c
|
@ -532,7 +532,7 @@ static GtkItemFactoryEntry menu_items[] =
|
|||
{"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
|
||||
{"/Edit/_Configuration Profiles...", "<shift><control>A", GTK_MENU_FUNC(profile_dialog_cb), 0, NULL, NULL,},
|
||||
{"/Edit/_Preferences...", "<shift><control>P", GTK_MENU_FUNC(prefs_cb),
|
||||
0, "<StockItem>", GTK_STOCK_PREFERENCES,},
|
||||
PREFS_PAGE_USER_INTERFACE, "<StockItem>", GTK_STOCK_PREFERENCES,},
|
||||
{"/_View", NULL, NULL, 0, "<Branch>", NULL,},
|
||||
{"/View/_Main Toolbar", NULL, GTK_MENU_FUNC(show_hide_cb), SHOW_HIDE_MAIN_TOOLBAR, "<CheckItem>", NULL,},
|
||||
{"/View/_Filter Toolbar", NULL, GTK_MENU_FUNC(show_hide_cb), SHOW_HIDE_FILTER_TOOLBAR, "<CheckItem>", 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, "<StockItem>", GTK_STOCK_SORT_ASCENDING,},
|
||||
{"/Sort Descending", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_SORT_DESCENDING, "<StockItem>", GTK_STOCK_SORT_DESCENDING,},
|
||||
|
||||
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
|
||||
|
||||
{"/Column Preferences", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "<StockItem>", GTK_STOCK_PREFERENCES,},
|
||||
{"/Resize Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_RESIZE, "<StockItem>", WIRESHARK_STOCK_RESIZE_COLUMNS,},
|
||||
{"/Rename Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_RENAME, "<StockItem>", GTK_STOCK_BOLD,},
|
||||
|
||||
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
|
||||
|
||||
{"/Remove Column", NULL, GTK_MENU_FUNC(new_packet_list_column_clicked), COLUMN_SELECTED_REMOVE, "<StockItem>", 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, "<main>", 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, "<main>", 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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue