Handle -I in the options processing.
[obnox/wireshark/wip.git] / gtk / sctp_error_dlg.c
index ecb8c94ac9357f17cc21cb420449d7d4c3dd7daf..c22fd2e06faa332663bc17e70d403fb1e4c71592 100644 (file)
@@ -3,8 +3,8 @@
  *
  * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * 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
 
 #include <gtk/gtk.h>
 
-#include "globals.h"
 #include "epan/filesystem.h"
-#include "simple_dialog.h"
-#include "tap_menu.h"
-#include "dlg_utils.h"
-#include "ui_util.h"
-#include "main.h"
-#include "compat_macros.h"
 
-#include "sctp_stat.h"
-/*#include "sctp_assoc_analyse.h"*/
+#include "../globals.h"
+#include "../simple_dialog.h"
+
+#include "gtk/dlg_utils.h"
+#include "gtk/gui_utils.h"
+#include "gtk/main.h"
+#include "gtk/sctp_stat.h"
 
 
 static GtkWidget *sctp_error_dlg=NULL;
 static GtkWidget *clist = NULL;
 static GList *last_list = NULL;
 static sctp_error_info_t* selected_packet = NULL;/* current selection */
-/*static sctp_assoc_info_t* selected_assoc = NULL; */
-extern GtkWidget *main_display_filter_widget;
-
-
-#define NUM_COLS 3
 
-typedef struct column_arrows {
-       GtkWidget *table;
-       GtkWidget *ascend_pm;
-       GtkWidget *descend_pm;
-} column_arrows;
+enum
+{
+       FRAME_COLUMN,
+       INFO_COLUMN,
+       TEXT_COLUMN,
+       N_COLUMN
+};
 
 
 static void
@@ -64,68 +59,148 @@ dlg_destroy(void)
        sctp_error_dlg=NULL;
 }
 
-static void add_to_clist(sctp_error_info_t* errinfo)
+static void
+sctp_error_on_select_row(GtkTreeSelection *sel, gpointer user_data _U_)
 {
-       gint added_row, i;
-       gchar *data[NUM_COLS];
-       gchar field[NUM_COLS][30];
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
+               gtk_tree_model_get(model, &iter, 
+                       FRAME_COLUMN, &(selected_packet->frame_number),
+                       TEXT_COLUMN, &(selected_packet->chunk_info),
+                       INFO_COLUMN, &(selected_packet->info_text),
+                       -1);
+               }
+}
 
-       for (i=0; i<NUM_COLS; i++)
-               data[i]=&field[i][0];
+static
+GtkWidget *create_list(void)
+{
+       GtkListStore *list_store;
+       GtkWidget * list;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+       GtkTreeView *list_view;
+       GtkTreeSelection *selection;
+       
+       list_store = gtk_list_store_new(N_COLUMN,
+               G_TYPE_UINT, /* Frame number*/
+               G_TYPE_STRING, /* Chunk type*/
+               G_TYPE_STRING );/* Info */
+               
+    /* Create a view */
+    list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+
+       list_view = GTK_TREE_VIEW(list);
+
+#if GTK_CHECK_VERSION(2,6,0)
+       /* Speed up the list display */
+       gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
+#endif
 
-               /*printf("errinfo=%s\n",errinfo->chunk_info);*/
+    gtk_tree_view_set_headers_clickable(list_view, TRUE);
+
+    /* The view now holds a reference.  We can get rid of our own reference */
+    g_object_unref (G_OBJECT (list_store));
+
+    /* 
+     * Create the first column packet, associating the "text" attribute of the
+     * cell_renderer to the first column of the model 
+     */
+    /* 1:st column */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("Framenumber", renderer, 
+               "text", FRAME_COLUMN, 
+               NULL);
+
+       gtk_tree_view_column_set_sort_column_id(column, FRAME_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, 80);
+
+       /* 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 ("Chunk Types", renderer, 
+               "text", TEXT_COLUMN,
+               NULL);
+    gtk_tree_view_column_set_sort_column_id(column, INFO_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, 200);
+    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 ("Info", renderer, 
+               "text", INFO_COLUMN,
+               NULL);
+    gtk_tree_view_column_set_sort_column_id(column, TEXT_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, 200);
+    gtk_tree_view_append_column (list_view, column);
+
+
+    /* 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);
+
+       /* Setup the selection handler */
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
+       gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+       g_signal_connect(selection, "changed", G_CALLBACK(sctp_error_on_select_row), NULL);
+       return list;
+}
 
-       g_snprintf(field[0], 20, "%u", errinfo->frame_number);
-       g_snprintf(field[1], 20, "%s", errinfo->chunk_info);
-       g_snprintf(field[2], 20, "%s", errinfo->info_text);
 
-       added_row = gtk_clist_append(GTK_CLIST(clist), data);
+static void add_to_clist(sctp_error_info_t* errinfo)
+{
+    GtkListStore *list_store = NULL;
+    GtkTreeIter  iter;
+
+    list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (clist))); /* Get store */
 
-       /* set data pointer of last row to point to user data for that row */
-       gtk_clist_set_row_data(GTK_CLIST(clist), added_row, errinfo);
+#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
+               FRAME_COLUMN,                   errinfo->frame_number,
+               TEXT_COLUMN,                    errinfo->chunk_info,
+               INFO_COLUMN,                    errinfo->info_text,
+         -1);  
 }
 
 static void
 sctp_error_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
 {
-       gtk_clist_unselect_all(GTK_CLIST(clist));
+       gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)));
 }
 
-void sctp_error_dlg_update(GList *list)
+static void sctp_error_dlg_update(GList *list)
 {
-GList *ilist=NULL;
-printf("dlg_update\n");
-       if (sctp_error_dlg != NULL) {
-                       gtk_clist_clear(GTK_CLIST(clist));
-printf("vor ilist\n");
-       ilist=list;
-       if (ilist==NULL)
-       printf("=NULL\n");
-       printf("nach ilist\n");
+       GList *ilist=NULL;
+
+       if (sctp_error_dlg != NULL) 
+       {
+               gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
+               ilist=list;
 
                while (ilist)
                {
-               printf("while\n");
                        add_to_clist((sctp_error_info_t*)(ilist->data));
                        ilist = g_list_next(ilist);
                }
 
                sctp_error_on_unselect(NULL, NULL);
        }
-printf("vor last_list\n");
        last_list = ilist;
 }
 
-static void
-sctp_error_on_select_row(GtkCList *clist,
-                                            gint row,
-                                            gint column _U_,
-                                            GdkEventButton *event _U_,
-                                            gpointer user_data _U_)
-{
-selected_packet = gtk_clist_get_row_data(GTK_CLIST(clist), row);
-}
-
 
 
 static void
@@ -141,7 +216,7 @@ sctp_error_on_frame (GtkButton *button _U_, gpointer user_data _U_)
 
 
 static void
-sctp_error_on_close (GtkButton *button _U_, gpointer         user_data _U_)
+sctp_error_on_close (GtkButton *button _U_, gpointer user_data _U_)
 {
        gtk_grab_remove(sctp_error_dlg);
        gtk_widget_destroy(sctp_error_dlg);
@@ -158,76 +233,32 @@ gtk_sctperror_dlg(void)
        GtkWidget *bt_frame;
        GtkWidget *bt_close;
 
-       gchar *titles[NUM_COLS] =  {"Framenumber","Chunk Types", "Info"};
-       column_arrows *col_arrows;
-       GtkStyle *win_style;
-       GtkWidget *column_lb;
-       int i;
-
-       sctp_error_dlg_w = window_new (GTK_WINDOW_TOPLEVEL, "Ethereal: SCTP Associations");
+       sctp_error_dlg_w = window_new (GTK_WINDOW_TOPLEVEL, "Wireshark: SCTP Associations");
        gtk_window_set_position (GTK_WINDOW (sctp_error_dlg_w), GTK_WIN_POS_CENTER);
-       SIGNAL_CONNECT(sctp_error_dlg_w, "destroy", dlg_destroy,NULL);
+       g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
 
        /* Container for each row of widgets */
        vbox1 = gtk_vbox_new(FALSE, 2);
-       gtk_container_border_width(GTK_CONTAINER(vbox1), 8);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
        gtk_container_add(GTK_CONTAINER(sctp_error_dlg_w), vbox1);
        gtk_widget_show(vbox1);
 
-/*     sctp_error_dlg_w = gtk_dialog_new();
-       gtk_window_set_title (GTK_WINDOW (sctp_error_dlg_w), "Ethereal: SCTP Malformed Packets");
-
-       dialog_vbox1 = GTK_DIALOG (sctp_error_dlg_w)->vbox;
-       gtk_widget_show (dialog_vbox1);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox1);
-       gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
-       gtk_container_set_border_width (GTK_CONTAINER (vbox1), 8);*/
-
        scrolledwindow1 = scrolled_window_new (NULL, NULL);
        gtk_widget_show (scrolledwindow1);
        gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
 
-       clist = gtk_clist_new (NUM_COLS);
+       clist = create_list();
        gtk_widget_show (clist);
        gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
-       WIDGET_SET_SIZE(clist, 500, 200);
-
-       gtk_clist_set_column_width (GTK_CLIST (clist), 0, 100);
-       gtk_clist_set_column_width (GTK_CLIST (clist), 1, 200);
-       gtk_clist_set_column_width (GTK_CLIST (clist), 2, 200);
-
-       gtk_clist_set_column_justification(GTK_CLIST(clist), 0, GTK_JUSTIFY_CENTER);
-       gtk_clist_set_column_justification(GTK_CLIST(clist), 1, GTK_JUSTIFY_LEFT);
-       gtk_clist_set_column_justification(GTK_CLIST(clist), 2, GTK_JUSTIFY_LEFT);
-
-       gtk_clist_column_titles_show (GTK_CLIST (clist));
-
-       gtk_clist_set_sort_column(GTK_CLIST(clist), 0);
-       gtk_clist_set_sort_type(GTK_CLIST(clist), GTK_SORT_ASCENDING);
+       gtk_widget_set_size_request(clist, 500, 200);
 
        gtk_widget_show(sctp_error_dlg_w);
 
-       col_arrows = (column_arrows *) g_malloc(sizeof(column_arrows) * NUM_COLS);
-       win_style = gtk_widget_get_style(scrolledwindow1);
-
-       for (i=0; i<NUM_COLS; 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(titles[i]);
-               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);
-
-               gtk_clist_set_column_widget(GTK_CLIST(clist), i, col_arrows[i].table);
-               gtk_widget_show(col_arrows[i].table);
-       }
-
 
        hbuttonbox2 = gtk_hbutton_box_new ();
        gtk_widget_show (hbuttonbox2);
        gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox2, FALSE, FALSE, 0);
-       gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox2), 5);
+       gtk_box_set_spacing (GTK_BOX (hbuttonbox2), 5);
        gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_SPREAD);
 
 
@@ -239,63 +270,43 @@ gtk_sctperror_dlg(void)
        gtk_widget_show (bt_frame);
        gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_frame);
 
-    bt_close = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE);
+       bt_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
        gtk_widget_show (bt_close);
        gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_close);
 
-       SIGNAL_CONNECT(sctp_error_dlg_w, "destroy", dlg_destroy, NULL);
-       SIGNAL_CONNECT(clist, "select_row", sctp_error_on_select_row, NULL);
-       SIGNAL_CONNECT(bt_unselect, "clicked", sctp_error_on_unselect, NULL);
-       SIGNAL_CONNECT(bt_frame, "clicked", sctp_error_on_frame, NULL);
-       SIGNAL_CONNECT(bt_close, "clicked", sctp_error_on_close, NULL);
+       g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
+       g_signal_connect(bt_unselect, "clicked", G_CALLBACK(sctp_error_on_unselect), NULL);
+       g_signal_connect(bt_frame, "clicked", G_CALLBACK(sctp_error_on_frame), NULL);
+       g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_error_on_close), NULL);
 
        sctp_error_dlg = sctp_error_dlg_w;
 
-
 }
 
 
 void sctp_error_dlg_show(sctp_assoc_info_t* assoc)
 {
-GList *list;
+       GList *list;
 
-
-       /* selected_assoc=(sctp_assoc_info_t*)get_selected_assoc(); */
        list =assoc->error_info_list;
        if (list != NULL)
        {
-       if (sctp_error_dlg != NULL) {
-               /* There's already a dialog box; reactivate it. */
-               reactivate_window(sctp_error_dlg);
-               /* Another list since last call? */
-               if (list != last_list) {
+               if (sctp_error_dlg != NULL) {
+                       /* There's already a dialog box; reactivate it. */
+                       reactivate_window(sctp_error_dlg);
+                       /* Another list since last call? */
+                       if (list != last_list) {
+                               sctp_error_dlg_update(list);
+                       }
+               }
+               else {
+                       /* Create and show the dialog box */
+                       gtk_sctperror_dlg();
                        sctp_error_dlg_update(list);
                }
        }
-       else {
-               /* Create and show the dialog box */
-               gtk_sctperror_dlg();
-               sctp_error_dlg_update(list);
-       }
-       }
        else
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                    "No errors found!");
 }
 
-
-/*void sctp_error_start(GtkWidget *w _U_, gpointer data _U_)
-{
-       if (sctp_stat_get_info()->is_registered==FALSE)
-       register_tap_listener_sctp_stat();
-       sctp_stat_scan();
-       sctp_error_dlg_show(sctp_stat_get_info()->error_info_list);
-}*/
-
-/****************************************************************************/
-/*void
-register_tap_listener_sctp_error_dlg(void)
-{
-       register_tap_menu_item("SCTP/Show All Malformed Packets...", REGISTER_TAP_GROUP_NONE,
-           sctp_error_start, NULL, NULL, NULL);
-}*/