aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/table/e-tree-selection-model.c23
-rw-r--r--widgets/table/e-tree-table-adapter.c78
-rw-r--r--widgets/table/e-tree-table-adapter.h3
3 files changed, 57 insertions, 47 deletions
diff --git a/widgets/table/e-tree-selection-model.c b/widgets/table/e-tree-selection-model.c
index a790498c61..17c596062a 100644
--- a/widgets/table/e-tree-selection-model.c
+++ b/widgets/table/e-tree-selection-model.c
@@ -180,23 +180,6 @@ etsm_real_clear (ETreeSelectionModel *etsm)
}
-static gint
-etsm_orig_position(ETreeModel *etm, ETreePath path)
-{
- ETreePath parent, p;
- gint pos;
-
- parent = e_tree_model_node_get_parent(etm, path);
- for (pos = 0, p = e_tree_model_node_get_first_child(etm, parent);
- p && (p != path);
- p = e_tree_model_node_get_next(etm, p), pos++);
-
- if (p)
- return pos;
-
- return -1;
-}
-
static ETreeSelectionModelNode *
etsm_find_node_unless_equals (ETreeSelectionModel *etsm,
ETreePath path,
@@ -210,7 +193,7 @@ etsm_find_node_unless_equals (ETreeSelectionModel *etsm,
if (parent) {
selection_node = etsm_find_node_unless_equals(etsm, parent, grow);
if (selection_node) {
- int position = etsm_orig_position(etsm->priv->model, path);
+ int position = e_tree_table_adapter_orig_position(etsm->priv->etta, path);
if (selection_node->all_children_selected && grow)
return NULL;
if (!(selection_node->any_children_selected || grow))
@@ -260,7 +243,7 @@ update_parents (ETreeSelectionModel *etsm, ETreePath path)
g_free(node_sequence);
return;
}
- orig_position_sequence[i] = etsm_orig_position(etsm->priv->model, parents);
+ orig_position_sequence[i] = e_tree_table_adapter_orig_position(etsm->priv->etta, parents);
parents = e_tree_model_node_get_parent(etsm->priv->model, parents);
}
@@ -622,7 +605,7 @@ etsm_recurse_is_path_selected (ETreeSelectionModel *etsm,
if (parent) {
selection_node = etsm_recurse_is_path_selected (etsm, parent, is_selected);
if (selection_node) {
- int position = etsm_orig_position(etsm->priv->model, path);
+ int position = e_tree_table_adapter_orig_position(etsm->priv->etta, path);
if (position < 0 || position >= selection_node->num_children) {
*is_selected = FALSE;
return NULL;
diff --git a/widgets/table/e-tree-table-adapter.c b/widgets/table/e-tree-table-adapter.c
index ead9650cce..9f77bd7350 100644
--- a/widgets/table/e-tree-table-adapter.c
+++ b/widgets/table/e-tree-table-adapter.c
@@ -48,6 +48,7 @@ typedef struct {
ETreePath path;
guint32 num_visible_children;
guint32 index;
+ guint32 orig_pos;
guint expanded : 1;
guint expandable : 1;
@@ -138,34 +139,53 @@ remap_indices(ETreeTableAdapter *etta)
etta->priv->remap_needed = FALSE;
}
+static node_t *
+get_node(ETreeTableAdapter *etta, ETreePath path)
+{
+ GNode *gnode = lookup_gnode(etta, path);
+
+ if (!gnode)
+ return NULL;
+
+ return (node_t *)gnode->data;
+}
+
static void
resort_node(ETreeTableAdapter *etta, GNode *gnode, gboolean recurse)
{
node_t *node = (node_t *)gnode->data;
ETreePath *paths, path;
GNode *prev, *curr;
- int i;
+ int i, count;
+ gboolean sort_needed;
- if (node->num_visible_children == 0 || !gnode->children)
- return;
- else if (node->num_visible_children == 1 && recurse) {
- resort_node(etta, gnode->children, recurse);
+ if (node->num_visible_children == 0)
return;
+
+ sort_needed = etta->priv->sort_info && e_table_sort_info_sorting_get_count (etta->priv->sort_info) > 0;
+
+ for (i = 0, path = e_tree_model_node_get_first_child(etta->priv->source, node->path); path;
+ path = e_tree_model_node_get_next(etta->priv->source, path), i++) {
+ node_t *child = get_node(etta, path);
+ if (child)
+ child->orig_pos = i;
}
- paths = g_new0(ETreePath, node->num_visible_children);
-
- g_return_if_fail(paths != NULL);
+ count = i;
+ if (count <= 1)
+ return;
+
+ paths = g_new0(ETreePath, count);
for (i = 0, path = e_tree_model_node_get_first_child(etta->priv->source, node->path); path;
path = e_tree_model_node_get_next(etta->priv->source, path), i++)
paths[i] = path;
- if (etta->priv->sort_info && e_table_sort_info_sorting_get_count > 0)
- e_table_sorting_utils_tree_sort(etta->priv->source, etta->priv->sort_info, etta->priv->header, paths, node->num_visible_children);
+ if (count > 1 && sort_needed)
+ e_table_sorting_utils_tree_sort(etta->priv->source, etta->priv->sort_info, etta->priv->header, paths, count);
prev = NULL;
- for (i = 0; i < node->num_visible_children; i++) {
+ for (i = 0; i < count; i++) {
curr = lookup_gnode(etta, paths[i]);
if (!curr)
continue;
@@ -185,17 +205,6 @@ resort_node(ETreeTableAdapter *etta, GNode *gnode, gboolean recurse)
g_free(paths);
}
-static node_t *
-get_node(ETreeTableAdapter *etta, ETreePath path)
-{
- GNode *gnode = lookup_gnode(etta, path);
-
- if (!gnode)
- return NULL;
-
- return (node_t *)gnode->data;
-}
-
static gint
get_row(ETreeTableAdapter *etta, ETreePath path)
{
@@ -295,6 +304,8 @@ delete_node(ETreeTableAdapter *etta, ETreePath parent, ETreePath path)
parent_node->expandable = expandable;
e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row);
}
+
+ resort_node (etta, parent_gnode, FALSE);
}
e_table_model_rows_deleted(E_TABLE_MODEL(etta), row, to_remove);
@@ -309,6 +320,7 @@ create_gnode(ETreeTableAdapter *etta, ETreePath path)
node = g_new0(node_t, 1);
node->path = path;
node->index = -1;
+ node->orig_pos = 0;
node->expanded = e_tree_model_get_expanded_default(etta->priv->source);
node->expandable = e_tree_model_node_is_expandable(etta->priv->source, path);
node->expandable_set = 1;
@@ -323,13 +335,15 @@ insert_children(ETreeTableAdapter *etta, GNode *gnode)
{
ETreePath path, tmp;
int count = 0;
+ int pos = 0;
path = ((node_t *)gnode->data)->path;
for (tmp = e_tree_model_node_get_first_child(etta->priv->source, path);
tmp;
- tmp = e_tree_model_node_get_next(etta->priv->source, tmp)) {
+ tmp = e_tree_model_node_get_next(etta->priv->source, tmp), pos++) {
GNode *child = create_gnode(etta, tmp);
node_t *node = (node_t *) child->data;
+ node->orig_pos = pos;
if (node->expanded)
node->num_visible_children = insert_children(etta, child);
g_node_prepend(gnode, child);
@@ -418,10 +432,9 @@ insert_node(ETreeTableAdapter *etta, ETreePath parent, ETreePath path)
g_node_append(parent_gnode, gnode);
update_child_counts(parent_gnode, node->num_visible_children + 1);
- if (etta->priv->sort_info && e_table_sort_info_sorting_get_count(etta->priv->sort_info) > 0) {
- resort_node(etta, parent_gnode, FALSE);
- resort_node(etta, gnode, TRUE);
- }
+ resort_node(etta, parent_gnode, FALSE);
+ resort_node(etta, gnode, TRUE);
+
size = node->num_visible_children + 1;
resize_map(etta, etta->priv->n_map + size);
if (parent_gnode == etta->priv->root)
@@ -1106,3 +1119,14 @@ e_tree_table_adapter_set_sort_info (ETreeTableAdapter *etta, ETableSortInfo *sor
fill_map(etta, 0, etta->priv->root);
e_table_model_changed(E_TABLE_MODEL(etta));
}
+
+gint
+e_tree_table_adapter_orig_position (ETreeTableAdapter *etta, ETreePath path)
+{
+ node_t *node = get_node (etta, path);
+
+ if (!node)
+ return -1;
+
+ return node->orig_pos;
+}
diff --git a/widgets/table/e-tree-table-adapter.h b/widgets/table/e-tree-table-adapter.h
index a856489a40..2f6629a005 100644
--- a/widgets/table/e-tree-table-adapter.h
+++ b/widgets/table/e-tree-table-adapter.h
@@ -88,6 +88,9 @@ void e_tree_table_adapter_load_expanded_state (ETreeTableAdapter
void e_tree_table_adapter_set_sort_info (ETreeTableAdapter *etta,
ETableSortInfo *sort_info);
+gint e_tree_table_adapter_orig_position (ETreeTableAdapter *etta,
+ ETreePath path);
+
G_END_DECLS
#endif /* _E_TREE_TABLE_ADAPTER_H_ */