Revision: 2987
          http://vexi.svn.sourceforge.net/vexi/?rev=2987&view=rev
Author:   clrg
Date:     2008-07-21 21:21:33 +0000 (Mon, 21 Jul 2008)

Log Message:
-----------
Fix merging of trees

Modified Paths:
--------------
    trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/tree.t
    trunk/widgets/org.vexi.widgets/src/vexi/util/vector.t

Modified: trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/tree.t
===================================================================
--- trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/tree.t       
2008-07-21 18:53:49 UTC (rev 2986)
+++ trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/tree.t       
2008-07-21 21:21:33 UTC (rev 2987)
@@ -30,6 +30,15 @@
         /** select when we mouse press on the node */
         thisbox.v_nodePress = function(v) { if (enabled) selected = true; 
cascade = v; }
         
+        var insertAfter = function(node) {
+            if (!node.v_is_tree) return null;
+            for (var i=node.numchildren-1; i>=0; i--) {
+                var t = insertAfter(node[i]);
+                if (t) return t;
+            }
+            return node;
+        }
+        
         thisbox.v_childrenWrite = function(c) {
             if (c and c.v_is_tree) {
                 // we have no group
@@ -51,27 +60,14 @@
                         if (insafter) insafter = 
v_group.members.before(insafter);
                     }
                     // need to find last node (nodes may be trees)
-                    if (!insafter) {
-                        var node = thisbox;
-                        insafter = thisbox;
-                        for (var i=thisbox.numchildren-1; i>=0; i--) {
-                           if (node[i].v_is_tree) {
-                               insafter = node[i];
-                               if (node[i].numchildren) {
-                                   node = node[i];
-                                   // reset i, no -1 due to for loop i--
-                                   i = node.numchildren;
-                               } else break;
-                           }
-                        }
-                    }
-                    // now position [insafter] is known
-                    
+                    if (!insafter) insafter = insertAfter(thisbox);
                     // merge groups
-                    if (c.v_group)
-                        v_group.merge(c.v_group, insafter);
+                    if (c.v_group) {
+                        if (c.v_group!=v_group)
+                            v_group.merge(c.v_group, insafter);
+                        else throw "tree re-arranging not yet directly 
supported";
                     // c has no group - insert it
-                    else {
+                    } else {
                         c.v_group = v_group;
                         v_group.members.insert(c, insafter);
                     }

Modified: trunk/widgets/org.vexi.widgets/src/vexi/util/vector.t
===================================================================
--- trunk/widgets/org.vexi.widgets/src/vexi/util/vector.t       2008-07-21 
18:53:49 UTC (rev 2986)
+++ trunk/widgets/org.vexi.widgets/src/vexi/util/vector.t       2008-07-21 
21:21:33 UTC (rev 2987)
@@ -70,6 +70,8 @@
         /** function to check where elements contains v */
         thisbox.contains = function(v) { return v != null and elements[v] ? 
true : false; }
         
+        thisbox.dump = function() { return vexi.js.stringify(elements); }
+        
         var removeNoChecks = function(v) {
             if (count == 1)
                 if (v == objn) return makeEmpty();
@@ -128,11 +130,15 @@
         
         /** function to insert v optionally after n */
         thisbox.insert = function(v, n) {
-            if (v == null) throw "tried to add null object to a vector";
+            if (v == null)
+                throw "tried to add null object to a vector";
             // insert after the last element
             if (arguments.length == 1 or n == objn or n == null) { push(v); 
return; }
             // w does not exist
-            if (!elements[n]) throw "tried to insert after an object not 
present in a vector";
+            if (!elements[n])
+                throw "tried to insert after an object not present in a 
vector";
+                //throw "tried to insert after an object not present in a 
vector - "+n
+                //+"\n"+n.text+", "+vexi.js.stringify(elements);
             // prevent duplicate entries
             if (elements[v]) removeNoChecks(v);
             // insert v after n
@@ -146,12 +152,19 @@
         
         /** merge another vector with this one, optionally after w */
         thisbox.merge = function(vec, n) {
+            if (vec == thisbox)
+                throw "Tried to merge a vector with itself";
+            if (vec == null)
+                throw "Tried to merge a null vector";
             if (vec.length == 0) return;
             // we could do this more efficiently
             var l = vec.length;
             if (n) {
                 if (!elements[n])
                     throw "tried to merge after an object not present in a 
vector";
+                    //throw "tried to merge after an object not present in a 
vector - "+n
+                    //+"\nVec1: "+vexi.js.stringify(elements)
+                    //+"\nVec2: "+vec.dump();
                 for (var i=0; l>i; i++) insert(vec.pop(), n);
             } else for (var i=0; l>i; i++) push(vec.shift());
         }


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Vexi-svn mailing list
Vexi-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vexi-svn

Reply via email to