diff options
author | adhitya | 2016-04-11 15:10:54 +0000 |
---|---|---|
committer | adhitya | 2016-04-11 15:10:54 +0000 |
commit | 92f3207b50a1caca07df5c5b238212af3358905b (patch) | |
tree | 38c92f9649c6f1016d2ef70fa2fd33c86b437cba /src/js/layout/mxCircleLayout.js | |
parent | ab5fb6e125d82fdd5818aea3ce370c43c2293ddd (diff) | |
download | xcos-on-web-92f3207b50a1caca07df5c5b238212af3358905b.tar.gz xcos-on-web-92f3207b50a1caca07df5c5b238212af3358905b.tar.bz2 xcos-on-web-92f3207b50a1caca07df5c5b238212af3358905b.zip |
Revert last two commits - Keyboard shortcuts are not working
Diffstat (limited to 'src/js/layout/mxCircleLayout.js')
-rw-r--r-- | src/js/layout/mxCircleLayout.js | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/js/layout/mxCircleLayout.js b/src/js/layout/mxCircleLayout.js new file mode 100644 index 0000000..e3e6ec1 --- /dev/null +++ b/src/js/layout/mxCircleLayout.js @@ -0,0 +1,203 @@ +/** + * $Id: mxCircleLayout.js,v 1.25 2012-08-22 17:26:12 gaudenz Exp $ + * Copyright (c) 2006-2010, JGraph Ltd + */ +/** + * Class: mxCircleLayout + * + * Extends <mxGraphLayout> to implement a circluar layout for a given radius. + * The vertices do not need to be connected for this layout to work and all + * connections between vertices are not taken into account. + * + * Example: + * + * (code) + * var layout = new mxCircleLayout(graph); + * layout.execute(graph.getDefaultParent()); + * (end) + * + * Constructor: mxCircleLayout + * + * Constructs a new circular layout for the specified radius. + * + * Arguments: + * + * graph - <mxGraph> that contains the cells. + * radius - Optional radius as an int. Default is 100. + */ +function mxCircleLayout(graph, radius) +{ + mxGraphLayout.call(this, graph); + this.radius = (radius != null) ? radius : 100; +}; + +/** + * Extends mxGraphLayout. + */ +mxCircleLayout.prototype = new mxGraphLayout(); +mxCircleLayout.prototype.constructor = mxCircleLayout; + +/** + * Variable: radius + * + * Integer specifying the size of the radius. Default is 100. + */ +mxCircleLayout.prototype.radius = null; + +/** + * Variable: moveCircle + * + * Boolean specifying if the circle should be moved to the top, + * left corner specified by <x0> and <y0>. Default is false. + */ +mxCircleLayout.prototype.moveCircle = false; + +/** + * Variable: x0 + * + * Integer specifying the left coordinate of the circle. + * Default is 0. + */ +mxCircleLayout.prototype.x0 = 0; + +/** + * Variable: y0 + * + * Integer specifying the top coordinate of the circle. + * Default is 0. + */ +mxCircleLayout.prototype.y0 = 0; + +/** + * Variable: resetEdges + * + * Specifies if all edge points of traversed edges should be removed. + * Default is true. + */ +mxCircleLayout.prototype.resetEdges = true; + +/** + * Variable: disableEdgeStyle + * + * Specifies if the STYLE_NOEDGESTYLE flag should be set on edges that are + * modified by the result. Default is true. + */ +mxCircleLayout.prototype.disableEdgeStyle = true; + +/** + * Function: execute + * + * Implements <mxGraphLayout.execute>. + */ +mxCircleLayout.prototype.execute = function(parent) +{ + var model = this.graph.getModel(); + + // Moves the vertices to build a circle. Makes sure the + // radius is large enough for the vertices to not + // overlap + model.beginUpdate(); + try + { + // Gets all vertices inside the parent and finds + // the maximum dimension of the largest vertex + var max = 0; + var top = null; + var left = null; + var vertices = []; + var childCount = model.getChildCount(parent); + + for (var i = 0; i < childCount; i++) + { + var cell = model.getChildAt(parent, i); + + if (!this.isVertexIgnored(cell)) + { + vertices.push(cell); + var bounds = this.getVertexBounds(cell); + + if (top == null) + { + top = bounds.y; + } + else + { + top = Math.min(top, bounds.y); + } + + if (left == null) + { + left = bounds.x; + } + else + { + left = Math.min(left, bounds.x); + } + + max = Math.max(max, Math.max(bounds.width, bounds.height)); + } + else if (!this.isEdgeIgnored(cell)) + { + // Resets the points on the traversed edge + if (this.resetEdges) + { + this.graph.resetEdge(cell); + } + + if (this.disableEdgeStyle) + { + this.setEdgeStyleEnabled(cell, false); + } + } + } + + var r = this.getRadius(vertices.length, max); + + // Moves the circle to the specified origin + if (this.moveCircle) + { + left = this.x0; + top = this.y0; + } + + this.circle(vertices, r, left, top); + } + finally + { + model.endUpdate(); + } +}; + +/** + * Function: getRadius + * + * Returns the radius to be used for the given vertex count. Max is the maximum + * width or height of all vertices in the layout. + */ +mxCircleLayout.prototype.getRadius = function(count, max) +{ + return Math.max(count * max / Math.PI, this.radius); +}; + +/** + * Function: circle + * + * Executes the circular layout for the specified array + * of vertices and the given radius. This is called from + * <execute>. + */ +mxCircleLayout.prototype.circle = function(vertices, r, left, top) +{ + var vertexCount = vertices.length; + var phi = 2 * Math.PI / vertexCount; + + for (var i = 0; i < vertexCount; i++) + { + if (this.isVertexMovable(vertices[i])) + { + this.setVertexLocation(vertices[i], + left + r + r * Math.sin(i*phi), + top + r + r * Math.cos(i*phi)); + } + } +}; |