From Alejandro Vaquero:

- Add a pane to contain  the main graph and the comments to be able to 
split them
- Change the main graph area to be a scrolled_window
- Change the look of the selected item to be blue with white text color
- Gray color the title area
- Change the conversations color to more "soft" colors (it was difficult 
to read in some cases before)

svn path=/trunk/; revision=14556
This commit is contained in:
Anders Broman 2005-06-06 14:01:04 +00:00
parent 0d7fce8c7d
commit 936bcef09d
2 changed files with 417 additions and 287 deletions

View File

@ -44,6 +44,8 @@
/* in /gtk ... */
#include <gtk/gtk.h>
#include <glib-object.h>
#include <gdk/gdkkeysyms.h>
#include "gtkglobals.h"
@ -76,6 +78,19 @@ GdkColormap *colormap;
static GtkWidget *save_to_file_w = NULL;
#define MAX_LABEL 50
#define MAX_COMMENT 100
#define ITEM_HEIGHT 20
#define NODE_WIDTH 100
#define TOP_Y_BORDER 40
#define BOTTOM_Y_BORDER 0
#define COMMENT_WIDTH 400
#define TIME_WIDTH 50
#define NODE_CHARS_WIDTH 20
#define CONV_TIME_HEADER "Conv.| Time "
#define EMPTY_HEADER " | "
#define HEADER_LENGTH 16
/****************************************************************************/
/* Reset the user_data structure */
@ -118,15 +133,16 @@ static void graph_analysis_init_dlg(graph_analysis_data_t* user_data)
user_data->dlg.selected_item=0xFFFFFFFF; /*not item selected */
/* init dialog_graph */
user_data->dlg.needs_redraw=TRUE;
user_data->dlg.draw_area_time=NULL;
user_data->dlg.draw_area=NULL;
user_data->dlg.pixmap=NULL;
user_data->dlg.pixmap_time=NULL;
user_data->dlg.draw_area_comments=NULL;
user_data->dlg.pixmap_comments=NULL;
user_data->dlg.h_scrollbar=NULL;
user_data->dlg.h_scrollbar_adjustment=NULL;
user_data->dlg.v_scrollbar=NULL;
user_data->dlg.v_scrollbar_adjustment=NULL;
user_data->dlg.pixmap_width=350;
user_data->dlg.hpane=NULL;
user_data->dlg.pixmap_width = 350;
user_data->dlg.pixmap_height=400;
user_data->dlg.first_node=0;
user_data->dlg.first_item=0;
@ -194,19 +210,6 @@ static void draw_arrow(GdkDrawable *pixmap, GdkGC *gc, gint x, gint y, gboolean
arrow_point, 3);
}
#define MAX_LABEL 50
#define MAX_COMMENT 100
#define ITEM_HEIGHT 20
#define NODE_WIDTH 100
#define TOP_Y_BORDER 40
#define BOTTOM_Y_BORDER 0
#define COMMENT_WIDTH 400
#define NODE_CHARS_WIDTH 20
#define CONV_TIME_HEADER "Conv.| Time "
#define EMPTY_HEADER " | "
#define HEADER_LENGTH 16
/****************************************************************************/
/* adds trailing characters to complete the requested length */
/* NB: does not allocate new memory for the string, there must be enough */
@ -565,7 +568,7 @@ on_save_bt_clicked (GtkButton *button _U_,
/****************************************************************************/
static void dialog_graph_draw(graph_analysis_data_t* user_data)
{
guint32 i, last_item, first_item, last_node, first_node, display_items, display_nodes;
guint32 i, last_item, first_item, display_items;
guint32 start_arrow, end_arrow, label_x, src_port_x, dst_port_x, arrow_width;
guint32 current_item;
guint32 left_x_border;
@ -573,7 +576,9 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
guint32 top_y_border;
guint32 bottom_y_border;
graph_analysis_item_t *gai;
gboolean display_label;
GdkGC *frame_fg_color;
GdkGC *frame_bg_color;
GdkGC *div_line_color;
#if GTK_MAJOR_VERSION < 2
GdkFont *font;
@ -601,9 +606,14 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
}
user_data->dlg.needs_redraw=FALSE;
/*
* Clear out old plot
*/
/* Clear out old plt */
gdk_draw_rectangle(user_data->dlg.pixmap_time,
user_data->dlg.draw_area_time->style->white_gc,
TRUE,
0, 0,
user_data->dlg.draw_area_time->allocation.width,
user_data->dlg.draw_area_time->allocation.height);
gdk_draw_rectangle(user_data->dlg.pixmap,
user_data->dlg.draw_area->style->white_gc,
TRUE,
@ -615,8 +625,8 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
user_data->dlg.draw_area->style->white_gc,
TRUE,
0, 0,
COMMENT_WIDTH,
user_data->dlg.draw_area->allocation.height);
user_data->dlg.draw_area_comments->allocation.width,
user_data->dlg.draw_area_comments->allocation.height);
/* Calculate the y border */
@ -685,9 +695,9 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
label_width=gdk_string_width(font, label_string);
label_height=gdk_string_height(font, label_string);
#else
layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area, label_string);
big_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area, label_string);
small_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area, label_string);
layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
big_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
small_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
/* XXX - to prevent messages like "Couldn't load font x, falling back to y", I've changed font
description from "Helvetica-Bold 8" to "Helvetica,Sans,Bold 8", this seems to be
@ -697,34 +707,96 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
pango_layout_get_pixel_size(layout, &label_width, &label_height);
#endif
left_x_border=label_width+10;
/* resize the "time" draw area */
WIDGET_SET_SIZE(user_data->dlg.draw_area_time, label_width + 6, user_data->dlg.pixmap_height);
gtk_widget_show(user_data->dlg.draw_area_time);
left_x_border=3;
user_data->dlg.left_x_border = left_x_border;
right_x_border=2;
/* Calculate the number of nodes to display */
draw_width=user_data->dlg.pixmap_width-right_x_border-left_x_border;
display_nodes = draw_width/NODE_WIDTH;
first_node = user_data->dlg.first_node;
/* in case the windows is resized so we have to move the left node */
if ((first_node + display_nodes) > user_data->num_nodes){
if (display_nodes>user_data->num_nodes)
first_node=0;
else
first_node=user_data->num_nodes - display_nodes;
}
/* Paint time title background */
gdk_draw_rectangle(user_data->dlg.pixmap_time,
user_data->dlg.draw_area_time->style->bg_gc[2],
TRUE,
0,
0,
user_data->dlg.draw_area_time->allocation.width,
top_y_border);
/* Paint main title background */
gdk_draw_rectangle(user_data->dlg.pixmap,
user_data->dlg.draw_area->style->bg_gc[2],
TRUE,
0,
0,
user_data->dlg.draw_area->allocation.width,
top_y_border);
/* Paint main comment background */
gdk_draw_rectangle(user_data->dlg.pixmap_comments,
user_data->dlg.draw_area_comments->style->bg_gc[2],
TRUE,
0,
0,
user_data->dlg.draw_area_comments->allocation.width,
top_y_border);
/* in case there are less nodes than possible displayed */
if (display_nodes>user_data->num_nodes) display_nodes=user_data->num_nodes;
last_node = first_node + display_nodes-1;
/* Draw the word "Time" on top of time column */
g_snprintf(label_string, label_width, "%s", "Time");
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(font, label_string);
label_height=gdk_string_height(font, label_string);
gdk_draw_string(user_data->dlg.pixmap_time,
font,
user_data->dlg.draw_area_time->style->black_gc,
left_x_border+4,
top_y_border/2-label_height/2,
label_string);
#else
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
gdk_draw_layout(user_data->dlg.pixmap_time,
user_data->dlg.draw_area_time->style->black_gc,
left_x_border,
top_y_border/2-label_height/2,
layout);
#endif
/* Draw the word "Comment" on top of comment column */
g_snprintf(label_string, label_width, "%s", "Comment");
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(font, label_string);
label_height=gdk_string_height(font, label_string);
gdk_draw_string(user_data->dlg.pixmap_comments,
font,
user_data->dlg.draw_area_comments->style->black_gc,
MAX_COMMENT/2-label_width/2,
top_y_border/2-label_height/2,
label_string);
#else
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
gdk_draw_layout(user_data->dlg.pixmap_comments,
user_data->dlg.draw_area_comments->style->black_gc,
MAX_COMMENT/2-label_width/2,
top_y_border/2-label_height/2,
layout);
#endif
/* Paint the background items */
for (current_item=0; current_item<display_items; current_item++){
/*select the color. if it is the selected item select blue color */
if ( current_item+first_item == user_data->dlg.selected_item )
frame_bg_color = user_data->dlg.bg_gc[0];
else
frame_bg_color = user_data->dlg.bg_gc[1+user_data->dlg.items[current_item].conv_num%MAX_NUM_COL_CONV];
/* Paint background */
gdk_draw_rectangle(user_data->dlg.pixmap,
user_data->dlg.bg_gc[user_data->dlg.items[current_item].conv_num%MAX_NUM_COL_CONV],
frame_bg_color,
TRUE,
left_x_border,
top_y_border+current_item*ITEM_HEIGHT,
@ -732,13 +804,12 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
ITEM_HEIGHT);
}
/* Draw the node names on top and the division lines */
for (i=0; i<display_nodes; i++){
for (i=0; i<user_data->num_nodes; i++){
/* print the node identifiers */
/* XXX we assign 5 pixels per character in the node identity */
g_snprintf(label_string, NODE_WIDTH/5, "%s",
get_addr_name(&(user_data->nodes[i+first_node])));
get_addr_name(&(user_data->nodes[i])));
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(font, label_string);
label_height=gdk_string_height(font, label_string);
@ -759,7 +830,7 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
#endif
/* draw the node division lines */
gdk_draw_line(user_data->dlg.pixmap, user_data->dlg.div_line_gc,
gdk_draw_line(user_data->dlg.pixmap, user_data->dlg.div_line_gc[0],
left_x_border+NODE_WIDTH/2+NODE_WIDTH*i,
top_y_border,
left_x_border+NODE_WIDTH/2+NODE_WIDTH*i,
@ -767,33 +838,29 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
}
/*
* Draw the items
*/
/* Draw the items */
for (current_item=0; current_item<display_items; current_item++){
/* draw the time */
g_snprintf(label_string, MAX_LABEL, "%.3f", user_data->dlg.items[current_item].time);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(font, label_string);
label_height=gdk_string_height(font, label_string);
gdk_draw_string(user_data->dlg.pixmap,
gdk_draw_string(user_data->dlg.pixmap_time,
font,
user_data->dlg.draw_area->style->black_gc,
left_x_border-label_width-4,
3,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2+label_height/4,
label_string);
#else
pango_layout_set_text(layout, label_string, -1);
pango_layout_get_pixel_size(layout, &label_width, &label_height);
gdk_draw_layout(user_data->dlg.pixmap,
gdk_draw_layout(user_data->dlg.pixmap_time,
user_data->dlg.draw_area->style->black_gc,
left_x_border-label_width-4,
3,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2,
layout);
#endif
/*draw the comments */
g_snprintf(label_string, MAX_COMMENT, "%s", user_data->dlg.items[current_item].comment);
#if GTK_MAJOR_VERSION < 2
@ -814,203 +881,174 @@ static void dialog_graph_draw(graph_analysis_data_t* user_data)
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2,
small_layout);
#endif
/* draw the arrow an frame label*/
display_label = FALSE;
if (user_data->dlg.items[current_item].src_node>=first_node){
if (user_data->dlg.items[current_item].src_node<=last_node){
start_arrow = left_x_border+(user_data->dlg.items[current_item].src_node-first_node)*NODE_WIDTH+NODE_WIDTH/2;
display_label = TRUE;
} else {
start_arrow = user_data->dlg.pixmap_width - right_x_border;
}
/* select colors */
if ( current_item+first_item == user_data->dlg.selected_item ){
frame_fg_color = user_data->dlg.draw_area->style->white_gc;
div_line_color = user_data->dlg.div_line_gc[1];
} else {
start_arrow = left_x_border;
frame_fg_color = user_data->dlg.draw_area->style->black_gc;
div_line_color = user_data->dlg.div_line_gc[0];
}
/* draw the arrow line */
start_arrow = left_x_border+(user_data->dlg.items[current_item].src_node)*NODE_WIDTH+NODE_WIDTH/2;
end_arrow = left_x_border+(user_data->dlg.items[current_item].dst_node)*NODE_WIDTH+NODE_WIDTH/2;
if (user_data->dlg.items[current_item].dst_node>=first_node){
if (user_data->dlg.items[current_item].dst_node<=last_node){
end_arrow = left_x_border+(user_data->dlg.items[current_item].dst_node-first_node)*NODE_WIDTH+NODE_WIDTH/2;
display_label = TRUE;
} else {
end_arrow = user_data->dlg.pixmap_width - right_x_border;
}
} else {
end_arrow = left_x_border;
}
gdk_draw_line(user_data->dlg.pixmap, frame_fg_color,
start_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7,
end_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7);
if (start_arrow != end_arrow){
/* draw the arrow line */
gdk_draw_line(user_data->dlg.pixmap, user_data->dlg.draw_area->style->black_gc,
/* draw the additional line when line style is 2 pixels width */
if (user_data->dlg.items[current_item].line_style == 2){
gdk_draw_line(user_data->dlg.pixmap, frame_fg_color,
start_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-6,
end_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7);
/* draw the additional line when line style is 2 pixels width */
if (user_data->dlg.items[current_item].line_style == 2){
gdk_draw_line(user_data->dlg.pixmap, user_data->dlg.draw_area->style->black_gc,
start_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-6,
end_arrow,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-6);
}
/* draw the arrow */
if (start_arrow<end_arrow)
draw_arrow(user_data->dlg.pixmap, user_data->dlg.draw_area->style->black_gc, end_arrow-WIDTH_ARROW,top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7, RIGHT_ARROW);
else
draw_arrow(user_data->dlg.pixmap, user_data->dlg.draw_area->style->black_gc, end_arrow+WIDTH_ARROW,top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7, LEFT_ARROW);
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-6);
}
/* draw the arrow */
if (start_arrow<end_arrow)
draw_arrow(user_data->dlg.pixmap, frame_fg_color, end_arrow-WIDTH_ARROW,top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7, RIGHT_ARROW);
else
draw_arrow(user_data->dlg.pixmap, frame_fg_color, end_arrow+WIDTH_ARROW,top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7, LEFT_ARROW);
/* draw the frame comment */
if (display_label){
g_snprintf(label_string, MAX_LABEL, "%s", user_data->dlg.items[current_item].frame_label);
g_snprintf(label_string, MAX_LABEL, "%s", user_data->dlg.items[current_item].frame_label);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(big_font, label_string);
label_height=gdk_string_height(big_font, label_string);
label_width=gdk_string_width(big_font, label_string);
label_height=gdk_string_height(big_font, label_string);
#else
pango_layout_set_text(big_layout, label_string, -1);
pango_layout_get_pixel_size(big_layout, &label_width, &label_height);
pango_layout_set_text(big_layout, label_string, -1);
pango_layout_get_pixel_size(big_layout, &label_width, &label_height);
#endif
if (start_arrow<end_arrow){
arrow_width = end_arrow-start_arrow;
label_x = arrow_width/2+start_arrow;
}
else {
arrow_width = start_arrow-end_arrow;
label_x = arrow_width/2+end_arrow;
}
if (label_width>arrow_width) arrow_width = label_width;
if (left_x_border > (label_x-label_width/2)) label_x = left_x_border + label_width/2;
if ((user_data->dlg.pixmap_width - right_x_border) < (label_x+label_width/2)) label_x = user_data->dlg.pixmap_width - right_x_border - label_width/2;
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
big_font,
user_data->dlg.draw_area->style->black_gc,
label_x - label_width/2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2+label_height/4-3,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
user_data->dlg.draw_area->style->black_gc,
label_x - label_width/2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2-3,
big_layout);
#endif
/* draw the source port number */
if ((start_arrow != left_x_border) && (start_arrow != (user_data->dlg.pixmap_width - right_x_border))){
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_src);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(small_font, label_string);
label_height=gdk_string_height(small_font, label_string);
#else
pango_layout_set_text(small_layout, label_string, -1);
pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
#endif
if (start_arrow<end_arrow){
src_port_x = start_arrow - label_width - 2;
}
else {
src_port_x = start_arrow + 2;
}
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
small_font,
user_data->dlg.div_line_gc,
src_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2+label_height/4-2,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
user_data->dlg.div_line_gc,
src_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2,
small_layout);
#endif
}
/* draw the destination port number */
if ((end_arrow != left_x_border) && (end_arrow != (user_data->dlg.pixmap_width - right_x_border))){
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_dst);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(small_font, label_string);
label_height=gdk_string_height(small_font, label_string);
#else
pango_layout_set_text(small_layout, label_string, -1);
pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
#endif
if (start_arrow<end_arrow){
dst_port_x = end_arrow + 2;
}
else {
dst_port_x = end_arrow - label_width - 2;
}
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
small_font,
user_data->dlg.div_line_gc,
dst_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2+label_height/4-2,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
user_data->dlg.div_line_gc,
dst_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2,
small_layout);
#endif
}
if (start_arrow<end_arrow){
arrow_width = end_arrow-start_arrow;
label_x = arrow_width/2+start_arrow;
}
else {
arrow_width = start_arrow-end_arrow;
label_x = arrow_width/2+end_arrow;
}
if (label_width>arrow_width) arrow_width = label_width;
if ((int)left_x_border > ((int)label_x-(int)label_width/2))
label_x = left_x_border + label_width/2;
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
big_font,
frame_fg_color,
label_x - label_width/2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2+label_height/4-3,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
frame_fg_color,
label_x - label_width/2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2-3,
big_layout);
#endif
/* draw the source port number */
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_src);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(small_font, label_string);
label_height=gdk_string_height(small_font, label_string);
#else
pango_layout_set_text(small_layout, label_string, -1);
pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
#endif
if (start_arrow<end_arrow){
src_port_x = start_arrow - label_width - 2;
}
else {
src_port_x = start_arrow + 2;
}
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
small_font,
div_line_color,
src_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2+label_height/4-2,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
div_line_color,
src_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2,
small_layout);
#endif
/* draw the destination port number */
g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_dst);
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(small_font, label_string);
label_height=gdk_string_height(small_font, label_string);
#else
pango_layout_set_text(small_layout, label_string, -1);
pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
#endif
if (start_arrow<end_arrow){
dst_port_x = end_arrow + 2;
}
else {
dst_port_x = end_arrow - label_width - 2;
}
#if GTK_MAJOR_VERSION < 2
gdk_draw_string(user_data->dlg.pixmap,
small_font,
div_line_color,
dst_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2+label_height/4-2,
label_string);
#else
gdk_draw_layout(user_data->dlg.pixmap,
div_line_color,
dst_port_x,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2,
small_layout);
#endif
/* draw the div line of the selected item with soft gray*/
if ( current_item+first_item == user_data->dlg.selected_item )
for (i=0; i<user_data->num_nodes; i++){
gdk_draw_line(user_data->dlg.pixmap, user_data->dlg.div_line_gc[1],
left_x_border+NODE_WIDTH/2+NODE_WIDTH*i,
(user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER,
left_x_border+NODE_WIDTH/2+NODE_WIDTH*i,
(user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER+ITEM_HEIGHT);
}
}
#if GTK_MAJOR_VERSION >= 2
g_object_unref(G_OBJECT(layout));
#endif
/* draw the border on the selected item */
if ( (user_data->dlg.selected_item != 0xFFFFFFFF) && ( (user_data->dlg.selected_item>=first_item) && (user_data->dlg.selected_item<=last_item) )){
gdk_draw_rectangle(user_data->dlg.pixmap, user_data->dlg.draw_area->style->black_gc,
FALSE,
left_x_border-1,
(user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER,
user_data->dlg.pixmap_width-left_x_border-right_x_border+1,
ITEM_HEIGHT);
}
/* refresh the draw areas */
gdk_draw_pixmap(user_data->dlg.draw_area_time->window,
user_data->dlg.draw_area_time->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.draw_area_time)],
user_data->dlg.pixmap_time,
0, 0,
0, 0,
user_data->dlg.draw_area_time->allocation.width, user_data->dlg.draw_area_time->allocation.height);
gdk_draw_pixmap(user_data->dlg.draw_area->window,
user_data->dlg.draw_area->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.draw_area)],
user_data->dlg.pixmap,
0, 0,
0, 0,
user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
user_data->dlg.draw_area->allocation.width, user_data->dlg.draw_area->allocation.height);
gdk_draw_pixmap(user_data->dlg.draw_area_comments->window,
user_data->dlg.draw_area_comments->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.draw_area_comments)],
user_data->dlg.pixmap_comments,
0, 0,
0, 0,
COMMENT_WIDTH, user_data->dlg.pixmap_height);
/* update the h_scrollbar */
user_data->dlg.h_scrollbar_adjustment->upper=(gfloat) user_data->num_nodes-1;
user_data->dlg.h_scrollbar_adjustment->step_increment=1;
user_data->dlg.h_scrollbar_adjustment->page_increment=(gfloat) (last_node-first_node);
user_data->dlg.h_scrollbar_adjustment->page_size=(gfloat) (last_node-first_node);
user_data->dlg.h_scrollbar_adjustment->value=(gfloat) first_node;
gtk_adjustment_changed(user_data->dlg.h_scrollbar_adjustment);
gtk_adjustment_value_changed(user_data->dlg.h_scrollbar_adjustment);
user_data->dlg.draw_area_comments->allocation.width, user_data->dlg.draw_area_comments->allocation.height);
/* update the v_scrollbar */
user_data->dlg.v_scrollbar_adjustment->upper=(gfloat) user_data->num_items-1;
@ -1115,14 +1153,11 @@ static gint key_press_event(GtkWidget *widget, GdkEventKey *event _U_)
} else if (event->keyval == GDK_Left){
if (user_data->dlg.first_node == 0) return TRUE;
user_data->dlg.first_node--;
} else if (event->keyval == GDK_Right){
if ((user_data->dlg.first_node+user_data->dlg.h_scrollbar_adjustment->page_size+1 == user_data->num_nodes)) return TRUE;
user_data->dlg.first_node++;
} else return TRUE;
user_data->dlg.needs_redraw=TRUE;
dialog_graph_draw(user_data);
cf_goto_frame(&cfile, user_data->dlg.items[user_data->dlg.selected_item-user_data->dlg.first_item].frame_num);
return TRUE;
@ -1170,26 +1205,52 @@ static gint expose_event_comments(GtkWidget *widget, GdkEventExpose *event)
return FALSE;
}
static const GdkColor COLOR_GRAY = {0, 0x7fff, 0x7fff, 0x7fff};
/****************************************************************************/
static gint expose_event_time(GtkWidget *widget, GdkEventExpose *event)
{
graph_analysis_data_t *user_data;
user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
if(!user_data){
exit(10);
}
gdk_draw_pixmap(widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
user_data->dlg.pixmap_time,
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
return FALSE;
}
/****************************************************************************/
static gint configure_event(GtkWidget *widget, GdkEventConfigure *event _U_)
{
graph_analysis_data_t *user_data;
int i;
GdkColor color_div_line = COLOR_GRAY;
static GdkColor col[MAX_NUM_COL_CONV] = {
{0, 0x00FF, 0xFFFF, 0x00FF},
{0, 0xFFFF, 0xFFFF, 0x00FF},
{0, 0xFFFF, 0x00FF, 0x00FF},
{0, 0xFFFF, 0x00FF, 0xFFFF},
/* gray and soft gray colors */
static GdkColor color_div_line[2] = {
{0, 0x64ff, 0x64ff, 0x64ff},
{0, 0x7fff, 0x7fff, 0x7fff}
};
/* the first calor is blue to highlight the selected item */
static GdkColor col[MAX_NUM_COL_CONV+1] = {
{0, 0x00FF, 0x00FF, 0xFFFF},
{0, 0x00FF, 0xFFFF, 0xFFFF},
{0, 0xFFFF, 0x80FF, 0x00FF},
{0, 0x80FF, 0x00FF, 0xFFFF},
{0, 0x00FF, 0x80FF, 0xFFFF},
{0, 0xFFFF, 0x00FF, 0x80FF}
{0, 0x33FF, 0xFFFF, 0x33FF},
{0, 0x00FF, 0xCCFF, 0xCCFF},
{0, 0x66FF, 0xFFFF, 0xFFFF},
{0, 0x99FF, 0x66FF, 0xFFFF},
{0, 0xFFFF, 0xFFFF, 0x33FF},
{0, 0xCCFF, 0x99FF, 0xFFFF},
{0, 0xCCFF, 0xFFFF, 0x33FF},
{0, 0xFFFF, 0xCCFF, 0xCCFF},
{0, 0xFFFF, 0x99FF, 0x66FF},
{0, 0xFFFF, 0xFFFF, 0x99FF}
};
user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
@ -1207,7 +1268,6 @@ static gint configure_event(GtkWidget *widget, GdkEventConfigure *event _U_)
widget->allocation.width,
widget->allocation.height,
-1);
user_data->dlg.pixmap_width=widget->allocation.width;
user_data->dlg.pixmap_height=widget->allocation.height;
gdk_draw_rectangle(user_data->dlg.pixmap,
@ -1218,21 +1278,22 @@ static gint configure_event(GtkWidget *widget, GdkEventConfigure *event _U_)
widget->allocation.height);
/* create gc for division lines and set the line stype to dash*/
user_data->dlg.div_line_gc=gdk_gc_new(user_data->dlg.pixmap);
gdk_gc_set_line_attributes(user_data->dlg.div_line_gc, 1, GDK_LINE_ON_OFF_DASH, 0, 0);
for (i=0; i<2; i++){
user_data->dlg.div_line_gc[i]=gdk_gc_new(user_data->dlg.pixmap);
gdk_gc_set_line_attributes(user_data->dlg.div_line_gc[i], 1, GDK_LINE_ON_OFF_DASH, 0, 0);
#if GTK_MAJOR_VERSION < 2
colormap = gtk_widget_get_colormap (widget);
if (!gdk_color_alloc (colormap, &color_div_line)){
g_warning ("Couldn't allocate color");
}
gdk_gc_set_foreground(user_data->dlg.div_line_gc, &color_div_line);
colormap = gtk_widget_get_colormap (widget);
if (!gdk_color_alloc (colormap, &color_div_line[i])){
g_warning ("Couldn't allocate color");
}
gdk_gc_set_foreground(user_data->dlg.div_line_gc[i], &color_div_line[i]);
#else
gdk_gc_set_rgb_fg_color(user_data->dlg.div_line_gc, &color_div_line);
gdk_gc_set_rgb_fg_color(user_data->dlg.div_line_gc[i], &color_div_line[i]);
#endif
/* create gcs for the background items */
}
for (i=0; i<MAX_NUM_COL_CONV; i++){
/* create gcs for the background items */
for (i=0; i<MAX_NUM_COL_CONV+1; i++){
user_data->dlg.bg_gc[i]=gdk_gc_new(user_data->dlg.pixmap);
#if GTK_MAJOR_VERSION < 2
colormap = gtk_widget_get_colormap (widget);
@ -1245,7 +1306,7 @@ static gint configure_event(GtkWidget *widget, GdkEventConfigure *event _U_)
#endif
}
dialog_graph_redraw(user_data);
dialog_graph_redraw(user_data);
return TRUE;
}
@ -1266,7 +1327,7 @@ static gint configure_event_comments(GtkWidget *widget, GdkEventConfigure *event
}
user_data->dlg.pixmap_comments=gdk_pixmap_new(widget->window,
COMMENT_WIDTH,
widget->allocation.width,
widget->allocation.height,
-1);
@ -1274,7 +1335,7 @@ static gint configure_event_comments(GtkWidget *widget, GdkEventConfigure *event
widget->style->white_gc,
TRUE,
0, 0,
COMMENT_WIDTH,
widget->allocation.width,
widget->allocation.height);
dialog_graph_redraw(user_data);
@ -1282,21 +1343,59 @@ static gint configure_event_comments(GtkWidget *widget, GdkEventConfigure *event
}
/****************************************************************************/
static gint h_scrollbar_changed(GtkWidget *widget _U_, gpointer data)
static gint configure_event_time(GtkWidget *widget, GdkEventConfigure *event _U_)
{
graph_analysis_data_t *user_data=(graph_analysis_data_t *)data;
graph_analysis_data_t *user_data;
if ((user_data->dlg.first_node+user_data->dlg.h_scrollbar_adjustment->page_size+1 == user_data->num_nodes)
&& (user_data->dlg.h_scrollbar_adjustment->value >= user_data->dlg.first_node ))
return TRUE;
user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
if (user_data->dlg.first_node == (guint16) user_data->dlg.h_scrollbar_adjustment->value)
return TRUE;
if(!user_data){
exit(10);
}
user_data->dlg.first_node = (guint16) user_data->dlg.h_scrollbar_adjustment->value;
if(user_data->dlg.pixmap_time){
gdk_pixmap_unref(user_data->dlg.pixmap_time);
user_data->dlg.pixmap_time=NULL;
}
dialog_graph_redraw(user_data);
return TRUE;
user_data->dlg.pixmap_time=gdk_pixmap_new(widget->window,
widget->allocation.width,
widget->allocation.height,
-1);
gdk_draw_rectangle(user_data->dlg.pixmap_time,
widget->style->white_gc,
TRUE,
0, 0,
widget->allocation.width,
widget->allocation.height);
dialog_graph_redraw(user_data);
return TRUE;
}
/****************************************************************************/
static gint pane_callback(GtkWidget *widget, GParamSpec *pspec, gpointer data)
{
graph_analysis_data_t *user_data=(graph_analysis_data_t *)data;
if(!user_data){
exit(10);
}
#if GTK_MAJOR_VERSION >= 2
if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) > user_data->dlg.pixmap_width)
gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), user_data->dlg.pixmap_width);
else if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) < NODE_WIDTH*2)
gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), NODE_WIDTH*2);
#endif
/* repaint the comment area because when moving the pane position thre are times that the expose_event_comments is not called */
gdk_draw_pixmap(user_data->dlg.draw_area_comments->window,
user_data->dlg.draw_area_comments->style->fg_gc[GTK_WIDGET_STATE(widget)],
user_data->dlg.pixmap_comments,
0,0,
0,0,
user_data->dlg.draw_area_comments->allocation.width,
user_data->dlg.draw_area_comments->allocation.height);
return TRUE;
}
/****************************************************************************/
@ -1323,6 +1422,9 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box)
GtkWidget *hbox;
GtkWidget *scroll_window;
GtkWidget *viewport;
GtkWidget *scroll_window_comments;
GtkWidget *viewport_comments;
GValue value = { 0, };
hbox=gtk_hbox_new(FALSE, 0);
gtk_widget_show(hbox);
@ -1330,35 +1432,54 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box)
vbox=gtk_vbox_new(FALSE, 0);
gtk_widget_show(vbox);
/* create "time" draw area */
user_data->dlg.draw_area_time=gtk_drawing_area_new();
WIDGET_SET_SIZE(user_data->dlg.draw_area_time, TIME_WIDTH, user_data->dlg.pixmap_height);
OBJECT_SET_DATA(user_data->dlg.draw_area_time, "graph_analysis_data_t", user_data);
/* create "comments" draw area */
user_data->dlg.draw_area_comments=gtk_drawing_area_new();
WIDGET_SET_SIZE(user_data->dlg.draw_area_comments, COMMENT_WIDTH, user_data->dlg.pixmap_height);
scroll_window=gtk_scrolled_window_new(NULL, NULL);
WIDGET_SET_SIZE(scroll_window, COMMENT_WIDTH/2, user_data->dlg.pixmap_height);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
viewport = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll_window)));
gtk_container_add(GTK_CONTAINER(viewport), user_data->dlg.draw_area_comments);
gtk_container_add(GTK_CONTAINER(scroll_window), viewport);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
scroll_window_comments=gtk_scrolled_window_new(NULL, NULL);
WIDGET_SET_SIZE(scroll_window_comments, COMMENT_WIDTH/2, user_data->dlg.pixmap_height);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window_comments), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
viewport_comments = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window_comments)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll_window_comments)));
gtk_container_add(GTK_CONTAINER(viewport_comments), user_data->dlg.draw_area_comments);
gtk_container_add(GTK_CONTAINER(scroll_window_comments), viewport_comments);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport_comments), GTK_SHADOW_NONE);
OBJECT_SET_DATA(user_data->dlg.draw_area_comments, "graph_analysis_data_t", user_data);
gtk_widget_add_events (user_data->dlg.draw_area_comments, GDK_BUTTON_PRESS_MASK);
#if GTK_MAJOR_VERSION >= 2
SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "scroll_event", scroll_event, user_data);
#endif
/* create main Graph draw area */
user_data->dlg.draw_area=gtk_drawing_area_new();
user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH;
WIDGET_SET_SIZE(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
scroll_window=gtk_scrolled_window_new(NULL, NULL);
WIDGET_SET_SIZE(scroll_window, NODE_WIDTH*2, user_data->dlg.pixmap_height);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
viewport = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll_window)));
gtk_container_add(GTK_CONTAINER(viewport), user_data->dlg.draw_area);
gtk_container_add(GTK_CONTAINER(scroll_window), viewport);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
OBJECT_SET_DATA(user_data->dlg.draw_area, "graph_analysis_data_t", user_data);
GTK_WIDGET_SET_FLAGS(user_data->dlg.draw_area, GTK_CAN_FOCUS);
gtk_widget_grab_focus(user_data->dlg.draw_area);
OBJECT_SET_DATA(user_data->dlg.draw_area, "graph_analysis_data_t", user_data);
WIDGET_SET_SIZE(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
/* signals needed to handle backing pixmap */
SIGNAL_CONNECT(user_data->dlg.draw_area, "expose_event", expose_event, NULL);
SIGNAL_CONNECT(user_data->dlg.draw_area, "configure_event", configure_event, user_data);
/* signals needed to handle backing pixmap comments*/
SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "expose_event", expose_event_comments, NULL);
SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "configure_event", configure_event_comments, user_data);
/* signals needed to handle backing pixmap time*/
SIGNAL_CONNECT(user_data->dlg.draw_area_time, "expose_event", expose_event_time, NULL);
SIGNAL_CONNECT(user_data->dlg.draw_area_time, "configure_event", configure_event_time, user_data);
gtk_widget_add_events (user_data->dlg.draw_area, GDK_BUTTON_PRESS_MASK);
SIGNAL_CONNECT(user_data->dlg.draw_area, "button_press_event", button_press_event, user_data);
#if GTK_MAJOR_VERSION >= 2
@ -1366,31 +1487,39 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box)
#endif
SIGNAL_CONNECT(user_data->dlg.draw_area, "key_press_event", key_press_event, user_data);
gtk_widget_show(user_data->dlg.draw_area_time);
gtk_widget_show(user_data->dlg.draw_area);
gtk_widget_show(user_data->dlg.draw_area_comments);
gtk_widget_show(viewport);
gtk_widget_show(user_data->dlg.draw_area_comments);
gtk_widget_show(viewport_comments);
gtk_box_pack_start(GTK_BOX(vbox), user_data->dlg.draw_area, TRUE, TRUE, 0);
gtk_widget_show(scroll_window);
gtk_widget_show(scroll_window_comments);
/* create the associated h_scrollbar */
user_data->dlg.h_scrollbar_adjustment=(GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
user_data->dlg.h_scrollbar=gtk_hscrollbar_new(user_data->dlg.h_scrollbar_adjustment);
gtk_widget_show(user_data->dlg.h_scrollbar);
gtk_box_pack_end(GTK_BOX(vbox), user_data->dlg.h_scrollbar, FALSE, FALSE, 0);
SIGNAL_CONNECT(user_data->dlg.h_scrollbar_adjustment, "value_changed", h_scrollbar_changed, user_data);
gtk_box_pack_start(GTK_BOX(hbox), user_data->dlg.draw_area_time, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
user_data->dlg.hpane = gtk_hpaned_new();
gtk_paned_pack1(GTK_PANED (user_data->dlg.hpane), scroll_window, TRUE, TRUE);
gtk_paned_pack2(GTK_PANED (user_data->dlg.hpane), scroll_window_comments, FALSE, TRUE);
gtk_box_pack_start(GTK_BOX(hbox), scroll_window, FALSE, FALSE, 0);
SIGNAL_CONNECT(user_data->dlg.hpane, "notify::position", pane_callback, user_data);
gtk_widget_show(user_data->dlg.hpane);
gtk_box_pack_start(GTK_BOX(hbox), user_data->dlg.hpane, TRUE, TRUE, 0);
#if GTK_MAJOR_VERSION >= 2
gtk_container_child_get_property(GTK_CONTAINER(user_data->dlg.hpane), scroll_window, "resize", &value);
#endif
/* create the associated v_scrollbar */
user_data->dlg.v_scrollbar_adjustment=(GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
user_data->dlg.v_scrollbar_adjustment=(GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
user_data->dlg.v_scrollbar=gtk_vscrollbar_new(user_data->dlg.v_scrollbar_adjustment);
gtk_widget_show(user_data->dlg.v_scrollbar);
gtk_box_pack_end(GTK_BOX(hbox), user_data->dlg.v_scrollbar, FALSE, FALSE, 0);
SIGNAL_CONNECT(user_data->dlg.v_scrollbar_adjustment, "value_changed", v_scrollbar_changed, user_data);
gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0);
}

View File

@ -83,16 +83,17 @@ typedef struct _dialog_data_t {
GtkWidget *window;
gboolean needs_redraw;
gint selected_row;
GtkWidget *draw_area_time;
GtkWidget *draw_area;
GtkWidget *draw_area_comments;
GdkPixmap *pixmap_time;
GdkPixmap *pixmap;
GdkPixmap *pixmap_comments;
GtkAdjustment *h_scrollbar_adjustment;
GtkWidget *h_scrollbar;
GtkWidget *v_scrollbar;
GtkAdjustment *v_scrollbar_adjustment;
GdkGC *div_line_gc;
GdkGC *bg_gc[MAX_NUM_COL_CONV];
GtkWidget *hpane;
GdkGC *div_line_gc[2];
GdkGC *bg_gc[MAX_NUM_COL_CONV+1];
int pixmap_width;
int pixmap_height;
guint16 first_node; /* the first node on the left to show in the screen */