From 77df46c366a3b761288db21b2593e963c4590207 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Sat, 20 Nov 1999 23:37:37 +0000 Subject: Compute width, keep track of it. (ethi_add_table_header): Monitor changes 1999-11-20 Miguel de Icaza * e-table-header-item.c (ethi_set_arg): Compute width, keep track of it. (ethi_add_table_header): Monitor changes to the Header model; Queue updates. (ethi_draw): Fix the redraw logic here. * table-test.c (main): Change the sample code, so we can better debug this. * e-table-item.c (eti_header_structure_changed): Keep track of width; (eti_header_dim_changed): ditto. (eti_draw): Many redraw fixes. svn path=/trunk/; revision=1425 --- widgets/ChangeLog | 16 +++++++++ widgets/e-table-header-item.c | 65 +++++++++++++++++++++++++++++++---- widgets/e-table-header-item.h | 7 +++- widgets/e-table-item.c | 64 +++++++++++++++++++++++++++------- widgets/e-table-item.h | 2 +- widgets/e-table/ChangeLog | 16 +++++++++ widgets/e-table/e-table-header-item.c | 65 +++++++++++++++++++++++++++++++---- widgets/e-table/e-table-header-item.h | 7 +++- widgets/e-table/e-table-item.c | 64 +++++++++++++++++++++++++++------- widgets/e-table/e-table-item.h | 2 +- widgets/e-table/table-test.c | 15 +++----- widgets/table-test.c | 15 +++----- widgets/table/e-table-header-item.c | 65 +++++++++++++++++++++++++++++++---- widgets/table/e-table-header-item.h | 7 +++- widgets/table/e-table-item.c | 64 +++++++++++++++++++++++++++------- widgets/table/e-table-item.h | 2 +- widgets/table/table-test.c | 15 +++----- 17 files changed, 395 insertions(+), 96 deletions(-) (limited to 'widgets') diff --git a/widgets/ChangeLog b/widgets/ChangeLog index c77c3b22dd..107b2ee4a8 100644 --- a/widgets/ChangeLog +++ b/widgets/ChangeLog @@ -1,3 +1,19 @@ +1999-11-20 Miguel de Icaza + + * e-table-header-item.c (ethi_set_arg): Compute width, keep track + of it. + (ethi_add_table_header): Monitor changes to the Header model; + Queue updates. + (ethi_draw): Fix the redraw logic here. + + * table-test.c (main): Change the sample code, so we can better + debug this. + + * e-table-item.c (eti_header_structure_changed): Keep track of + width; + (eti_header_dim_changed): ditto. + (eti_draw): Many redraw fixes. + 1999-11-19 Miguel de Icaza * e-table-item.c (eti_realize): Hook up; Load gcs. diff --git a/widgets/e-table-header-item.c b/widgets/e-table-header-item.c index b46f8511b0..dab5d3d71d 100644 --- a/widgets/e-table-header-item.c +++ b/widgets/e-table-header-item.c @@ -52,8 +52,8 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags item->x1 = ethi->x1; item->y1 = ethi->y1; - item->x2 = INT_MAX; - item->y2 = ethi->x1 + ethi->height; + item->x2 = ethi->x1 + ethi->width; + item->y2 = ethi->y1 + ethi->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -71,6 +71,54 @@ ethi_font_load (ETableHeaderItem *ethi, char *font) ethi->height = ethi->font->ascent + ethi->font->descent + PADDING; } +static void +ethi_drop_table_header (ETableHeaderItem *ethi) +{ + GtkObject *header; + + if (!ethi->eth) + return; + + header = GTK_OBJECT (ethi->eth); + gtk_signal_disconnect (header, ethi->structure_change_id); + gtk_signal_disconnect (header, ethi->dimension_change_id); + + gtk_object_unref (header); + ethi->eth = NULL; + ethi->width = 0; +} + +static void +structure_changed (ETableHeader *header, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header) +{ + ethi->eth = header; + gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi->width = e_table_header_total_width (header); + + ethi->structure_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "structure_change", + GTK_SIGNAL_FUNC(structure_changed), ethi); + ethi->dimension_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "dimension_change", + GTK_SIGNAL_FUNC(dimension_changed), ethi); +} + static void ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { @@ -83,8 +131,8 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_TABLE_HEADER: - ethi->eth = GTK_VALUE_POINTER (*arg); - gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi_drop_table_header (ethi); + ethi_add_table_header (ethi, GTK_VALUE_POINTER (*arg)); break; case ARG_TABLE_X: @@ -196,6 +244,9 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid total = 0; x = -x1; + printf ("My coords are: %g %g %g %g\n", + item->x1, item->y1, item->x2, item->y2); + for (col = 0; col < cols; col++){ ETableCol *ecol = e_table_header_get_column (ethi->eth, col); int col_width; @@ -206,6 +257,7 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid col_width = ecol->width; if (x1 > total + col_width){ + total += col_width; x += col_width; continue; } @@ -217,9 +269,10 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid draw_button (ethi, ecol, drawable, gc, GTK_WIDGET (canvas)->style, - x, -y1, col_width, ethi->height); + x, ethi->y1 - y1, col_width, ethi->height); x += col_width; + total += col_width; } } @@ -292,7 +345,7 @@ ethi_request_redraw (ETableHeaderItem *ethi) * request a redraw */ gnome_canvas_request_redraw ( - canvas, ethi->x1, ethi->y1, INT_MAX, ethi->x1 + ethi->height); + canvas, ethi->x1, ethi->y1, ethi->x1 + ethi->width, ethi->x1 + ethi->height); } static void diff --git a/widgets/e-table-header-item.h b/widgets/e-table-header-item.h index 45e8f8851d..d6b7d64a9f 100644 --- a/widgets/e-table-header-item.h +++ b/widgets/e-table-header-item.h @@ -17,7 +17,7 @@ typedef struct { GdkGC *gc; GdkCursor *change_cursor, *normal_cursor; - short x1, y1, height; + short x1, y1, height, width; GdkFont *font; /* @@ -27,6 +27,11 @@ typedef struct { int resize_width; int resize_start_pos; GtkObject *resize_guide; + + /* + * Ids + */ + int structure_change_id, dimension_change_id; } ETableHeaderItem; typedef struct { diff --git a/widgets/e-table-item.c b/widgets/e-table-item.c index 8f7fa73725..7ddfc10405 100644 --- a/widgets/e-table-item.c +++ b/widgets/e-table-item.c @@ -31,8 +31,8 @@ eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) item->x1 = eti->x1; item->y1 = eti->y1; - item->x2 = INT_MAX; - item->y2 = eti->x1 + eti->height; + item->x2 = eti->x1 + eti->width; + item->y2 = eti->y1 + eti->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -85,16 +85,30 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) GTK_SIGNAL_FUNC (eti_table_model_changed), eti); } +static void +eti_request_redraw (ETableItem *eti) +{ + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + + gnome_canvas_request_redraw (canvas, eti->x1, eti->y1, eti->x1 + eti->width, eti->y1 + eti->height); +} + static void eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti) { - printf ("NOTIFY: Dimension changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void eti_header_structure_changed (ETableHeader *eth, ETableItem *eti) { - printf ("NOTIFY: Structure changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void @@ -104,6 +118,8 @@ eti_add_header_model (ETableItem *eti, ETableHeader *header) eti->header = header; gtk_object_ref (GTK_OBJECT (header)); + + eti->width = e_table_header_total_width (header); eti->header_dim_change_id = gtk_signal_connect ( GTK_OBJECT (header), "dimension_change", @@ -203,7 +219,17 @@ static void draw_cell (ETableItem *eti, GdkDrawable *drawable, int col, int row, int x1, int y1, int x2, int y2) { - gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2-x1, y2-y1); + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + GdkFont *font; + char text [40]; + + font = GTK_WIDGET (canvas)->style->font; + + sprintf (text, "%d:%d\n", col, row); + gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2, y2); + gdk_draw_line (drawable, eti->grid_gc, x1, y2, x2, y1); + + gdk_draw_text (drawable, font, eti->grid_gc, x1, y2, text, strlen (text)); } static void @@ -215,19 +241,20 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int row, col, y1, y2; int first_col, last_col, x_offset; int x1, x2; - + /* * Clear the background */ gdk_draw_rectangle ( - drawable, eti->fill_gc, TRUE, 0, 0, width, height); - + drawable, eti->fill_gc, TRUE, + eti->x1 - x, eti->y1 - y, eti->width, eti->height); + /* * First column to draw, last column to draw */ - x1 = x_offset = 0; first_col = -1; - last_col = 0; + last_col = x_offset = 0; + x1 = eti->x1; for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -238,17 +265,26 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (x2 < x) continue; if (first_col == -1){ - x_offset = x - x1; + x_offset = x1 - x; first_col = col; } } last_col = col; + /* + * Nothing to paint + */ + if (first_col == -1) + return; + + printf ("Cols %d %d\n", first_col, last_col); /* * Draw individual lines */ - y1 = y2 = 0; + y1 = y2 = eti->y1; for (row = eti->top_item; row < rows; row++, y1 = y2){ + int xd; + y2 += e_table_model_row_height (eti->table_model, row) + 1; if (y1 > y + height) @@ -260,10 +296,12 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line (drawable, eti->grid_gc, 0, y - y2, width, y - y2); + xd = x_offset; for (col = first_col; col < last_col; col++){ ETableCol *ecol = e_table_header_get_column (eti->header, col); - draw_cell (eti, drawable, col, row, x_offset, y1 - y, x_offset + ecol->width, y2); + draw_cell (eti, drawable, col, row, xd, y1 - y, xd + ecol->width, y2); + xd += ecol->width; } } } diff --git a/widgets/e-table-item.h b/widgets/e-table-item.h index 55893bb9ae..7e548cf49d 100644 --- a/widgets/e-table-item.h +++ b/widgets/e-table-item.h @@ -17,7 +17,7 @@ typedef struct { ETableHeader *header; int x1, y1; - int height; + int width, height; int top_item; diff --git a/widgets/e-table/ChangeLog b/widgets/e-table/ChangeLog index c77c3b22dd..107b2ee4a8 100644 --- a/widgets/e-table/ChangeLog +++ b/widgets/e-table/ChangeLog @@ -1,3 +1,19 @@ +1999-11-20 Miguel de Icaza + + * e-table-header-item.c (ethi_set_arg): Compute width, keep track + of it. + (ethi_add_table_header): Monitor changes to the Header model; + Queue updates. + (ethi_draw): Fix the redraw logic here. + + * table-test.c (main): Change the sample code, so we can better + debug this. + + * e-table-item.c (eti_header_structure_changed): Keep track of + width; + (eti_header_dim_changed): ditto. + (eti_draw): Many redraw fixes. + 1999-11-19 Miguel de Icaza * e-table-item.c (eti_realize): Hook up; Load gcs. diff --git a/widgets/e-table/e-table-header-item.c b/widgets/e-table/e-table-header-item.c index b46f8511b0..dab5d3d71d 100644 --- a/widgets/e-table/e-table-header-item.c +++ b/widgets/e-table/e-table-header-item.c @@ -52,8 +52,8 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags item->x1 = ethi->x1; item->y1 = ethi->y1; - item->x2 = INT_MAX; - item->y2 = ethi->x1 + ethi->height; + item->x2 = ethi->x1 + ethi->width; + item->y2 = ethi->y1 + ethi->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -71,6 +71,54 @@ ethi_font_load (ETableHeaderItem *ethi, char *font) ethi->height = ethi->font->ascent + ethi->font->descent + PADDING; } +static void +ethi_drop_table_header (ETableHeaderItem *ethi) +{ + GtkObject *header; + + if (!ethi->eth) + return; + + header = GTK_OBJECT (ethi->eth); + gtk_signal_disconnect (header, ethi->structure_change_id); + gtk_signal_disconnect (header, ethi->dimension_change_id); + + gtk_object_unref (header); + ethi->eth = NULL; + ethi->width = 0; +} + +static void +structure_changed (ETableHeader *header, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header) +{ + ethi->eth = header; + gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi->width = e_table_header_total_width (header); + + ethi->structure_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "structure_change", + GTK_SIGNAL_FUNC(structure_changed), ethi); + ethi->dimension_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "dimension_change", + GTK_SIGNAL_FUNC(dimension_changed), ethi); +} + static void ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { @@ -83,8 +131,8 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_TABLE_HEADER: - ethi->eth = GTK_VALUE_POINTER (*arg); - gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi_drop_table_header (ethi); + ethi_add_table_header (ethi, GTK_VALUE_POINTER (*arg)); break; case ARG_TABLE_X: @@ -196,6 +244,9 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid total = 0; x = -x1; + printf ("My coords are: %g %g %g %g\n", + item->x1, item->y1, item->x2, item->y2); + for (col = 0; col < cols; col++){ ETableCol *ecol = e_table_header_get_column (ethi->eth, col); int col_width; @@ -206,6 +257,7 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid col_width = ecol->width; if (x1 > total + col_width){ + total += col_width; x += col_width; continue; } @@ -217,9 +269,10 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid draw_button (ethi, ecol, drawable, gc, GTK_WIDGET (canvas)->style, - x, -y1, col_width, ethi->height); + x, ethi->y1 - y1, col_width, ethi->height); x += col_width; + total += col_width; } } @@ -292,7 +345,7 @@ ethi_request_redraw (ETableHeaderItem *ethi) * request a redraw */ gnome_canvas_request_redraw ( - canvas, ethi->x1, ethi->y1, INT_MAX, ethi->x1 + ethi->height); + canvas, ethi->x1, ethi->y1, ethi->x1 + ethi->width, ethi->x1 + ethi->height); } static void diff --git a/widgets/e-table/e-table-header-item.h b/widgets/e-table/e-table-header-item.h index 45e8f8851d..d6b7d64a9f 100644 --- a/widgets/e-table/e-table-header-item.h +++ b/widgets/e-table/e-table-header-item.h @@ -17,7 +17,7 @@ typedef struct { GdkGC *gc; GdkCursor *change_cursor, *normal_cursor; - short x1, y1, height; + short x1, y1, height, width; GdkFont *font; /* @@ -27,6 +27,11 @@ typedef struct { int resize_width; int resize_start_pos; GtkObject *resize_guide; + + /* + * Ids + */ + int structure_change_id, dimension_change_id; } ETableHeaderItem; typedef struct { diff --git a/widgets/e-table/e-table-item.c b/widgets/e-table/e-table-item.c index 8f7fa73725..7ddfc10405 100644 --- a/widgets/e-table/e-table-item.c +++ b/widgets/e-table/e-table-item.c @@ -31,8 +31,8 @@ eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) item->x1 = eti->x1; item->y1 = eti->y1; - item->x2 = INT_MAX; - item->y2 = eti->x1 + eti->height; + item->x2 = eti->x1 + eti->width; + item->y2 = eti->y1 + eti->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -85,16 +85,30 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) GTK_SIGNAL_FUNC (eti_table_model_changed), eti); } +static void +eti_request_redraw (ETableItem *eti) +{ + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + + gnome_canvas_request_redraw (canvas, eti->x1, eti->y1, eti->x1 + eti->width, eti->y1 + eti->height); +} + static void eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti) { - printf ("NOTIFY: Dimension changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void eti_header_structure_changed (ETableHeader *eth, ETableItem *eti) { - printf ("NOTIFY: Structure changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void @@ -104,6 +118,8 @@ eti_add_header_model (ETableItem *eti, ETableHeader *header) eti->header = header; gtk_object_ref (GTK_OBJECT (header)); + + eti->width = e_table_header_total_width (header); eti->header_dim_change_id = gtk_signal_connect ( GTK_OBJECT (header), "dimension_change", @@ -203,7 +219,17 @@ static void draw_cell (ETableItem *eti, GdkDrawable *drawable, int col, int row, int x1, int y1, int x2, int y2) { - gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2-x1, y2-y1); + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + GdkFont *font; + char text [40]; + + font = GTK_WIDGET (canvas)->style->font; + + sprintf (text, "%d:%d\n", col, row); + gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2, y2); + gdk_draw_line (drawable, eti->grid_gc, x1, y2, x2, y1); + + gdk_draw_text (drawable, font, eti->grid_gc, x1, y2, text, strlen (text)); } static void @@ -215,19 +241,20 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int row, col, y1, y2; int first_col, last_col, x_offset; int x1, x2; - + /* * Clear the background */ gdk_draw_rectangle ( - drawable, eti->fill_gc, TRUE, 0, 0, width, height); - + drawable, eti->fill_gc, TRUE, + eti->x1 - x, eti->y1 - y, eti->width, eti->height); + /* * First column to draw, last column to draw */ - x1 = x_offset = 0; first_col = -1; - last_col = 0; + last_col = x_offset = 0; + x1 = eti->x1; for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -238,17 +265,26 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (x2 < x) continue; if (first_col == -1){ - x_offset = x - x1; + x_offset = x1 - x; first_col = col; } } last_col = col; + /* + * Nothing to paint + */ + if (first_col == -1) + return; + + printf ("Cols %d %d\n", first_col, last_col); /* * Draw individual lines */ - y1 = y2 = 0; + y1 = y2 = eti->y1; for (row = eti->top_item; row < rows; row++, y1 = y2){ + int xd; + y2 += e_table_model_row_height (eti->table_model, row) + 1; if (y1 > y + height) @@ -260,10 +296,12 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line (drawable, eti->grid_gc, 0, y - y2, width, y - y2); + xd = x_offset; for (col = first_col; col < last_col; col++){ ETableCol *ecol = e_table_header_get_column (eti->header, col); - draw_cell (eti, drawable, col, row, x_offset, y1 - y, x_offset + ecol->width, y2); + draw_cell (eti, drawable, col, row, xd, y1 - y, xd + ecol->width, y2); + xd += ecol->width; } } } diff --git a/widgets/e-table/e-table-item.h b/widgets/e-table/e-table-item.h index 55893bb9ae..7e548cf49d 100644 --- a/widgets/e-table/e-table-item.h +++ b/widgets/e-table/e-table-item.h @@ -17,7 +17,7 @@ typedef struct { ETableHeader *header; int x1, y1; - int height; + int width, height; int top_item; diff --git a/widgets/e-table/table-test.c b/widgets/e-table/table-test.c index 50fa8a7597..54392a73bc 100644 --- a/widgets/e-table/table-test.c +++ b/widgets/e-table/table-test.c @@ -226,15 +226,8 @@ main (int argc, char *argv []) gnome_canvas_root (GNOME_CANVAS (canvas)), e_table_header_item_get_type (), "ETableHeader", e_table_header, - NULL); - gnome_canvas_item_new ( - gnome_canvas_root (GNOME_CANVAS (canvas)), - gnome_canvas_rect_get_type (), - "x1", 0.0, - "y1", 0.0, - "x2", 10.0, - "y2", 10.0, - "fill_color", "red", + "x", 0, + "y", 0, NULL); gnome_canvas_item_new ( @@ -242,8 +235,8 @@ main (int argc, char *argv []) e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 0, - "y", 30, + "x", 10, + "y", 30, NULL); gtk_main (); diff --git a/widgets/table-test.c b/widgets/table-test.c index 50fa8a7597..54392a73bc 100644 --- a/widgets/table-test.c +++ b/widgets/table-test.c @@ -226,15 +226,8 @@ main (int argc, char *argv []) gnome_canvas_root (GNOME_CANVAS (canvas)), e_table_header_item_get_type (), "ETableHeader", e_table_header, - NULL); - gnome_canvas_item_new ( - gnome_canvas_root (GNOME_CANVAS (canvas)), - gnome_canvas_rect_get_type (), - "x1", 0.0, - "y1", 0.0, - "x2", 10.0, - "y2", 10.0, - "fill_color", "red", + "x", 0, + "y", 0, NULL); gnome_canvas_item_new ( @@ -242,8 +235,8 @@ main (int argc, char *argv []) e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 0, - "y", 30, + "x", 10, + "y", 30, NULL); gtk_main (); diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c index b46f8511b0..dab5d3d71d 100644 --- a/widgets/table/e-table-header-item.c +++ b/widgets/table/e-table-header-item.c @@ -52,8 +52,8 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags item->x1 = ethi->x1; item->y1 = ethi->y1; - item->x2 = INT_MAX; - item->y2 = ethi->x1 + ethi->height; + item->x2 = ethi->x1 + ethi->width; + item->y2 = ethi->y1 + ethi->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -71,6 +71,54 @@ ethi_font_load (ETableHeaderItem *ethi, char *font) ethi->height = ethi->font->ascent + ethi->font->descent + PADDING; } +static void +ethi_drop_table_header (ETableHeaderItem *ethi) +{ + GtkObject *header; + + if (!ethi->eth) + return; + + header = GTK_OBJECT (ethi->eth); + gtk_signal_disconnect (header, ethi->structure_change_id); + gtk_signal_disconnect (header, ethi->dimension_change_id); + + gtk_object_unref (header); + ethi->eth = NULL; + ethi->width = 0; +} + +static void +structure_changed (ETableHeader *header, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi) +{ + ethi->width = e_table_header_total_width (header); + + ethi_update (GNOME_CANVAS_ITEM (ethi), NULL, NULL, 0); +} + +static void +ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header) +{ + ethi->eth = header; + gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi->width = e_table_header_total_width (header); + + ethi->structure_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "structure_change", + GTK_SIGNAL_FUNC(structure_changed), ethi); + ethi->dimension_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "dimension_change", + GTK_SIGNAL_FUNC(dimension_changed), ethi); +} + static void ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { @@ -83,8 +131,8 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_TABLE_HEADER: - ethi->eth = GTK_VALUE_POINTER (*arg); - gtk_object_ref (GTK_OBJECT (ethi->eth)); + ethi_drop_table_header (ethi); + ethi_add_table_header (ethi, GTK_VALUE_POINTER (*arg)); break; case ARG_TABLE_X: @@ -196,6 +244,9 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid total = 0; x = -x1; + printf ("My coords are: %g %g %g %g\n", + item->x1, item->y1, item->x2, item->y2); + for (col = 0; col < cols; col++){ ETableCol *ecol = e_table_header_get_column (ethi->eth, col); int col_width; @@ -206,6 +257,7 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid col_width = ecol->width; if (x1 > total + col_width){ + total += col_width; x += col_width; continue; } @@ -217,9 +269,10 @@ ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int wid draw_button (ethi, ecol, drawable, gc, GTK_WIDGET (canvas)->style, - x, -y1, col_width, ethi->height); + x, ethi->y1 - y1, col_width, ethi->height); x += col_width; + total += col_width; } } @@ -292,7 +345,7 @@ ethi_request_redraw (ETableHeaderItem *ethi) * request a redraw */ gnome_canvas_request_redraw ( - canvas, ethi->x1, ethi->y1, INT_MAX, ethi->x1 + ethi->height); + canvas, ethi->x1, ethi->y1, ethi->x1 + ethi->width, ethi->x1 + ethi->height); } static void diff --git a/widgets/table/e-table-header-item.h b/widgets/table/e-table-header-item.h index 45e8f8851d..d6b7d64a9f 100644 --- a/widgets/table/e-table-header-item.h +++ b/widgets/table/e-table-header-item.h @@ -17,7 +17,7 @@ typedef struct { GdkGC *gc; GdkCursor *change_cursor, *normal_cursor; - short x1, y1, height; + short x1, y1, height, width; GdkFont *font; /* @@ -27,6 +27,11 @@ typedef struct { int resize_width; int resize_start_pos; GtkObject *resize_guide; + + /* + * Ids + */ + int structure_change_id, dimension_change_id; } ETableHeaderItem; typedef struct { diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index 8f7fa73725..7ddfc10405 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -31,8 +31,8 @@ eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) item->x1 = eti->x1; item->y1 = eti->y1; - item->x2 = INT_MAX; - item->y2 = eti->x1 + eti->height; + item->x2 = eti->x1 + eti->width; + item->y2 = eti->y1 + eti->height; gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -85,16 +85,30 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) GTK_SIGNAL_FUNC (eti_table_model_changed), eti); } +static void +eti_request_redraw (ETableItem *eti) +{ + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + + gnome_canvas_request_redraw (canvas, eti->x1, eti->y1, eti->x1 + eti->width, eti->y1 + eti->height); +} + static void eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti) { - printf ("NOTIFY: Dimension changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void eti_header_structure_changed (ETableHeader *eth, ETableItem *eti) { - printf ("NOTIFY: Structure changed"); + eti->width = e_table_header_total_width (eti->header); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); + eti_request_redraw (eti); } static void @@ -104,6 +118,8 @@ eti_add_header_model (ETableItem *eti, ETableHeader *header) eti->header = header; gtk_object_ref (GTK_OBJECT (header)); + + eti->width = e_table_header_total_width (header); eti->header_dim_change_id = gtk_signal_connect ( GTK_OBJECT (header), "dimension_change", @@ -203,7 +219,17 @@ static void draw_cell (ETableItem *eti, GdkDrawable *drawable, int col, int row, int x1, int y1, int x2, int y2) { - gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2-x1, y2-y1); + GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; + GdkFont *font; + char text [40]; + + font = GTK_WIDGET (canvas)->style->font; + + sprintf (text, "%d:%d\n", col, row); + gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2, y2); + gdk_draw_line (drawable, eti->grid_gc, x1, y2, x2, y1); + + gdk_draw_text (drawable, font, eti->grid_gc, x1, y2, text, strlen (text)); } static void @@ -215,19 +241,20 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int row, col, y1, y2; int first_col, last_col, x_offset; int x1, x2; - + /* * Clear the background */ gdk_draw_rectangle ( - drawable, eti->fill_gc, TRUE, 0, 0, width, height); - + drawable, eti->fill_gc, TRUE, + eti->x1 - x, eti->y1 - y, eti->width, eti->height); + /* * First column to draw, last column to draw */ - x1 = x_offset = 0; first_col = -1; - last_col = 0; + last_col = x_offset = 0; + x1 = eti->x1; for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -238,17 +265,26 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (x2 < x) continue; if (first_col == -1){ - x_offset = x - x1; + x_offset = x1 - x; first_col = col; } } last_col = col; + /* + * Nothing to paint + */ + if (first_col == -1) + return; + + printf ("Cols %d %d\n", first_col, last_col); /* * Draw individual lines */ - y1 = y2 = 0; + y1 = y2 = eti->y1; for (row = eti->top_item; row < rows; row++, y1 = y2){ + int xd; + y2 += e_table_model_row_height (eti->table_model, row) + 1; if (y1 > y + height) @@ -260,10 +296,12 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line (drawable, eti->grid_gc, 0, y - y2, width, y - y2); + xd = x_offset; for (col = first_col; col < last_col; col++){ ETableCol *ecol = e_table_header_get_column (eti->header, col); - draw_cell (eti, drawable, col, row, x_offset, y1 - y, x_offset + ecol->width, y2); + draw_cell (eti, drawable, col, row, xd, y1 - y, xd + ecol->width, y2); + xd += ecol->width; } } } diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h index 55893bb9ae..7e548cf49d 100644 --- a/widgets/table/e-table-item.h +++ b/widgets/table/e-table-item.h @@ -17,7 +17,7 @@ typedef struct { ETableHeader *header; int x1, y1; - int height; + int width, height; int top_item; diff --git a/widgets/table/table-test.c b/widgets/table/table-test.c index 50fa8a7597..54392a73bc 100644 --- a/widgets/table/table-test.c +++ b/widgets/table/table-test.c @@ -226,15 +226,8 @@ main (int argc, char *argv []) gnome_canvas_root (GNOME_CANVAS (canvas)), e_table_header_item_get_type (), "ETableHeader", e_table_header, - NULL); - gnome_canvas_item_new ( - gnome_canvas_root (GNOME_CANVAS (canvas)), - gnome_canvas_rect_get_type (), - "x1", 0.0, - "y1", 0.0, - "x2", 10.0, - "y2", 10.0, - "fill_color", "red", + "x", 0, + "y", 0, NULL); gnome_canvas_item_new ( @@ -242,8 +235,8 @@ main (int argc, char *argv []) e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 0, - "y", 30, + "x", 10, + "y", 30, NULL); gtk_main (); -- cgit