aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/table/e-cell-float.c8
-rw-r--r--widgets/table/e-cell-tree.c2
-rw-r--r--widgets/table/e-table-header-item.c32
-rw-r--r--widgets/table/e-table-header-item.h2
-rw-r--r--widgets/table/e-table-item.c9
-rw-r--r--widgets/table/e-tree-selection-model.c2
-rw-r--r--widgets/table/e-tree-table-adapter.c18
-rw-r--r--widgets/table/e-tree.c8
-rw-r--r--widgets/table/e-tree.h2
9 files changed, 59 insertions, 24 deletions
diff --git a/widgets/table/e-cell-float.c b/widgets/table/e-cell-float.c
index c11c8e945c..68d645360c 100644
--- a/widgets/table/e-cell-float.c
+++ b/widgets/table/e-cell-float.c
@@ -36,7 +36,7 @@
static ECellTextClass *parent_class;
static char *
-ecn_get_text(ECellText *cell, ETableModel *model, int col, int row)
+ecf_get_text(ECellText *cell, ETableModel *model, int col, int row)
{
gfloat *fvalue;
@@ -46,7 +46,7 @@ ecn_get_text(ECellText *cell, ETableModel *model, int col, int row)
}
static void
-ecn_free_text(ECellText *cell, char *text)
+ecf_free_text(ECellText *cell, char *text)
{
g_free(text);
}
@@ -58,8 +58,8 @@ e_cell_float_class_init (GtkObjectClass *object_class)
parent_class = gtk_type_class (PARENT_TYPE);
- ectc->get_text = ecn_get_text;
- ectc->free_text = ecn_free_text;
+ ectc->get_text = ecf_get_text;
+ ectc->free_text = ecf_free_text;
}
static void
diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c
index af5997eed1..64af817f9b 100644
--- a/widgets/table/e-cell-tree.c
+++ b/widgets/table/e-cell-tree.c
@@ -396,7 +396,7 @@ ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
{
ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
- return e_cell_height (tree_view->subcell_view, model_col, view_col, row);
+ return (((e_cell_height (tree_view->subcell_view, model_col, view_col, row)) + 1) / 2) * 2;
}
/*
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
index 8326087f9d..f2bf4a2928 100644
--- a/widgets/table/e-table-header-item.c
+++ b/widgets/table/e-table-header-item.c
@@ -81,6 +81,7 @@ enum {
ARG_TABLE_FONTSET,
ARG_SORT_INFO,
ARG_TABLE,
+ ARG_TREE,
};
static void
@@ -155,7 +156,6 @@ ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags
if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)
(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)(item, affine, clip_path, flags);
-
if (ethi->sort_info)
ethi->group_indent_width = e_table_sort_info_grouping_get_count(ethi->sort_info) * GROUP_INDENT;
else
@@ -326,6 +326,12 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
else
ethi->table = NULL;
break;
+ case ARG_TREE:
+ if (GTK_VALUE_OBJECT(*arg))
+ ethi->tree = E_TREE(GTK_VALUE_OBJECT(*arg));
+ else
+ ethi->tree = NULL;
+ break;
}
gnome_canvas_item_request_update(item);
}
@@ -1242,7 +1248,10 @@ apply_changes (ETableConfig *config, ETableHeaderItem *ethi)
{
char *state = e_table_state_save_to_string (config->state);
- e_table_set_state (ethi->table, state);
+ if (ethi->table)
+ e_table_set_state (ethi->table, state);
+ if (ethi->tree)
+ e_tree_set_state (ethi->tree, state);
g_free (state);
}
@@ -1251,15 +1260,23 @@ ethi_popup_customize_view(GtkWidget *widget, EthiHeaderInfo *info)
{
ETableHeaderItem *ethi = info->ethi;
ETableState *state;
+ ETableSpecification *spec;
if (ethi->config)
e_table_config_raise (E_TABLE_CONFIG (ethi->config));
else {
- state = e_table_get_state_object(ethi->table);
+ if (ethi->table) {
+ state = e_table_get_state_object(ethi->table);
+ spec = ethi->table->spec;
+ } else if (ethi->tree) {
+ state = e_tree_get_state_object(ethi->tree);
+ spec = e_tree_get_spec (ethi->tree);
+ } else
+ return;
ethi->config = e_table_config_new (
- _("Configuring view: FIXME"),
- ethi->table->spec, state);
+ _("Configuring view: FIXME"),
+ spec, state);
gtk_signal_connect (
GTK_OBJECT (ethi->config), "destroy",
GTK_SIGNAL_FUNC (config_destroyed), ethi);
@@ -1302,7 +1319,7 @@ ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
e_popup_menu_run (ethi_context_menu, (GdkEvent *) event,
1 +
(col->sortable ? 0 : 2) +
- (ethi->table ? 0 : 4) +
+ ((ethi->table || ethi->tree) ? 0 : 4) +
((e_table_header_count (ethi->eth) > 1) ? 0 : 8),
((e_table_sort_info_get_can_group (ethi->sort_info)) ? 0 : 16) +
128, info);
@@ -1543,6 +1560,8 @@ ethi_class_init (GtkObjectClass *object_class)
GTK_ARG_WRITABLE, ARG_SORT_INFO);
gtk_object_add_arg_type ("ETableHeaderItem::table", GTK_TYPE_OBJECT,
GTK_ARG_WRITABLE, ARG_TABLE);
+ gtk_object_add_arg_type ("ETableHeaderItem::tree", E_TREE_TYPE,
+ GTK_ARG_WRITABLE, ARG_TREE);
/*
* Create our pixmaps for DnD
@@ -1589,6 +1608,7 @@ ethi_init (GnomeCanvasItem *item)
ethi->group_indent_width = 0;
ethi->table = NULL;
+ ethi->tree = NULL;
}
GtkType
diff --git a/widgets/table/e-table-header-item.h b/widgets/table/e-table-header-item.h
index 6186037d5d..0555585986 100644
--- a/widgets/table/e-table-header-item.h
+++ b/widgets/table/e-table-header-item.h
@@ -3,6 +3,7 @@
#define _E_TABLE_HEADER_ITEM_H_
#include <gal/e-table/e-table.h>
+#include <gal/e-table/e-tree.h>
#include <libgnomeui/gnome-canvas.h>
#include <gnome-xml/tree.h>
#include <gal/e-table/e-table-header.h>
@@ -64,6 +65,7 @@ typedef struct {
/* For adding fields. */
ETableHeader *full_header;
ETable *table;
+ ETree *tree;
void *config;
} ETableHeaderItem;
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index 5e1c669e53..16b8db8277 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -818,10 +818,15 @@ eti_table_model_rows_deleted (ETableModel *table_model, int row, int count, ETab
if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
return;
+ g_assert (eti->rows == -1 || row + count <= eti->rows);
+
eti->rows = e_table_model_row_count (eti->table_model);
- if (eti->height_cache)
+ g_assert (row <= eti->rows);
+
+ if (eti->height_cache) {
memmove(eti->height_cache + row, eti->height_cache + row + count, (eti->rows - row) * sizeof(int));
+ }
eti->needs_compute_height = 1;
e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
@@ -1196,6 +1201,8 @@ eti_init (GnomeCanvasItem *item)
eti->maybe_in_drag = 0;
eti->grabbed = 0;
+ eti->rows = -1;
+
e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow);
}
diff --git a/widgets/table/e-tree-selection-model.c b/widgets/table/e-tree-selection-model.c
index 70ae105a77..282e0bfb49 100644
--- a/widgets/table/e-tree-selection-model.c
+++ b/widgets/table/e-tree-selection-model.c
@@ -196,7 +196,7 @@ etsm_find_node_unless_equals (ETreeSelectionModel *etsm,
return selection_node->children[position];
} else
- return NULL;
+ return NULL;
} else {
if (!etsm->priv->root)
etsm->priv->root = e_tree_selection_model_node_new();
diff --git a/widgets/table/e-tree-table-adapter.c b/widgets/table/e-tree-table-adapter.c
index f432dcc53a..4ee3c6f704 100644
--- a/widgets/table/e-tree-table-adapter.c
+++ b/widgets/table/e-tree-table-adapter.c
@@ -605,21 +605,18 @@ etta_proxy_node_changed (ETreeModel *etm, ETreePath path, ETreeTableAdapter *ett
int row = find_row_num(etta, path);
int size;
int old_size;
+ ETreeTableAdapterNode *node;
if (row == -1)
return;
size = array_size_from_path(etta, path);
- if (e_tree_model_node_is_expandable(etta->priv->source, path)) {
- ETreeTableAdapterNode *node = find_or_create_node(etta, path);
+
+ node = find_node(etta, path);
+ if (node)
old_size = node->num_visible_children + 1;
- } else {
- ETreeTableAdapterNode *node = find_node(etta, path);
- if (node)
- old_size = node->num_visible_children + 1;
- else
- old_size = 1;
- }
+ else
+ old_size = 1;
etta_expand_to(etta, etta->priv->n_map + size - old_size);
@@ -932,13 +929,13 @@ void e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ET
return;
node = find_or_create_node(etta, path);
- row = find_row_num(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);
@@ -961,6 +958,7 @@ void e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ET
}
} else {
int num_children = node->num_visible_children;
+ g_assert (etta->priv->n_map >= row + 1 + num_children);
memmove(etta->priv->map_table + row + 1,
etta->priv->map_table + row + 1 + num_children,
(etta->priv->n_map - row - 1 - num_children) * sizeof (ETreePath));
diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c
index 568574f98f..d48773eb95 100644
--- a/widgets/table/e-tree.c
+++ b/widgets/table/e-tree.c
@@ -418,7 +418,7 @@ e_tree_setup_header (ETree *e_tree)
"full_header", e_tree->priv->full_header,
"sort_info", e_tree->priv->sort_info,
"dnd_code", pointer,
- /* "table", e_tree, FIXME*/
+ "tree", e_tree,
NULL);
g_free(pointer);
@@ -914,6 +914,12 @@ e_tree_save_state (ETree *e_tree,
gtk_object_unref(GTK_OBJECT(state));
}
+ETableSpecification *
+e_tree_get_spec (ETree *e_tree)
+{
+ return e_tree->priv->spec;
+}
+
static void
et_table_model_changed (ETableModel *model, ETree *et)
{
diff --git a/widgets/table/e-tree.h b/widgets/table/e-tree.h
index 46481a046a..4b73ff9dcb 100644
--- a/widgets/table/e-tree.h
+++ b/widgets/table/e-tree.h
@@ -9,6 +9,7 @@
#include <gal/widgets/e-printable.h>
#include <gal/e-table/e-table-extras.h>
+#include <gal/e-table/e-table-specification.h>
#include <gal/e-table/e-table-state.h>
#include <gal/e-table/e-tree-model.h>
@@ -138,6 +139,7 @@ gchar *e_tree_get_state (ETree *e_tree)
void e_tree_save_state (ETree *e_tree,
const gchar *filename);
ETableState *e_tree_get_state_object (ETree *e_tree);
+ETableSpecification *e_tree_get_spec (ETree *e_tree);
/* note that it is more efficient to provide the state at creation time */
void e_tree_set_state (ETree *e_tree,