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