diff options
author | Arturo Espinosa <unammx@src.gnome.org> | 1999-12-13 12:39:18 +0800 |
---|---|---|
committer | Arturo Espinosa <unammx@src.gnome.org> | 1999-12-13 12:39:18 +0800 |
commit | df80388fd94f635a0fecb08314eafd5e25131800 (patch) | |
tree | 40dd55a1c27190d9180960a1e9fcffc05dab7205 /widgets | |
parent | 8846da8e48cacd7ab792bdcbec8eef19a9c19736 (diff) | |
download | gsoc2013-evolution-df80388fd94f635a0fecb08314eafd5e25131800.tar.gz gsoc2013-evolution-df80388fd94f635a0fecb08314eafd5e25131800.tar.zst gsoc2013-evolution-df80388fd94f635a0fecb08314eafd5e25131800.zip |
Works with GnomeCanvasGroups -miguel
svn path=/trunk/; revision=1484
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/ChangeLog | 5 | ||||
-rw-r--r-- | widgets/Makefile.am | 2 | ||||
-rw-r--r-- | widgets/e-table-group.h | 2 | ||||
-rw-r--r-- | widgets/e-table-item.c | 81 | ||||
-rw-r--r-- | widgets/e-table.c | 3 | ||||
-rw-r--r-- | widgets/e-table/ChangeLog | 5 | ||||
-rw-r--r-- | widgets/e-table/Makefile.am | 2 | ||||
-rw-r--r-- | widgets/e-table/e-table-group.h | 2 | ||||
-rw-r--r-- | widgets/e-table/e-table-item.c | 81 | ||||
-rw-r--r-- | widgets/e-table/e-table.c | 3 | ||||
-rw-r--r-- | widgets/e-table/test-table.c | 14 | ||||
-rw-r--r-- | widgets/table/e-table-group.h | 2 | ||||
-rw-r--r-- | widgets/table/e-table-item.c | 81 | ||||
-rw-r--r-- | widgets/table/e-table.c | 3 | ||||
-rw-r--r-- | widgets/table/test-table.c | 14 | ||||
-rw-r--r-- | widgets/test-table.c | 14 |
16 files changed, 229 insertions, 85 deletions
diff --git a/widgets/ChangeLog b/widgets/ChangeLog index b5062dfedf..9f0f836b68 100644 --- a/widgets/ChangeLog +++ b/widgets/ChangeLog @@ -1,5 +1,10 @@ 1999-12-12 Miguel de Icaza <miguel@helixcode.com> + * e-table-item.c (eti_update): Make this play nicely with groups. + (eti_draw): ditto. + (eti_request_region_redraw): ditto. + (eti_item_region_redraw): New function. + * e-table-subset.c (etss_proxy_model_row_changed): Added model proxying. diff --git a/widgets/Makefile.am b/widgets/Makefile.am index e59c03a18d..a82935a262 100644 --- a/widgets/Makefile.am +++ b/widgets/Makefile.am @@ -21,8 +21,6 @@ libevolutionwidgets_a_SOURCES = \ e-table.h \ e-table-col.c \ e-table-col.h \ - e-table-group.c \ - e-table-group.h \ e-table-header.c \ e-table-header.h \ e-table-header-item.c \ diff --git a/widgets/e-table-group.h b/widgets/e-table-group.h index d673aebd11..62bc11093f 100644 --- a/widgets/e-table-group.h +++ b/widgets/e-table-group.h @@ -15,7 +15,7 @@ typedef struct { guint is_leaf :1; } ETableGroup; -ETableGroup *e_table_group_new (const char *title); +ETableGroup *e_table_group_new (ETableCol *ecol, ETableItem *item ETableGroup *e_table_group_new_leaf (const char *title, ETableModel *table); void e_table_group_destroy (ETableGroup *etg); diff --git a/widgets/e-table-item.c b/widgets/e-table-item.c index d0a0ad8cba..26e21bfd98 100644 --- a/widgets/e-table-item.c +++ b/widgets/e-table-item.c @@ -14,6 +14,7 @@ #include <stdio.h> #include <gtk/gtksignal.h> #include <gdk/gdkkeysyms.h> +#include <math.h> #include "e-table-item.h" #include "e-cell.h" @@ -103,15 +104,27 @@ static void eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) { ETableItem *eti = E_TABLE_ITEM (item); + double i2c [6]; + ArtPoint c1, c2, i1, i2; if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update) (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags); - item->x1 = eti->x1; - item->y1 = eti->y1; - item->x2 = eti->x1 + eti->width; - item->y2 = eti->y1 + eti->height; + gnome_canvas_item_i2c_affine (item, i2c); + i1.x = eti->x1; + i1.y = eti->y1; + i2.x = eti->x1 + eti->width; + i2.y = eti->y1 + eti->height; + art_affine_point (&c1, &i1, i2c); + art_affine_point (&c2, &i2, i2c); + item->x1 = c1.x; + item->y1 = c1.y; + item->x2 = c2.x; + item->y2 = c2.y; + + printf ("BBOX: %g %g %g %g\n", item->x1, item->y1, item->x2, item->y2); + gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -239,6 +252,23 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *eti) eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); } +static void +eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1) +{ + GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti); + ArtDRect rect; + double i2c [6]; + + rect.x0 = x0; + rect.y0 = y0; + rect.x1 = x1; + rect.y1 = y1; + + gnome_canvas_item_i2c_affine (item, i2c); + art_drect_affine_transform (&rect, &rect, i2c); + + gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1); +} /* * eti_request_redraw: @@ -248,11 +278,7 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *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 + 1, - eti->y1 + eti->height + 1); + eti_item_region_redraw (eti, eti->x1, eti->y1, eti->x1 + eti->width + 1, eti->y1 + eti->height + 1); } /* @@ -286,7 +312,6 @@ eti_request_region_redraw (ETableItem *eti, int start_col, int start_row, int end_col, int end_row, int border) { - GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; int x1, y1, width, height; x1 = e_table_header_col_diff (eti->header, 0, start_col); @@ -294,8 +319,7 @@ eti_request_region_redraw (ETableItem *eti, width = e_table_header_col_diff (eti->header, start_col, end_col + 1); height = eti_row_diff (eti, start_row, end_row + 1); - gnome_canvas_request_redraw (canvas, - eti->x1 + x1 - border, + eti_item_region_redraw (eti, eti->x1 + x1 - border, eti->y1 + y1 - border, eti->x1 + x1 + width + 1 + border, eti->y1 + y1 + height + 1 + border); @@ -561,8 +585,9 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int x1, x2; int f_x1, f_x2, f_y1, f_y2; gboolean f_found; - -/* printf ("Rect: %d %d %d %d\n", x, y, width, height); */ + double i2c [6]; + ArtPoint eti_base, eti_base_item; + /* * Clear the background */ @@ -571,13 +596,21 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, drawable, eti->fill_gc, TRUE, eti->x1 - x, eti->y1 - y, eti->width, eti->height); #endif - + + /* + * Find out our real position after grouping + */ + gnome_canvas_item_i2c_affine (item, i2c); + eti_base_item.x = eti->x1; + eti_base_item.y = eti->y1; + art_affine_point (&eti_base, &eti_base_item, i2c); + /* * First column to draw, last column to draw */ first_col = -1; last_col = x_offset = 0; - x1 = x2 = eti->x1; + x1 = x2 = floor (eti_base.x); for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -605,7 +638,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, */ first_row = -1; y_offset = 0; - y1 = y2 = eti->y1 + 1; + y1 = y2 = floor (eti_base.y) + 1; for (row = 0; row < rows; row++, y1 = y2){ y2 += eti_row_height (eti, row) + 1; @@ -636,7 +669,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid && first_row == 0){ gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); } yd++; @@ -673,7 +706,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); yd++; } @@ -717,7 +750,7 @@ eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, } static gboolean -find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, gdouble *x1_res, gdouble *y1_res) +find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, double *x1_res, double *y1_res) { const int cols = eti->cols; const int rows = eti->rows; @@ -777,9 +810,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_2BUTTON_PRESS: { + double x1, y1; int col, row; - gdouble x1, y1; - + + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; @@ -810,6 +845,8 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) int col, row; double x1, y1; + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; diff --git a/widgets/e-table.c b/widgets/e-table.c index f9a41a38fc..a37012d4cc 100644 --- a/widgets/e-table.c +++ b/widgets/e-table.c @@ -35,6 +35,7 @@ typedef struct { } Leaf; typedef struct { + } Node; @@ -132,7 +133,7 @@ e_table_create_leaf (ETable *e_table, int x_off, int y_off, ETableModel *etm) NULL); height = E_TABLE_ITEM (leaf->table_item)->height; - + leaf->rect = gnome_canvas_item_new ( gnome_canvas_root (e_table->table_canvas), gnome_canvas_rect_get_type (), diff --git a/widgets/e-table/ChangeLog b/widgets/e-table/ChangeLog index b5062dfedf..9f0f836b68 100644 --- a/widgets/e-table/ChangeLog +++ b/widgets/e-table/ChangeLog @@ -1,5 +1,10 @@ 1999-12-12 Miguel de Icaza <miguel@helixcode.com> + * e-table-item.c (eti_update): Make this play nicely with groups. + (eti_draw): ditto. + (eti_request_region_redraw): ditto. + (eti_item_region_redraw): New function. + * e-table-subset.c (etss_proxy_model_row_changed): Added model proxying. diff --git a/widgets/e-table/Makefile.am b/widgets/e-table/Makefile.am index e59c03a18d..a82935a262 100644 --- a/widgets/e-table/Makefile.am +++ b/widgets/e-table/Makefile.am @@ -21,8 +21,6 @@ libevolutionwidgets_a_SOURCES = \ e-table.h \ e-table-col.c \ e-table-col.h \ - e-table-group.c \ - e-table-group.h \ e-table-header.c \ e-table-header.h \ e-table-header-item.c \ diff --git a/widgets/e-table/e-table-group.h b/widgets/e-table/e-table-group.h index d673aebd11..62bc11093f 100644 --- a/widgets/e-table/e-table-group.h +++ b/widgets/e-table/e-table-group.h @@ -15,7 +15,7 @@ typedef struct { guint is_leaf :1; } ETableGroup; -ETableGroup *e_table_group_new (const char *title); +ETableGroup *e_table_group_new (ETableCol *ecol, ETableItem *item ETableGroup *e_table_group_new_leaf (const char *title, ETableModel *table); void e_table_group_destroy (ETableGroup *etg); diff --git a/widgets/e-table/e-table-item.c b/widgets/e-table/e-table-item.c index d0a0ad8cba..26e21bfd98 100644 --- a/widgets/e-table/e-table-item.c +++ b/widgets/e-table/e-table-item.c @@ -14,6 +14,7 @@ #include <stdio.h> #include <gtk/gtksignal.h> #include <gdk/gdkkeysyms.h> +#include <math.h> #include "e-table-item.h" #include "e-cell.h" @@ -103,15 +104,27 @@ static void eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) { ETableItem *eti = E_TABLE_ITEM (item); + double i2c [6]; + ArtPoint c1, c2, i1, i2; if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update) (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags); - item->x1 = eti->x1; - item->y1 = eti->y1; - item->x2 = eti->x1 + eti->width; - item->y2 = eti->y1 + eti->height; + gnome_canvas_item_i2c_affine (item, i2c); + i1.x = eti->x1; + i1.y = eti->y1; + i2.x = eti->x1 + eti->width; + i2.y = eti->y1 + eti->height; + art_affine_point (&c1, &i1, i2c); + art_affine_point (&c2, &i2, i2c); + item->x1 = c1.x; + item->y1 = c1.y; + item->x2 = c2.x; + item->y2 = c2.y; + + printf ("BBOX: %g %g %g %g\n", item->x1, item->y1, item->x2, item->y2); + gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -239,6 +252,23 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *eti) eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); } +static void +eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1) +{ + GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti); + ArtDRect rect; + double i2c [6]; + + rect.x0 = x0; + rect.y0 = y0; + rect.x1 = x1; + rect.y1 = y1; + + gnome_canvas_item_i2c_affine (item, i2c); + art_drect_affine_transform (&rect, &rect, i2c); + + gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1); +} /* * eti_request_redraw: @@ -248,11 +278,7 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *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 + 1, - eti->y1 + eti->height + 1); + eti_item_region_redraw (eti, eti->x1, eti->y1, eti->x1 + eti->width + 1, eti->y1 + eti->height + 1); } /* @@ -286,7 +312,6 @@ eti_request_region_redraw (ETableItem *eti, int start_col, int start_row, int end_col, int end_row, int border) { - GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; int x1, y1, width, height; x1 = e_table_header_col_diff (eti->header, 0, start_col); @@ -294,8 +319,7 @@ eti_request_region_redraw (ETableItem *eti, width = e_table_header_col_diff (eti->header, start_col, end_col + 1); height = eti_row_diff (eti, start_row, end_row + 1); - gnome_canvas_request_redraw (canvas, - eti->x1 + x1 - border, + eti_item_region_redraw (eti, eti->x1 + x1 - border, eti->y1 + y1 - border, eti->x1 + x1 + width + 1 + border, eti->y1 + y1 + height + 1 + border); @@ -561,8 +585,9 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int x1, x2; int f_x1, f_x2, f_y1, f_y2; gboolean f_found; - -/* printf ("Rect: %d %d %d %d\n", x, y, width, height); */ + double i2c [6]; + ArtPoint eti_base, eti_base_item; + /* * Clear the background */ @@ -571,13 +596,21 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, drawable, eti->fill_gc, TRUE, eti->x1 - x, eti->y1 - y, eti->width, eti->height); #endif - + + /* + * Find out our real position after grouping + */ + gnome_canvas_item_i2c_affine (item, i2c); + eti_base_item.x = eti->x1; + eti_base_item.y = eti->y1; + art_affine_point (&eti_base, &eti_base_item, i2c); + /* * First column to draw, last column to draw */ first_col = -1; last_col = x_offset = 0; - x1 = x2 = eti->x1; + x1 = x2 = floor (eti_base.x); for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -605,7 +638,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, */ first_row = -1; y_offset = 0; - y1 = y2 = eti->y1 + 1; + y1 = y2 = floor (eti_base.y) + 1; for (row = 0; row < rows; row++, y1 = y2){ y2 += eti_row_height (eti, row) + 1; @@ -636,7 +669,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid && first_row == 0){ gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); } yd++; @@ -673,7 +706,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); yd++; } @@ -717,7 +750,7 @@ eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, } static gboolean -find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, gdouble *x1_res, gdouble *y1_res) +find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, double *x1_res, double *y1_res) { const int cols = eti->cols; const int rows = eti->rows; @@ -777,9 +810,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_2BUTTON_PRESS: { + double x1, y1; int col, row; - gdouble x1, y1; - + + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; @@ -810,6 +845,8 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) int col, row; double x1, y1; + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; diff --git a/widgets/e-table/e-table.c b/widgets/e-table/e-table.c index f9a41a38fc..a37012d4cc 100644 --- a/widgets/e-table/e-table.c +++ b/widgets/e-table/e-table.c @@ -35,6 +35,7 @@ typedef struct { } Leaf; typedef struct { + } Node; @@ -132,7 +133,7 @@ e_table_create_leaf (ETable *e_table, int x_off, int y_off, ETableModel *etm) NULL); height = E_TABLE_ITEM (leaf->table_item)->height; - + leaf->rect = gnome_canvas_item_new ( gnome_canvas_root (e_table->table_canvas), gnome_canvas_rect_get_type (), diff --git a/widgets/e-table/test-table.c b/widgets/e-table/test-table.c index 83a130d72a..8bf22f980d 100644 --- a/widgets/e-table/test-table.c +++ b/widgets/e-table/test-table.c @@ -186,6 +186,7 @@ table_browser_test (void) ETableModel *e_table_model; ETableHeader *e_table_header; ECell *cell_left_just; + GnomeCanvasItem *group; int i; load_data (); @@ -231,13 +232,20 @@ table_browser_test (void) "y", 0, NULL); - gnome_canvas_item_new ( + group = gnome_canvas_item_new ( gnome_canvas_root (GNOME_CANVAS (canvas)), + gnome_canvas_group_get_type (), + "x", 30.0, + "y", 30.0, + NULL); + + gnome_canvas_item_new ( + GNOME_CANVAS_GROUP (group), e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 10, - "y", 30, + "x", 0, + "y", 0, "drawgrid", TRUE, "drawfocus", TRUE, "spreadsheet", TRUE, diff --git a/widgets/table/e-table-group.h b/widgets/table/e-table-group.h index d673aebd11..62bc11093f 100644 --- a/widgets/table/e-table-group.h +++ b/widgets/table/e-table-group.h @@ -15,7 +15,7 @@ typedef struct { guint is_leaf :1; } ETableGroup; -ETableGroup *e_table_group_new (const char *title); +ETableGroup *e_table_group_new (ETableCol *ecol, ETableItem *item ETableGroup *e_table_group_new_leaf (const char *title, ETableModel *table); void e_table_group_destroy (ETableGroup *etg); diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index d0a0ad8cba..26e21bfd98 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -14,6 +14,7 @@ #include <stdio.h> #include <gtk/gtksignal.h> #include <gdk/gdkkeysyms.h> +#include <math.h> #include "e-table-item.h" #include "e-cell.h" @@ -103,15 +104,27 @@ static void eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) { ETableItem *eti = E_TABLE_ITEM (item); + double i2c [6]; + ArtPoint c1, c2, i1, i2; if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update) (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags); - item->x1 = eti->x1; - item->y1 = eti->y1; - item->x2 = eti->x1 + eti->width; - item->y2 = eti->y1 + eti->height; + gnome_canvas_item_i2c_affine (item, i2c); + i1.x = eti->x1; + i1.y = eti->y1; + i2.x = eti->x1 + eti->width; + i2.y = eti->y1 + eti->height; + art_affine_point (&c1, &i1, i2c); + art_affine_point (&c2, &i2, i2c); + item->x1 = c1.x; + item->y1 = c1.y; + item->x2 = c2.x; + item->y2 = c2.y; + + printf ("BBOX: %g %g %g %g\n", item->x1, item->y1, item->x2, item->y2); + gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); } @@ -239,6 +252,23 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *eti) eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); } +static void +eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1) +{ + GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti); + ArtDRect rect; + double i2c [6]; + + rect.x0 = x0; + rect.y0 = y0; + rect.x1 = x1; + rect.y1 = y1; + + gnome_canvas_item_i2c_affine (item, i2c); + art_drect_affine_transform (&rect, &rect, i2c); + + gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1); +} /* * eti_request_redraw: @@ -248,11 +278,7 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *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 + 1, - eti->y1 + eti->height + 1); + eti_item_region_redraw (eti, eti->x1, eti->y1, eti->x1 + eti->width + 1, eti->y1 + eti->height + 1); } /* @@ -286,7 +312,6 @@ eti_request_region_redraw (ETableItem *eti, int start_col, int start_row, int end_col, int end_row, int border) { - GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas; int x1, y1, width, height; x1 = e_table_header_col_diff (eti->header, 0, start_col); @@ -294,8 +319,7 @@ eti_request_region_redraw (ETableItem *eti, width = e_table_header_col_diff (eti->header, start_col, end_col + 1); height = eti_row_diff (eti, start_row, end_row + 1); - gnome_canvas_request_redraw (canvas, - eti->x1 + x1 - border, + eti_item_region_redraw (eti, eti->x1 + x1 - border, eti->y1 + y1 - border, eti->x1 + x1 + width + 1 + border, eti->y1 + y1 + height + 1 + border); @@ -561,8 +585,9 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int x1, x2; int f_x1, f_x2, f_y1, f_y2; gboolean f_found; - -/* printf ("Rect: %d %d %d %d\n", x, y, width, height); */ + double i2c [6]; + ArtPoint eti_base, eti_base_item; + /* * Clear the background */ @@ -571,13 +596,21 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, drawable, eti->fill_gc, TRUE, eti->x1 - x, eti->y1 - y, eti->width, eti->height); #endif - + + /* + * Find out our real position after grouping + */ + gnome_canvas_item_i2c_affine (item, i2c); + eti_base_item.x = eti->x1; + eti_base_item.y = eti->y1; + art_affine_point (&eti_base, &eti_base_item, i2c); + /* * First column to draw, last column to draw */ first_col = -1; last_col = x_offset = 0; - x1 = x2 = eti->x1; + x1 = x2 = floor (eti_base.x); for (col = 0; col < cols; col++, x1 = x2){ ETableCol *ecol = e_table_header_get_column (eti->header, col); @@ -605,7 +638,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, */ first_row = -1; y_offset = 0; - y1 = y2 = eti->y1 + 1; + y1 = y2 = floor (eti_base.y) + 1; for (row = 0; row < rows; row++, y1 = y2){ y2 += eti_row_height (eti, row) + 1; @@ -636,7 +669,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid && first_row == 0){ gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); } yd++; @@ -673,7 +706,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, if (eti->draw_grid) gdk_draw_line ( drawable, eti->grid_gc, - eti->x1 - x, yd, eti->x1 + eti->width - x, yd); + eti_base.x - x, yd, eti_base.x + eti->width - x, yd); yd++; } @@ -717,7 +750,7 @@ eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, } static gboolean -find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, gdouble *x1_res, gdouble *y1_res) +find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res, double *x1_res, double *y1_res) { const int cols = eti->cols; const int rows = eti->rows; @@ -777,9 +810,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_2BUTTON_PRESS: { + double x1, y1; int col, row; - gdouble x1, y1; - + + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; @@ -810,6 +845,8 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e) int col, row; double x1, y1; + gnome_canvas_item_w2i (item, &e->button.x, &e->button.y); + if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1)) return TRUE; diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c index f9a41a38fc..a37012d4cc 100644 --- a/widgets/table/e-table.c +++ b/widgets/table/e-table.c @@ -35,6 +35,7 @@ typedef struct { } Leaf; typedef struct { + } Node; @@ -132,7 +133,7 @@ e_table_create_leaf (ETable *e_table, int x_off, int y_off, ETableModel *etm) NULL); height = E_TABLE_ITEM (leaf->table_item)->height; - + leaf->rect = gnome_canvas_item_new ( gnome_canvas_root (e_table->table_canvas), gnome_canvas_rect_get_type (), diff --git a/widgets/table/test-table.c b/widgets/table/test-table.c index 83a130d72a..8bf22f980d 100644 --- a/widgets/table/test-table.c +++ b/widgets/table/test-table.c @@ -186,6 +186,7 @@ table_browser_test (void) ETableModel *e_table_model; ETableHeader *e_table_header; ECell *cell_left_just; + GnomeCanvasItem *group; int i; load_data (); @@ -231,13 +232,20 @@ table_browser_test (void) "y", 0, NULL); - gnome_canvas_item_new ( + group = gnome_canvas_item_new ( gnome_canvas_root (GNOME_CANVAS (canvas)), + gnome_canvas_group_get_type (), + "x", 30.0, + "y", 30.0, + NULL); + + gnome_canvas_item_new ( + GNOME_CANVAS_GROUP (group), e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 10, - "y", 30, + "x", 0, + "y", 0, "drawgrid", TRUE, "drawfocus", TRUE, "spreadsheet", TRUE, diff --git a/widgets/test-table.c b/widgets/test-table.c index 83a130d72a..8bf22f980d 100644 --- a/widgets/test-table.c +++ b/widgets/test-table.c @@ -186,6 +186,7 @@ table_browser_test (void) ETableModel *e_table_model; ETableHeader *e_table_header; ECell *cell_left_just; + GnomeCanvasItem *group; int i; load_data (); @@ -231,13 +232,20 @@ table_browser_test (void) "y", 0, NULL); - gnome_canvas_item_new ( + group = gnome_canvas_item_new ( gnome_canvas_root (GNOME_CANVAS (canvas)), + gnome_canvas_group_get_type (), + "x", 30.0, + "y", 30.0, + NULL); + + gnome_canvas_item_new ( + GNOME_CANVAS_GROUP (group), e_table_item_get_type (), "ETableHeader", e_table_header, "ETableModel", e_table_model, - "x", 10, - "y", 30, + "x", 0, + "y", 0, "drawgrid", TRUE, "drawfocus", TRUE, "spreadsheet", TRUE, |