Save column alignment in the recent file.

Added center and default alignment menu items.

svn path=/trunk/; revision=31143
This commit is contained in:
Stig Bjørlykke 2009-12-01 17:07:13 +00:00
parent 669b05d601
commit 8b1f93f288
5 changed files with 157 additions and 14 deletions

View File

@ -770,14 +770,16 @@ static GtkItemFactoryEntry packet_list_heading_items[] =
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
{"/Default Alignment", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_DEFAULT, NULL, NULL,},
{"/Align Left", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_LEFT, "<StockItem>", GTK_STOCK_JUSTIFY_LEFT,},
{"/Align Center", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_CENTER, "<StockItem>", GTK_STOCK_JUSTIFY_CENTER,},
{"/Align Right", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_RIGHT, "<StockItem>", GTK_STOCK_JUSTIFY_RIGHT,},
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
{"/Column Preferences", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "<StockItem>", GTK_STOCK_PREFERENCES,},
{"/Column Preferences...", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "<StockItem>", GTK_STOCK_PREFERENCES,},
{"/Resize Column", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_RESIZE, "<StockItem>", WIRESHARK_STOCK_RESIZE_COLUMNS,},
{"/Rename Column Title", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_RENAME, "<StockItem>", GTK_STOCK_BOLD,},
{"/Rename Column Title...", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_RENAME, "<StockItem>", GTK_STOCK_BOLD,},
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
@ -788,9 +790,9 @@ static GtkItemFactoryEntry packet_list_heading_items[] =
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
{"/Column Preferences", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "<StockItem>", GTK_STOCK_PREFERENCES,},
{"/Column Preferences...", NULL, GTK_MENU_FUNC(prefs_cb), PREFS_PAGE_COLUMNS, "<StockItem>", GTK_STOCK_PREFERENCES,},
{"/Resize Column", NULL, GTK_MENU_FUNC(packet_list_column_menu_cb), COLUMN_SELECTED_RESIZE, "<StockItem>", WIRESHARK_STOCK_RESIZE_COLUMNS,},
{"/Rename Column Title", NULL, GTK_MENU_FUNC(packet_list_column_menu_cb), COLUMN_SELECTED_RENAME, "<StockItem>", GTK_STOCK_BOLD,},
{"/Rename Column Title...", NULL, GTK_MENU_FUNC(packet_list_column_menu_cb), COLUMN_SELECTED_RENAME, "<StockItem>", GTK_STOCK_BOLD,},
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},

View File

@ -279,14 +279,43 @@ new_packet_list_column_clicked_cb (GtkTreeViewColumn *col, gpointer user_data _U
}
}
static gdouble
get_xalign_value (gchar xalign, gint col_id)
{
double value;
switch (xalign) {
case COLUMN_XALIGN_RIGHT:
value = 1.0f;
break;
case COLUMN_XALIGN_CENTER:
value = 0.5f;
break;
case COLUMN_XALIGN_LEFT:
value = 0.0f;
break;
case COLUMN_XALIGN_DEFAULT:
default:
if (right_justify_column (col_id)) {
value = 1.0f;
} else {
value = 0.0f;
}
break;
}
return value;
}
static void
new_packet_list_xalign_column (GtkTreeViewColumn *col, gdouble value)
new_packet_list_xalign_column (gint col_id, GtkTreeViewColumn *col, gchar xalign)
{
#if GTK_CHECK_VERSION(2,18,0)
GList *renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
#else
GList *renderers = gtk_tree_view_column_get_cell_renderers (col);
#endif
gdouble value = get_xalign_value (xalign, col_id);
GList *entry;
GtkCellRenderer *renderer;
@ -298,6 +327,7 @@ new_packet_list_xalign_column (GtkTreeViewColumn *col, gdouble value)
}
g_list_free (renderers);
recent_set_column_xalign (col_id, xalign);
gtk_widget_queue_draw (packetlist->view);
}
@ -332,10 +362,16 @@ new_packet_list_column_menu_cb (GtkWidget *w _U_, gpointer user_data _U_, COLUMN
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(packetlist), 0, GTK_SORT_ASCENDING);
break;
case COLUMN_SELECTED_ALIGN_LEFT:
new_packet_list_xalign_column (col, 0.0);
new_packet_list_xalign_column (col_id, col, COLUMN_XALIGN_LEFT);
break;
case COLUMN_SELECTED_ALIGN_CENTER:
new_packet_list_xalign_column (col_id, col, COLUMN_XALIGN_CENTER);
break;
case COLUMN_SELECTED_ALIGN_RIGHT:
new_packet_list_xalign_column (col, 1.0);
new_packet_list_xalign_column (col_id, col, COLUMN_XALIGN_RIGHT);
break;
case COLUMN_SELECTED_ALIGN_DEFAULT:
new_packet_list_xalign_column (col_id, col, COLUMN_XALIGN_DEFAULT);
break;
case COLUMN_SELECTED_RESIZE:
new_packet_list_resize_column (col_id);
@ -369,6 +405,8 @@ create_view_and_model(void)
GtkCellRenderer *renderer;
PangoLayout *layout;
gint i, col_width;
gchar xalign;
gdouble value;
GtkWidget *title_lb;
gchar *tooltip_text;
header_field_info *hfi;
@ -400,7 +438,13 @@ create_view_and_model(void)
/* We need one extra column to store the entire PacketListRecord */
for(i = 0; i < cfile.cinfo.num_cols; i++) {
renderer = gtk_cell_renderer_text_new();
if (right_justify_column (i)) {
xalign = recent_get_column_xalign(i);
col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
if (xalign != COLUMN_XALIGN_DEFAULT) {
value = get_xalign_value(xalign, i);
g_object_set(G_OBJECT(renderer), "xalign", value, NULL);
} else if (right_justify_column (i)) {
g_object_set(G_OBJECT(renderer),
"xalign",
1.0,
@ -409,8 +453,6 @@ create_view_and_model(void)
g_object_set(renderer,
"ypad", 0,
NULL);
col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_set_cell_data_func(col, renderer,
show_cell_data_func,
GINT_TO_POINTER(i),
@ -1141,14 +1183,12 @@ new_packet_list_copy_summary_cb(GtkWidget * w _U_, gpointer data _U_, copy_summa
g_string_free(text,TRUE);
}
/* XXX for some reason this does not work in the .h file XXX*/
#define RECENT_KEY_COL_WIDTH "column.width"
void
new_packet_list_recent_write_all(FILE *rf)
{
gint col, width, num_cols, col_fmt;
GtkTreeViewColumn *tree_column;
gchar xalign;
fprintf (rf, "%s:", RECENT_KEY_COL_WIDTH);
num_cols = g_list_length(prefs.col_list);
@ -1161,11 +1201,15 @@ new_packet_list_recent_write_all(FILE *rf)
}
tree_column = gtk_tree_view_get_column(GTK_TREE_VIEW(GTK_TREE_VIEW(packetlist->view)), col);
width = gtk_tree_view_column_get_width(tree_column);
xalign = recent_get_column_xalign (col);
if (width == 0) {
/* We have not initialized the packet list yet, use old values */
width = recent_get_column_width (col);
}
fprintf (rf, " %d", width);
if (xalign != COLUMN_XALIGN_DEFAULT) {
fprintf (rf, ":%c", xalign);
}
if (col != num_cols-1) {
fprintf (rf, ",");
}

View File

@ -35,12 +35,19 @@ typedef enum {
COLUMN_SELECTED_SORT_DESCENDING,
COLUMN_SELECTED_SORT_NONE,
COLUMN_SELECTED_ALIGN_LEFT,
COLUMN_SELECTED_ALIGN_CENTER,
COLUMN_SELECTED_ALIGN_RIGHT,
COLUMN_SELECTED_ALIGN_DEFAULT,
COLUMN_SELECTED_RESIZE,
COLUMN_SELECTED_RENAME,
COLUMN_SELECTED_REMOVE
} COLUMN_SELECTED_E;
#define COLUMN_XALIGN_DEFAULT 0
#define COLUMN_XALIGN_LEFT 'L'
#define COLUMN_XALIGN_CENTER 'C'
#define COLUMN_XALIGN_RIGHT 'R'
GtkWidget *new_packet_list_create(void);
void new_packet_list_recreate(void);
void new_packet_list_column_menu_cb (GtkWidget *w, gpointer data, COLUMN_SELECTED_E action);

View File

@ -694,12 +694,18 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
col_l_elt = col_l_elt->next;
cfmt->width = strtol(col_l_elt->data, &p, 0);
if (p == col_l_elt->data || *p != '\0') {
if (p == col_l_elt->data || (*p != '\0' && *p != ':')) {
g_free(cfmt->cfield);
g_free(cfmt);
return PREFS_SET_SYNTAX_ERR; /* number was bad */
}
if (*p == ':') {
cfmt->xalign = *(++p);
} else {
cfmt->xalign = 0;
}
col_l_elt = col_l_elt->next;
recent.col_width_list = g_list_append(recent.col_width_list, cfmt);
}
@ -996,6 +1002,76 @@ recent_set_column_width(gint col, gint width)
col_w->cfield = NULL;
}
col_w->width = width;
col_w->xalign = 0;
recent.col_width_list = g_list_append(recent.col_width_list, col_w);
}
}
gchar
recent_get_column_xalign(gint col)
{
GList *col_l;
col_width_data *col_w;
gint cfmt;
const gchar *cfield = NULL;
cfmt = get_column_format(col);
if (cfmt == COL_CUSTOM) {
cfield = get_column_custom_field(col);
}
col_l = g_list_first(recent.col_width_list);
while (col_l) {
col_w = (col_width_data *) col_l->data;
if (col_w->cfmt == cfmt) {
if (cfmt != COL_CUSTOM || strcmp (cfield, col_w->cfield) == 0) {
return col_w->xalign;
}
}
col_l = col_l->next;
}
return 0;
}
void
recent_set_column_xalign(gint col, gchar xalign)
{
GList *col_l;
col_width_data *col_w;
gint cfmt;
const gchar *cfield = NULL;
gboolean found = FALSE;
cfmt = get_column_format(col);
if (cfmt == COL_CUSTOM) {
cfield = get_column_custom_field(col);
}
col_l = g_list_first(recent.col_width_list);
while (col_l) {
col_w = (col_width_data *) col_l->data;
if (col_w->cfmt == cfmt) {
if (cfmt != COL_CUSTOM || strcmp (cfield, col_w->cfield) == 0) {
col_w->xalign = xalign;
found = TRUE;
break;
}
}
col_l = col_l->next;
}
if (!found) {
col_w = (col_width_data *) g_malloc(sizeof(col_width_data));
col_w->cfmt = cfmt;
if (cfield) {
col_w->cfield = g_strdup(cfield);
} else {
col_w->cfield = NULL;
}
col_w->width = 40;
col_w->xalign = xalign;
recent.col_width_list = g_list_append(recent.col_width_list, col_w);
}
}

View File

@ -43,6 +43,7 @@ typedef struct _col_width_data {
gint cfmt;
gchar *cfield;
gint width;
gchar xalign;
} col_width_data;
/** Recent settings. */
@ -149,4 +150,17 @@ extern gint recent_get_column_width(gint col);
*/
extern void recent_set_column_width(gint col, gint width);
/** Get the column xalign for the given column
*
* @param col column number
*/
extern gchar recent_get_column_xalign(gint col);
/** Set the column xalign for the given column
*
* @param col column number
* @param xalign column alignment
*/
extern void recent_set_column_xalign(gint col, gchar xalign);
#endif /* recent.h */