aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2009-11-26 09:09:07 +0000
committerStig Bjørlykke <stig@bjorlykke.org>2009-11-26 09:09:07 +0000
commit43de696a6c99afcffb4f67240c3dccd169214533 (patch)
tree7543fb51be34a4c4d8338d04de7a1c5c11aec632 /gtk
parent7322057d66142695ba7abb1e7191bad23fe40d93 (diff)
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
Diffstat (limited to 'gtk')
-rw-r--r--gtk/keys.h4
-rw-r--r--gtk/menus.c32
-rw-r--r--gtk/new_packet_list.c150
-rw-r--r--gtk/new_packet_list.h9
4 files changed, 191 insertions, 4 deletions
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/<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);
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);