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)
{
* 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));
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
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];
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)){
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);
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.
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.
*/
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.
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__ */