aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/table/e-table-header.c16
-rw-r--r--widgets/table/e-table-item.c2
-rw-r--r--widgets/table/e-tree.c158
3 files changed, 132 insertions, 44 deletions
diff --git a/widgets/table/e-table-header.c b/widgets/table/e-table-header.c
index 4e45cd2833..56c7bed164 100644
--- a/widgets/table/e-table-header.c
+++ b/widgets/table/e-table-header.c
@@ -777,14 +777,14 @@ eth_calc_widths (ETableHeader *eth)
}
if (eth->sort_info)
extra -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
- if (expansion == 0 || extra <= 0)
- return;
- for (i = 0; i < last_resizable; i++) {
- next_position += extra * (eth->columns[i]->resizable ? eth->columns[i]->expansion : 0)/expansion;
- eth->columns[i]->width += next_position - last_position;
- last_position = next_position;
+ if (expansion != 0 && extra > 0) {
+ for (i = 0; i < last_resizable; i++) {
+ next_position += extra * (eth->columns[i]->resizable ? eth->columns[i]->expansion : 0)/expansion;
+ eth->columns[i]->width += next_position - last_position;
+ last_position = next_position;
+ }
+ eth->columns[i]->width += extra - last_position;
}
- eth->columns[i]->width += extra - last_position;
eth_update_offsets (eth);
gtk_signal_emit (GTK_OBJECT (eth), eth_signals [DIMENSION_CHANGE]);
@@ -799,7 +799,7 @@ e_table_header_update_horizontal (ETableHeader *eth)
cols = eth->col_count;
for (i = 0; i < cols; i++) {
- int width;
+ int width = 0;
gtk_signal_emit_by_name (GTK_OBJECT (eth),
"request_width",
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index ed4c6985db..5b2875425a 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -968,7 +968,7 @@ eti_request_column_width (ETableHeader *eth, int col, ETableItem *eti)
{
int width = 0;
- if (eti->cell_views) {
+ if (eti->cell_views && eti->cell_views_realized) {
width = e_cell_max_width (eti->cell_views[col], view_to_model_col(eti, col), col);
}
diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c
index 5f1ab0f944..dc76561848 100644
--- a/widgets/table/e-tree.c
+++ b/widgets/table/e-tree.c
@@ -91,6 +91,12 @@ struct ETreePriv {
int reflow_idle_id;
+ int table_model_change_id;
+ int table_row_change_id;
+ int table_cell_change_id;
+ int table_rows_inserted_id;
+ int table_rows_deleted_id;
+
GnomeCanvas *header_canvas, *table_canvas;
GnomeCanvasItem *header_item, *root;
@@ -176,6 +182,32 @@ static gint e_tree_drag_source_event_cb (GtkWidget *widget,
static gint et_focus (GtkContainer *container, GtkDirectionType direction);
static void
+et_disconnect_from_etta (ETree *et)
+{
+ if (et->priv->table_model_change_id != 0)
+ gtk_signal_disconnect (GTK_OBJECT (et->priv->etta),
+ et->priv->table_model_change_id);
+ if (et->priv->table_row_change_id != 0)
+ gtk_signal_disconnect (GTK_OBJECT (et->priv->etta),
+ et->priv->table_row_change_id);
+ if (et->priv->table_cell_change_id != 0)
+ gtk_signal_disconnect (GTK_OBJECT (et->priv->etta),
+ et->priv->table_cell_change_id);
+ if (et->priv->table_rows_inserted_id != 0)
+ gtk_signal_disconnect (GTK_OBJECT (et->priv->etta),
+ et->priv->table_rows_inserted_id);
+ if (et->priv->table_rows_deleted_id != 0)
+ gtk_signal_disconnect (GTK_OBJECT (et->priv->etta),
+ et->priv->table_rows_deleted_id);
+
+ et->priv->table_model_change_id = 0;
+ et->priv->table_row_change_id = 0;
+ et->priv->table_cell_change_id = 0;
+ et->priv->table_rows_inserted_id = 0;
+ et->priv->table_rows_deleted_id = 0;
+}
+
+static void
et_destroy (GtkObject *object)
{
ETree *et = E_TREE (object);
@@ -184,6 +216,9 @@ et_destroy (GtkObject *object)
g_source_remove(et->priv->reflow_idle_id);
et->priv->reflow_idle_id = 0;
+ et_disconnect_from_etta (et);
+
+ gtk_object_unref (GTK_OBJECT (et->priv->etta));
gtk_object_unref (GTK_OBJECT (et->priv->model));
gtk_object_unref (GTK_OBJECT (et->priv->sorted));
gtk_object_unref (GTK_OBJECT (et->priv->full_header));
@@ -217,57 +252,57 @@ e_tree_init (GtkObject *object)
GTK_WIDGET_SET_FLAGS (e_tree, GTK_CAN_FOCUS);
- gtk_table->homogeneous = FALSE;
+ gtk_table->homogeneous = FALSE;
- e_tree->priv = g_new(ETreePriv, 1);
+ e_tree->priv = g_new(ETreePriv, 1);
- e_tree->priv->model = NULL;
- e_tree->priv->sorted = NULL;
- e_tree->priv->etta = NULL;
+ e_tree->priv->model = NULL;
+ e_tree->priv->sorted = NULL;
+ e_tree->priv->etta = NULL;
- e_tree->priv->full_header = NULL;
- e_tree->priv->header = NULL;
+ e_tree->priv->full_header = NULL;
+ e_tree->priv->header = NULL;
- e_tree->priv->sort_info = NULL;
- e_tree->priv->sorter = NULL;
- e_tree->priv->reflow_idle_id = 0;
+ e_tree->priv->sort_info = NULL;
+ e_tree->priv->sorter = NULL;
+ e_tree->priv->reflow_idle_id = 0;
- e_tree->priv->horizontal_draw_grid = 1;
- e_tree->priv->vertical_draw_grid = 1;
- e_tree->priv->draw_focus = 1;
- e_tree->priv->cursor_mode = E_CURSOR_SIMPLE;
- e_tree->priv->length_threshold = 200;
+ e_tree->priv->horizontal_draw_grid = 1;
+ e_tree->priv->vertical_draw_grid = 1;
+ e_tree->priv->draw_focus = 1;
+ e_tree->priv->cursor_mode = E_CURSOR_SIMPLE;
+ e_tree->priv->length_threshold = 200;
- e_tree->priv->row_selection_active = FALSE;
- e_tree->priv->horizontal_scrolling = FALSE;
+ e_tree->priv->row_selection_active = FALSE;
+ e_tree->priv->horizontal_scrolling = FALSE;
- e_tree->priv->drop_row = -1;
- e_tree->priv->drop_path = NULL;
- e_tree->priv->drop_col = -1;
+ e_tree->priv->drop_row = -1;
+ e_tree->priv->drop_path = NULL;
+ e_tree->priv->drop_col = -1;
- e_tree->priv->drag_row = -1;
- e_tree->priv->drag_path = NULL;
- e_tree->priv->drag_col = -1;
+ e_tree->priv->drag_row = -1;
+ e_tree->priv->drag_path = NULL;
+ e_tree->priv->drag_col = -1;
- e_tree->priv->site = NULL;
- e_tree->priv->drag_source_button_press_event_id = 0;
+ e_tree->priv->site = NULL;
+ e_tree->priv->drag_source_button_press_event_id = 0;
e_tree->priv->drag_source_motion_notify_event_id = 0;
#ifdef E_TREE_USE_TREE_SELECTION
- e_tree->priv->selection = E_SELECTION_MODEL(e_tree_selection_model_new());
+ e_tree->priv->selection = E_SELECTION_MODEL(e_tree_selection_model_new());
#else
- e_tree->priv->selection = E_SELECTION_MODEL(e_table_selection_model_new());
+ e_tree->priv->selection = E_SELECTION_MODEL(e_table_selection_model_new());
#endif
- e_tree->priv->spec = NULL;
+ e_tree->priv->spec = NULL;
- e_tree->priv->header_canvas = NULL;
- e_tree->priv->table_canvas = NULL;
+ e_tree->priv->header_canvas = NULL;
+ e_tree->priv->table_canvas = NULL;
- e_tree->priv->header_item = NULL;
- e_tree->priv->root = NULL;
+ e_tree->priv->header_item = NULL;
+ e_tree->priv->root = NULL;
- e_tree->priv->white_item = NULL;
- e_tree->priv->item = NULL;
+ e_tree->priv->white_item = NULL;
+ e_tree->priv->item = NULL;
}
/* Grab_focus handler for the ETree */
@@ -824,7 +859,7 @@ gchar *e_tree_get_state (ETree *e_tree)
*/
void
e_tree_save_state (ETree *e_tree,
- const gchar *filename)
+ const gchar *filename)
{
ETableState *state;
@@ -833,6 +868,57 @@ e_tree_save_state (ETree *e_tree,
gtk_object_unref(GTK_OBJECT(state));
}
+static void
+et_table_model_changed (ETableModel *model, ETree *et)
+{
+ if (et->priv->horizontal_scrolling)
+ e_table_header_update_horizontal(et->priv->header);
+}
+
+static void
+et_table_row_changed (ETableModel *table_model, int row, ETree *et)
+{
+ et_table_model_changed (table_model, et);
+}
+
+static void
+et_table_cell_changed (ETableModel *table_model, int view_col, int row, ETree *et)
+{
+ et_table_model_changed (table_model, et);
+}
+
+static void
+et_table_rows_inserted (ETableModel *table_model, int row, int count, ETree *et)
+{
+ et_table_model_changed (table_model, et);
+}
+
+static void
+et_table_rows_deleted (ETableModel *table_model, int row, int count, ETree *et)
+{
+ et_table_model_changed (table_model, et);
+}
+
+static void
+et_connect_to_etta (ETree *et)
+{
+ et->priv->table_model_change_id = gtk_signal_connect (GTK_OBJECT (et->priv->etta), "model_changed",
+ GTK_SIGNAL_FUNC (et_table_model_changed), et);
+
+ et->priv->table_row_change_id = gtk_signal_connect (GTK_OBJECT (et->priv->etta), "model_row_changed",
+ GTK_SIGNAL_FUNC (et_table_row_changed), et);
+
+ et->priv->table_cell_change_id = gtk_signal_connect (GTK_OBJECT (et->priv->etta), "model_cell_changed",
+ GTK_SIGNAL_FUNC (et_table_cell_changed), et);
+
+ et->priv->table_rows_inserted_id = gtk_signal_connect (GTK_OBJECT (et->priv->etta), "model_rows_inserted",
+ GTK_SIGNAL_FUNC (et_table_rows_inserted), et);
+
+ et->priv->table_rows_deleted_id = gtk_signal_connect (GTK_OBJECT (et->priv->etta), "model_rows_deleted",
+ GTK_SIGNAL_FUNC (et_table_rows_deleted), et);
+
+}
+
static ETree *
et_real_construct (ETree *e_tree, ETreeModel *etm, ETableExtras *ete,
ETableSpecification *specification, ETableState *state)
@@ -867,6 +953,8 @@ et_real_construct (ETree *e_tree, ETreeModel *etm, ETableExtras *ete,
e_tree->priv->etta = E_TREE_TABLE_ADAPTER(e_tree_table_adapter_new(E_TREE_MODEL(e_tree->priv->sorted)));
+ et_connect_to_etta (e_tree);
+
gtk_widget_push_visual (gdk_rgb_get_visual ());
gtk_widget_push_colormap (gdk_rgb_get_cmap ());