diff options
Diffstat (limited to 'gtk/new_packet_list.c')
-rw-r--r-- | gtk/new_packet_list.c | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c new file mode 100644 index 0000000000..a89bc149ee --- /dev/null +++ b/gtk/new_packet_list.c @@ -0,0 +1,231 @@ +/* new_packet_list.c + * Routines to implement a new GTK2 packet list using our custom model + * Copyright 2008-2009, Stephen Fisher <stephentfisher@yahoo.com> + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#ifdef NEW_PACKET_LIST + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STRING_H +#include "string.h" +#endif + +#include <gtk/gtk.h> +#include <glib.h> + +#include "gui_utils.h" +#include "packet_list_store.h" +#include "epan/column_info.h" +#include "epan/emem.h" +#include "globals.h" +#include "gtk/gtkglobals.h" +#include "gtk/font_utils.h" +#include "epan/column.h" +#include "gtk/recent.h" +#include "gtk/keys.h" +#include "gtk/menus.h" + +static PacketList *packetlist; + +static GtkWidget *create_view_and_model(void); +static guint row_from_iter(GtkTreeIter *iter); +static void new_packet_list_select_cb(GtkTreeView *tree_view, gpointer data _U_); + +GtkWidget * +new_packet_list_create(void) +{ + GtkWidget *view, *scrollwin; + + scrollwin = scrolled_window_new(NULL, NULL); + + view = create_view_and_model(); + + gtk_container_add(GTK_CONTAINER(scrollwin), view); + + /* XXX - Implement me + g_signal_connect(view, "row-activated", + G_CALLBACK(popup_menu_handler), + g_object_get_data(G_OBJECT(popup_menu_object), + PM_PACKET_LIST_KEY)); + g_signal_connect(view, "button_press_event", + G_CALLBACK(new_packet_list_button_pressed_cb), NULL); + */ + + g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_KEY, view); + + return scrollwin; +} + +guint +new_packet_list_append(column_info cinfo, frame_data *fdata) +{ + gint i; + row_data_t *row_data; + + row_data = g_new0(row_data_t, NUM_COL_FMTS+1); + + for(i = 0; i < cfile.cinfo.num_cols; i++) { + row_data->col_text[cinfo.col_fmt[i]] = + se_strdup(cinfo.col_data[i]); + } + + row_data->fdata = fdata; + + packet_list_append_record(packetlist, row_data); + + g_free(row_data); + + return packetlist->num_rows; /* XXX - Check that this is the right # */ +} + +static GtkWidget * +create_view_and_model(void) +{ + GtkTreeViewColumn *col; + GtkCellRenderer *renderer; + PangoLayout *layout; + gint i, col_width; + + packetlist = new_packet_list_new(); + + packetlist->view = tree_view_new(GTK_TREE_MODEL(packetlist)); + + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(packetlist->view), + TRUE); + + g_signal_connect(packetlist->view, "cursor-changed", + G_CALLBACK(new_packet_list_select_cb), NULL); + + /* g_object_unref(packetlist); */ /* Destroy automatically with view for now */ /* XXX - Messes up freezing & thawing */ + + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "ypad", 0, "font-desc", user_font_get_regular(), + NULL); + + for(i = 0; i < cfile.cinfo.num_cols; i++) { + col = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_add_attribute(col, renderer, "text", + cfile.cinfo.col_fmt[i]); + 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_resizable(col, TRUE); + gtk_tree_view_column_set_sizing(col,GTK_TREE_VIEW_COLUMN_FIXED); + + col_width = recent_get_column_width(i); + if(col_width == -1) { + layout = gtk_widget_create_pango_layout(packetlist->view, get_column_width_string(get_column_format(i), i)); + pango_layout_get_pixel_size(layout, &col_width, NULL); + gtk_tree_view_column_set_min_width(col, col_width); + g_object_unref(G_OBJECT(layout)); + } + + gtk_tree_view_append_column(GTK_TREE_VIEW(packetlist->view), col); + } + + return packetlist->view; +} + +void +new_packet_list_freeze(void) +{ + /* So we don't lose the model by the time we want to thaw it */ + g_object_ref(packetlist); + + /* Detach view from model */ + gtk_tree_view_set_model(GTK_TREE_VIEW(packetlist->view), NULL); +} + +void +new_packet_list_thaw(void) +{ + /* Remove extra reference added by new_packet_list_freeze() */ + g_object_unref(packetlist); + + /* Re-attach view to the model */ + gtk_tree_view_set_model(GTK_TREE_VIEW(packetlist->view), + GTK_TREE_MODEL(packetlist)); +} + +void +new_packet_list_resize_columns_cb(GtkWidget *widget _U_, gpointer data _U_) +{ + g_warning("*** new_packet_list_resize_columns_cb() not yet implemented."); +} + +void +new_packet_list_next(void) +{ + g_warning("*** new_packet_list_next() not yet implemented."); +} + +void +new_packet_list_prev(void) +{ + g_warning("*** new_packet_list_prev() not yet implemented."); +} + +static void +new_packet_list_select_cb(GtkTreeView *tree_view, gpointer data _U_) +{ + GtkTreeSelection *selection; + GtkTreeIter iter; + guint row; + + selection = gtk_tree_view_get_selection(tree_view); + gtk_tree_selection_get_selected(selection, NULL, &iter); + + /* Remove the hex display tab pages */ + while(gtk_notebook_get_nth_page(GTK_NOTEBOOK(byte_nb_ptr), 0)) + gtk_notebook_remove_page(GTK_NOTEBOOK(byte_nb_ptr), 0); + + row = row_from_iter(&iter); + + cf_select_packet(&cfile, row); +} + +frame_data * +new_packet_list_get_row_data(gint row) +{ + PacketListRecord *record; + + record = packetlist->rows[row]; + + return record->fdata; +} + +static guint +row_from_iter(GtkTreeIter *iter) +{ + PacketListRecord *record; + + record = iter->user_data; + + return record->pos; +} + +#endif /* NEW_PACKET_LIST */ |