From Didier Gautheron:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Oct 2009 08:52:36 +0000 (08:52 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Oct 2009 08:52:36 +0000 (08:52 +0000)
- Display number with a space as thousand separator.
- Move functions use both by conversations and hostlist in gui_utils.c, they may be useful for other taps too.

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

gtk/conversations_table.c
gtk/gui_utils.c
gtk/gui_utils.h

index 361af8a740d976245029020d54ff6831d0147ee1..2150b5c72fa6ae1f9ba14bab15f3daf2e35ed16d 100644 (file)
@@ -1052,30 +1052,6 @@ draw_ct_table_addresses(conversations_table *ct)
     g_object_unref(store);
 }
 
-static void
-switch_to_fixed_col(conversations_table *ct)
-{
-    gint size;
-    GtkTreeViewColumn *column;
-    GList          *columns;
-
-    ct->fixed_col = TRUE;
-    columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(ct->table));
-    while(columns) {
-        column = columns->data;
-        size = gtk_tree_view_column_get_width (column);
-        gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_FIXED);
-        if (size > gtk_tree_view_column_get_fixed_width(column))
-            gtk_tree_view_column_set_fixed_width(column, size);
-        columns = g_list_next(columns);
-    }
-    g_list_free(columns);
-    
-#if GTK_CHECK_VERSION(2,6,0)
-    gtk_tree_view_set_fixed_height_mode(ct->table, TRUE);
-#endif
-}
-
 static void
 draw_ct_table_data(conversations_table *ct)
 {
@@ -1185,7 +1161,9 @@ draw_ct_table_data(conversations_table *ct)
                  * let it run in autosize a little (1000 is arbitrary)
                  * and then switch to fixed width.
                 */
-                switch_to_fixed_col(ct);
+                ct->fixed_col = TRUE;
+
+                switch_to_fixed_col(ct->table);
             }
 
             gtk_tree_view_set_model(GTK_TREE_VIEW(ct->table), GTK_TREE_MODEL(store));
@@ -1321,19 +1299,6 @@ copy_as_csv_cb(GtkWindow *copy_bt, gpointer data _U_)
     g_string_free(csv.CSV_str, TRUE);                    /* Free the memory */
 }
 
-static gint get_default_col_size(GtkWidget *view, const gchar *str)
-{
-    PangoLayout *layout;
-    gint col_width;
-
-    layout = gtk_widget_create_pango_layout(view, str);
-    pango_layout_get_pixel_size(layout, 
-                               &col_width, /* width */
-                               NULL); /* height */
-    g_object_unref(G_OBJECT(layout));
-    return col_width;
-}
-
 static gint default_col_size[N_COLUMNS];
 
 static void
@@ -1344,8 +1309,8 @@ init_default_col_size(GtkWidget *view)
     default_col_size[DST_ADR_COLUMN] = default_col_size[SRC_ADR_COLUMN];
     default_col_size[SRC_PORT_COLUMN] = get_default_col_size(view, "000000");
     default_col_size[DST_PORT_COLUMN] = default_col_size[SRC_PORT_COLUMN];
-    default_col_size[PACKETS_COLUMN] = get_default_col_size(view, "00000000");
-    default_col_size[BYTES_COLUMN] = get_default_col_size(view, "0000000000");
+    default_col_size[PACKETS_COLUMN] = get_default_col_size(view, "00 000 000");
+    default_col_size[BYTES_COLUMN] = get_default_col_size(view, "0 000 000 000");
     default_col_size[PKT_AB_COLUMN] = default_col_size[PACKETS_COLUMN]; 
     default_col_size[PKT_BA_COLUMN] = default_col_size[PACKETS_COLUMN];
     default_col_size[BYTES_AB_COLUMN] = default_col_size[BYTES_COLUMN];
@@ -1441,15 +1406,11 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
     for (i = 0; i < N_COLUMNS -1; i++) {
         renderer = gtk_cell_renderer_text_new ();
         g_object_set(renderer, "ypad", 0, NULL);
-        if (i >= 4) {
-            /* right align numbers */
-            g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
-            column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, "text", 
-                               i, NULL);
-            if (i >= 10)
-                gtk_tree_sortable_set_sort_func(sortable, i, ct_sort_func, GINT_TO_POINTER(i), NULL);
-        }
-        else {
+        switch(i) {
+        case 0: /* addresses and ports */
+        case 1:
+        case 2:
+        case 3:
             column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, "text", 
                                i, NULL);
             if(hide_ports && (i == 1 || i == 3)){
@@ -1457,6 +1418,24 @@ init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean
               gtk_tree_view_column_set_visible(column, FALSE);
             }
             gtk_tree_sortable_set_sort_func(sortable, i, ct_sort_func, GINT_TO_POINTER(i), NULL);
+            break;
+        case 4: /* counts */
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9: /* right align numbers */
+            g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+            column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, NULL);
+            gtk_tree_view_column_set_cell_data_func(column, renderer, u64_data_func,  GINT_TO_POINTER(i), NULL);
+            break;
+        default: /* times and bps */
+            g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+            column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, "text", 
+                               i, NULL);
+
+            gtk_tree_sortable_set_sort_func(sortable, i, ct_sort_func, GINT_TO_POINTER(i), NULL);
+            break;
         }
         gtk_tree_view_column_set_sort_column_id(column, i);
         gtk_tree_view_column_set_resizable(column, TRUE);
index 49740f025d4b2c8f7f7d89bbd04400a0d4517f3e..901c6c9d2c642a90056e174c6584b45d4aa0b2c1 100644 (file)
@@ -1137,6 +1137,44 @@ tree_view_key_pressed_cb(GtkWidget *tree, GdkEventKey *event, gpointer user_data
     return FALSE;
 }
 
+void
+switch_to_fixed_col(GtkTreeView *view)
+{
+    gint size;
+    GtkTreeViewColumn *column;
+    GList          *columns;
+
+    columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(view));
+    while(columns) {
+        column = columns->data;
+        size = gtk_tree_view_column_get_width (column);
+        gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_FIXED);
+        if (size > gtk_tree_view_column_get_fixed_width(column))
+            gtk_tree_view_column_set_fixed_width(column, size);
+        columns = g_list_next(columns);
+    }
+    g_list_free(columns);
+    
+#if GTK_CHECK_VERSION(2,6,0)
+    gtk_tree_view_set_fixed_height_mode(view, TRUE);
+#endif
+}
+
+gint 
+get_default_col_size(GtkWidget *view, const gchar *str)
+{
+    PangoLayout *layout;
+    gint col_width;
+
+    layout = gtk_widget_create_pango_layout(view, str);
+    pango_layout_get_pixel_size(layout, 
+                               &col_width, /* width */
+                               NULL); /* height */
+    g_object_unref(G_OBJECT(layout));
+    return col_width;
+}
+
+
 /* 
  * This function can be called from gtk_tree_view_column_set_cell_data_func()
  * the user data must be the colum number.
@@ -1197,6 +1235,34 @@ present_as_hex_func (GtkTreeViewColumn *column _U_,
      g_object_set(renderer, "text", buf, NULL);
    }
 
+void
+u64_data_func (GtkTreeViewColumn *column _U_,
+                           GtkCellRenderer   *renderer,
+                           GtkTreeModel      *model,
+                           GtkTreeIter       *iter,
+                           gpointer           user_data)
+   {
+     guint64 val;
+     int i = 0;
+     gchar *bp;
+     gchar   buf[35];
+
+        /* the col to get data from is in userdata */
+        gint col = GPOINTER_TO_INT(user_data);
+
+     gtk_tree_model_get(model, iter, col, &val, -1);
+
+     bp = &buf[34];
+     *bp = 0;
+     do {
+        *--bp = (gchar)(val % 10) +'0';
+        if (!(++i % 3)) {
+            *--bp = ' ';
+        }
+        } while ((val /= 10) != 0 && bp > buf);
+     g_object_set(renderer, "text", bp, NULL);
+   }
+
 /* 
  * This function can be called from gtk_tree_view_column_set_cell_data_func()
  * the user data must be the colum number.
index 289118ca22d1e3ba00e88476bb3f2130e9376739..cc288ccb0fd9d0513a97c61232b931871ab7b63e 100644 (file)
@@ -326,6 +326,17 @@ void float_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkT
  */
 void present_as_hex_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
 
+/** Renders an unsigned 64 bits integer with space as thousand separator, called from gtk_tree_view_column_set_cell_data_func()
+ * The user data must be the colum number.
+ * Present value as hexadecimal. 
+ * @param column A GtkTreeColumn 
+ * @param renderer The GtkCellRenderer that is being rendered by tree_column 
+ * @param model The GtkTreeModel being rendered 
+ * @param iter A GtkTreeIter of the current row rendered 
+ * @param user_data must be the colum number to fetch the data from
+ */
+void u64_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
+
 /** This function can be called from gtk_tree_view_column_set_cell_data_func()
  * the user data must be the colum number.
  * Present value as hexadecimal. 
@@ -351,6 +362,15 @@ gint str_ptr_sort_func(GtkTreeModel *model,
                                                        GtkTreeIter *b,
                                                        gpointer user_data);
 
+/** Switch a GtkTReeView to fixed columns (speed optimization)
+ * @param view A GtkTreeView 
+ */
+void switch_to_fixed_col(GtkTreeView *view);
 
+/** Return the size in pixels of a string displayed with the GtkWidget's font.
+ * @param view A GtkWidget
+ * @param str UTF8 string 
+ */
+gint get_default_col_size(GtkWidget *view, const gchar *str);
 
 #endif /* __GTKGUIUI_UTIL_H__ */