aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/table/e-table-item.c')
-rw-r--r--widgets/table/e-table-item.c126
1 files changed, 116 insertions, 10 deletions
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index 387bb520bd..16b85fab6e 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -20,6 +20,7 @@ enum {
ARG_TABLE_MODEL,
ARG_TABLE_X,
ARG_TABLE_Y,
+ ARG_LENGHT_THRESHOLD
};
static void
@@ -103,10 +104,47 @@ eti_remove_header_model (ETableItem *eti)
eti->header = NULL;
}
+static int
+eti_row_height (ETableItem *eti, int row)
+{
+ const int cols = e_table_header_count (eti->header);
+ int col;
+ int h, max_h;
+
+ max_h = 0;
+
+ for (col = 0; col < cols; col++){
+ h = e_cell_height (eti->cell_views [col], col, row);
+
+ if (h > max_h)
+ max_h = h;
+ }
+ return max_h;
+}
+
+static int
+eti_get_height (ETableItem *eti)
+{
+ const int rows = e_table_model_row_count (eti->table_model);
+ int row;
+ int height = 0;
+
+ if (rows > eti->length_threshold){
+ height = eti_row_height (eti, 0) * rows;
+
+ return height;
+ }
+
+ for (row = 0; row < rows; row++)
+ height += eti_row_height (eti, row);
+
+ return height;
+}
+
static void
eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
{
- eti->height = e_table_model_height (eti->table_model);
+ eti->height = eti_get_height (eti);
eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0);
}
@@ -122,7 +160,7 @@ eti_request_redraw (ETableItem *eti)
}
static void
-eti_table_model_row_selection (ETableModel *table_model, ETableItem *eti)
+eti_table_model_row_selection (ETableModel *table_model, int row, gboolean selected, ETableItem *eti)
{
/* FIXME: we should optimize this to only redraw the selection change */
eti_request_redraw (eti);
@@ -217,8 +255,6 @@ eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
case ARG_TABLE_MODEL:
eti_remove_table_model (eti);
eti_add_table_model (eti, GTK_VALUE_POINTER (*arg));
-
- eti->height = e_table_model_height (eti->table_model);
break;
case ARG_TABLE_X:
@@ -229,6 +265,10 @@ eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
eti->y1 = GTK_VALUE_INT (*arg);
break;
+ case ARG_LENGHT_THRESHOLD:
+ eti->length_threshold = GTK_VALUE_INT (*arg);
+ break;
+
}
eti_update (item, NULL, NULL, 0);
}
@@ -240,6 +280,9 @@ eti_init (GnomeCanvasItem *item)
eti->focused_col = -1;
eti->focused_row = -1;
+ eti->height = 0;
+
+ eti->length_threshold = -1;
}
static void
@@ -260,6 +303,9 @@ eti_realize (GnomeCanvasItem *item)
gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->fg [GTK_STATE_NORMAL]);
eti_realize_cell_views (eti);
+
+ eti->height = eti_get_height (eti);
+ eti_update (item, NULL, NULL, 0);
}
static void
@@ -273,6 +319,8 @@ eti_unrealize (GnomeCanvasItem *item)
eti->grid_gc = NULL;
eti_unrealize_cell_views (eti);
+
+ eti->height = 0;
if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)
(*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)(item);
@@ -293,10 +341,10 @@ draw_cell (ETableItem *eti, GdkDrawable *drawable, int col, int row,
e_cell_draw (ecell_view, drawable, col, row, x1, y1, x2, y2);
- gdk_draw_line (drawable, eti->grid_gc, x1, y1, x2, y2);
+#if 0
+ 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);
-#if 0
sprintf (text, "%d:%d\n", col, row);
gdk_draw_text (drawable, font, eti->grid_gc, x1, y2, text, strlen (text));
#endif
@@ -358,7 +406,7 @@ eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width,
for (row = eti->top_item; row < rows; row++, y1 = y2){
int xd;
- y2 += e_table_model_row_height (eti->table_model, row) + 1;
+ y2 += eti_row_height (eti, row);
if (y1 > y + height)
break;
@@ -388,6 +436,52 @@ eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
return 0.0;
}
+static gboolean
+find_cell (ETableItem *eti, double x, double y, int *col_res, int *row_res)
+{
+ const int cols = e_table_header_count (eti->header);
+ const int rows = e_table_model_row_count (eti->table_model);
+ gdouble x1, y1, x2, y2;
+ int col, row;
+
+ /* FIXME: inneficient, fix later */
+
+ x -= eti->x1;
+ y -= eti->y1;
+
+ x1 = 0;
+ for (col = 0; col < cols; col++, x1 = x2){
+ ETableCol *ecol = e_table_header_get_column (eti->header, col);
+
+ if (x < x1)
+ return FALSE;
+
+ x2 = x1 + ecol->width;
+
+ if (x > x2)
+ continue;
+
+ *col_res = col;
+ break;
+ }
+
+ y1 = 0;
+ for (row = 0; row < rows; row++, y1 = y2){
+ if (y < y1)
+ return FALSE;
+
+ y2 += eti_row_height (eti, row);
+
+ if (y > y2)
+ continue;
+
+ *row_res = row;
+ break;
+ }
+
+ return TRUE;
+}
+
static int
eti_event (GnomeCanvasItem *item, GdkEvent *e)
{
@@ -397,8 +491,18 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
switch (e->type){
case GDK_BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
- case GDK_2BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS: {
+ int col, row;
+
+ if (!find_cell (eti, e->button.x, e->button.y, &col, &row))
+ return TRUE;
+ ecell_view = eti->cell_views [col];
+ printf ("Found: %d %d\n", col, row);
+ e_cell_event (ecell_view, e, col, row);
+ break;
+ }
+
case GDK_KEY_PRESS:
case GDK_KEY_RELEASE:
if (eti->focused_col == -1)
@@ -408,9 +512,11 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
e_cell_event (ecell_view, e, eti->focused_col, eti->focused_row);
break;
-
+
+ default:
+ return FALSE;
}
- return FALSE;
+ return TRUE;
}
static void