From 5fbcc4828efb084344e9c5fd42ebccb288ee492f Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Wed, 2 Aug 2000 16:56:26 +0000 Subject: Add a handler for "model_pre_change" and properly stop editing. 2000-08-02 Christopher James Lahey * e-table-item.c, e-table-item.h: Add a handler for "model_pre_change" and properly stop editing. * e-table-model.c, e-table-model.h: Added a "model_pre_change" signal that gets sent before any row numbers are changed. * e-table-sorted-variable.c, e-table-subset-variable.c: Emit "model_pre_change" signals as appropriate. * e-table-subset.c, e-table-subset.h: Proxy "model_pre_changed" signals. svn path=/trunk/; revision=4472 --- widgets/table/e-table-item.c | 42 +++++++++++++++++++++++++++------ widgets/table/e-table-item.h | 1 + widgets/table/e-table-model.c | 19 +++++++++++++++ widgets/table/e-table-model.h | 3 +++ widgets/table/e-table-sorted-variable.c | 12 ++++++++-- widgets/table/e-table-subset-variable.c | 8 ++++++- widgets/table/e-table-subset.c | 11 +++++++++ widgets/table/e-table-subset.h | 1 + 8 files changed, 87 insertions(+), 10 deletions(-) (limited to 'widgets/table') diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index 4eac94ed41..1ecd119133 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -302,6 +302,8 @@ eti_remove_table_model (ETableItem *eti) if (!eti->table_model) return; + gtk_signal_disconnect (GTK_OBJECT (eti->table_model), + eti->table_model_pre_change_id); gtk_signal_disconnect (GTK_OBJECT (eti->table_model), eti->table_model_change_id); gtk_signal_disconnect (GTK_OBJECT (eti->table_model), @@ -316,6 +318,7 @@ eti_remove_table_model (ETableItem *eti) if (eti->source_model) gtk_object_unref (GTK_OBJECT (eti->source_model)); + eti->table_model_pre_change_id = 0; eti->table_model_change_id = 0; eti->table_model_row_change_id = 0; eti->table_model_cell_change_id = 0; @@ -558,6 +561,16 @@ eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1) gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1); } +/* + * Callback routine: invoked before the ETableModel has suffers a change + */ +static void +eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti) +{ + if (eti_editing (eti)) + e_table_item_leave_edit (eti); +} + /* * Callback routine: invoked when the ETableModel has suffered a change */ @@ -720,7 +733,11 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model) eti->table_model = table_model; gtk_object_ref (GTK_OBJECT (eti->table_model)); - + + eti->table_model_pre_change_id = gtk_signal_connect ( + GTK_OBJECT (table_model), "model_pre_change", + GTK_SIGNAL_FUNC (eti_table_model_pre_change), eti); + eti->table_model_change_id = gtk_signal_connect ( GTK_OBJECT (table_model), "model_changed", GTK_SIGNAL_FUNC (eti_table_model_changed), eti); @@ -841,12 +858,12 @@ eti_destroy (GtkObject *object) if (eti->selection) gtk_object_unref(GTK_OBJECT(eti->selection)); - + if (eti->height_cache_idle_id) g_source_remove(eti->height_cache_idle_id); - + g_free (eti->height_cache); - + if (GTK_OBJECT_CLASS (eti_parent_class)->destroy) (*GTK_OBJECT_CLASS (eti_parent_class)->destroy) (object); } @@ -1033,6 +1050,9 @@ eti_unrealize (GnomeCanvasItem *item) { ETableItem *eti = E_TABLE_ITEM (item); + if (eti_editing (eti)) + e_table_item_leave_edit (eti); + gdk_gc_unref (eti->fill_gc); eti->fill_gc = NULL; gdk_gc_unref (eti->grid_gc); @@ -1844,18 +1864,26 @@ e_table_item_enter_edit (ETableItem *eti, int col, int row) void e_table_item_leave_edit (ETableItem *eti) { + int col, row; + void *edit_ctx; + g_return_if_fail (eti != NULL); g_return_if_fail (E_IS_TABLE_ITEM (eti)); if (!eti_editing (eti)) return; - e_cell_leave_edit (eti->cell_views [eti->editing_col], - view_to_model_col(eti, eti->editing_col), eti->editing_col, eti->editing_row, - eti->edit_ctx); + col = eti->editing_col; + row = eti->editing_row; + edit_ctx = eti->edit_ctx; + eti->editing_col = -1; eti->editing_row = -1; eti->edit_ctx = NULL; + + e_cell_leave_edit (eti->cell_views [col], + view_to_model_col(eti, col), + col, row, edit_ctx); } typedef struct { diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h index 7102ef3ef7..b6b441c9d4 100644 --- a/widgets/table/e-table-item.h +++ b/widgets/table/e-table-item.h @@ -40,6 +40,7 @@ typedef struct { */ int header_dim_change_id; int header_structure_change_id; + int table_model_pre_change_id; int table_model_change_id; int table_model_row_change_id; int table_model_cell_change_id; diff --git a/widgets/table/e-table-model.c b/widgets/table/e-table-model.c index 7f07bd9787..f47fb7afb2 100644 --- a/widgets/table/e-table-model.c +++ b/widgets/table/e-table-model.c @@ -20,6 +20,7 @@ static GtkObjectClass *e_table_model_parent_class; enum { MODEL_CHANGED, + MODEL_PRE_CHANGE, MODEL_ROW_CHANGED, MODEL_CELL_CHANGED, MODEL_ROW_INSERTED, @@ -176,6 +177,14 @@ e_table_model_class_init (GtkObjectClass *object_class) gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); + e_table_model_signals [MODEL_PRE_CHANGE] = + gtk_signal_new ("model_pre_change", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (ETableModelClass, model_pre_change), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + e_table_model_signals [MODEL_ROW_CHANGED] = gtk_signal_new ("model_row_changed", GTK_RUN_LAST, @@ -255,6 +264,16 @@ e_table_model_get_type (void) return type; } +void +e_table_model_pre_change (ETableModel *e_table_model) +{ + g_return_if_fail (e_table_model != NULL); + g_return_if_fail (E_IS_TABLE_MODEL (e_table_model)); + + gtk_signal_emit (GTK_OBJECT (e_table_model), + e_table_model_signals [MODEL_PRE_CHANGE]); +} + void e_table_model_changed (ETableModel *e_table_model) { diff --git a/widgets/table/e-table-model.h b/widgets/table/e-table-model.h index 447903c83a..d4fae1659e 100644 --- a/widgets/table/e-table-model.h +++ b/widgets/table/e-table-model.h @@ -50,6 +50,8 @@ typedef struct { * A row inserted: row_inserted * A row deleted: row_deleted */ + void (*model_pre_change) (ETableModel *etm); + void (*model_changed) (ETableModel *etm); void (*model_row_changed) (ETableModel *etm, int row); void (*model_cell_changed) (ETableModel *etm, int col, int row); @@ -76,6 +78,7 @@ char *e_table_model_value_to_string (ETableModel *e_table_model, int col, /* * Routines for emitting signals on the e_table */ +void e_table_model_pre_change (ETableModel *e_table_model); void e_table_model_changed (ETableModel *e_table_model); void e_table_model_row_changed (ETableModel *e_table_model, int row); void e_table_model_cell_changed (ETableModel *e_table_model, int col, int row); diff --git a/widgets/table/e-table-sorted-variable.c b/widgets/table/e-table-sorted-variable.c index a5472d7bce..958daca1de 100644 --- a/widgets/table/e-table-sorted-variable.c +++ b/widgets/table/e-table-sorted-variable.c @@ -169,8 +169,12 @@ etsv_add_all (ETableSubsetVariable *etssv) ETableModel *etm = E_TABLE_MODEL(etssv); ETableSubset *etss = E_TABLE_SUBSET(etssv); ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv); - int rows = e_table_model_row_count(etss->source); + int rows; int i; + + e_table_model_pre_change(etm); + + rows = e_table_model_row_count(etss->source); if (etss->n_map + rows > etssv->n_vals_allocated){ etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows); @@ -285,13 +289,17 @@ etsv_sort(ETableSortedVariable *etsv) ETableSubset *etss = E_TABLE_SUBSET(etsv); static int reentering = 0; int rows = E_TABLE_SUBSET(etsv)->n_map; - int total_rows = e_table_model_row_count(E_TABLE_SUBSET(etsv)->source); + int total_rows; int i; int j; int cols; if (reentering) return; reentering = 1; + + e_table_model_pre_change(E_TABLE_MODEL(etsv)); + + total_rows = e_table_model_row_count(E_TABLE_SUBSET(etsv)->source); cols = e_table_sort_info_sorting_get_count(etsv->sort_info); cols_closure = cols; etsv_closure = etsv; diff --git a/widgets/table/e-table-subset-variable.c b/widgets/table/e-table-subset-variable.c index 377b21c9ae..f418337092 100644 --- a/widgets/table/e-table-subset-variable.c +++ b/widgets/table/e-table-subset-variable.c @@ -30,6 +30,8 @@ etssv_add (ETableSubsetVariable *etssv, ETableSubset *etss = E_TABLE_SUBSET(etssv); int i; + e_table_model_pre_change(etm); + if (etss->n_map + 1 > etssv->n_vals_allocated){ etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated + INCREMENT_AMOUNT) * sizeof(int)); etssv->n_vals_allocated += INCREMENT_AMOUNT; @@ -48,9 +50,12 @@ etssv_add_all (ETableSubsetVariable *etssv) { ETableModel *etm = E_TABLE_MODEL(etssv); ETableSubset *etss = E_TABLE_SUBSET(etssv); - int rows = e_table_model_row_count(etss->source); + int rows; int i; + + e_table_model_pre_change(etm); + rows = e_table_model_row_count(etss->source); if (etss->n_map + rows > etssv->n_vals_allocated){ etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows); etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int)); @@ -72,6 +77,7 @@ etssv_remove (ETableSubsetVariable *etssv, for (i = 0; i < etss->n_map; i++){ if (etss->map_table[i] == row) { + e_table_model_pre_change (etm); memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int)); etss->n_map --; diff --git a/widgets/table/e-table-subset.c b/widgets/table/e-table-subset.c index 8ba5ed03e3..1cac0f88ea 100644 --- a/widgets/table/e-table-subset.c +++ b/widgets/table/e-table-subset.c @@ -25,6 +25,8 @@ etss_destroy (GtkObject *object) if (etss->source) gtk_object_unref (GTK_OBJECT (etss->source)); + gtk_signal_disconnect (GTK_OBJECT (etss->source), + etss->table_model_pre_change_id); gtk_signal_disconnect (GTK_OBJECT (etss->source), etss->table_model_changed_id); gtk_signal_disconnect (GTK_OBJECT (etss->source), @@ -32,6 +34,7 @@ etss_destroy (GtkObject *object) gtk_signal_disconnect (GTK_OBJECT (etss->source), etss->table_model_cell_changed_id); + etss->table_model_pre_change_id = 0; etss->table_model_changed_id = 0; etss->table_model_row_changed_id = 0; etss->table_model_cell_changed_id = 0; @@ -152,6 +155,12 @@ etss_class_init (GtkObjectClass *klass) E_MAKE_TYPE(e_table_subset, "ETableSubset", ETableSubset, etss_class_init, NULL, PARENT_TYPE); +static void +etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss) +{ + e_table_model_pre_change (E_TABLE_MODEL (etss)); +} + static void etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss) { @@ -206,6 +215,8 @@ e_table_subset_construct (ETableSubset *etss, ETableModel *source, int nvals) for (i = 0; i < nvals; i++) etss->map_table [i] = i; + etss->table_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "model_pre_change", + GTK_SIGNAL_FUNC (etss_proxy_model_pre_change), etss); etss->table_model_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_changed", GTK_SIGNAL_FUNC (etss_proxy_model_changed), etss); etss->table_model_row_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_row_changed", diff --git a/widgets/table/e-table-subset.h b/widgets/table/e-table-subset.h index 074120a410..9e10de7a4b 100644 --- a/widgets/table/e-table-subset.h +++ b/widgets/table/e-table-subset.h @@ -18,6 +18,7 @@ typedef struct { int n_map; int *map_table; + int table_model_pre_change_id; int table_model_changed_id; int table_model_row_changed_id; int table_model_cell_changed_id; -- cgit v1.2.3