Added frozen_count variable to know not to show the cursor while a change
2001-10-31 Christopher James Lahey <clahey@ximian.com> * e-table-item.c, e-table-item.h: Added frozen_count variable to know not to show the cursor while a change is going on. * e-table-model.c, e-table-model.h, e-tree-model.c, e-tree-model.h: Added a model_no_change signal to pair with a pre_change if there's no change. * e-table-selection-model.h: Removed an unused frozen field here. * e-table-sorted.c, e-table-subset.c, e-table-subset.h, e-table-without.c, e-tree-memory.c, e-tree-sorted.c, e-tree-table-adapter.c: Made sure pre_changes were all matched by some change. Proxy no_change signal where appropriate. * e-tree-selection-model.c: Keep track of the frozen_count variable to know whether a change is going on. svn path=/trunk/; revision=14523
This commit is contained in:
committed by
Chris Lahey
parent
a06c0a0d12
commit
23587bebe8
@ -457,6 +457,8 @@ eti_remove_table_model (ETableItem *eti)
|
||||
|
||||
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_no_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
|
||||
eti->table_model_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (eti->table_model),
|
||||
@ -472,6 +474,7 @@ eti_remove_table_model (ETableItem *eti)
|
||||
gtk_object_unref (GTK_OBJECT (eti->source_model));
|
||||
|
||||
eti->table_model_pre_change_id = 0;
|
||||
eti->table_model_no_change_id = 0;
|
||||
eti->table_model_change_id = 0;
|
||||
eti->table_model_row_change_id = 0;
|
||||
eti->table_model_cell_change_id = 0;
|
||||
@ -840,6 +843,11 @@ eti_show_cursor (ETableItem *eti, int delay)
|
||||
|
||||
if (!((GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) && eti->cell_views_realized))
|
||||
return;
|
||||
|
||||
if (eti->frozen_count > 0) {
|
||||
eti->queue_show_cursor = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_object_get(GTK_OBJECT(eti->selection),
|
||||
"cursor_row", &cursor_row,
|
||||
@ -881,6 +889,10 @@ eti_check_cursor_bounds (ETableItem *eti)
|
||||
|
||||
if (!((GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) && eti->cell_views_realized))
|
||||
return;
|
||||
|
||||
if (eti->frozen_count > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_object_get(GTK_OBJECT(eti->selection),
|
||||
"cursor_row", &cursor_row,
|
||||
@ -957,8 +969,25 @@ eti_cancel_drag_due_to_model_change (ETableItem *eti)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eti_freeze (ETableItem *eti)
|
||||
{
|
||||
eti->frozen_count ++;
|
||||
}
|
||||
|
||||
static void
|
||||
eti_unfreeze (ETableItem *eti)
|
||||
{
|
||||
eti->frozen_count --;
|
||||
if (eti->frozen_count == 0 && eti->queue_show_cursor) {
|
||||
eti_show_cursor (eti, 0);
|
||||
eti_check_cursor_bounds (eti);
|
||||
eti->queue_show_cursor = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback routine: invoked before the ETableModel has suffers a change
|
||||
* Callback routine: invoked before the ETableModel suffers a change
|
||||
*/
|
||||
static void
|
||||
eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
|
||||
@ -967,6 +996,16 @@ eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
|
||||
eti_check_cursor_bounds (eti);
|
||||
if (eti_editing (eti))
|
||||
e_table_item_leave_edit_(eti);
|
||||
eti_freeze (eti);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback routine: invoked when the ETableModel has not suffered a change
|
||||
*/
|
||||
static void
|
||||
eti_table_model_no_change (ETableModel *table_model, ETableItem *eti)
|
||||
{
|
||||
eti_unfreeze (eti);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -976,13 +1015,17 @@ eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
|
||||
static void
|
||||
eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
|
||||
{
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
|
||||
eti_unfreeze (eti);
|
||||
return;
|
||||
}
|
||||
|
||||
eti->rows = e_table_model_row_count (eti->table_model);
|
||||
|
||||
free_height_cache(eti);
|
||||
|
||||
eti_unfreeze (eti);
|
||||
|
||||
eti->needs_compute_height = 1;
|
||||
e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
|
||||
eti->needs_redraw = 1;
|
||||
@ -994,36 +1037,46 @@ eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
|
||||
static void
|
||||
eti_table_model_row_changed (ETableModel *table_model, int row, ETableItem *eti)
|
||||
{
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
|
||||
eti_unfreeze (eti);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!eti->uniform_row_height) && eti->height_cache && eti->height_cache[row] != -1 && eti_row_height_real(eti, row) != eti->height_cache[row]) {
|
||||
eti_table_model_changed (table_model, eti);
|
||||
return;
|
||||
}
|
||||
|
||||
eti_unfreeze (eti);
|
||||
|
||||
eti_request_region_redraw (eti, 0, row, eti->cols - 1, row, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
eti_table_model_cell_changed (ETableModel *table_model, int col, int row, ETableItem *eti)
|
||||
{
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
|
||||
eti_unfreeze (eti);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!eti->uniform_row_height) && eti->height_cache && eti->height_cache[row] != -1 && eti_row_height_real(eti, row) != eti->height_cache[row]) {
|
||||
eti_table_model_changed (table_model, eti);
|
||||
return;
|
||||
}
|
||||
|
||||
eti_unfreeze (eti);
|
||||
|
||||
eti_request_region_redraw (eti, 0, row, eti->cols - 1, row, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
eti_table_model_rows_inserted (ETableModel *table_model, int row, int count, ETableItem *eti)
|
||||
{
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
|
||||
eti_unfreeze (eti);
|
||||
return;
|
||||
}
|
||||
eti->rows = e_table_model_row_count (eti->table_model);
|
||||
|
||||
if (eti->height_cache) {
|
||||
@ -1034,6 +1087,8 @@ eti_table_model_rows_inserted (ETableModel *table_model, int row, int count, ETa
|
||||
eti->height_cache[i] = -1;
|
||||
}
|
||||
|
||||
eti_unfreeze (eti);
|
||||
|
||||
eti_idle_maybe_show_cursor(eti);
|
||||
|
||||
eti->needs_compute_height = 1;
|
||||
@ -1045,8 +1100,10 @@ eti_table_model_rows_inserted (ETableModel *table_model, int row, int count, ETa
|
||||
static void
|
||||
eti_table_model_rows_deleted (ETableModel *table_model, int row, int count, ETableItem *eti)
|
||||
{
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
|
||||
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
|
||||
eti_unfreeze (eti);
|
||||
return;
|
||||
}
|
||||
|
||||
g_assert (eti->rows == -1 || row + count <= eti->rows);
|
||||
|
||||
@ -1058,6 +1115,8 @@ eti_table_model_rows_deleted (ETableModel *table_model, int row, int count, ETab
|
||||
memmove(eti->height_cache + row, eti->height_cache + row + count, (eti->rows - row) * sizeof(int));
|
||||
}
|
||||
|
||||
eti_unfreeze (eti);
|
||||
|
||||
eti_idle_maybe_show_cursor(eti);
|
||||
|
||||
eti->needs_compute_height = 1;
|
||||
@ -1116,6 +1175,10 @@ eti_add_table_model (ETableItem *eti, ETableModel *table_model)
|
||||
GTK_OBJECT (table_model), "model_pre_change",
|
||||
GTK_SIGNAL_FUNC (eti_table_model_pre_change), eti);
|
||||
|
||||
eti->table_model_no_change_id = gtk_signal_connect (
|
||||
GTK_OBJECT (table_model), "model_no_change",
|
||||
GTK_SIGNAL_FUNC (eti_table_model_no_change), eti);
|
||||
|
||||
eti->table_model_change_id = gtk_signal_connect (
|
||||
GTK_OBJECT (table_model), "model_changed",
|
||||
GTK_SIGNAL_FUNC (eti_table_model_changed), eti);
|
||||
@ -1464,6 +1527,9 @@ eti_init (GnomeCanvasItem *item)
|
||||
|
||||
eti->rows = -1;
|
||||
|
||||
eti->frozen_count = 0;
|
||||
eti->queue_show_cursor = FALSE;
|
||||
|
||||
e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow);
|
||||
}
|
||||
|
||||
@ -2834,6 +2900,7 @@ eti_cursor_activated (ESelectionModel *selection, int row, int col, ETableItem *
|
||||
} else {
|
||||
eti_show_cursor(eti, 0);
|
||||
}
|
||||
eti_check_cursor_bounds (eti);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -63,6 +63,7 @@ typedef struct {
|
||||
int header_structure_change_id;
|
||||
int header_request_width_id;
|
||||
int table_model_pre_change_id;
|
||||
int table_model_no_change_id;
|
||||
int table_model_change_id;
|
||||
int table_model_row_change_id;
|
||||
int table_model_cell_change_id;
|
||||
@ -107,6 +108,10 @@ typedef struct {
|
||||
guint cursor_on_screen : 1;
|
||||
guint gtk_grabbed : 1;
|
||||
|
||||
guint queue_show_cursor : 1;
|
||||
|
||||
int frozen_count;
|
||||
|
||||
int cursor_x1;
|
||||
int cursor_y1;
|
||||
int cursor_x2;
|
||||
|
||||
@ -38,6 +38,7 @@ d(static gint depth = 0);
|
||||
static GtkObjectClass *e_table_model_parent_class;
|
||||
|
||||
enum {
|
||||
MODEL_NO_CHANGE,
|
||||
MODEL_CHANGED,
|
||||
MODEL_PRE_CHANGE,
|
||||
MODEL_ROW_CHANGED,
|
||||
@ -272,6 +273,15 @@ e_table_model_class_init (GtkObjectClass *object_class)
|
||||
|
||||
object_class->destroy = e_table_model_destroy;
|
||||
|
||||
e_table_model_signals [MODEL_NO_CHANGE] =
|
||||
gtk_signal_new ("model_no_change",
|
||||
GTK_RUN_LAST,
|
||||
E_OBJECT_CLASS_TYPE (object_class),
|
||||
GTK_SIGNAL_OFFSET (ETableModelClass, model_no_change),
|
||||
gtk_marshal_NONE__NONE,
|
||||
GTK_TYPE_NONE, 0);
|
||||
|
||||
|
||||
e_table_model_signals [MODEL_CHANGED] =
|
||||
gtk_signal_new ("model_changed",
|
||||
GTK_RUN_LAST,
|
||||
@ -341,6 +351,7 @@ e_table_model_class_init (GtkObjectClass *object_class)
|
||||
klass->value_is_empty = NULL;
|
||||
klass->value_to_string = NULL;
|
||||
|
||||
klass->model_no_change = NULL;
|
||||
klass->model_changed = NULL;
|
||||
klass->model_row_changed = NULL;
|
||||
klass->model_cell_changed = NULL;
|
||||
@ -391,13 +402,40 @@ e_table_model_pre_change (ETableModel *e_table_model)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting pre_change on model 0x%p.\n", e_table_model));
|
||||
d(g_print("Emitting pre_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_PRE_CHANGE]);
|
||||
d(depth--);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_model_no_change:
|
||||
* @e_table_model: the table model to notify of the lack of a change
|
||||
*
|
||||
* Use this function to notify any views of this table model that
|
||||
* the contents of the table model have changed. This will emit
|
||||
* the signal "model_no_change" on the @e_table_model object.
|
||||
*
|
||||
* It is preferable to use the e_table_model_row_changed() and
|
||||
* the e_table_model_cell_changed() to notify of smaller changes
|
||||
* than to invalidate the entire model, as the views might have
|
||||
* ways of caching the information they render from the model.
|
||||
*/
|
||||
void
|
||||
e_table_model_no_change (ETableModel *e_table_model)
|
||||
{
|
||||
g_return_if_fail (e_table_model != NULL);
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting model_no_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_NO_CHANGE]);
|
||||
d(depth--);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_table_model_changed:
|
||||
* @e_table_model: the table model to notify of the change
|
||||
@ -418,7 +456,7 @@ e_table_model_changed (ETableModel *e_table_model)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting model_changed on model 0x%p.\n", e_table_model));
|
||||
d(g_print("Emitting model_changed on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_CHANGED]);
|
||||
@ -442,7 +480,7 @@ e_table_model_row_changed (ETableModel *e_table_model, int row)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting row_changed on model 0x%p, row %d.\n", e_table_model, row));
|
||||
d(g_print("Emitting row_changed on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_ROW_CHANGED], row);
|
||||
@ -467,7 +505,7 @@ e_table_model_cell_changed (ETableModel *e_table_model, int col, int row)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting cell_changed on model 0x%p, row %d, col %d.\n", e_table_model, row, col));
|
||||
d(g_print("Emitting cell_changed on model 0x%p, a %s, row %d, col %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row, col));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_CELL_CHANGED], col, row);
|
||||
@ -492,7 +530,7 @@ e_table_model_rows_inserted (ETableModel *e_table_model, int row, int count)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting row_inserted on model 0x%p, row %d.\n", e_table_model, row));
|
||||
d(g_print("Emitting row_inserted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_ROWS_INSERTED], row, count);
|
||||
@ -532,7 +570,7 @@ e_table_model_rows_deleted (ETableModel *e_table_model, int row, int count)
|
||||
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
|
||||
|
||||
d(print_tabs());
|
||||
d(g_print("Emitting row_deleted on model 0x%p, row %d.\n", e_table_model, row));
|
||||
d(g_print("Emitting row_deleted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
|
||||
d(depth++);
|
||||
gtk_signal_emit (GTK_OBJECT (e_table_model),
|
||||
e_table_model_signals [MODEL_ROWS_DELETED], row, count);
|
||||
|
||||
@ -77,6 +77,7 @@ typedef struct {
|
||||
|
||||
/*
|
||||
* These all come after the change has been made.
|
||||
* No changes, cancel pre_change: no_change
|
||||
* Major structural changes: model_changed
|
||||
* Changes only in a row: row_changed
|
||||
* Only changes in a cell: cell_changed
|
||||
@ -85,6 +86,7 @@ typedef struct {
|
||||
*/
|
||||
void (*model_pre_change) (ETableModel *etm);
|
||||
|
||||
void (*model_no_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);
|
||||
@ -144,6 +146,7 @@ char *e_table_model_value_to_string (ETableModel *e_table_model,
|
||||
* Routines for emitting signals on the e_table
|
||||
*/
|
||||
void e_table_model_pre_change (ETableModel *e_table_model);
|
||||
void e_table_model_no_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);
|
||||
|
||||
@ -54,7 +54,6 @@ typedef struct {
|
||||
|
||||
guint model_changed_idle_id;
|
||||
|
||||
guint frozen : 1;
|
||||
guint selection_model_changed : 1;
|
||||
guint group_info_changed : 1;
|
||||
|
||||
|
||||
@ -127,6 +127,9 @@ e_table_sorted_new (ETableModel *source, ETableHeader *full_header, ETableSortIn
|
||||
ETableSorted *ets = gtk_type_new (E_TABLE_SORTED_TYPE);
|
||||
ETableSubset *etss = E_TABLE_SUBSET (ets);
|
||||
|
||||
if (ets_parent_class->proxy_model_pre_change)
|
||||
(ets_parent_class->proxy_model_pre_change) (etss, source);
|
||||
|
||||
if (e_table_subset_construct (etss, source, 0) == NULL){
|
||||
gtk_object_unref (GTK_OBJECT (ets));
|
||||
return NULL;
|
||||
@ -198,17 +201,27 @@ ets_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *source, int row,
|
||||
ETableModel *etm = E_TABLE_MODEL(etss);
|
||||
ETableSorted *ets = E_TABLE_SORTED(etss);
|
||||
int i;
|
||||
gboolean full_change = FALSE;
|
||||
|
||||
e_table_model_pre_change (etm);
|
||||
if (count == 0) {
|
||||
e_table_model_no_change (etm);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < etss->n_map; i++) {
|
||||
if (etss->map_table[i] >= row)
|
||||
etss->map_table[i] += count;
|
||||
if (row != etss->n_map) {
|
||||
full_change = TRUE;
|
||||
for (i = 0; i < etss->n_map; i++) {
|
||||
if (etss->map_table[i] >= row) {
|
||||
etss->map_table[i] += count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
etss->map_table = g_realloc (etss->map_table, (etss->n_map + count) * sizeof(int));
|
||||
|
||||
for (; count > 0; count --) {
|
||||
if (!full_change)
|
||||
e_table_model_pre_change (etm);
|
||||
i = etss->n_map;
|
||||
if (ets->sort_idle_id == 0) {
|
||||
/* this is to see if we're inserting a lot of things between idle loops.
|
||||
@ -228,11 +241,17 @@ ets_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *source, int row,
|
||||
}
|
||||
etss->map_table[i] = row;
|
||||
etss->n_map++;
|
||||
if (!full_change) {
|
||||
e_table_model_row_inserted (etm, i);
|
||||
}
|
||||
|
||||
e_table_model_row_inserted (etm, i);
|
||||
d(g_print("inserted row %d", row));
|
||||
row++;
|
||||
}
|
||||
if (full_change)
|
||||
e_table_model_changed (etm);
|
||||
else
|
||||
e_table_model_no_change (etm);
|
||||
d(e_table_subset_print_debugging(etss));
|
||||
}
|
||||
|
||||
@ -245,11 +264,12 @@ ets_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *source, int row,
|
||||
int j;
|
||||
|
||||
shift = row == etss->n_map - count;
|
||||
|
||||
|
||||
for (j = 0; j < count; j++) {
|
||||
for (i = 0; i < etss->n_map; i++){
|
||||
if (etss->map_table[i] == row + j) {
|
||||
e_table_model_pre_change (etm);
|
||||
if (shift)
|
||||
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 --;
|
||||
if (shift)
|
||||
@ -264,6 +284,8 @@ ets_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *source, int row,
|
||||
}
|
||||
|
||||
e_table_model_changed (etm);
|
||||
} else {
|
||||
e_table_model_no_change (etm);
|
||||
}
|
||||
|
||||
d(g_print("deleted row %d count %d", row, count));
|
||||
|
||||
@ -29,9 +29,12 @@
|
||||
#include "e-table-subset.h"
|
||||
|
||||
static void etss_proxy_model_pre_change_real (ETableSubset *etss, ETableModel *etm);
|
||||
static void etss_proxy_model_no_change_real (ETableSubset *etss, ETableModel *etm);
|
||||
static void etss_proxy_model_changed_real (ETableSubset *etss, ETableModel *etm);
|
||||
static void etss_proxy_model_row_changed_real (ETableSubset *etss, ETableModel *etm, int row);
|
||||
static void etss_proxy_model_cell_changed_real (ETableSubset *etss, ETableModel *etm, int col, int row);
|
||||
static void etss_proxy_model_rows_inserted_real (ETableSubset *etss, ETableModel *etm, int row, int count);
|
||||
static void etss_proxy_model_rows_deleted_real (ETableSubset *etss, ETableModel *etm, int row, int count);
|
||||
|
||||
#define PARENT_TYPE E_TABLE_MODEL_TYPE
|
||||
#define d(x)
|
||||
@ -87,6 +90,8 @@ etss_destroy (GtkObject *object)
|
||||
if (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_no_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (etss->source),
|
||||
etss->table_model_changed_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (etss->source),
|
||||
@ -223,36 +228,37 @@ etss_value_to_string (ETableModel *etm, int col, const void *value)
|
||||
static void
|
||||
etss_class_init (GtkObjectClass *object_class)
|
||||
{
|
||||
ETableSubsetClass *klass = (ETableSubsetClass *) object_class;
|
||||
ETableModelClass *table_class = (ETableModelClass *) object_class;
|
||||
ETableSubsetClass *klass = (ETableSubsetClass *) object_class;
|
||||
ETableModelClass *table_class = (ETableModelClass *) object_class;
|
||||
|
||||
etss_parent_class = gtk_type_class (PARENT_TYPE);
|
||||
etss_parent_class = gtk_type_class (PARENT_TYPE);
|
||||
|
||||
object_class->destroy = etss_destroy;
|
||||
object_class->destroy = etss_destroy;
|
||||
|
||||
table_class->column_count = etss_column_count;
|
||||
table_class->row_count = etss_row_count;
|
||||
table_class->append_row = etss_append_row;
|
||||
table_class->column_count = etss_column_count;
|
||||
table_class->row_count = etss_row_count;
|
||||
table_class->append_row = etss_append_row;
|
||||
|
||||
table_class->value_at = etss_value_at;
|
||||
table_class->set_value_at = etss_set_value_at;
|
||||
table_class->is_cell_editable = etss_is_cell_editable;
|
||||
table_class->value_at = etss_value_at;
|
||||
table_class->set_value_at = etss_set_value_at;
|
||||
table_class->is_cell_editable = etss_is_cell_editable;
|
||||
|
||||
table_class->has_save_id = etss_has_save_id;
|
||||
table_class->get_save_id = etss_get_save_id;
|
||||
table_class->has_save_id = etss_has_save_id;
|
||||
table_class->get_save_id = etss_get_save_id;
|
||||
|
||||
table_class->duplicate_value = etss_duplicate_value;
|
||||
table_class->free_value = etss_free_value;
|
||||
table_class->initialize_value = etss_initialize_value;
|
||||
table_class->value_is_empty = etss_value_is_empty;
|
||||
table_class->value_to_string = etss_value_to_string;
|
||||
table_class->duplicate_value = etss_duplicate_value;
|
||||
table_class->free_value = etss_free_value;
|
||||
table_class->initialize_value = etss_initialize_value;
|
||||
table_class->value_is_empty = etss_value_is_empty;
|
||||
table_class->value_to_string = etss_value_to_string;
|
||||
|
||||
klass->proxy_model_pre_change = etss_proxy_model_pre_change_real;
|
||||
klass->proxy_model_changed = etss_proxy_model_changed_real;
|
||||
klass->proxy_model_row_changed = etss_proxy_model_row_changed_real;
|
||||
klass->proxy_model_cell_changed = etss_proxy_model_cell_changed_real;
|
||||
klass->proxy_model_rows_inserted = NULL;
|
||||
klass->proxy_model_rows_deleted = NULL;
|
||||
klass->proxy_model_pre_change = etss_proxy_model_pre_change_real;
|
||||
klass->proxy_model_no_change = etss_proxy_model_no_change_real;
|
||||
klass->proxy_model_changed = etss_proxy_model_changed_real;
|
||||
klass->proxy_model_row_changed = etss_proxy_model_row_changed_real;
|
||||
klass->proxy_model_cell_changed = etss_proxy_model_cell_changed_real;
|
||||
klass->proxy_model_rows_inserted = etss_proxy_model_rows_inserted_real;
|
||||
klass->proxy_model_rows_deleted = etss_proxy_model_rows_deleted_real;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -269,6 +275,12 @@ etss_proxy_model_pre_change_real (ETableSubset *etss, ETableModel *etm)
|
||||
e_table_model_pre_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_no_change_real (ETableSubset *etss, ETableModel *etm)
|
||||
{
|
||||
e_table_model_no_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_changed_real (ETableSubset *etss, ETableModel *etm)
|
||||
{
|
||||
@ -281,6 +293,8 @@ etss_proxy_model_row_changed_real (ETableSubset *etss, ETableModel *etm, int row
|
||||
int view_row = etss_get_view_row (etss, row);
|
||||
if (view_row != -1)
|
||||
e_table_model_row_changed (E_TABLE_MODEL (etss), view_row);
|
||||
else
|
||||
e_table_model_no_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -289,6 +303,20 @@ etss_proxy_model_cell_changed_real (ETableSubset *etss, ETableModel *etm, int co
|
||||
int view_row = etss_get_view_row (etss, row);
|
||||
if (view_row != -1)
|
||||
e_table_model_cell_changed (E_TABLE_MODEL (etss), col, view_row);
|
||||
else
|
||||
e_table_model_no_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_rows_inserted_real (ETableSubset *etss, ETableModel *etm, int row, int count)
|
||||
{
|
||||
e_table_model_no_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_rows_deleted_real (ETableSubset *etss, ETableModel *etm, int row, int count)
|
||||
{
|
||||
e_table_model_no_change (E_TABLE_MODEL (etss));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -298,6 +326,13 @@ etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss)
|
||||
(ETSS_CLASS(etss)->proxy_model_pre_change) (etss, etm);
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_no_change (ETableModel *etm, ETableSubset *etss)
|
||||
{
|
||||
if (ETSS_CLASS(etss)->proxy_model_no_change)
|
||||
(ETSS_CLASS(etss)->proxy_model_no_change) (etss, etm);
|
||||
}
|
||||
|
||||
static void
|
||||
etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss)
|
||||
{
|
||||
@ -354,18 +389,20 @@ 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",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_row_changed), etss);
|
||||
etss->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_cell_changed), etss);
|
||||
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_no_change_id = gtk_signal_connect (GTK_OBJECT (source), "model_no_change",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_no_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",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_row_changed), etss);
|
||||
etss->table_model_cell_changed_id = gtk_signal_connect (GTK_OBJECT (source), "model_cell_changed",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_cell_changed), etss);
|
||||
etss->table_model_rows_inserted_id = gtk_signal_connect (GTK_OBJECT (source), "model_rows_inserted",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_rows_inserted), etss);
|
||||
etss->table_model_rows_deleted_id = gtk_signal_connect (GTK_OBJECT (source), "model_rows_deleted",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_rows_deleted), etss);
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_rows_inserted), etss);
|
||||
etss->table_model_rows_deleted_id = gtk_signal_connect (GTK_OBJECT (source), "model_rows_deleted",
|
||||
GTK_SIGNAL_FUNC (etss_proxy_model_rows_deleted), etss);
|
||||
|
||||
return E_TABLE_MODEL (etss);
|
||||
}
|
||||
|
||||
@ -48,6 +48,7 @@ typedef struct {
|
||||
int last_access;
|
||||
|
||||
int table_model_pre_change_id;
|
||||
int table_model_no_change_id;
|
||||
int table_model_changed_id;
|
||||
int table_model_row_changed_id;
|
||||
int table_model_cell_changed_id;
|
||||
@ -59,6 +60,7 @@ typedef struct {
|
||||
ETableModelClass parent_class;
|
||||
|
||||
void (*proxy_model_pre_change) (ETableSubset *etss, ETableModel *etm);
|
||||
void (*proxy_model_no_change) (ETableSubset *etss, ETableModel *etm);
|
||||
void (*proxy_model_changed) (ETableSubset *etss, ETableModel *etm);
|
||||
void (*proxy_model_row_changed) (ETableSubset *etss, ETableModel *etm, int row);
|
||||
void (*proxy_model_cell_changed) (ETableSubset *etss, ETableModel *etm, int col, int row);
|
||||
|
||||
@ -153,11 +153,15 @@ etw_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *etm, int model_r
|
||||
{
|
||||
int i;
|
||||
ETableWithout *etw = E_TABLE_WITHOUT (etss);
|
||||
gboolean shift = FALSE;
|
||||
|
||||
/* i is View row */
|
||||
for (i = 0; i < etss->n_map; i++) {
|
||||
if (etss->map_table[i] > model_row)
|
||||
etss->map_table[i] += count;
|
||||
if (model_row != etss->n_map) {
|
||||
for (i = 0; i < etss->n_map; i++) {
|
||||
if (etss->map_table[i] > model_row)
|
||||
etss->map_table[i] += count;
|
||||
}
|
||||
shift = TRUE;
|
||||
}
|
||||
|
||||
/* i is Model row */
|
||||
@ -166,6 +170,10 @@ etw_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *etm, int model_r
|
||||
add_row (etw, i);
|
||||
}
|
||||
}
|
||||
if (shift)
|
||||
e_table_model_changed (E_TABLE_MODEL (etw));
|
||||
else
|
||||
e_table_model_no_change (E_TABLE_MODEL (etw));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -173,14 +181,21 @@ etw_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *etm, int model_ro
|
||||
{
|
||||
int i; /* View row */
|
||||
ETableWithout *etw = E_TABLE_WITHOUT (etss);
|
||||
gboolean shift = FALSE;
|
||||
|
||||
for (i = 0; i < etss->n_map; i++) {
|
||||
if (etss->map_table[i] >= model_row && etss->map_table[i] < model_row + count) {
|
||||
remove_row (etw, i);
|
||||
i--;
|
||||
} else if (etss->map_table[i] >= model_row + count)
|
||||
} else if (etss->map_table[i] >= model_row + count) {
|
||||
etss->map_table[i] -= count;
|
||||
shift = TRUE;
|
||||
}
|
||||
}
|
||||
if (shift)
|
||||
e_table_model_changed (E_TABLE_MODEL (etw));
|
||||
else
|
||||
e_table_model_no_change (E_TABLE_MODEL (etw));
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -460,8 +460,7 @@ e_tree_memory_node_insert (ETreeMemory *tree_model,
|
||||
e_tree_memory_path_insert (parent_path, position, new_path);
|
||||
if (!tree_model->priv->frozen)
|
||||
e_tree_model_node_inserted (E_TREE_MODEL(tree_model), parent_path, new_path);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
priv->root = new_path;
|
||||
if (!tree_model->priv->frozen)
|
||||
e_tree_model_node_changed(E_TREE_MODEL(tree_model), new_path);
|
||||
|
||||
@ -46,6 +46,7 @@ static GtkObjectClass *parent_class;
|
||||
|
||||
enum {
|
||||
PRE_CHANGE,
|
||||
NO_CHANGE,
|
||||
NODE_CHANGED,
|
||||
NODE_DATA_CHANGED,
|
||||
NODE_COL_CHANGED,
|
||||
@ -72,6 +73,14 @@ e_tree_model_class_init (GtkObjectClass *klass)
|
||||
gtk_marshal_NONE__NONE,
|
||||
GTK_TYPE_NONE, 0);
|
||||
|
||||
e_tree_model_signals [NO_CHANGE] =
|
||||
gtk_signal_new ("no_change",
|
||||
GTK_RUN_LAST,
|
||||
E_OBJECT_CLASS_TYPE (klass),
|
||||
GTK_SIGNAL_OFFSET (ETreeModelClass, no_change),
|
||||
gtk_marshal_NONE__NONE,
|
||||
GTK_TYPE_NONE, 0);
|
||||
|
||||
e_tree_model_signals [NODE_CHANGED] =
|
||||
gtk_signal_new ("node_changed",
|
||||
GTK_RUN_LAST,
|
||||
@ -150,6 +159,7 @@ e_tree_model_class_init (GtkObjectClass *klass)
|
||||
tree_class->value_to_string = NULL;
|
||||
|
||||
tree_class->pre_change = NULL;
|
||||
tree_class->no_change = NULL;
|
||||
tree_class->node_changed = NULL;
|
||||
tree_class->node_data_changed = NULL;
|
||||
tree_class->node_col_changed = NULL;
|
||||
@ -186,6 +196,25 @@ e_tree_model_pre_change (ETreeModel *tree_model)
|
||||
e_tree_model_signals [PRE_CHANGE]);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_tree_model_node_changed:
|
||||
* @tree_model:
|
||||
* @node:
|
||||
*
|
||||
*
|
||||
*
|
||||
* Return value:
|
||||
**/
|
||||
void
|
||||
e_tree_model_no_change (ETreeModel *tree_model)
|
||||
{
|
||||
g_return_if_fail (tree_model != NULL);
|
||||
g_return_if_fail (E_IS_TREE_MODEL (tree_model));
|
||||
|
||||
gtk_signal_emit (GTK_OBJECT (tree_model),
|
||||
e_tree_model_signals [NO_CHANGE]);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_tree_model_node_changed:
|
||||
* @tree_model:
|
||||
|
||||
@ -55,13 +55,13 @@ struct ETreeModelClass {
|
||||
/*
|
||||
* Virtual methods
|
||||
*/
|
||||
ETreePath (*get_root) (ETreeModel *etm);
|
||||
ETreePath (*get_root) (ETreeModel *etm);
|
||||
|
||||
ETreePath (*get_parent) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_first_child) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_last_child) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_next) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_prev) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_parent) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_first_child) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_last_child) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_next) (ETreeModel *etm, ETreePath node);
|
||||
ETreePath (*get_prev) (ETreeModel *etm, ETreePath node);
|
||||
|
||||
gboolean (*is_root) (ETreeModel *etm, ETreePath node);
|
||||
gboolean (*is_expandable) (ETreeModel *etm, ETreePath node);
|
||||
@ -98,6 +98,7 @@ struct ETreeModelClass {
|
||||
* Signals
|
||||
*/
|
||||
void (*pre_change) (ETreeModel *etm);
|
||||
void (*no_change) (ETreeModel *etm);
|
||||
void (*node_changed) (ETreeModel *etm, ETreePath node);
|
||||
void (*node_data_changed) (ETreeModel *etm, ETreePath node);
|
||||
void (*node_col_changed) (ETreeModel *etm, ETreePath node, int col);
|
||||
@ -185,6 +186,7 @@ void e_tree_model_node_traverse_preorder (ETreeModel *model,
|
||||
** Routines for emitting signals on the ETreeModel
|
||||
*/
|
||||
void e_tree_model_pre_change (ETreeModel *tree_model);
|
||||
void e_tree_model_no_change (ETreeModel *tree_model);
|
||||
void e_tree_model_node_changed (ETreeModel *tree_model,
|
||||
ETreePath node);
|
||||
void e_tree_model_node_data_changed (ETreeModel *tree_model,
|
||||
|
||||
@ -70,7 +70,10 @@ struct ETreeSelectionModelPriv {
|
||||
|
||||
char *cursor_save_id;
|
||||
|
||||
int frozen_count;
|
||||
|
||||
int tree_model_pre_change_id;
|
||||
int tree_model_no_change_id;
|
||||
int tree_model_node_changed_id;
|
||||
int tree_model_node_data_changed_id;
|
||||
int tree_model_node_col_changed_id;
|
||||
@ -341,6 +344,18 @@ update_parents (ETreeSelectionModel *etsm, ETreePath path)
|
||||
|
||||
/* Signal handlers */
|
||||
|
||||
static void
|
||||
etsm_freeze (ETreeSelectionModel *etsm)
|
||||
{
|
||||
etsm->priv->frozen_count ++;
|
||||
}
|
||||
|
||||
static void
|
||||
etsm_unfreeze (ETreeSelectionModel *etsm)
|
||||
{
|
||||
etsm->priv->frozen_count --;
|
||||
}
|
||||
|
||||
static void
|
||||
etsm_pre_change (ETreeModel *etm, ETreeSelectionModel *etsm)
|
||||
{
|
||||
@ -352,6 +367,14 @@ etsm_pre_change (ETreeModel *etm, ETreeSelectionModel *etsm)
|
||||
etsm->priv->cursor_path) {
|
||||
etsm->priv->cursor_save_id = e_tree_model_get_save_id (etm, etsm->priv->cursor_path);
|
||||
}
|
||||
|
||||
etsm_freeze (etsm);
|
||||
}
|
||||
|
||||
static void
|
||||
etsm_no_change (ETreeModel *etm, ETreeSelectionModel *etsm)
|
||||
{
|
||||
etsm_unfreeze (etsm);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -384,6 +407,7 @@ etsm_node_changed (ETreeModel *etm, ETreePath node, ETreeSelectionModel *etsm)
|
||||
|
||||
g_free (etsm->priv->cursor_save_id);
|
||||
etsm->priv->cursor_save_id = NULL;
|
||||
etsm_unfreeze (etsm);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -391,6 +415,7 @@ etsm_node_data_changed (ETreeModel *etm, ETreePath node, ETreeSelectionModel *et
|
||||
{
|
||||
g_free (etsm->priv->cursor_save_id);
|
||||
etsm->priv->cursor_save_id = NULL;
|
||||
etsm_unfreeze (etsm);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -398,6 +423,7 @@ etsm_node_col_changed (ETreeModel *etm, ETreePath node, int col, ETreeSelectionM
|
||||
{
|
||||
g_free (etsm->priv->cursor_save_id);
|
||||
etsm->priv->cursor_save_id = NULL;
|
||||
etsm_unfreeze (etsm);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -454,6 +480,8 @@ add_model(ETreeSelectionModel *etsm, ETreeModel *model)
|
||||
gtk_object_ref(GTK_OBJECT(priv->model));
|
||||
priv->tree_model_pre_change_id = gtk_signal_connect_after (GTK_OBJECT (priv->model), "pre_change",
|
||||
GTK_SIGNAL_FUNC (etsm_pre_change), etsm);
|
||||
priv->tree_model_no_change_id = gtk_signal_connect_after (GTK_OBJECT (priv->model), "no_change",
|
||||
GTK_SIGNAL_FUNC (etsm_no_change), etsm);
|
||||
priv->tree_model_node_changed_id = gtk_signal_connect_after (GTK_OBJECT (priv->model), "node_changed",
|
||||
GTK_SIGNAL_FUNC (etsm_node_changed), etsm);
|
||||
priv->tree_model_node_data_changed_id = gtk_signal_connect_after (GTK_OBJECT (priv->model), "node_data_changed",
|
||||
@ -476,6 +504,8 @@ drop_model(ETreeSelectionModel *etsm)
|
||||
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->model),
|
||||
priv->tree_model_pre_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->model),
|
||||
priv->tree_model_no_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->model),
|
||||
priv->tree_model_node_changed_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->model),
|
||||
@ -491,6 +521,7 @@ drop_model(ETreeSelectionModel *etsm)
|
||||
priv->model = NULL;
|
||||
|
||||
priv->tree_model_pre_change_id = 0;
|
||||
priv->tree_model_no_change_id = 0;
|
||||
priv->tree_model_node_changed_id = 0;
|
||||
priv->tree_model_node_data_changed_id = 0;
|
||||
priv->tree_model_node_col_changed_id = 0;
|
||||
@ -1194,6 +1225,7 @@ e_tree_selection_model_init (ETreeSelectionModel *etsm)
|
||||
|
||||
|
||||
priv->tree_model_pre_change_id = 0;
|
||||
priv->tree_model_no_change_id = 0;
|
||||
priv->tree_model_node_changed_id = 0;
|
||||
priv->tree_model_node_data_changed_id = 0;
|
||||
priv->tree_model_node_col_changed_id = 0;
|
||||
|
||||
@ -93,6 +93,7 @@ struct ETreeSortedPriv {
|
||||
ETreeSortedPath *last_access;
|
||||
|
||||
int tree_model_pre_change_id;
|
||||
int tree_model_no_change_id;
|
||||
int tree_model_node_changed_id;
|
||||
int tree_model_node_data_changed_id;
|
||||
int tree_model_node_col_changed_id;
|
||||
@ -390,12 +391,13 @@ new_path (ETreeSortedPath *parent, ETreePath corresponding)
|
||||
return path;
|
||||
}
|
||||
|
||||
static void
|
||||
static gboolean
|
||||
reposition_path (ETreeSorted *ets, ETreeSortedPath *path)
|
||||
{
|
||||
int new_index;
|
||||
int old_index = path->position;
|
||||
ETreeSortedPath *parent = path->parent;
|
||||
gboolean changed = FALSE;
|
||||
if (parent) {
|
||||
if (ets->priv->sort_idle_id == 0) {
|
||||
if (ets->priv->insert_count > ETS_INSERT_MAX) {
|
||||
@ -422,9 +424,9 @@ reposition_path (ETreeSorted *ets, ETreeSortedPath *path)
|
||||
parent->children[new_index] = path;
|
||||
for (i = old_index; i <= new_index; i++)
|
||||
parent->children[i]->position = i;
|
||||
changed = TRUE;
|
||||
e_tree_model_node_changed(E_TREE_MODEL(ets), parent);
|
||||
e_tree_sorted_node_resorted(ets, parent);
|
||||
e_tree_model_pre_change(E_TREE_MODEL(ets));
|
||||
} else if (new_index < old_index) {
|
||||
int i;
|
||||
ets->priv->insert_count++;
|
||||
@ -432,14 +434,15 @@ reposition_path (ETreeSorted *ets, ETreeSortedPath *path)
|
||||
parent->children[new_index] = path;
|
||||
for (i = new_index; i <= old_index; i++)
|
||||
parent->children[i]->position = i;
|
||||
changed = TRUE;
|
||||
e_tree_model_node_changed(E_TREE_MODEL(ets), parent);
|
||||
e_tree_sorted_node_resorted(ets, parent);
|
||||
e_tree_model_pre_change(E_TREE_MODEL(ets));
|
||||
}
|
||||
}
|
||||
} else
|
||||
mark_path_needs_resort(ets, parent, TRUE, FALSE);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -596,6 +599,8 @@ ets_destroy (GtkObject *object)
|
||||
if (priv->source) {
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->source),
|
||||
priv->tree_model_pre_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->source),
|
||||
priv->tree_model_no_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->source),
|
||||
priv->tree_model_node_changed_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (priv->source),
|
||||
@ -611,6 +616,7 @@ ets_destroy (GtkObject *object)
|
||||
priv->source = NULL;
|
||||
|
||||
priv->tree_model_pre_change_id = 0;
|
||||
priv->tree_model_no_change_id = 0;
|
||||
priv->tree_model_node_changed_id = 0;
|
||||
priv->tree_model_node_data_changed_id = 0;
|
||||
priv->tree_model_node_col_changed_id = 0;
|
||||
@ -990,6 +996,12 @@ ets_proxy_pre_change (ETreeModel *etm, ETreeSorted *ets)
|
||||
e_tree_model_pre_change(E_TREE_MODEL(ets));
|
||||
}
|
||||
|
||||
static void
|
||||
ets_proxy_no_change (ETreeModel *etm, ETreeSorted *ets)
|
||||
{
|
||||
e_tree_model_no_change(E_TREE_MODEL(ets));
|
||||
}
|
||||
|
||||
static void
|
||||
ets_proxy_node_changed (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
|
||||
{
|
||||
@ -1009,8 +1021,8 @@ ets_proxy_node_changed (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
|
||||
|
||||
if (path) {
|
||||
free_children(path);
|
||||
reposition_path(ets, path);
|
||||
e_tree_model_node_changed(E_TREE_MODEL(ets), path);
|
||||
if (!reposition_path(ets, path))
|
||||
e_tree_model_node_changed(E_TREE_MODEL(ets), path);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1021,8 +1033,8 @@ ets_proxy_node_data_changed (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
|
||||
ETreeSortedPath *path = find_path(ets, node);
|
||||
|
||||
if (path) {
|
||||
reposition_path(ets, path);
|
||||
e_tree_model_node_data_changed(E_TREE_MODEL(ets), path);
|
||||
if (!reposition_path(ets, path))
|
||||
e_tree_model_node_data_changed(E_TREE_MODEL(ets), path);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1032,9 +1044,11 @@ ets_proxy_node_col_changed (ETreeModel *etm, ETreePath node, int col, ETreeSorte
|
||||
ETreeSortedPath *path = find_path(ets, node);
|
||||
|
||||
if (path) {
|
||||
gboolean changed = FALSE;
|
||||
if (e_table_sorting_utils_affects_sort(ets->priv->sort_info, ets->priv->full_header, col))
|
||||
reposition_path(ets, path);
|
||||
e_tree_model_node_col_changed(E_TREE_MODEL(ets), path, col);
|
||||
changed = reposition_path(ets, path);
|
||||
if (!changed)
|
||||
e_tree_model_node_col_changed(E_TREE_MODEL(ets), path, col);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1236,6 +1250,7 @@ e_tree_sorted_init (GtkObject *object)
|
||||
priv->last_access = NULL;
|
||||
|
||||
priv->tree_model_pre_change_id = 0;
|
||||
priv->tree_model_no_change_id = 0;
|
||||
priv->tree_model_node_changed_id = 0;
|
||||
priv->tree_model_node_data_changed_id = 0;
|
||||
priv->tree_model_node_col_changed_id = 0;
|
||||
@ -1271,8 +1286,10 @@ e_tree_sorted_construct (ETreeSorted *ets, ETreeModel *source, ETableHeader *ful
|
||||
ets->priv->sort_info = sort_info;
|
||||
if (sort_info) gtk_object_ref(GTK_OBJECT(sort_info));
|
||||
|
||||
ets->priv->tree_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "pre_change",
|
||||
GTK_SIGNAL_FUNC (ets_proxy_pre_change), ets);
|
||||
ets->priv->tree_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "pre_change",
|
||||
GTK_SIGNAL_FUNC (ets_proxy_pre_change), ets);
|
||||
ets->priv->tree_model_no_change_id = gtk_signal_connect (GTK_OBJECT (source), "no_change",
|
||||
GTK_SIGNAL_FUNC (ets_proxy_no_change), ets);
|
||||
ets->priv->tree_model_node_changed_id = gtk_signal_connect (GTK_OBJECT (source), "node_changed",
|
||||
GTK_SIGNAL_FUNC (ets_proxy_node_changed), ets);
|
||||
ets->priv->tree_model_node_data_changed_id = gtk_signal_connect (GTK_OBJECT (source), "node_data_changed",
|
||||
|
||||
@ -52,6 +52,7 @@ struct ETreeTableAdapterPriv {
|
||||
int last_access;
|
||||
|
||||
int tree_model_pre_change_id;
|
||||
int tree_model_no_change_id;
|
||||
int tree_model_node_changed_id;
|
||||
int tree_model_node_data_changed_id;
|
||||
int tree_model_node_col_changed_id;
|
||||
@ -391,6 +392,8 @@ etta_destroy (GtkObject *object)
|
||||
if (etta->priv->source) {
|
||||
gtk_signal_disconnect (GTK_OBJECT (etta->priv->source),
|
||||
etta->priv->tree_model_pre_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (etta->priv->source),
|
||||
etta->priv->tree_model_no_change_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (etta->priv->source),
|
||||
etta->priv->tree_model_node_changed_id);
|
||||
gtk_signal_disconnect (GTK_OBJECT (etta->priv->source),
|
||||
@ -406,6 +409,7 @@ etta_destroy (GtkObject *object)
|
||||
etta->priv->source = NULL;
|
||||
|
||||
etta->priv->tree_model_pre_change_id = 0;
|
||||
etta->priv->tree_model_no_change_id = 0;
|
||||
etta->priv->tree_model_node_changed_id = 0;
|
||||
etta->priv->tree_model_node_data_changed_id = 0;
|
||||
etta->priv->tree_model_node_col_changed_id = 0;
|
||||
@ -618,6 +622,7 @@ etta_init (ETreeTableAdapter *etta)
|
||||
etta->priv->last_access = 0;
|
||||
|
||||
etta->priv->tree_model_pre_change_id = 0;
|
||||
etta->priv->tree_model_no_change_id = 0;
|
||||
etta->priv->tree_model_node_changed_id = 0;
|
||||
etta->priv->tree_model_node_data_changed_id = 0;
|
||||
etta->priv->tree_model_node_col_changed_id = 0;
|
||||
@ -633,6 +638,12 @@ etta_proxy_pre_change (ETreeModel *etm, ETreeTableAdapter *etta)
|
||||
e_table_model_pre_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
static void
|
||||
etta_proxy_no_change (ETreeModel *etm, ETreeTableAdapter *etta)
|
||||
{
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
static void
|
||||
etta_proxy_node_changed (ETreeModel *etm, ETreePath path, ETreeTableAdapter *etta)
|
||||
{
|
||||
@ -681,7 +692,10 @@ etta_proxy_node_data_changed (ETreeModel *etm, ETreePath path, ETreeTableAdapter
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row);
|
||||
else if (row != 0)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row - 1);
|
||||
}
|
||||
else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -693,7 +707,10 @@ etta_proxy_node_col_changed (ETreeModel *etm, ETreePath path, int col, ETreeTabl
|
||||
e_table_model_cell_changed(E_TABLE_MODEL(etta), col, row);
|
||||
else if (row != 0)
|
||||
e_table_model_cell_changed(E_TABLE_MODEL(etta), col, row - 1);
|
||||
}
|
||||
else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -709,19 +726,26 @@ etta_proxy_node_inserted (ETreeModel *etm, ETreePath parent, ETreePath child, ET
|
||||
ETreeTableAdapterNode *parent_node;
|
||||
|
||||
parent_row = find_row_num(etta, parent);
|
||||
if (parent_row == -1)
|
||||
if (parent_row == -1) {
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
return;
|
||||
}
|
||||
|
||||
parent_node = find_or_create_node(etta, parent);
|
||||
if (parent_node->expandable != e_tree_model_node_is_expandable(etta->priv->source, parent)) {
|
||||
e_table_model_pre_change(E_TABLE_MODEL(etta));
|
||||
parent_node->expandable = e_tree_model_node_is_expandable(etta->priv->source, parent);
|
||||
if (etta->priv->root_visible)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row);
|
||||
else if (parent_row != 0)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row - 1);
|
||||
else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
if (!parent_node->expanded)
|
||||
if (!parent_node->expanded) {
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
return;
|
||||
}
|
||||
|
||||
row = find_first_child_node(etta, parent_row);
|
||||
children = e_tree_model_node_get_first_child(etta->priv->source, parent);
|
||||
@ -755,7 +779,8 @@ etta_proxy_node_inserted (ETreeModel *etm, ETreePath parent, ETreePath child, ET
|
||||
e_table_model_rows_inserted(E_TABLE_MODEL(etta), row - 1, size);
|
||||
else
|
||||
e_table_model_rows_inserted(E_TABLE_MODEL(etta), 0, size - 1);
|
||||
}
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -766,13 +791,17 @@ etta_proxy_node_removed (ETableModel *etm, ETreePath parent, ETreePath child, in
|
||||
ETreeTableAdapterNode *parent_node = find_node(etta, parent);
|
||||
if (parent_row != -1 && parent_node) {
|
||||
if (parent_node->expandable != e_tree_model_node_is_expandable(etta->priv->source, parent)) {
|
||||
e_table_model_pre_change(E_TABLE_MODEL(etta));
|
||||
parent_node->expandable = e_tree_model_node_is_expandable(etta->priv->source, parent);
|
||||
if (etta->priv->root_visible)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row);
|
||||
else if (parent_row != 0)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row - 1);
|
||||
else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
}
|
||||
|
||||
if (row != -1) {
|
||||
ETreeTableAdapterNode *node = find_node(etta, child);
|
||||
int to_remove = (node ? node->num_visible_children : 0) + 1;
|
||||
@ -792,7 +821,8 @@ etta_proxy_node_removed (ETableModel *etm, ETreePath parent, ETreePath child, in
|
||||
e_table_model_rows_deleted(E_TABLE_MODEL(etta), row - 1, to_remove);
|
||||
else
|
||||
e_table_model_rows_deleted(E_TABLE_MODEL(etta), 0, to_remove - 1);
|
||||
}
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
|
||||
ETableModel *
|
||||
@ -819,6 +849,8 @@ e_tree_table_adapter_construct (ETreeTableAdapter *etta, ETreeModel *source)
|
||||
|
||||
etta->priv->tree_model_pre_change_id = gtk_signal_connect (GTK_OBJECT (source), "pre_change",
|
||||
GTK_SIGNAL_FUNC (etta_proxy_pre_change), etta);
|
||||
etta->priv->tree_model_no_change_id = gtk_signal_connect (GTK_OBJECT (source), "no_change",
|
||||
GTK_SIGNAL_FUNC (etta_proxy_no_change), etta);
|
||||
etta->priv->tree_model_node_changed_id = gtk_signal_connect (GTK_OBJECT (source), "node_changed",
|
||||
GTK_SIGNAL_FUNC (etta_proxy_node_changed), etta);
|
||||
etta->priv->tree_model_node_data_changed_id = gtk_signal_connect (GTK_OBJECT (source), "node_data_changed",
|
||||
@ -973,18 +1005,20 @@ void e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ET
|
||||
node = find_or_create_node(etta, path);
|
||||
|
||||
if (expanded != node->expanded) {
|
||||
e_table_model_pre_change (E_TABLE_MODEL(etta));
|
||||
|
||||
node->expanded = expanded;
|
||||
|
||||
row = find_row_num(etta, path);
|
||||
if (row != -1) {
|
||||
if (etta->priv->root_visible)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row);
|
||||
else if (row != 0)
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row - 1);
|
||||
|
||||
e_table_model_pre_change (E_TABLE_MODEL(etta));
|
||||
|
||||
if (etta->priv->root_visible) {
|
||||
e_table_model_pre_change (E_TABLE_MODEL(etta));
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row);
|
||||
} else if (row != 0) {
|
||||
e_table_model_pre_change (E_TABLE_MODEL(etta));
|
||||
e_table_model_row_changed(E_TABLE_MODEL(etta), row - 1);
|
||||
}
|
||||
|
||||
if (expanded) {
|
||||
int num_children = array_size_from_path(etta, path) - 1;
|
||||
etta_expand_to(etta, etta->priv->n_map + num_children);
|
||||
@ -998,7 +1032,8 @@ void e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ET
|
||||
e_table_model_rows_inserted(E_TABLE_MODEL(etta), row + 1, num_children);
|
||||
else
|
||||
e_table_model_rows_inserted(E_TABLE_MODEL(etta), row, num_children);
|
||||
}
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
} else {
|
||||
int num_children = node->num_visible_children;
|
||||
g_assert (etta->priv->n_map >= row + 1 + num_children);
|
||||
@ -1012,7 +1047,8 @@ void e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ET
|
||||
e_table_model_rows_deleted(E_TABLE_MODEL(etta), row + 1, num_children);
|
||||
else
|
||||
e_table_model_rows_deleted(E_TABLE_MODEL(etta), row, num_children);
|
||||
}
|
||||
} else
|
||||
e_table_model_no_change(E_TABLE_MODEL(etta));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user