Allow the folders in the About Wireshark/Folders list to be double clicked on to...
authorgal <gal@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 13 Apr 2008 17:48:47 +0000 (17:48 +0000)
committergal <gal@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 13 Apr 2008 17:48:47 +0000 (17:48 +0000)
The MIB/PIB paths have been split up to allow each one to be clicked on separately, but as a result this will lose the order if the whole list is reordered.

XXX: I have been unable to test this on MacOS or Linux. Stig? :-)
I suppose it should work, but we may need to make it WIN32 specific?

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@24995 f5534014-38df-0310-8fa8-9805f1628bb7

gtk/about_dlg.c
gtk/gui_utils.c
gtk/gui_utils.h
gtk/main_proto_draw.c
gtk/webbrowser.c

index 49af9e4f87d2dd361b642bab609dd1a5d96a05a0..d38c926176e0e97919683a0e784ee6e78e8c08bd 100644 (file)
@@ -50,6 +50,7 @@
 #include "gtk/plugins_dlg.h"
 
 #include "../image/wssplash.xpm"
+#include "webbrowser.h"
 
 static void about_wireshark_destroy_cb(GtkWidget *, gpointer);
 
@@ -317,6 +318,31 @@ about_authors_page_new(void)
   return page;
 }
 
+static gint about_folders_callback(GtkWidget *widget, GdkEventButton *event, gint id)
+{
+  gint row = 0, col = 0;
+  GtkTreeSelection *tree_selection;
+  GtkTreeModel *model;
+  GtkTreeIter  iter;
+  gchar        *path;
+
+  tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+
+  if(gtk_tree_selection_count_selected_rows(tree_selection) == 0)
+    return FALSE;
+
+  if(event->type != GDK_2BUTTON_PRESS)
+    /* not a double click */
+    return FALSE;
+
+  if(gtk_tree_selection_get_selected (tree_selection, &model, &iter)) {
+    gtk_tree_model_get(model, &iter, 1, &path, -1);
+    browser_open_data_file(path);
+  }
+
+  return TRUE;
+}
+
 static void
 about_folders_row(GtkWidget *table, const char *label, const char *dir, const char *tip)
 {
@@ -332,6 +358,10 @@ about_folders_page_new(void)
   char *path;
   const gchar *titles[] = { "Name", "Folder", "Typical Files"};
   GtkWidget *scrolledwindow;
+#ifdef HAVE_LIBSMI
+  gint i; 
+  gchar **resultArray;
+#endif 
 
   scrolledwindow = scrolled_window_new(NULL, NULL);
   gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),
@@ -340,6 +370,12 @@ about_folders_page_new(void)
   /* Container for our data */
   table = simple_list_new(3, titles);
 
+  /* connect a callback so we can spot a double-click */
+  gtk_signal_connect(GTK_OBJECT(table), "button_press_event", 
+                    GTK_SIGNAL_FUNC(about_folders_callback), (gpointer)0);
+
+  simple_list_url_col(table, 1);
+
   /* "file open" */
   about_folders_row(table, "\"File\" dialogs", get_last_open_dir(),
       "capture files");
@@ -388,8 +424,13 @@ about_folders_page_new(void)
 #ifdef HAVE_LIBSMI
   /* SMI MIBs/PIBs */
   path = oid_get_default_mib_path();
-  about_folders_row(table, "MIB/PIB paths", path,
-      "SMI MIB/PIB search path");
+
+  resultArray = g_strsplit(path, ";", 10);
+
+  for(i = 0; resultArray[i]; i++) 
+    about_folders_row(table, "MIB/PIB path", g_strstrip(resultArray[i]),
+                     "SMI MIB/PIB search path");
+  g_strfreev(resultArray);
   g_free((void *) path);
 #endif
 
index 3db465eebf802d78170931f09b1dbac1bd6746a1..7bd5d7803205daff3294e8b9c366dee926e2ffc0 100644 (file)
@@ -933,6 +933,37 @@ simple_list_new(gint cols, const gchar **titles) {
     return plugins_list;
 }
 
+void render_as_url(GtkCellRenderer *cell)
+{
+    g_object_set(cell, "foreground", "blue", NULL);
+    g_object_set(cell, "foreground-set", TRUE, NULL);
+
+    g_object_set(cell, "underline", PANGO_UNDERLINE_SINGLE, NULL);
+    g_object_set(cell, "underline-set", TRUE, NULL);
+}
+
+void simple_list_url_col(GtkWidget *list, gint col)
+{
+  GtkTreeViewColumn *ul_column;
+  GList             *renderers_list;
+  GtkCellRenderer   *ul_renderer;
+
+  /* make the column look like a link ... */
+  ul_column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), col);
+
+  renderers_list = gtk_tree_view_column_get_cell_renderers(ul_column);
+
+  if(renderers_list != NULL) {
+    /* it is simple list - there should be only one renderer */
+    ul_renderer = (GtkCellRenderer*)renderers_list->data;
+
+    render_as_url(ul_renderer);
+
+    g_list_free(renderers_list);
+  }
+
+}
+
 void
 copy_to_clipboard(GString *str)
 {
index 15346a4f711c370eb7622ab06dfbdf494918e49a..780886a4081118151974fb78ccb667e6ca93b390 100644 (file)
@@ -248,7 +248,19 @@ extern GtkWidget *simple_list_new(gint cols, const gchar **titles);
  */
 extern void simple_list_append(GtkWidget *list, ...);
 
+/*** Make a column look like a url
+ *
+ * @param list the list from simple_list_new()
+ * @param col the column to make the values lookk like urls
+ */
+extern void simple_list_url_col(GtkWidget *list, gint col);
+
+/*** Make a cell underline to look like links
+ *
+ * @param cell the cell renderer that will show the text as a link
+ */
 
+extern void render_as_url(GtkCellRenderer *cell);
 
 /** Set the styles of all Trees based upon user preferences. */
 extern void set_tree_styles_all(void);
index 4b6961ecdc291b283bd4a61248774b41ce2151de..f7f5dff6fffa796b41fefa2e146c16bec79bb387 100644 (file)
@@ -1492,11 +1492,7 @@ static void tree_cell_renderer(GtkTreeViewColumn *tree_column _U_,
 
     if((fi->hfinfo->type == FT_FRAMENUM) ||
        (FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type))) {
-        g_object_set (cell, "foreground", "blue", NULL);
-        g_object_set (cell, "foreground-set", TRUE, NULL);
-
-        g_object_set (cell, "underline", PANGO_UNDERLINE_SINGLE, NULL);
-        g_object_set (cell, "underline-set", TRUE, NULL);
+        render_as_url(cell);
     }
 
        if(FI_GET_FLAG(fi, PI_SEVERITY_MASK)) {
index 57ec0568ba0c9c2262ad14472b0015cce53c5675..a13a3443845c5b417897dd40850203325479b0b3 100644 (file)
@@ -275,6 +275,16 @@ browser_open_data_file(const gchar *filename)
     gchar *uri;
 
     /* build filename */
+#ifdef G_OS_WIN32
+    if((strlen(filename) > 2) && (filename[1] == ':'))
+      file_path = g_strdup(filename);
+#else
+    /* XXX: is this correct for MacOS/Linux ? */
+    if((strlen(filename) > 1) && (filename[0] == '/'))
+      file_path = g_strdup(filename);
+#endif 
+    else
+
     file_path = g_strdup_printf("%s/%s", get_datafile_dir(), filename);
 
     /* XXX - check, if the file is really existing, otherwise display a simple_dialog about the problem */