summaryrefslogtreecommitdiff
path: root/gtk/gtkrbtree.c
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2001-12-04 23:49:57 +0000
committerJonathan Blandford <jrb@src.gnome.org>2001-12-04 23:49:57 +0000
commitd1a858c8371d849e2fca3b306e6076c8241d3943 (patch)
treecac03e2a4704eb52d90eed6bebc59c43d50ca721 /gtk/gtkrbtree.c
parent57506c438b37586a189330e7023682f56ed58c7f (diff)
downloadgtk+-d1a858c8371d849e2fca3b306e6076c8241d3943.tar.gz
Minor fix.
Tue Dec 4 18:38:35 2001 Jonathan Blandford <jrb@redhat.com> * demos/gtk-demo/main.c: (create_tree): Minor fix. * docs/tree-column-sizing.txt: Update * gtk/gtkrbtree.[ch]: Massive work to support validation. * gtk/gtktreemodel.c: Doc fixes. * gtk/gtktreeview.c: Incremental reflow added. * gtk/gtktreeviewcolumn.c: ditto * gtk/gtktreeviewcolumn.h: ditto
Diffstat (limited to 'gtk/gtkrbtree.c')
-rw-r--r--gtk/gtkrbtree.c127
1 files changed, 101 insertions, 26 deletions
diff --git a/gtk/gtkrbtree.c b/gtk/gtkrbtree.c
index 9b0aaf5047..9bba7ab666 100644
--- a/gtk/gtkrbtree.c
+++ b/gtk/gtkrbtree.c
@@ -571,9 +571,10 @@ _gtk_rbtree_remove (GtkRBTree *tree)
GtkRBNode *
-_gtk_rbtree_insert_after (GtkRBTree *tree,
- GtkRBNode *current,
- gint height)
+_gtk_rbtree_insert_after (GtkRBTree *tree,
+ GtkRBNode *current,
+ gint height,
+ gboolean valid)
{
GtkRBNode *node;
gboolean right = TRUE;
@@ -632,14 +633,20 @@ _gtk_rbtree_insert_after (GtkRBTree *tree,
if (gtk_debug_flags & GTK_DEBUG_TREE)
_gtk_rbtree_test (G_STRLOC, tree);
-
+
+ if (valid)
+ _gtk_rbtree_node_mark_valid (tree, node);
+ else
+ _gtk_rbtree_node_mark_invalid (tree, node);
+
return node;
}
GtkRBNode *
-_gtk_rbtree_insert_before (GtkRBTree *tree,
- GtkRBNode *current,
- gint height)
+_gtk_rbtree_insert_before (GtkRBTree *tree,
+ GtkRBNode *current,
+ gint height,
+ gboolean valid)
{
GtkRBNode *node;
gboolean left = TRUE;
@@ -698,7 +705,12 @@ _gtk_rbtree_insert_before (GtkRBTree *tree,
if (gtk_debug_flags & GTK_DEBUG_TREE)
_gtk_rbtree_test (G_STRLOC, tree);
-
+
+ if (valid)
+ _gtk_rbtree_node_mark_valid (tree, node);
+ else
+ _gtk_rbtree_node_mark_invalid (tree, node);
+
return node;
}
@@ -775,18 +787,22 @@ void
_gtk_rbtree_node_mark_valid (GtkRBTree *tree,
GtkRBNode *node)
{
- if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID))
+ if ((!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)) &&
+ (!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID)))
return;
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_INVALID);
+ GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_COLUMN_INVALID);
+
do
{
- if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
+ if ((GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)) ||
+ (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID)) ||
(node->children && GTK_RBNODE_FLAG_SET (node->children->root, GTK_RBNODE_DESCENDANTS_INVALID)) ||
- (node->left && GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID)) ||
- (node->right && GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID)))
+ (node->left != tree->nil && GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID)) ||
+ (node->right != tree->nil && GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID)))
return;
-
+
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID);
node = node->parent;
if (node == NULL)
@@ -798,6 +814,34 @@ _gtk_rbtree_node_mark_valid (GtkRBTree *tree,
while (node);
}
+
+/* Assume tree is the root node as it doesn't set DESCENDANTS_INVALID above.
+ */
+void
+_gtk_rbtree_column_invalid (GtkRBTree *tree)
+{
+ GtkRBNode *node;
+
+ if (tree == NULL)
+ return;
+ node = tree->root;
+ g_assert (node);
+
+ while (node->left != tree->nil)
+ node = node->left;
+
+ do
+ {
+ if (! (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)))
+ GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_COLUMN_INVALID);
+ GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID);
+
+ if (node->children)
+ _gtk_rbtree_column_invalid (node->children);
+ }
+ while ((node = _gtk_rbtree_next (tree, node)) != NULL);
+}
+
typedef struct _GtkRBReorder
{
GtkRBTree *children;
@@ -849,6 +893,14 @@ gtk_rbtree_reorder_fixup (GtkRBTree *tree,
node->offset += node->children->root->offset;
node->parity += node->children->root->parity;
}
+
+ if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
+ (node->right != tree->nil && GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID)) ||
+ (node->left != tree->nil && GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID)) ||
+ (node->children && GTK_RBNODE_FLAG_SET (node->children->root, GTK_RBNODE_DESCENDANTS_INVALID)))
+ GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID);
+ else
+ GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID);
}
/* It basically pulls everything out of the tree, rearranges it, and puts it
@@ -990,19 +1042,23 @@ _gtk_rbtree_node_find_parity (GtkRBTree *tree,
}
gint
-_gtk_rbtree_find_offset (GtkRBTree *tree,
- gint height,
- GtkRBTree **new_tree,
- GtkRBNode **new_node)
+_gtk_rbtree_real_find_offset (GtkRBTree *tree,
+ gint height,
+ GtkRBTree **new_tree,
+ GtkRBNode **new_node)
{
GtkRBNode *tmp_node;
+ g_assert (tree);
+
if (height < 0)
{
*new_tree = NULL;
*new_node = NULL;
+
return 0;
}
+
tmp_node = tree->root;
while (tmp_node != tree->nil &&
@@ -1033,20 +1089,40 @@ _gtk_rbtree_find_offset (GtkRBTree *tree,
*new_node = tmp_node;
return (height - tmp_node->left->offset);
}
- return _gtk_rbtree_find_offset (tmp_node->children,
- height - tmp_node->left->offset -
- (tmp_node->offset -
- tmp_node->left->offset -
- tmp_node->right->offset -
- tmp_node->children->root->offset),
- new_tree,
- new_node);
+ return _gtk_rbtree_real_find_offset (tmp_node->children,
+ height - tmp_node->left->offset -
+ (tmp_node->offset -
+ tmp_node->left->offset -
+ tmp_node->right->offset -
+ tmp_node->children->root->offset),
+ new_tree,
+ new_node);
}
*new_tree = tree;
*new_node = tmp_node;
return (height - tmp_node->left->offset);
}
+gint
+_gtk_rbtree_find_offset (GtkRBTree *tree,
+ gint height,
+ GtkRBTree **new_tree,
+ GtkRBNode **new_node)
+{
+ GtkRBNode *tmp_node;
+
+ g_assert (tree);
+
+ if ((height < 0) ||
+ (height >= tree->root->offset))
+ {
+ *new_tree = NULL;
+ *new_node = NULL;
+
+ return 0;
+ }
+ _gtk_rbtree_real_find_offset (tree, height, new_tree, new_node);
+}
void
_gtk_rbtree_remove_node (GtkRBTree *tree,
@@ -1069,7 +1145,6 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
if (gtk_debug_flags & GTK_DEBUG_TREE)
_gtk_rbtree_test (G_STRLOC, tree);
-
if (node->left == tree->nil || node->right == tree->nil)
{
y = node;