| /** |
| * Copyright (c) 2006-2015, JGraph Ltd |
| * Copyright (c) 2006-2015, Gaudenz Alder |
| */ |
| /** |
| * Class: mxGraphHierarchyNode |
| * |
| * An abstraction of a hierarchical edge for the hierarchy layout |
| * |
| * Constructor: mxGraphHierarchyNode |
| * |
| * Constructs an internal node to represent the specified real graph cell |
| * |
| * Arguments: |
| * |
| * cell - the real graph cell this node represents |
| */ |
| function mxGraphHierarchyNode(cell) |
| { |
| mxGraphAbstractHierarchyCell.apply(this, arguments); |
| this.cell = cell; |
| this.id = mxObjectIdentity.get(cell); |
| this.connectsAsTarget = []; |
| this.connectsAsSource = []; |
| }; |
| |
| /** |
| * Extends mxGraphAbstractHierarchyCell. |
| */ |
| mxGraphHierarchyNode.prototype = new mxGraphAbstractHierarchyCell(); |
| mxGraphHierarchyNode.prototype.constructor = mxGraphHierarchyNode; |
| |
| /** |
| * Variable: cell |
| * |
| * The graph cell this object represents. |
| */ |
| mxGraphHierarchyNode.prototype.cell = null; |
| |
| /** |
| * Variable: id |
| * |
| * The object identity of the wrapped cell |
| */ |
| mxGraphHierarchyNode.prototype.id = null; |
| |
| /** |
| * Variable: connectsAsTarget |
| * |
| * Collection of hierarchy edges that have this node as a target |
| */ |
| mxGraphHierarchyNode.prototype.connectsAsTarget = null; |
| |
| /** |
| * Variable: connectsAsSource |
| * |
| * Collection of hierarchy edges that have this node as a source |
| */ |
| mxGraphHierarchyNode.prototype.connectsAsSource = null; |
| |
| /** |
| * Variable: hashCode |
| * |
| * Assigns a unique hashcode for each node. Used by the model dfs instead |
| * of copying HashSets |
| */ |
| mxGraphHierarchyNode.prototype.hashCode = false; |
| |
| /** |
| * Function: getRankValue |
| * |
| * Returns the integer value of the layer that this node resides in |
| */ |
| mxGraphHierarchyNode.prototype.getRankValue = function(layer) |
| { |
| return this.maxRank; |
| }; |
| |
| /** |
| * Function: getNextLayerConnectedCells |
| * |
| * Returns the cells this cell connects to on the next layer up |
| */ |
| mxGraphHierarchyNode.prototype.getNextLayerConnectedCells = function(layer) |
| { |
| if (this.nextLayerConnectedCells == null) |
| { |
| this.nextLayerConnectedCells = []; |
| this.nextLayerConnectedCells[0] = []; |
| |
| for (var i = 0; i < this.connectsAsTarget.length; i++) |
| { |
| var edge = this.connectsAsTarget[i]; |
| |
| if (edge.maxRank == -1 || edge.maxRank == layer + 1) |
| { |
| // Either edge is not in any rank or |
| // no dummy nodes in edge, add node of other side of edge |
| this.nextLayerConnectedCells[0].push(edge.source); |
| } |
| else |
| { |
| // Edge spans at least two layers, add edge |
| this.nextLayerConnectedCells[0].push(edge); |
| } |
| } |
| } |
| |
| return this.nextLayerConnectedCells[0]; |
| }; |
| |
| /** |
| * Function: getPreviousLayerConnectedCells |
| * |
| * Returns the cells this cell connects to on the next layer down |
| */ |
| mxGraphHierarchyNode.prototype.getPreviousLayerConnectedCells = function(layer) |
| { |
| if (this.previousLayerConnectedCells == null) |
| { |
| this.previousLayerConnectedCells = []; |
| this.previousLayerConnectedCells[0] = []; |
| |
| for (var i = 0; i < this.connectsAsSource.length; i++) |
| { |
| var edge = this.connectsAsSource[i]; |
| |
| if (edge.minRank == -1 || edge.minRank == layer - 1) |
| { |
| // No dummy nodes in edge, add node of other side of edge |
| this.previousLayerConnectedCells[0].push(edge.target); |
| } |
| else |
| { |
| // Edge spans at least two layers, add edge |
| this.previousLayerConnectedCells[0].push(edge); |
| } |
| } |
| } |
| |
| return this.previousLayerConnectedCells[0]; |
| }; |
| |
| /** |
| * Function: isVertex |
| * |
| * Returns true. |
| */ |
| mxGraphHierarchyNode.prototype.isVertex = function() |
| { |
| return true; |
| }; |
| |
| /** |
| * Function: getGeneralPurposeVariable |
| * |
| * Gets the value of temp for the specified layer |
| */ |
| mxGraphHierarchyNode.prototype.getGeneralPurposeVariable = function(layer) |
| { |
| return this.temp[0]; |
| }; |
| |
| /** |
| * Function: setGeneralPurposeVariable |
| * |
| * Set the value of temp for the specified layer |
| */ |
| mxGraphHierarchyNode.prototype.setGeneralPurposeVariable = function(layer, value) |
| { |
| this.temp[0] = value; |
| }; |
| |
| /** |
| * Function: isAncestor |
| */ |
| mxGraphHierarchyNode.prototype.isAncestor = function(otherNode) |
| { |
| // Firstly, the hash code of this node needs to be shorter than the |
| // other node |
| if (otherNode != null && this.hashCode != null && otherNode.hashCode != null |
| && this.hashCode.length < otherNode.hashCode.length) |
| { |
| if (this.hashCode == otherNode.hashCode) |
| { |
| return true; |
| } |
| |
| if (this.hashCode == null || this.hashCode == null) |
| { |
| return false; |
| } |
| |
| // Secondly, this hash code must match the start of the other |
| // node's hash code. Arrays.equals cannot be used here since |
| // the arrays are different length, and we do not want to |
| // perform another array copy. |
| for (var i = 0; i < this.hashCode.length; i++) |
| { |
| if (this.hashCode[i] != otherNode.hashCode[i]) |
| { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| return false; |
| }; |
| |
| /** |
| * Function: getCoreCell |
| * |
| * Gets the core vertex associated with this wrapper |
| */ |
| mxGraphHierarchyNode.prototype.getCoreCell = function() |
| { |
| return this.cell; |
| }; |