? movefix.txt
Index: tree.tcl
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/struct/tree.tcl,v
retrieving revision 1.16
diff -u -r1.16 tree.tcl
--- tree.tcl	9 May 2002 05:46:04 -0000	1.16
+++ tree.tcl	7 Jul 2002 21:15:55 -0000
@@ -620,6 +620,7 @@
 	set index [expr {[lsearch -exact $children($parentNode) $val] + 1}]
     }
 
+    # Validate each node to move
     foreach node $args {
 	if { [string equal $node "root"] } {
 	    error "cannot move root node"
@@ -638,27 +639,20 @@
 	    }
 	    set ancestor $parent($ancestor)
 	}
-	
-	# Remove this node from its parent's children list
+	}
+    
+    # Remove each node from its current parent
+    foreach node $args {
 	set oldParent $parent($node)
 	set ind [lsearch -exact $children($oldParent) $node]
 	set children($oldParent) [lreplace $children($oldParent) $ind $ind]
 
 	# Update the nodes parent value
 	set parent($node) $parentNode
-
-	# If the node is moving within its parent, and its old location
-	# was before the new location, decrement the new location, so that
-	# it gets put in the right spot
-	if { [string equal $oldParent $parentNode] && $ind < $index } {
-	    incr index -1
-	}
-
-	# Add this node to its parent's children list
-	set children($parentNode) [linsert $children($parentNode) $index $node]
-	
-	incr index
     }
+
+	# Add all the nodes to the new parent's children list
+	set children($parentNode) [eval linsert [list $children($parentNode)] $index $args]
 
     return
 }
Index: tree.test
===================================================================
RCS file: /cvsroot/tcllib/tcllib/modules/struct/tree.test,v
retrieving revision 1.15
diff -u -r1.15 tree.test
--- tree.test	9 May 2002 05:46:04 -0000	1.15
+++ tree.test	7 Jul 2002 21:15:57 -0000
@@ -328,7 +328,7 @@
     set result [mytree children root]
     mytree destroy
     set result
-} [list node0 node1 node2]
+} [list node2 node0 node1]
 test tree-7.9 {move moves node within parent properly} {
     tree mytree
     mytree insert root end node0 node1 node2 node3
@@ -336,7 +336,7 @@
     set result [mytree children root]
     mytree destroy
     set result
-} [list node0 node1 node2 node3]
+} [list node0 node2 node1 node3]
 test tree-7.10 {move moves node within parent properly} {
     tree mytree
     mytree insert root end node0 node1 node2 node3
@@ -345,7 +345,8 @@
     set result [mytree children root]
     mytree destroy
     set result
-} [list node1 node0 node4 node5 node6 node2 node3]
+} [list node1 node2 node0 node4 node5 node6 node3]
+
 test tree-7.11 {move moves node in parent properly when oldInd < newInd} {
     tree mytree
     mytree insert root end node0 node1 node2 node3
@@ -353,7 +354,25 @@
     set result [mytree children root]
     mytree destroy
     set result
+} [list node1 node2 node0 node3]
+
+test tree-7.12 {move node up one} {
+    tree mytree
+    mytree insert root end node0 node1 node2 node3
+    mytree move root [mytree index [mytree next node0]] node0
+    set result [mytree children root]
+    mytree destroy
+    set result
 } [list node1 node0 node2 node3]
+
+test tree-7.13 {move node down one} {
+    tree mytree
+    mytree insert root end node0 node1 node2 node3
+    mytree move root [mytree index [mytree previous node2]] node2
+    set result [mytree children root]
+    mytree destroy
+    set result
+} [list node0 node2 node1 node3]
 
 test tree-8.1 {parent gives error on fake node} {
     tree mytree
