mirror of
https://bitbucket.org/wisemapping/wisemapping-open-source.git
synced 2024-09-20 11:10:07 +02:00
142 lines
3.7 KiB
JavaScript
142 lines
3.7 KiB
JavaScript
|
mindplot.nlayout.RootedTreeSet = new Class({
|
||
|
initialize:function() {
|
||
|
this._rootNodes = [];
|
||
|
},
|
||
|
|
||
|
setRoot:function(root) {
|
||
|
$assert(root, 'root can not be null');
|
||
|
this._rootNodes.push(this._decodate(root));
|
||
|
},
|
||
|
|
||
|
getTreeRoots:function() {
|
||
|
return this._rootNodes;
|
||
|
},
|
||
|
|
||
|
_decodate:function(node) {
|
||
|
node._children = [];
|
||
|
return node;
|
||
|
},
|
||
|
|
||
|
add: function(node) {
|
||
|
$assert(node, 'node can not be null');
|
||
|
$assert(!node._children, 'node already added');
|
||
|
this._rootNodes.push(this._decodate(node));
|
||
|
},
|
||
|
|
||
|
remove: function(node) {
|
||
|
throw "Must be implemted";
|
||
|
},
|
||
|
|
||
|
connect: function(parentId, childId) {
|
||
|
$assert($defined(parentId), 'parent can not be null');
|
||
|
$assert($defined(childId), 'child can not be null');
|
||
|
|
||
|
var parent = this.find(parentId, true);
|
||
|
var child = this.find(childId, true);
|
||
|
$assert(!child._parent, 'node already connected. Id:' + child.getId() + ",previous:" + child._parent);
|
||
|
|
||
|
|
||
|
parent._children.push(child);
|
||
|
child._parent = parent;
|
||
|
this._rootNodes.erase(child);
|
||
|
},
|
||
|
|
||
|
disconnect: function(nodeId) {
|
||
|
$assert(node, 'node can not be null');
|
||
|
$assert(node._parent, 'child node not connected connected');
|
||
|
|
||
|
node._parent._children.erase(node);
|
||
|
this._isolated.push(node);
|
||
|
|
||
|
node._parent = null;
|
||
|
},
|
||
|
|
||
|
find:function(id, validate) {
|
||
|
$assert($defined(id), 'id can not be null');
|
||
|
|
||
|
var graphs = this._rootNodes;
|
||
|
var result = null;
|
||
|
for (var i = 0; i < graphs.length; i++) {
|
||
|
var node = graphs[i];
|
||
|
result = this._find(id, node);
|
||
|
if (result) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
$assert(validate ? result : true, 'node could not be found id:' + id);
|
||
|
return result;
|
||
|
|
||
|
},
|
||
|
|
||
|
_find:function(id, parent) {
|
||
|
if (parent.getId() == id) {
|
||
|
return parent;
|
||
|
|
||
|
}
|
||
|
|
||
|
var result = null;
|
||
|
var children = parent._children;
|
||
|
for (var i = 0; i < children.length; i++) {
|
||
|
var child = children[i];
|
||
|
result = this._find(id, child);
|
||
|
if (result)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
getChildren:function(node) {
|
||
|
$assert(node, 'node can not be null');
|
||
|
return node._children;
|
||
|
},
|
||
|
|
||
|
dump: function() {
|
||
|
var branches = this._rootNodes;
|
||
|
var result = "";
|
||
|
for (var i = 0; i < branches.length; i++) {
|
||
|
var branch = branches[i];
|
||
|
result += this._dump(branch, "");
|
||
|
}
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
_dump:function(node, indent) {
|
||
|
var result = indent + node + "\n";
|
||
|
var children = this.getChildren(node);
|
||
|
for (var i = 0; i < children.length; i++) {
|
||
|
var child = children[i];
|
||
|
result += this._dump(child, indent + " ");
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
updateBranchPosition : function(node, position) {
|
||
|
|
||
|
var oldPos = node.getPosition();
|
||
|
node.setPosition(position);
|
||
|
|
||
|
var xOffset = oldPos.x - position.x;
|
||
|
var yOffset = oldPos.y - position.y;
|
||
|
|
||
|
var children = this.getChildren(node);
|
||
|
children.forEach(function(child) {
|
||
|
this._shiftBranchPosition(child, xOffset, yOffset);
|
||
|
}.bind(this));
|
||
|
|
||
|
},
|
||
|
|
||
|
_shiftBranchPosition : function(node, xOffset, yOffset) {
|
||
|
var position = node.getPosition();
|
||
|
node.setPosition({x:position.x + xOffset, y:position.y + yOffset});
|
||
|
|
||
|
var children = this.getChildren(node);
|
||
|
children.forEach(function(child) {
|
||
|
this._shiftBranchPosition(child, xOffset, yOffset);
|
||
|
}.bind(this));
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|