Ok, the restructuring of ETableItem to compute its size without hacks is

Ok, the restructuring of ETableItem to compute its size without hacks is
in now.  I am feeling better now.

1999-12-30  Miguel de Icaza  <miguel@gnu.org>

	* e-table-item.c (eti_attach_cell_views): New routine, creates the
	cell views.
	(eti_detach_cell_views): Detaches the cell_views from the
	ETableItem.
	(eti_realize_cell_views, eti_unrealize_cell_views): Simplified to
	just do realize/unrealize notification.
	(eti_add_table_model): Only attach the cells when we have both the
	table model and the header model.

	* e-cell.h (ECellClass): Added two new methods: new_view and
	kill_view which drive the view process (instead of putting that on
	realize/unrealize).

	* e-cell.c: Adapt the code to use the new scheme for view
	instantiation.

	* e-cell-text.c, e-cell-toggle.c: Adapted to the new class
	changes.

svn path=/trunk/; revision=1523
This commit is contained in:
Miguel de Icaza
1999-12-31 02:23:37 +00:00
committed by Arturo Espinosa
parent d0606659a4
commit f55c64565c
26 changed files with 579 additions and 231 deletions

View File

@ -1,3 +1,24 @@
1999-12-30 Miguel de Icaza <miguel@gnu.org>
* e-table-item.c (eti_attach_cell_views): New routine, creates the
cell views.
(eti_detach_cell_views): Detaches the cell_views from the
ETableItem.
(eti_realize_cell_views, eti_unrealize_cell_views): Simplified to
just do realize/unrealize notification.
(eti_add_table_model): Only attach the cells when we have both the
table model and the header model.
* e-cell.h (ECellClass): Added two new methods: new_view and
kill_view which drive the view process (instead of putting that on
realize/unrealize).
* e-cell.c: Adapt the code to use the new scheme for view
instantiation.
* e-cell-text.c, e-cell-toggle.c: Adapted to the new class
changes.
1999-12-22 Miguel de Icaza <miguel@helixcode.com>
* e-table-item.c (e_table_item_focus): grab focus here with the

View File

@ -38,7 +38,6 @@ typedef struct {
GdkGC *gc;
GdkFont *font;
GnomeCanvas *canvas;
ETableItem *eti;
/*
* During edition.
@ -51,7 +50,9 @@ static ECellClass *parent_class;
static void
ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
@ -63,7 +64,7 @@ ect_accept_edits (ECellTextView *text_view)
const char *text = gtk_entry_get_text (text_view->edit->entry);
CellEdit *edit = text_view->edit;
e_table_model_set_value_at (text_view->cell_view.table_model, edit->model_col, edit->row, text);
e_table_model_set_value_at (text_view->cell_view.e_table_model, edit->model_col, edit->row, text);
}
/*
@ -84,7 +85,7 @@ ect_stop_editing (ECellTextView *text_view)
text_view->edit = NULL;
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -98,20 +99,19 @@ ect_cancel_edit (ECellTextView *text_view)
}
/*
* ECell::realize method
* ECell::new_view method
*/
static ECellView *
ect_realize (ECell *ecell, ETableModel *table_model, void *view)
ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellText *ect = E_CELL_TEXT (ecell);
ECellTextView *text_view = g_new0 (ECellTextView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
text_view->cell_view.ecell = ecell;
text_view->cell_view.table_model = table_model;
text_view->cell_view.e_table_model = table_model;
text_view->cell_view.e_table_item_view = e_table_item_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
if (ect->font_name){
GdkFont *f;
@ -124,12 +124,36 @@ ect_realize (ECell *ecell, ETableModel *table_model, void *view)
gdk_font_ref (text_view->font);
}
text_view->eti = eti;
text_view->canvas = canvas;
return (ECellView *)text_view;
}
/*
* ECell::kill_view method
*/
static void
ect_kill_view (ECellView *ecv)
{
ECellTextView *text_view = (ECellTextView *) ecv;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
* ECell::realize method
*/
static void
ect_realize (ECellView *ecell_view)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -140,11 +164,6 @@ ect_unrealize (ECellView *ecv)
gdk_gc_unref (text_view->gc);
text_view->gc = NULL;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
@ -159,7 +178,7 @@ ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
ECellTextView *text_view = (ECellTextView *) ecell_view;
GtkWidget *w = GTK_WIDGET (text_view->canvas);
GdkRectangle rect;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
GdkFont *font = text_view->font;
const int height = font->ascent + font->descent;
int xoff;
@ -333,7 +352,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
if (text_view->edit){
printf ("FIXME: Should handle click here\n");
} else
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
break;
case GDK_BUTTON_RELEASE:
@ -351,7 +370,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
}
if (!text_view->edit){
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
ect_edit_select_all (text_view);
}
@ -385,7 +404,7 @@ ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
static void
ect_entry_activate (GtkEntry *entry, ECellTextView *text_view)
{
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -395,7 +414,7 @@ static void *
ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
CellEdit *edit;
edit = g_new (CellEdit, 1);
@ -461,7 +480,9 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = ect_destroy;
ecc->new_view = ect_new_view;
ecc->kill_view = ect_kill_view;
ecc->realize = ect_realize;
ecc->unrealize = ect_unrealize;
ecc->draw = ect_draw;

View File

@ -23,7 +23,6 @@ typedef struct {
ECellView cell_view;
GdkGC *gc;
GnomeCanvas *canvas;
ETableItem *eti;
} ECellToggleView;
static ECellClass *parent_class;
@ -31,28 +30,43 @@ static ECellClass *parent_class;
static void
etog_queue_redraw (ECellToggleView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
* ECell::realize method
*/
static ECellView *
etog_realize (ECell *ecell, ETableModel *table_model, void *view)
etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
toggle_view->cell_view.ecell = ecell;
toggle_view->cell_view.table_model = table_model;
toggle_view->eti = eti;
toggle_view->cell_view.e_table_model = table_model;
toggle_view->cell_view.e_table_item_view = e_table_item_view;
toggle_view->canvas = canvas;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
return (ECellView *) toggle_view;
}
static void
etog_kill_view (ECellView *ecell_view)
{
g_free (ecell_view);
}
static void
etog_realize (ECellView *ecell_view)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -63,8 +77,6 @@ etog_unrealize (ECellView *ecv)
gdk_gc_unref (toggle_view->gc);
toggle_view->gc = NULL;
g_free (toggle_view);
}
/*
@ -81,7 +93,7 @@ etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
ArtPixBuf *art;
int x, y, width, height;
const int value = GPOINTER_TO_INT (
e_table_model_value_at (ecell_view->table_model, model_col, row));
e_table_model_value_at (ecell_view->e_table_model, model_col, row));
if (value >= toggle->n_states){
g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
@ -173,7 +185,7 @@ etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int r
if (value >= toggle->n_states)
value = 0;
e_table_model_set_value_at (toggle_view->cell_view.table_model,
e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
model_col, row, GINT_TO_POINTER (value));
etog_queue_redraw (toggle_view, view_col, row);
}
@ -185,7 +197,7 @@ static gint
etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
void *_value = e_table_model_value_at (ecell_view->table_model, model_col, row);
void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
const int value = GPOINTER_TO_INT (_value);
switch (event->type){
@ -237,7 +249,9 @@ e_cell_toggle_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = etog_destroy;
ecc->new_view = etog_new_view;
ecc->kill_view = etog_kill_view;
ecc->realize = etog_realize;
ecc->unrealize = etog_unrealize;
ecc->draw = etog_draw;

View File

@ -13,11 +13,21 @@
#define PARENT_TYPE gtk_object_get_type()
static ECellView *
ec_realize (ECell *e_cell, ETableModel *table_model, void *view)
ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return NULL;
}
static void
ec_realize (ECellView *e_cell)
{
}
static void
ec_kill_view (ECellView *ecell_view)
{
}
static void
ec_unrealize (ECellView *e_cell)
{
@ -85,6 +95,8 @@ e_cell_class_init (GtkObjectClass *object_class)
ecc->realize = ec_realize;
ecc->unrealize = ec_unrealize;
ecc->new_view = ec_new_view;
ecc->kill_view = ec_kill_view;
ecc->draw = ec_draw;
ecc->event = ec_event;
ecc->focus = ec_focus;
@ -110,10 +122,22 @@ e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_co
}
ECellView *
e_cell_realize (ECell *ecell, ETableModel *table_model, void *view)
e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->realize (
ecell, table_model, view);
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->new_view (
ecell, table_model, e_table_item_view);
}
void
e_cell_view_realize (ECellView *ecell_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->realize (ecell_view);
}
void
e_cell_kill_view (ECellView *ecell_view)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->kill_view (ecell_view);
}
void

View File

@ -19,7 +19,8 @@ struct _ECell {
struct _ECellView {
ECell *ecell;
ETableModel *table_model;
ETableModel *e_table_model;
void *e_table_item_view;
gint focus_x1, focus_y1, focus_x2, focus_y2;
gint focus_col, focus_row;
@ -29,9 +30,13 @@ struct _ECellView {
typedef struct {
GtkObjectClass parent_class;
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
ECellView *(*realize) (ECell *ecell, ETableModel *table_model, void *view);
void (*unrealize) (ECellView *e_cell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
@ -46,9 +51,14 @@ typedef struct {
} ECellClass;
GtkType e_cell_get_type (void);
ECellView *e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void e_cell_kill_view (ECellView *ecell_view);
void e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
ECellView *e_cell_realize (ECell *ecell, ETableModel *table_model, void *view);
void e_cell_realize (ECellView *ecell_view);
void e_cell_unrealize (ECellView *ecell_view);
void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
int model_col, int view_col, int row, gboolean selected,
int x1, int y1, int x2, int y2);

View File

@ -66,6 +66,21 @@ eti_realize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++)
e_cell_view_realize (eti->cell_views [i], eti);
eti->cell_views_realized = 1;
}
static void eti_compute_height (ETableItem *eti);
static void
eti_attach_cell_views (ETableItem *eti)
{
int i;
g_assert (eti->header);
g_assert (eti->table_model);
/*
* Now realize the various ECells
*/
@ -75,35 +90,50 @@ eti_realize_cell_views (ETableItem *eti)
for (i = 0; i < eti->n_cells; i++){
ETableCol *col = e_table_header_get_column (eti->header, i);
eti->cell_views [i] = e_cell_realize (col->ecell, eti->table_model, eti);
eti->cell_views [i] = e_cell_new_view (col->ecell, eti->table_model, eti);
}
eti_compute_height (eti);
}
/*
* During unrealization: we invoke every e-cell (one per column in the current
* setup) to dispose all resources allocated
* setup) to dispose all X resources allocated
*/
static void
eti_unrealize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
if (eti->cell_views_realized == 0)
return;
for (i = 0; i < eti->n_cells; i++)
e_cell_unrealize (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
eti->cell_views_realized = 0;
}
static void
eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
eti_detach_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
e_cell_kill_view (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
}
static void
eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
{
double i2c [6];
ArtPoint c1, c2, i1, i2;
GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
ETableItem *eti = E_TABLE_ITEM (item);
gnome_canvas_item_i2c_affine (item, i2c);
i1.x = eti->x1;
@ -126,12 +156,10 @@ eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
static void
eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
{
ETableItem *eti = E_TABLE_ITEM (item);
if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
(*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
eti_bounds (eti, &item->x1, &item->y1, &item->x2, &item->y2);
eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
}
@ -172,8 +200,14 @@ eti_remove_header_model (ETableItem *eti)
eti->header_structure_change_id);
gtk_signal_disconnect (GTK_OBJECT (eti->header),
eti->header_dim_change_id);
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
}
gtk_object_unref (GTK_OBJECT (eti->header));
eti->header_structure_change_id = 0;
eti->header_dim_change_id = 0;
eti->header = NULL;
@ -192,6 +226,8 @@ eti_row_height (ETableItem *eti, int row)
int col;
int h, max_h;
g_assert (eti->cell_views);
max_h = 0;
for (col = 0; col < cols; col++){
@ -395,7 +431,12 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model)
eti->table_model_row_change_id = gtk_signal_connect (
GTK_OBJECT (table_model), "model_row_changed",
GTK_SIGNAL_FUNC (eti_table_model_row_changed), eti);
if (eti->header){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
eti_table_model_changed (table_model, eti);
}
@ -420,7 +461,14 @@ eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
eti_realize_cell_views (eti);
} else {
if (eti->table_model){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
}
eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0);
@ -565,10 +613,10 @@ eti_realize (GnomeCanvasItem *item)
gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
if (eti->cell_views == NULL)
eti_attach_cell_views (eti);
/*
*
*/
eti_realize_cell_views (eti);
eti_compute_height (eti);

View File

@ -38,6 +38,7 @@ typedef struct {
unsigned int draw_focus:1;
unsigned int mode_spreadsheet:1;
unsigned int renderers_can_change_size:1;
unsigned int cell_views_realized:1;
int focused_col, focused_row;

View File

@ -441,21 +441,10 @@ e_table_canvas_realize (GtkWidget *widget)
"y", 0.0,
NULL);
e_table->gen_header_width = e_table_header_total_width (e_table->header);
leaf = e_table_create_nodes (
e_table, e_table->model,
e_table->header, GNOME_CANVAS_GROUP (e_table->root), 0, groups);
{
static int warn_shown;
if (!warn_shown){
g_warning ("Precompute the width, and update on model changes");
warn_shown = 1;
}
}
gnome_canvas_set_scroll_region (
GNOME_CANVAS (e_table_canvas),
0, 0,

View File

@ -30,11 +30,6 @@ typedef struct {
guint spreadsheet:1;
char *group_spec;
/*
* Used during table generation
*/
int gen_header_width;
} ETable;
typedef struct {

View File

@ -1,3 +1,24 @@
1999-12-30 Miguel de Icaza <miguel@gnu.org>
* e-table-item.c (eti_attach_cell_views): New routine, creates the
cell views.
(eti_detach_cell_views): Detaches the cell_views from the
ETableItem.
(eti_realize_cell_views, eti_unrealize_cell_views): Simplified to
just do realize/unrealize notification.
(eti_add_table_model): Only attach the cells when we have both the
table model and the header model.
* e-cell.h (ECellClass): Added two new methods: new_view and
kill_view which drive the view process (instead of putting that on
realize/unrealize).
* e-cell.c: Adapt the code to use the new scheme for view
instantiation.
* e-cell-text.c, e-cell-toggle.c: Adapted to the new class
changes.
1999-12-22 Miguel de Icaza <miguel@helixcode.com>
* e-table-item.c (e_table_item_focus): grab focus here with the

View File

@ -38,7 +38,6 @@ typedef struct {
GdkGC *gc;
GdkFont *font;
GnomeCanvas *canvas;
ETableItem *eti;
/*
* During edition.
@ -51,7 +50,9 @@ static ECellClass *parent_class;
static void
ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
@ -63,7 +64,7 @@ ect_accept_edits (ECellTextView *text_view)
const char *text = gtk_entry_get_text (text_view->edit->entry);
CellEdit *edit = text_view->edit;
e_table_model_set_value_at (text_view->cell_view.table_model, edit->model_col, edit->row, text);
e_table_model_set_value_at (text_view->cell_view.e_table_model, edit->model_col, edit->row, text);
}
/*
@ -84,7 +85,7 @@ ect_stop_editing (ECellTextView *text_view)
text_view->edit = NULL;
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -98,20 +99,19 @@ ect_cancel_edit (ECellTextView *text_view)
}
/*
* ECell::realize method
* ECell::new_view method
*/
static ECellView *
ect_realize (ECell *ecell, ETableModel *table_model, void *view)
ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellText *ect = E_CELL_TEXT (ecell);
ECellTextView *text_view = g_new0 (ECellTextView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
text_view->cell_view.ecell = ecell;
text_view->cell_view.table_model = table_model;
text_view->cell_view.e_table_model = table_model;
text_view->cell_view.e_table_item_view = e_table_item_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
if (ect->font_name){
GdkFont *f;
@ -124,12 +124,36 @@ ect_realize (ECell *ecell, ETableModel *table_model, void *view)
gdk_font_ref (text_view->font);
}
text_view->eti = eti;
text_view->canvas = canvas;
return (ECellView *)text_view;
}
/*
* ECell::kill_view method
*/
static void
ect_kill_view (ECellView *ecv)
{
ECellTextView *text_view = (ECellTextView *) ecv;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
* ECell::realize method
*/
static void
ect_realize (ECellView *ecell_view)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -140,11 +164,6 @@ ect_unrealize (ECellView *ecv)
gdk_gc_unref (text_view->gc);
text_view->gc = NULL;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
@ -159,7 +178,7 @@ ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
ECellTextView *text_view = (ECellTextView *) ecell_view;
GtkWidget *w = GTK_WIDGET (text_view->canvas);
GdkRectangle rect;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
GdkFont *font = text_view->font;
const int height = font->ascent + font->descent;
int xoff;
@ -333,7 +352,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
if (text_view->edit){
printf ("FIXME: Should handle click here\n");
} else
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
break;
case GDK_BUTTON_RELEASE:
@ -351,7 +370,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
}
if (!text_view->edit){
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
ect_edit_select_all (text_view);
}
@ -385,7 +404,7 @@ ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
static void
ect_entry_activate (GtkEntry *entry, ECellTextView *text_view)
{
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -395,7 +414,7 @@ static void *
ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
CellEdit *edit;
edit = g_new (CellEdit, 1);
@ -461,7 +480,9 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = ect_destroy;
ecc->new_view = ect_new_view;
ecc->kill_view = ect_kill_view;
ecc->realize = ect_realize;
ecc->unrealize = ect_unrealize;
ecc->draw = ect_draw;

View File

@ -23,7 +23,6 @@ typedef struct {
ECellView cell_view;
GdkGC *gc;
GnomeCanvas *canvas;
ETableItem *eti;
} ECellToggleView;
static ECellClass *parent_class;
@ -31,28 +30,43 @@ static ECellClass *parent_class;
static void
etog_queue_redraw (ECellToggleView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
* ECell::realize method
*/
static ECellView *
etog_realize (ECell *ecell, ETableModel *table_model, void *view)
etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
toggle_view->cell_view.ecell = ecell;
toggle_view->cell_view.table_model = table_model;
toggle_view->eti = eti;
toggle_view->cell_view.e_table_model = table_model;
toggle_view->cell_view.e_table_item_view = e_table_item_view;
toggle_view->canvas = canvas;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
return (ECellView *) toggle_view;
}
static void
etog_kill_view (ECellView *ecell_view)
{
g_free (ecell_view);
}
static void
etog_realize (ECellView *ecell_view)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -63,8 +77,6 @@ etog_unrealize (ECellView *ecv)
gdk_gc_unref (toggle_view->gc);
toggle_view->gc = NULL;
g_free (toggle_view);
}
/*
@ -81,7 +93,7 @@ etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
ArtPixBuf *art;
int x, y, width, height;
const int value = GPOINTER_TO_INT (
e_table_model_value_at (ecell_view->table_model, model_col, row));
e_table_model_value_at (ecell_view->e_table_model, model_col, row));
if (value >= toggle->n_states){
g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
@ -173,7 +185,7 @@ etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int r
if (value >= toggle->n_states)
value = 0;
e_table_model_set_value_at (toggle_view->cell_view.table_model,
e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
model_col, row, GINT_TO_POINTER (value));
etog_queue_redraw (toggle_view, view_col, row);
}
@ -185,7 +197,7 @@ static gint
etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
void *_value = e_table_model_value_at (ecell_view->table_model, model_col, row);
void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
const int value = GPOINTER_TO_INT (_value);
switch (event->type){
@ -237,7 +249,9 @@ e_cell_toggle_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = etog_destroy;
ecc->new_view = etog_new_view;
ecc->kill_view = etog_kill_view;
ecc->realize = etog_realize;
ecc->unrealize = etog_unrealize;
ecc->draw = etog_draw;

View File

@ -13,11 +13,21 @@
#define PARENT_TYPE gtk_object_get_type()
static ECellView *
ec_realize (ECell *e_cell, ETableModel *table_model, void *view)
ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return NULL;
}
static void
ec_realize (ECellView *e_cell)
{
}
static void
ec_kill_view (ECellView *ecell_view)
{
}
static void
ec_unrealize (ECellView *e_cell)
{
@ -85,6 +95,8 @@ e_cell_class_init (GtkObjectClass *object_class)
ecc->realize = ec_realize;
ecc->unrealize = ec_unrealize;
ecc->new_view = ec_new_view;
ecc->kill_view = ec_kill_view;
ecc->draw = ec_draw;
ecc->event = ec_event;
ecc->focus = ec_focus;
@ -110,10 +122,22 @@ e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_co
}
ECellView *
e_cell_realize (ECell *ecell, ETableModel *table_model, void *view)
e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->realize (
ecell, table_model, view);
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->new_view (
ecell, table_model, e_table_item_view);
}
void
e_cell_view_realize (ECellView *ecell_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->realize (ecell_view);
}
void
e_cell_kill_view (ECellView *ecell_view)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->kill_view (ecell_view);
}
void

View File

@ -19,7 +19,8 @@ struct _ECell {
struct _ECellView {
ECell *ecell;
ETableModel *table_model;
ETableModel *e_table_model;
void *e_table_item_view;
gint focus_x1, focus_y1, focus_x2, focus_y2;
gint focus_col, focus_row;
@ -29,9 +30,13 @@ struct _ECellView {
typedef struct {
GtkObjectClass parent_class;
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
ECellView *(*realize) (ECell *ecell, ETableModel *table_model, void *view);
void (*unrealize) (ECellView *e_cell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
@ -46,9 +51,14 @@ typedef struct {
} ECellClass;
GtkType e_cell_get_type (void);
ECellView *e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void e_cell_kill_view (ECellView *ecell_view);
void e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
ECellView *e_cell_realize (ECell *ecell, ETableModel *table_model, void *view);
void e_cell_realize (ECellView *ecell_view);
void e_cell_unrealize (ECellView *ecell_view);
void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
int model_col, int view_col, int row, gboolean selected,
int x1, int y1, int x2, int y2);

View File

@ -66,6 +66,21 @@ eti_realize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++)
e_cell_view_realize (eti->cell_views [i], eti);
eti->cell_views_realized = 1;
}
static void eti_compute_height (ETableItem *eti);
static void
eti_attach_cell_views (ETableItem *eti)
{
int i;
g_assert (eti->header);
g_assert (eti->table_model);
/*
* Now realize the various ECells
*/
@ -75,35 +90,50 @@ eti_realize_cell_views (ETableItem *eti)
for (i = 0; i < eti->n_cells; i++){
ETableCol *col = e_table_header_get_column (eti->header, i);
eti->cell_views [i] = e_cell_realize (col->ecell, eti->table_model, eti);
eti->cell_views [i] = e_cell_new_view (col->ecell, eti->table_model, eti);
}
eti_compute_height (eti);
}
/*
* During unrealization: we invoke every e-cell (one per column in the current
* setup) to dispose all resources allocated
* setup) to dispose all X resources allocated
*/
static void
eti_unrealize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
if (eti->cell_views_realized == 0)
return;
for (i = 0; i < eti->n_cells; i++)
e_cell_unrealize (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
eti->cell_views_realized = 0;
}
static void
eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
eti_detach_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
e_cell_kill_view (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
}
static void
eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
{
double i2c [6];
ArtPoint c1, c2, i1, i2;
GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
ETableItem *eti = E_TABLE_ITEM (item);
gnome_canvas_item_i2c_affine (item, i2c);
i1.x = eti->x1;
@ -126,12 +156,10 @@ eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
static void
eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
{
ETableItem *eti = E_TABLE_ITEM (item);
if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
(*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
eti_bounds (eti, &item->x1, &item->y1, &item->x2, &item->y2);
eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
}
@ -172,8 +200,14 @@ eti_remove_header_model (ETableItem *eti)
eti->header_structure_change_id);
gtk_signal_disconnect (GTK_OBJECT (eti->header),
eti->header_dim_change_id);
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
}
gtk_object_unref (GTK_OBJECT (eti->header));
eti->header_structure_change_id = 0;
eti->header_dim_change_id = 0;
eti->header = NULL;
@ -192,6 +226,8 @@ eti_row_height (ETableItem *eti, int row)
int col;
int h, max_h;
g_assert (eti->cell_views);
max_h = 0;
for (col = 0; col < cols; col++){
@ -395,7 +431,12 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model)
eti->table_model_row_change_id = gtk_signal_connect (
GTK_OBJECT (table_model), "model_row_changed",
GTK_SIGNAL_FUNC (eti_table_model_row_changed), eti);
if (eti->header){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
eti_table_model_changed (table_model, eti);
}
@ -420,7 +461,14 @@ eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
eti_realize_cell_views (eti);
} else {
if (eti->table_model){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
}
eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0);
@ -565,10 +613,10 @@ eti_realize (GnomeCanvasItem *item)
gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
if (eti->cell_views == NULL)
eti_attach_cell_views (eti);
/*
*
*/
eti_realize_cell_views (eti);
eti_compute_height (eti);

View File

@ -38,6 +38,7 @@ typedef struct {
unsigned int draw_focus:1;
unsigned int mode_spreadsheet:1;
unsigned int renderers_can_change_size:1;
unsigned int cell_views_realized:1;
int focused_col, focused_row;

View File

@ -441,21 +441,10 @@ e_table_canvas_realize (GtkWidget *widget)
"y", 0.0,
NULL);
e_table->gen_header_width = e_table_header_total_width (e_table->header);
leaf = e_table_create_nodes (
e_table, e_table->model,
e_table->header, GNOME_CANVAS_GROUP (e_table->root), 0, groups);
{
static int warn_shown;
if (!warn_shown){
g_warning ("Precompute the width, and update on model changes");
warn_shown = 1;
}
}
gnome_canvas_set_scroll_region (
GNOME_CANVAS (e_table_canvas),
0, 0,

View File

@ -30,11 +30,6 @@ typedef struct {
guint spreadsheet:1;
char *group_spec;
/*
* Used during table generation
*/
int gen_header_width;
} ETable;
typedef struct {

View File

@ -38,7 +38,6 @@ typedef struct {
GdkGC *gc;
GdkFont *font;
GnomeCanvas *canvas;
ETableItem *eti;
/*
* During edition.
@ -51,7 +50,9 @@ static ECellClass *parent_class;
static void
ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
@ -63,7 +64,7 @@ ect_accept_edits (ECellTextView *text_view)
const char *text = gtk_entry_get_text (text_view->edit->entry);
CellEdit *edit = text_view->edit;
e_table_model_set_value_at (text_view->cell_view.table_model, edit->model_col, edit->row, text);
e_table_model_set_value_at (text_view->cell_view.e_table_model, edit->model_col, edit->row, text);
}
/*
@ -84,7 +85,7 @@ ect_stop_editing (ECellTextView *text_view)
text_view->edit = NULL;
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -98,20 +99,19 @@ ect_cancel_edit (ECellTextView *text_view)
}
/*
* ECell::realize method
* ECell::new_view method
*/
static ECellView *
ect_realize (ECell *ecell, ETableModel *table_model, void *view)
ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellText *ect = E_CELL_TEXT (ecell);
ECellTextView *text_view = g_new0 (ECellTextView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
text_view->cell_view.ecell = ecell;
text_view->cell_view.table_model = table_model;
text_view->cell_view.e_table_model = table_model;
text_view->cell_view.e_table_item_view = e_table_item_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
if (ect->font_name){
GdkFont *f;
@ -124,12 +124,36 @@ ect_realize (ECell *ecell, ETableModel *table_model, void *view)
gdk_font_ref (text_view->font);
}
text_view->eti = eti;
text_view->canvas = canvas;
return (ECellView *)text_view;
}
/*
* ECell::kill_view method
*/
static void
ect_kill_view (ECellView *ecv)
{
ECellTextView *text_view = (ECellTextView *) ecv;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
* ECell::realize method
*/
static void
ect_realize (ECellView *ecell_view)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -140,11 +164,6 @@ ect_unrealize (ECellView *ecv)
gdk_gc_unref (text_view->gc);
text_view->gc = NULL;
gdk_font_unref (text_view->font);
text_view->font = NULL;
g_free (text_view);
}
/*
@ -159,7 +178,7 @@ ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
ECellTextView *text_view = (ECellTextView *) ecell_view;
GtkWidget *w = GTK_WIDGET (text_view->canvas);
GdkRectangle rect;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
GdkFont *font = text_view->font;
const int height = font->ascent + font->descent;
int xoff;
@ -333,7 +352,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
if (text_view->edit){
printf ("FIXME: Should handle click here\n");
} else
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
break;
case GDK_BUTTON_RELEASE:
@ -351,7 +370,7 @@ ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col,
}
if (!text_view->edit){
e_table_item_enter_edit (text_view->eti, view_col, row);
e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
ect_edit_select_all (text_view);
}
@ -385,7 +404,7 @@ ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
static void
ect_entry_activate (GtkEntry *entry, ECellTextView *text_view)
{
e_table_item_leave_edit (text_view->eti);
e_table_item_leave_edit (text_view->cell_view.e_table_item_view);
}
/*
@ -395,7 +414,7 @@ static void *
ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
{
ECellTextView *text_view = (ECellTextView *) ecell_view;
const char *str = e_table_model_value_at (ecell_view->table_model, model_col, row);
const char *str = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
CellEdit *edit;
edit = g_new (CellEdit, 1);
@ -461,7 +480,9 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = ect_destroy;
ecc->new_view = ect_new_view;
ecc->kill_view = ect_kill_view;
ecc->realize = ect_realize;
ecc->unrealize = ect_unrealize;
ecc->draw = ect_draw;

View File

@ -23,7 +23,6 @@ typedef struct {
ECellView cell_view;
GdkGC *gc;
GnomeCanvas *canvas;
ETableItem *eti;
} ECellToggleView;
static ECellClass *parent_class;
@ -31,28 +30,43 @@ static ECellClass *parent_class;
static void
etog_queue_redraw (ECellToggleView *text_view, int view_col, int view_row)
{
e_table_item_redraw_range (text_view->eti, view_col, view_row, view_col, view_row);
e_table_item_redraw_range (
text_view->cell_view.e_table_item_view,
view_col, view_row, view_col, view_row);
}
/*
* ECell::realize method
*/
static ECellView *
etog_realize (ECell *ecell, ETableModel *table_model, void *view)
etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
toggle_view->cell_view.ecell = ecell;
toggle_view->cell_view.table_model = table_model;
toggle_view->eti = eti;
toggle_view->cell_view.e_table_model = table_model;
toggle_view->cell_view.e_table_item_view = e_table_item_view;
toggle_view->canvas = canvas;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
return (ECellView *) toggle_view;
}
static void
etog_kill_view (ECellView *ecell_view)
{
g_free (ecell_view);
}
static void
etog_realize (ECellView *ecell_view)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
}
/*
* ECell::unrealize method
*/
@ -63,8 +77,6 @@ etog_unrealize (ECellView *ecv)
gdk_gc_unref (toggle_view->gc);
toggle_view->gc = NULL;
g_free (toggle_view);
}
/*
@ -81,7 +93,7 @@ etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
ArtPixBuf *art;
int x, y, width, height;
const int value = GPOINTER_TO_INT (
e_table_model_value_at (ecell_view->table_model, model_col, row));
e_table_model_value_at (ecell_view->e_table_model, model_col, row));
if (value >= toggle->n_states){
g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
@ -173,7 +185,7 @@ etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int r
if (value >= toggle->n_states)
value = 0;
e_table_model_set_value_at (toggle_view->cell_view.table_model,
e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
model_col, row, GINT_TO_POINTER (value));
etog_queue_redraw (toggle_view, view_col, row);
}
@ -185,7 +197,7 @@ static gint
etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row)
{
ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
void *_value = e_table_model_value_at (ecell_view->table_model, model_col, row);
void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
const int value = GPOINTER_TO_INT (_value);
switch (event->type){
@ -237,7 +249,9 @@ e_cell_toggle_class_init (GtkObjectClass *object_class)
ECellClass *ecc = (ECellClass *) object_class;
object_class->destroy = etog_destroy;
ecc->new_view = etog_new_view;
ecc->kill_view = etog_kill_view;
ecc->realize = etog_realize;
ecc->unrealize = etog_unrealize;
ecc->draw = etog_draw;

View File

@ -13,11 +13,21 @@
#define PARENT_TYPE gtk_object_get_type()
static ECellView *
ec_realize (ECell *e_cell, ETableModel *table_model, void *view)
ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return NULL;
}
static void
ec_realize (ECellView *e_cell)
{
}
static void
ec_kill_view (ECellView *ecell_view)
{
}
static void
ec_unrealize (ECellView *e_cell)
{
@ -85,6 +95,8 @@ e_cell_class_init (GtkObjectClass *object_class)
ecc->realize = ec_realize;
ecc->unrealize = ec_unrealize;
ecc->new_view = ec_new_view;
ecc->kill_view = ec_kill_view;
ecc->draw = ec_draw;
ecc->event = ec_event;
ecc->focus = ec_focus;
@ -110,10 +122,22 @@ e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_co
}
ECellView *
e_cell_realize (ECell *ecell, ETableModel *table_model, void *view)
e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->realize (
ecell, table_model, view);
return E_CELL_CLASS (GTK_OBJECT (ecell)->klass)->new_view (
ecell, table_model, e_table_item_view);
}
void
e_cell_view_realize (ECellView *ecell_view)
{
return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->realize (ecell_view);
}
void
e_cell_kill_view (ECellView *ecell_view)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->kill_view (ecell_view);
}
void

View File

@ -19,7 +19,8 @@ struct _ECell {
struct _ECellView {
ECell *ecell;
ETableModel *table_model;
ETableModel *e_table_model;
void *e_table_item_view;
gint focus_x1, focus_y1, focus_x2, focus_y2;
gint focus_col, focus_row;
@ -29,9 +30,13 @@ struct _ECellView {
typedef struct {
GtkObjectClass parent_class;
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
ECellView *(*realize) (ECell *ecell, ETableModel *table_model, void *view);
void (*unrealize) (ECellView *e_cell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
@ -46,9 +51,14 @@ typedef struct {
} ECellClass;
GtkType e_cell_get_type (void);
ECellView *e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void e_cell_kill_view (ECellView *ecell_view);
void e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
ECellView *e_cell_realize (ECell *ecell, ETableModel *table_model, void *view);
void e_cell_realize (ECellView *ecell_view);
void e_cell_unrealize (ECellView *ecell_view);
void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
int model_col, int view_col, int row, gboolean selected,
int x1, int y1, int x2, int y2);

View File

@ -66,6 +66,21 @@ eti_realize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++)
e_cell_view_realize (eti->cell_views [i], eti);
eti->cell_views_realized = 1;
}
static void eti_compute_height (ETableItem *eti);
static void
eti_attach_cell_views (ETableItem *eti)
{
int i;
g_assert (eti->header);
g_assert (eti->table_model);
/*
* Now realize the various ECells
*/
@ -75,35 +90,50 @@ eti_realize_cell_views (ETableItem *eti)
for (i = 0; i < eti->n_cells; i++){
ETableCol *col = e_table_header_get_column (eti->header, i);
eti->cell_views [i] = e_cell_realize (col->ecell, eti->table_model, eti);
eti->cell_views [i] = e_cell_new_view (col->ecell, eti->table_model, eti);
}
eti_compute_height (eti);
}
/*
* During unrealization: we invoke every e-cell (one per column in the current
* setup) to dispose all resources allocated
* setup) to dispose all X resources allocated
*/
static void
eti_unrealize_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
if (eti->cell_views_realized == 0)
return;
for (i = 0; i < eti->n_cells; i++)
e_cell_unrealize (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
eti->cell_views_realized = 0;
}
static void
eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
eti_detach_cell_views (ETableItem *eti)
{
int i;
for (i = 0; i < eti->n_cells; i++){
e_cell_kill_view (eti->cell_views [i]);
eti->cell_views [i] = NULL;
}
g_free (eti->cell_views);
eti->cell_views = NULL;
eti->n_cells = 0;
}
static void
eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
{
double i2c [6];
ArtPoint c1, c2, i1, i2;
GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
ETableItem *eti = E_TABLE_ITEM (item);
gnome_canvas_item_i2c_affine (item, i2c);
i1.x = eti->x1;
@ -126,12 +156,10 @@ eti_bounds (ETableItem *eti, double *x1, double *y1, double *x2, double *y2)
static void
eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
{
ETableItem *eti = E_TABLE_ITEM (item);
if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
(*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
eti_bounds (eti, &item->x1, &item->y1, &item->x2, &item->y2);
eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
}
@ -172,8 +200,14 @@ eti_remove_header_model (ETableItem *eti)
eti->header_structure_change_id);
gtk_signal_disconnect (GTK_OBJECT (eti->header),
eti->header_dim_change_id);
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
}
gtk_object_unref (GTK_OBJECT (eti->header));
eti->header_structure_change_id = 0;
eti->header_dim_change_id = 0;
eti->header = NULL;
@ -192,6 +226,8 @@ eti_row_height (ETableItem *eti, int row)
int col;
int h, max_h;
g_assert (eti->cell_views);
max_h = 0;
for (col = 0; col < cols; col++){
@ -395,7 +431,12 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model)
eti->table_model_row_change_id = gtk_signal_connect (
GTK_OBJECT (table_model), "model_row_changed",
GTK_SIGNAL_FUNC (eti_table_model_row_changed), eti);
if (eti->header){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
eti_table_model_changed (table_model, eti);
}
@ -420,7 +461,14 @@ eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
if (eti->cell_views){
eti_unrealize_cell_views (eti);
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
eti_realize_cell_views (eti);
} else {
if (eti->table_model){
eti_detach_cell_views (eti);
eti_attach_cell_views (eti);
}
}
eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0);
@ -565,10 +613,10 @@ eti_realize (GnomeCanvasItem *item)
gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
if (eti->cell_views == NULL)
eti_attach_cell_views (eti);
/*
*
*/
eti_realize_cell_views (eti);
eti_compute_height (eti);

View File

@ -38,6 +38,7 @@ typedef struct {
unsigned int draw_focus:1;
unsigned int mode_spreadsheet:1;
unsigned int renderers_can_change_size:1;
unsigned int cell_views_realized:1;
int focused_col, focused_row;

View File

@ -441,21 +441,10 @@ e_table_canvas_realize (GtkWidget *widget)
"y", 0.0,
NULL);
e_table->gen_header_width = e_table_header_total_width (e_table->header);
leaf = e_table_create_nodes (
e_table, e_table->model,
e_table->header, GNOME_CANVAS_GROUP (e_table->root), 0, groups);
{
static int warn_shown;
if (!warn_shown){
g_warning ("Precompute the width, and update on model changes");
warn_shown = 1;
}
}
gnome_canvas_set_scroll_region (
GNOME_CANVAS (e_table_canvas),
0, 0,

View File

@ -30,11 +30,6 @@ typedef struct {
guint spreadsheet:1;
char *group_spec;
/*
* Used during table generation
*/
int gen_header_width;
} ETable;
typedef struct {