diff options
author | Jonathan Blandford <jrb@redhat.com> | 2001-12-04 23:49:57 +0000 |
---|---|---|
committer | Jonathan Blandford <jrb@src.gnome.org> | 2001-12-04 23:49:57 +0000 |
commit | d1a858c8371d849e2fca3b306e6076c8241d3943 (patch) | |
tree | cac03e2a4704eb52d90eed6bebc59c43d50ca721 /gtk/gtkrbtree.c | |
parent | 57506c438b37586a189330e7023682f56ed58c7f (diff) | |
download | gtk+-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.c | 127 |
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; |