# include "config.h"
#endif
-#include <gtk/gtk.h>
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
#include <string.h>
-#include <wtap.h>
+#include <gtk/gtk.h>
#include "epan/packet_info.h"
#include "epan/epan.h"
#include "epan/value_string.h"
-#include "../stat_menu.h"
-#include "gui_stat_menu.h"
-#include "globals.h"
-#include "file.h"
-#include "summary.h"
-#include "image/clist_ascend.xpm"
-#include "image/clist_descend.xpm"
-#include "dlg_utils.h"
-#include "gui_utils.h"
-#include "compat_macros.h"
#include <epan/tap.h>
-
#include <epan/dissectors/packet-mtp3.h>
-#include "mtp3_stat.h"
-#define SUM_STR_MAX 1024
+#include "../stat_menu.h"
+#include "../globals.h"
+#include "../file.h"
+#include "../summary.h"
-typedef struct column_arrows {
- GtkWidget *table;
- GtkWidget *ascend_pm;
- GtkWidget *descend_pm;
-} column_arrows;
+#include "gtk/gui_stat_menu.h"
+#include "gtk/dlg_utils.h"
+#include "gtk/gui_utils.h"
+#include "gtk/mtp3_stat.h"
+
+#define SUM_STR_MAX 1024
-#define MTP3_SUM_INIT_TABLE_NUM_COLUMNS 6
typedef struct _my_columns_t {
guint32 value;
GtkJustification just;
} my_columns_t;
-static my_columns_t columns[MTP3_SUM_INIT_TABLE_NUM_COLUMNS] = {
- { 110, "SI", GTK_JUSTIFY_LEFT },
- { 100, "Num MSUs", GTK_JUSTIFY_RIGHT },
- { 100, "MSUs/sec", GTK_JUSTIFY_RIGHT },
- { 100, "Num Bytes", GTK_JUSTIFY_RIGHT },
- { 100, "Bytes/MSU", GTK_JUSTIFY_RIGHT },
- { 100, "Bytes/sec", GTK_JUSTIFY_RIGHT }
-};
-
-
-static void
-add_string_to_box(gchar *str, GtkWidget *box)
+enum
{
- GtkWidget *lb;
- lb = gtk_label_new(str);
- gtk_misc_set_alignment(GTK_MISC(lb), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
- gtk_widget_show(lb);
-}
-
+ SI_COLUMN,
+ NUM_MSUS_COLUMN,
+ NUM_MSUS_SEC_COLUMN,
+ NUM_BYTES_COLUMN,
+ NUM_BYTES_MSU_COLUMN,
+ NUM_BYTES_SEC_COLUMN,
+ N_COLUMN /* The number of columns */
+};
-static void
-mtp3_sum_gtk_click_column_cb(
- GtkCList *clist,
- gint column,
- gpointer data)
+/* Create list */
+static
+GtkWidget* create_list()
{
- column_arrows *col_arrows = (column_arrows *) data;
- int i;
+ GtkListStore *list_store;
+ GtkWidget *list;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeSortable *sortable;
+ GtkTreeView *list_view;
+ GtkTreeSelection *selection;
+
+ /* Create the store */
+ list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX*/
+ G_TYPE_STRING, /* SI */
+ G_TYPE_INT, /* Num MSUs */
+ G_TYPE_STRING, /* MSUs/sec */
+ G_TYPE_INT, /* Num Bytes */
+ G_TYPE_STRING, /* Bytes/MSU */
+ G_TYPE_STRING); /* Bytes/sec */
+
+ /* Create a view */
+ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+
+ list_view = GTK_TREE_VIEW(list);
+ sortable = GTK_TREE_SORTABLE(list_store);
+
+#if GTK_CHECK_VERSION(2,6,0)
+ /* Speed up the list display */
+ gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
+#endif
- gtk_clist_freeze(clist);
+ /* Setup the sortable columns */
+ gtk_tree_sortable_set_sort_column_id(sortable, SI_COLUMN, GTK_SORT_ASCENDING);
+ gtk_tree_view_set_headers_clickable(list_view, FALSE);
- for (i=0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
- {
- gtk_widget_hide(col_arrows[i].ascend_pm);
- gtk_widget_hide(col_arrows[i].descend_pm);
- }
+ /* The view now holds a reference. We can get rid of our own reference */
+ g_object_unref (G_OBJECT (list_store));
- if (column == clist->sort_column)
- {
- if (clist->sort_type == GTK_SORT_ASCENDING)
- {
- clist->sort_type = GTK_SORT_DESCENDING;
- gtk_widget_show(col_arrows[column].descend_pm);
- }
- else
- {
- clist->sort_type = GTK_SORT_ASCENDING;
- gtk_widget_show(col_arrows[column].ascend_pm);
- }
- }
- else
- {
- /*
- * Columns 0 sorted in descending order by default
+ /*
+ * Create the first column packet, associating the "text" attribute of the
+ * cell_renderer to the first column of the model
*/
- if (column == 0)
- {
- clist->sort_type = GTK_SORT_ASCENDING;
- gtk_widget_show(col_arrows[column].ascend_pm);
- }
- else
- {
- clist->sort_type = GTK_SORT_DESCENDING;
- gtk_widget_show(col_arrows[column].descend_pm);
- }
-
- gtk_clist_set_sort_column(clist, column);
- }
+ /* 1:st column */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("SI", renderer,
+ "text", SI_COLUMN,
+ NULL);
+
+ gtk_tree_view_column_set_sort_column_id(column, SI_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 110);
+
+ /* Add the column to the view. */
+ gtk_tree_view_append_column (list_view, column);
+
+ /* 2:nd column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Num MSUs", renderer,
+ "text", NUM_MSUS_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 100);
+ gtk_tree_view_append_column (list_view, column);
+
+ /* 3:d column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("MSUs/sec", renderer,
+ "text", NUM_MSUS_SEC_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_SEC_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 100);
+ gtk_tree_view_append_column (list_view, column);
+
+ /* 4:d column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Num Bytes", renderer,
+ "text", NUM_BYTES_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 100);
+ gtk_tree_view_append_column (list_view, column);
+
+ /* 5:th column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Bytes/MSU", renderer,
+ "text", NUM_BYTES_MSU_COLUMN,
+ NULL);
+
- gtk_clist_thaw(clist);
- gtk_clist_sort(clist);
-}
+ gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_MSU_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 100);
+ gtk_tree_view_append_column (list_view, column);
+ /* 6:th column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Bytes/sec", renderer,
+ "text", NUM_BYTES_SEC_COLUMN,
+ NULL);
-static gint
-mtp3_sum_gtk_sort_column(
- GtkCList *clist,
- gconstpointer ptr1,
- gconstpointer ptr2)
-{
- const GtkCListRow *row1 = ptr1;
- const GtkCListRow *row2 = ptr2;
- char *text1 = NULL;
- char *text2 = NULL;
- int i1, i2;
+ gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_SEC_COLUMN);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_min_width(column, 100);
+ gtk_tree_view_append_column (list_view, column);
- text1 = GTK_CELL_TEXT(row1->cell[clist->sort_column])->text;
- text2 = GTK_CELL_TEXT(row2->cell[clist->sort_column])->text;
+ /* Now enable the sorting of each column */
+ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
+ gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
- switch (clist->sort_column)
- {
- case 0:
- /* text columns */
- return(strcmp(text1, text2));
-
- default:
- /* number columns */
- i1 = strtol(text1, NULL, 0);
- i2 = strtol(text2, NULL, 0);
- return(i1 - i2);
- }
+ /* Setup the selection handler */
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- g_assert_not_reached();
+ return list;
- return(0);
}
+static void
+add_string_to_box(gchar *str, GtkWidget *box)
+{
+ GtkWidget *lb;
+ lb = gtk_label_new(str);
+ gtk_misc_set_alignment(GTK_MISC(lb), 0.0, 0.5);
+ gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
+ gtk_widget_show(lb);
+}
+
+
+
static void
mtp3_sum_draw(
GtkWidget *table,
int *tot_num_msus_p,
double *tot_num_bytes_p)
{
- const char *entries[MTP3_SUM_INIT_TABLE_NUM_COLUMNS];
+ char *entries[N_COLUMN];
int i, j;
int num_msus;
- double num_bytes;
+ int num_bytes;
+ GtkListStore *list_store = NULL;
+ GtkTreeIter iter;
*tot_num_msus_p = 0;
*tot_num_bytes_p = 0;
+ list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (table))); /* Get store */
+
for (i=0; i < MTP3_NUM_SI_CODE; i++)
{
- entries[0] = g_strdup(mtp3_service_indicator_code_short_vals[i].strptr);
-
- j = 0;
- num_msus = 0;
- num_bytes = 0;
-
- while (j < mtp3_num_used)
- {
- num_msus += mtp3_stat[j].si_code[i].num_msus;
- num_bytes += mtp3_stat[j].si_code[i].size;
-
- j++;
- }
-
- *tot_num_msus_p += num_msus;
- *tot_num_bytes_p += num_bytes;
-
- entries[1] = g_strdup_printf("%u", num_msus);
-
- entries[2] = (seconds) ? g_strdup_printf("%.2f", num_msus/seconds) : "N/A";
-
- entries[3] = g_strdup_printf("%.0f", num_bytes);
-
- entries[4] = (num_msus) ? g_strdup_printf("%.2f", num_bytes/num_msus) : "N/A";
-
- entries[5] = (seconds) ? g_strdup_printf("%.2f", num_bytes/seconds) : "N/A";
-
- gtk_clist_insert(GTK_CLIST(table), i, (gchar **) entries);
+ j = 0;
+ num_msus = 0;
+ num_bytes = 0;
+
+ while (j < mtp3_num_used)
+ {
+ num_msus += mtp3_stat[j].si_code[i].num_msus;
+ num_bytes += mtp3_stat[j].si_code[i].size;
+
+ j++;
+ }
+
+ *tot_num_msus_p += num_msus;
+ *tot_num_bytes_p += num_bytes;
+
+ /*
+ * XXX - when do these get freed?
+ */
+ entries[2] = (seconds) ? g_strdup_printf("%.2f", (double)num_msus/seconds) : g_strdup("N/A");
+ entries[4] = (num_msus) ? g_strdup_printf("%.2f", (double)num_bytes/num_msus) : g_strdup("N/A");
+ entries[5] = (seconds) ? g_strdup_printf("%.2f", (double)num_bytes/seconds) : g_strdup("N/A");
+
+#if GTK_CHECK_VERSION(2,6,0)
+ gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
+#else
+ gtk_list_store_append (list_store, &iter);
+ gtk_list_store_set (list_store, &iter,
+#endif
+ SI_COLUMN, mtp3_service_indicator_code_short_vals[i].strptr,
+ NUM_MSUS_COLUMN, num_msus,
+ NUM_MSUS_SEC_COLUMN, entries[2],
+ NUM_BYTES_COLUMN, num_bytes,
+ NUM_BYTES_MSU_COLUMN, entries[4],
+ NUM_BYTES_SEC_COLUMN, entries[5],
+ -1);
}
-
- gtk_clist_sort(GTK_CLIST(table));
}
*main_vb, *file_fr, *data_fr, *file_box,
*data_box, *bbox, *close_bt,
*tot_fr, *tot_box,
- *table, *column_lb, *table_fr;
- column_arrows *col_arrows;
+ *table, *table_fr;
gchar string_buff[SUM_STR_MAX];
const char * file_type;
double seconds;
int tot_num_msus;
double tot_num_bytes;
- int i;
-
+
/* initialize the tally */
summary_fill_in(&cfile, &summary);
/* Container for each row of widgets */
main_vb = gtk_vbox_new(FALSE, 3);
- gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
+ gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
gtk_container_add(GTK_CONTAINER(sum_open_w), main_vb);
gtk_widget_show(main_vb);
add_string_to_box(string_buff, file_box);
/* length */
- g_snprintf(string_buff, SUM_STR_MAX, "Length: %lu", summary.file_length);
+ g_snprintf(string_buff, SUM_STR_MAX, "Length: %" G_GINT64_MODIFIER "d", summary.file_length);
add_string_to_box(string_buff, file_box);
/* format */
- file_type = wtap_file_type_string(summary.encap_type);
+ file_type = wtap_file_type_string(summary.file_type);
g_snprintf(string_buff, SUM_STR_MAX, "Format: %s", (file_type ? file_type : "N/A"));
add_string_to_box(string_buff, file_box);
gtk_container_add(GTK_CONTAINER(main_vb), table_fr);
gtk_widget_show(table_fr);
- table = gtk_clist_new(MTP3_SUM_INIT_TABLE_NUM_COLUMNS);
+ table = create_list();
+
gtk_container_add(GTK_CONTAINER(table_fr), table);
gtk_widget_show(table);
- col_arrows =
- (column_arrows *) g_malloc(sizeof(column_arrows) * MTP3_SUM_INIT_TABLE_NUM_COLUMNS);
-
- for (i = 0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
- {
- col_arrows[i].table = gtk_table_new(2, 2, FALSE);
-
- gtk_table_set_col_spacings(GTK_TABLE(col_arrows[i].table), 5);
-
- column_lb = gtk_label_new(columns[i].strptr);
-
- gtk_table_attach(GTK_TABLE(col_arrows[i].table), column_lb,
- 0, 1, 0, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
- gtk_widget_show(column_lb);
-
- col_arrows[i].ascend_pm = xpm_to_widget(clist_ascend_xpm);
-
- gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].ascend_pm,
- 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
- col_arrows[i].descend_pm = xpm_to_widget(clist_descend_xpm);
-
- gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].descend_pm,
- 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
- if (i == 0)
- {
- /* default column sorting */
- gtk_widget_show(col_arrows[i].ascend_pm);
- }
-
- gtk_clist_set_column_justification(GTK_CLIST(table), i, columns[i].just);
-
- gtk_clist_set_column_widget(GTK_CLIST(table), i, col_arrows[i].table);
- gtk_widget_show(col_arrows[i].table);
- }
- gtk_clist_column_titles_show(GTK_CLIST(table));
-
- gtk_clist_set_compare_func(GTK_CLIST(table), mtp3_sum_gtk_sort_column);
- gtk_clist_set_sort_column(GTK_CLIST(table), 0);
- gtk_clist_set_sort_type(GTK_CLIST(table), GTK_SORT_ASCENDING);
-
- for (i = 0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
- {
- gtk_clist_set_column_width(GTK_CLIST(table), i, columns[i].value);
- }
-
- gtk_clist_set_shadow_type(GTK_CLIST(table), GTK_SHADOW_IN);
- gtk_clist_column_titles_show(GTK_CLIST(table));
-
- SIGNAL_CONNECT(table, "click-column", mtp3_sum_gtk_click_column_cb, col_arrows);
mtp3_sum_draw(table, seconds, &tot_num_msus, &tot_num_bytes);
gtk_container_add(GTK_CONTAINER(main_vb), bbox);
gtk_widget_show(bbox);
- close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
+ close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
window_set_cancel_button(sum_open_w, close_bt, window_cancel_button_cb);
- SIGNAL_CONNECT(sum_open_w, "delete_event", window_delete_event_cb, NULL);
+ g_signal_connect(sum_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
gtk_widget_show_all(sum_open_w);
window_present(sum_open_w);