From 93e035bbbb657790556e7ca6e4768d62e4136cf2 Mon Sep 17 00:00:00 2001 From: Gonzalo Bellver Date: Mon, 2 Jan 2012 17:10:14 -0300 Subject: [PATCH] Grid sorter first approach --- .../src/main/javascript/nlayout/GridSorter.js | 38 ++++++++++- .../main/javascript/nlayout/LayoutManager.js | 4 ++ .../main/javascript/nlayout/OriginalLayout.js | 6 +- .../main/javascript/nlayout/SymetricSorter.js | 2 +- .../src/main/javascript/nlayout/TestSuite.js | 65 +++++++++++++++++-- .../src/test/javascript/static/layout.html | 9 +++ 6 files changed, 113 insertions(+), 11 deletions(-) diff --git a/mindplot/src/main/javascript/nlayout/GridSorter.js b/mindplot/src/main/javascript/nlayout/GridSorter.js index 77c7cc3a..8152988a 100644 --- a/mindplot/src/main/javascript/nlayout/GridSorter.js +++ b/mindplot/src/main/javascript/nlayout/GridSorter.js @@ -1,12 +1,48 @@ mindplot.nlayout.GridSorter = new Class({ Extends: mindplot.nlayout.SymetricSorder, + computeOffsets: function(treeSet, node) { + $assert(treeSet, "treeSet can no be null."); + $assert(node, "node can no be null."); + $assert("order can no be null."); + + var children = this._getSortedChildren(treeSet, node); + + // Compute heights ... + var heights = children.map(function(child) { + return {id:child.getId(),height:this._computeChildrenHeight(treeSet, child)}; + }.bind(this)); + + // Calculate the offsets ... + var result = {}; + for (var i = 0; i < heights.length; i++) { + var even = i%2 == 0 ? 1 : -1; + + var zeroHeight = i == 0 ? 0 : heights[0].height/2 * even; + var middleHeight = 0; + for (var j=i-2; j>0; j=j-2) { + middleHeight += heights[j].height * even; + } + var finalHeight = i == 0 ? 0 : heights[i].height/2 * even; + + var yOffset = zeroHeight + middleHeight +finalHeight; + var xOffset = node.getSize().width + mindplot.nlayout.GridSorter.GRID_HORIZONTAR_SIZE; + + $assert(!isNaN(xOffset), "xOffset can not be null"); + $assert(!isNaN(yOffset), "yOffset can not be null"); + + result[heights[i].id] = {x:xOffset,y:yOffset}; + + } + return result; + }, + toString:function() { return "Grid Sorter"; } }); -mindplot.nlayout.GridSorter.GRID_HORIZONTAR_SIZE = 50; +mindplot.nlayout.GridSorter.GRID_HORIZONTAR_SIZE = 20; mindplot.nlayout.GridSorter.INTER_NODE_VERTICAL_DISTANCE = 50; diff --git a/mindplot/src/main/javascript/nlayout/LayoutManager.js b/mindplot/src/main/javascript/nlayout/LayoutManager.js index dad0a187..ad43535f 100644 --- a/mindplot/src/main/javascript/nlayout/LayoutManager.js +++ b/mindplot/src/main/javascript/nlayout/LayoutManager.js @@ -22,6 +22,10 @@ mindplot.nlayout.LayoutManager = new Class({ // @Todo: finish... }, + find: function(id) { + return this._treeSet.find(id); + }, + connectNode: function(parentId, childId, order) { $assert($defined(parentId), "parentId can not be null"); $assert($defined(childId), "childId can not be null"); diff --git a/mindplot/src/main/javascript/nlayout/OriginalLayout.js b/mindplot/src/main/javascript/nlayout/OriginalLayout.js index 0050122d..53617d98 100644 --- a/mindplot/src/main/javascript/nlayout/OriginalLayout.js +++ b/mindplot/src/main/javascript/nlayout/OriginalLayout.js @@ -48,15 +48,12 @@ mindplot.nlayout.OriginalLayout = new Class({ layout: function() { var roots = this._treeSet.getTreeRoots(); roots.forEach(function(node) { - console.log('node = ' + node.getId()); //TODO(gb): Remove trace!!! // Calculate all node heights ... var sorter = node.getSorter(); - console.log('sorter = ' + sorter); //TODO(gb): Remove trace!!! // @Todo: This must not be implemented in this way.Each sorter could have different notion of heights ... var heightById = sorter.computeChildrenIdByHeights(this._treeSet, node); - console.log('heightById = ' + heightById[0]); //TODO(gb): Remove trace!!! this._layoutChildren(node, heightById); }, this); @@ -98,7 +95,8 @@ mindplot.nlayout.OriginalLayout = new Class({ }); mindplot.nlayout.OriginalLayout.SYMETRIC_SORTER = new mindplot.nlayout.SymetricSorder(); -mindplot.nlayout.OriginalLayout.GRID_SORTER = new mindplot.nlayout.SymetricSorder(); +mindplot.nlayout.OriginalLayout.GRID_SORTER = new mindplot.nlayout.GridSorter(); +//mindplot.nlayout.OriginalLayout.GRID_SORTER = new mindplot.nlayout.SymetricSorder(); diff --git a/mindplot/src/main/javascript/nlayout/SymetricSorter.js b/mindplot/src/main/javascript/nlayout/SymetricSorter.js index e752a802..e6aa72ad 100644 --- a/mindplot/src/main/javascript/nlayout/SymetricSorter.js +++ b/mindplot/src/main/javascript/nlayout/SymetricSorter.js @@ -132,7 +132,7 @@ mindplot.nlayout.SymetricSorder = new Class({ for (var i = 0; i < heights.length; i++) { ysum = ysum - heights[i].height; - var yOffset = ysum + heights[i].height/2; + var yOffset = ysum + heights[i].height/2; var xOffset = node.getSize().width + mindplot.nlayout.SymetricSorder.INTERNODE_HORIZONTAL_PADDING; $assert(!isNaN(xOffset), "xOffset can not be null"); diff --git a/mindplot/src/main/javascript/nlayout/TestSuite.js b/mindplot/src/main/javascript/nlayout/TestSuite.js index 9a18faff..382c8878 100644 --- a/mindplot/src/main/javascript/nlayout/TestSuite.js +++ b/mindplot/src/main/javascript/nlayout/TestSuite.js @@ -3,6 +3,7 @@ mindplot.nlayout.TestSuite = new Class({ initialize:function() { this.testAligned(); this.testSymmetry(); + this.testGrid(); this.testEvents(); this.testEventsComplex(); this.testDisconnect(); @@ -16,12 +17,22 @@ mindplot.nlayout.TestSuite = new Class({ var manager = new mindplot.nlayout.LayoutManager(0, size); manager.addNode(1, size, position); + manager.addNode(2, size, position); + manager.addNode(3, size, position); + manager.addNode(4, size, position); manager.connectNode(0, 1, 0); + manager.connectNode(1, 2, 0); + manager.connectNode(2, 3, 0); + manager.connectNode(3, 4, 0); manager.layout(); manager.dump(); + manager.plot("testAligned", {w:300,h:200}); - manager.plot("testAligned"); + $assert(manager.find(0).getPosition().y == manager.find(1).getPosition().y, "Nodes are not aligned"); + $assert(manager.find(0).getPosition().y == manager.find(2).getPosition().y, "Nodes are not aligned"); + $assert(manager.find(0).getPosition().y == manager.find(3).getPosition().y, "Nodes are not aligned"); + $assert(manager.find(0).getPosition().y == manager.find(4).getPosition().y, "Nodes are not aligned"); }, testSymmetry: function() { @@ -39,21 +50,65 @@ mindplot.nlayout.TestSuite = new Class({ manager.addNode(8, size, position); manager.addNode(9, size, position); manager.addNode(10, size, position); + manager.addNode(11, size, position); + manager.addNode(12, size, position); manager.connectNode(0, 1, 0); manager.connectNode(0, 2, 1); manager.connectNode(0, 3, 2); manager.connectNode(0, 4, 3); manager.connectNode(0, 5, 4); - manager.connectNode(5, 6, 0); - manager.connectNode(5, 7, 1); + manager.connectNode(1, 6, 0); + manager.connectNode(1, 7, 1); manager.connectNode(7, 8, 0); manager.connectNode(8, 9, 0); - manager.connectNode(1, 10, 0); + manager.connectNode(5, 10, 0); + manager.connectNode(6, 11, 0); + manager.connectNode(6, 12, 1); manager.layout(); +// manager.dump(); + manager.plot("testSymmetry",{w:400, h:300}); + + //TODO(gb): make asserts + }, + + testGrid: function() { + var size = {width:25,height:25}; + var position = {x:0,y:0}; + var manager = new mindplot.nlayout.LayoutManager(0, size); + + manager.addNode(1, size, position); + manager.connectNode(0, 1, 0); + manager.layout(); + manager.plot("testGrid1"); + + manager.addNode(2, size, position); + manager.connectNode(0, 2, 1); + manager.layout(); + manager.plot("testGrid2"); + + manager.addNode(3, size, position); + manager.connectNode(0, 3, 2); + manager.layout(); + manager.plot("testGrid3"); + + manager.addNode(4, size, position); + manager.connectNode(0, 4, 3); + manager.layout(); + manager.plot("testGrid4"); + + manager.addNode(5, size, position); + manager.addNode(6, size, position); + manager.addNode(7, size, position); + manager.connectNode(2, 5, 0); + manager.connectNode(2, 6, 1); + manager.connectNode(6, 7, 0); + manager.layout(); + manager.plot("testGrid5", {w:300, h:300}); + manager.dump(); - manager.plot("testSymmetry",{w:400, h:300}); + //TODO(gb): make asserts }, testEvents: function() { diff --git a/mindplot/src/test/javascript/static/layout.html b/mindplot/src/test/javascript/static/layout.html index 71167f08..a86d7a7c 100644 --- a/mindplot/src/test/javascript/static/layout.html +++ b/mindplot/src/test/javascript/static/layout.html @@ -48,6 +48,15 @@

testSymmetry:

+

testGrid:

+
+
+
+
+
+
+
+

testEvents: