diff options
author | Adhitya Kamakshidasan | 2016-04-04 20:02:27 +0530 |
---|---|---|
committer | Adhitya Kamakshidasan | 2016-04-04 20:02:27 +0530 |
commit | 5d474b6e265806c9df3fc80e06f8b4dd7fe16aea (patch) | |
tree | f64a5027d57f49b9833a8eea48acbd0905a1ceb3 /src/js/model/mxCell.js | |
download | xcos-on-web-5d474b6e265806c9df3fc80e06f8b4dd7fe16aea.tar.gz xcos-on-web-5d474b6e265806c9df3fc80e06f8b4dd7fe16aea.tar.bz2 xcos-on-web-5d474b6e265806c9df3fc80e06f8b4dd7fe16aea.zip |
Initial Commit
Diffstat (limited to 'src/js/model/mxCell.js')
-rw-r--r-- | src/js/model/mxCell.js | 806 |
1 files changed, 806 insertions, 0 deletions
diff --git a/src/js/model/mxCell.js b/src/js/model/mxCell.js new file mode 100644 index 0000000..cb5eb9f --- /dev/null +++ b/src/js/model/mxCell.js @@ -0,0 +1,806 @@ +/** + * $Id: mxCell.js,v 1.36 2011-06-17 13:45:08 gaudenz Exp $ + * Copyright (c) 2006-2010, JGraph Ltd + */ +/** + * Class: mxCell + * + * Cells are the elements of the graph model. They represent the state + * of the groups, vertices and edges in a graph. + * + * Custom attributes: + * + * For custom attributes we recommend using an XML node as the value of a cell. + * The following code can be used to create a cell with an XML node as the + * value: + * + * (code) + * var doc = mxUtils.createXmlDocument(); + * var node = doc.createElement('MyNode') + * node.setAttribute('label', 'MyLabel'); + * node.setAttribute('attribute1', 'value1'); + * graph.insertVertex(graph.getDefaultParent(), null, node, 40, 40, 80, 30); + * (end) + * + * For the label to work, <mxGraph.convertValueToString> and + * <mxGraph.cellLabelChanged> should be overridden as follows: + * + * (code) + * graph.convertValueToString = function(cell) + * { + * if (mxUtils.isNode(cell.value)) + * { + * return cell.getAttribute('label', '') + * } + * }; + * + * var cellLabelChanged = graph.cellLabelChanged; + * graph.cellLabelChanged = function(cell, newValue, autoSize) + * { + * if (mxUtils.isNode(cell.value)) + * { + * // Clones the value for correct undo/redo + * var elt = cell.value.cloneNode(true); + * elt.setAttribute('label', newValue); + * newValue = elt; + * } + * + * cellLabelChanged.apply(this, arguments); + * }; + * (end) + * + * Callback: onInit + * + * Called from within the constructor. + * + * Constructor: mxCell + * + * Constructs a new cell to be used in a graph model. + * This method invokes <onInit> upon completion. + * + * Parameters: + * + * value - Optional object that represents the cell value. + * geometry - Optional <mxGeometry> that specifies the geometry. + * style - Optional formatted string that defines the style. + */ +function mxCell(value, geometry, style) +{ + this.value = value; + this.setGeometry(geometry); + this.setStyle(style); + + if (this.onInit != null) + { + this.onInit(); + } +}; + +/** + * Variable: id + * + * Holds the Id. Default is null. + */ +mxCell.prototype.id = null; + +/** + * Variable: value + * + * Holds the user object. Default is null. + */ +mxCell.prototype.value = null; + +/** + * Variable: geometry + * + * Holds the <mxGeometry>. Default is null. + */ +mxCell.prototype.geometry = null; + +/** + * Variable: style + * + * Holds the style as a string of the form [(stylename|key=value);]. Default is + * null. + */ +mxCell.prototype.style = null; + +/** + * Variable: vertex + * + * Specifies whether the cell is a vertex. Default is false. + */ +mxCell.prototype.vertex = false; + +/** + * Variable: edge + * + * Specifies whether the cell is an edge. Default is false. + */ +mxCell.prototype.edge = false; + +/** + * Variable: connectable + * + * Specifies whether the cell is connectable. Default is true. + */ +mxCell.prototype.connectable = true; + +/** + * Variable: visible + * + * Specifies whether the cell is visible. Default is true. + */ +mxCell.prototype.visible = true; + +/** + * Variable: collapsed + * + * Specifies whether the cell is collapsed. Default is false. + */ +mxCell.prototype.collapsed = false; + +/** + * Variable: parent + * + * Reference to the parent cell. + */ +mxCell.prototype.parent = null; + +/** + * Variable: source + * + * Reference to the source terminal. + */ +mxCell.prototype.source = null; + +/** + * Variable: target + * + * Reference to the target terminal. + */ +mxCell.prototype.target = null; + +/** + * Variable: children + * + * Holds the child cells. + */ +mxCell.prototype.children = null; + +/** + * Variable: edges + * + * Holds the edges. + */ +mxCell.prototype.edges = null; + +/** + * Variable: mxTransient + * + * List of members that should not be cloned inside <clone>. This field is + * passed to <mxUtils.clone> and is not made persistent in <mxCellCodec>. + * This is not a convention for all classes, it is only used in this class + * to mark transient fields since transient modifiers are not supported by + * the language. + */ +mxCell.prototype.mxTransient = ['id', 'value', 'parent', 'source', + 'target', 'children', 'edges']; + +/** + * Function: getId + * + * Returns the Id of the cell as a string. + */ +mxCell.prototype.getId = function() +{ + return this.id; +}; + +/** + * Function: setId + * + * Sets the Id of the cell to the given string. + */ +mxCell.prototype.setId = function(id) +{ + this.id = id; +}; + +/** + * Function: getValue + * + * Returns the user object of the cell. The user + * object is stored in <value>. + */ +mxCell.prototype.getValue = function() +{ + return this.value; +}; + +/** + * Function: setValue + * + * Sets the user object of the cell. The user object + * is stored in <value>. + */ +mxCell.prototype.setValue = function(value) +{ + this.value = value; +}; + +/** + * Function: valueChanged + * + * Changes the user object after an in-place edit + * and returns the previous value. This implementation + * replaces the user object with the given value and + * returns the old user object. + */ +mxCell.prototype.valueChanged = function(newValue) +{ + var previous = this.getValue(); + this.setValue(newValue); + + return previous; +}; + +/** + * Function: getGeometry + * + * Returns the <mxGeometry> that describes the <geometry>. + */ +mxCell.prototype.getGeometry = function() +{ + return this.geometry; +}; + +/** + * Function: setGeometry + * + * Sets the <mxGeometry> to be used as the <geometry>. + */ +mxCell.prototype.setGeometry = function(geometry) +{ + this.geometry = geometry; +}; + +/** + * Function: getStyle + * + * Returns a string that describes the <style>. + */ +mxCell.prototype.getStyle = function() +{ + return this.style; +}; + +/** + * Function: setStyle + * + * Sets the string to be used as the <style>. + */ +mxCell.prototype.setStyle = function(style) +{ + this.style = style; +}; + +/** + * Function: isVertex + * + * Returns true if the cell is a vertex. + */ +mxCell.prototype.isVertex = function() +{ + return this.vertex; +}; + +/** + * Function: setVertex + * + * Specifies if the cell is a vertex. This should only be assigned at + * construction of the cell and not be changed during its lifecycle. + * + * Parameters: + * + * vertex - Boolean that specifies if the cell is a vertex. + */ +mxCell.prototype.setVertex = function(vertex) +{ + this.vertex = vertex; +}; + +/** + * Function: isEdge + * + * Returns true if the cell is an edge. + */ +mxCell.prototype.isEdge = function() +{ + return this.edge; +}; + +/** + * Function: setEdge + * + * Specifies if the cell is an edge. This should only be assigned at + * construction of the cell and not be changed during its lifecycle. + * + * Parameters: + * + * edge - Boolean that specifies if the cell is an edge. + */ +mxCell.prototype.setEdge = function(edge) +{ + this.edge = edge; +}; + +/** + * Function: isConnectable + * + * Returns true if the cell is connectable. + */ +mxCell.prototype.isConnectable = function() +{ + return this.connectable; +}; + +/** + * Function: setConnectable + * + * Sets the connectable state. + * + * Parameters: + * + * connectable - Boolean that specifies the new connectable state. + */ +mxCell.prototype.setConnectable = function(connectable) +{ + this.connectable = connectable; +}; + +/** + * Function: isVisible + * + * Returns true if the cell is visibile. + */ +mxCell.prototype.isVisible = function() +{ + return this.visible; +}; + +/** + * Function: setVisible + * + * Specifies if the cell is visible. + * + * Parameters: + * + * visible - Boolean that specifies the new visible state. + */ +mxCell.prototype.setVisible = function(visible) +{ + this.visible = visible; +}; + +/** + * Function: isCollapsed + * + * Returns true if the cell is collapsed. + */ +mxCell.prototype.isCollapsed = function() +{ + return this.collapsed; +}; + +/** + * Function: setCollapsed + * + * Sets the collapsed state. + * + * Parameters: + * + * collapsed - Boolean that specifies the new collapsed state. + */ +mxCell.prototype.setCollapsed = function(collapsed) +{ + this.collapsed = collapsed; +}; + +/** + * Function: getParent + * + * Returns the cell's parent. + */ +mxCell.prototype.getParent = function() +{ + return this.parent; +}; + +/** + * Function: setParent + * + * Sets the parent cell. + * + * Parameters: + * + * parent - <mxCell> that represents the new parent. + */ +mxCell.prototype.setParent = function(parent) +{ + this.parent = parent; +}; + +/** + * Function: getTerminal + * + * Returns the source or target terminal. + * + * Parameters: + * + * source - Boolean that specifies if the source terminal should be + * returned. + */ +mxCell.prototype.getTerminal = function(source) +{ + return (source) ? this.source : this.target; +}; + +/** + * Function: setTerminal + * + * Sets the source or target terminal and returns the new terminal. + * + * Parameters: + * + * terminal - <mxCell> that represents the new source or target terminal. + * isSource - Boolean that specifies if the source or target terminal + * should be set. + */ +mxCell.prototype.setTerminal = function(terminal, isSource) +{ + if (isSource) + { + this.source = terminal; + } + else + { + this.target = terminal; + } + + return terminal; +}; + +/** + * Function: getChildCount + * + * Returns the number of child cells. + */ +mxCell.prototype.getChildCount = function() +{ + return (this.children == null) ? 0 : this.children.length; +}; + +/** + * Function: getIndex + * + * Returns the index of the specified child in the child array. + * + * Parameters: + * + * child - Child whose index should be returned. + */ +mxCell.prototype.getIndex = function(child) +{ + return mxUtils.indexOf(this.children, child); +}; + +/** + * Function: getChildAt + * + * Returns the child at the specified index. + * + * Parameters: + * + * index - Integer that specifies the child to be returned. + */ +mxCell.prototype.getChildAt = function(index) +{ + return (this.children == null) ? null : this.children[index]; +}; + +/** + * Function: insert + * + * Inserts the specified child into the child array at the specified index + * and updates the parent reference of the child. If not childIndex is + * specified then the child is appended to the child array. Returns the + * inserted child. + * + * Parameters: + * + * child - <mxCell> to be inserted or appended to the child array. + * index - Optional integer that specifies the index at which the child + * should be inserted into the child array. + */ +mxCell.prototype.insert = function(child, index) +{ + if (child != null) + { + if (index == null) + { + index = this.getChildCount(); + + if (child.getParent() == this) + { + index--; + } + } + + child.removeFromParent(); + child.setParent(this); + + if (this.children == null) + { + this.children = []; + this.children.push(child); + } + else + { + this.children.splice(index, 0, child); + } + } + + return child; +}; + +/** + * Function: remove + * + * Removes the child at the specified index from the child array and + * returns the child that was removed. Will remove the parent reference of + * the child. + * + * Parameters: + * + * index - Integer that specifies the index of the child to be + * removed. + */ +mxCell.prototype.remove = function(index) +{ + var child = null; + + if (this.children != null && index >= 0) + { + child = this.getChildAt(index); + + if (child != null) + { + this.children.splice(index, 1); + child.setParent(null); + } + } + + return child; +}; + +/** + * Function: removeFromParent + * + * Removes the cell from its parent. + */ +mxCell.prototype.removeFromParent = function() +{ + if (this.parent != null) + { + var index = this.parent.getIndex(this); + this.parent.remove(index); + } +}; + +/** + * Function: getEdgeCount + * + * Returns the number of edges in the edge array. + */ +mxCell.prototype.getEdgeCount = function() +{ + return (this.edges == null) ? 0 : this.edges.length; +}; + +/** + * Function: getEdgeIndex + * + * Returns the index of the specified edge in <edges>. + * + * Parameters: + * + * edge - <mxCell> whose index in <edges> should be returned. + */ +mxCell.prototype.getEdgeIndex = function(edge) +{ + return mxUtils.indexOf(this.edges, edge); +}; + +/** + * Function: getEdgeAt + * + * Returns the edge at the specified index in <edges>. + * + * Parameters: + * + * index - Integer that specifies the index of the edge to be returned. + */ +mxCell.prototype.getEdgeAt = function(index) +{ + return (this.edges == null) ? null : this.edges[index]; +}; + +/** + * Function: insertEdge + * + * Inserts the specified edge into the edge array and returns the edge. + * Will update the respective terminal reference of the edge. + * + * Parameters: + * + * edge - <mxCell> to be inserted into the edge array. + * isOutgoing - Boolean that specifies if the edge is outgoing. + */ +mxCell.prototype.insertEdge = function(edge, isOutgoing) +{ + if (edge != null) + { + edge.removeFromTerminal(isOutgoing); + edge.setTerminal(this, isOutgoing); + + if (this.edges == null || + edge.getTerminal(!isOutgoing) != this || + mxUtils.indexOf(this.edges, edge) < 0) + { + if (this.edges == null) + { + this.edges = []; + } + + this.edges.push(edge); + } + } + + return edge; +}; + +/** + * Function: removeEdge + * + * Removes the specified edge from the edge array and returns the edge. + * Will remove the respective terminal reference from the edge. + * + * Parameters: + * + * edge - <mxCell> to be removed from the edge array. + * isOutgoing - Boolean that specifies if the edge is outgoing. + */ +mxCell.prototype.removeEdge = function(edge, isOutgoing) +{ + if (edge != null) + { + if (edge.getTerminal(!isOutgoing) != this && + this.edges != null) + { + var index = this.getEdgeIndex(edge); + + if (index >= 0) + { + this.edges.splice(index, 1); + } + } + + edge.setTerminal(null, isOutgoing); + } + + return edge; +}; + +/** + * Function: removeFromTerminal + * + * Removes the edge from its source or target terminal. + * + * Parameters: + * + * isSource - Boolean that specifies if the edge should be removed from its + * source or target terminal. + */ +mxCell.prototype.removeFromTerminal = function(isSource) +{ + var terminal = this.getTerminal(isSource); + + if (terminal != null) + { + terminal.removeEdge(this, isSource); + } +}; + +/** + * Function: getAttribute + * + * Returns the specified attribute from the user object if it is an XML + * node. + * + * Parameters: + * + * name - Name of the attribute whose value should be returned. + * defaultValue - Optional default value to use if the attribute has no + * value. + */ +mxCell.prototype.getAttribute = function(name, defaultValue) +{ + var userObject = this.getValue(); + + var val = (userObject != null && + userObject.nodeType == mxConstants.NODETYPE_ELEMENT) ? + userObject.getAttribute(name) : null; + + return val || defaultValue; +}; + +/** + * Function: setAttribute + * + * Sets the specified attribute on the user object if it is an XML node. + * + * Parameters: + * + * name - Name of the attribute whose value should be set. + * value - New value of the attribute. + */ +mxCell.prototype.setAttribute = function(name, value) +{ + var userObject = this.getValue(); + + if (userObject != null && + userObject.nodeType == mxConstants.NODETYPE_ELEMENT) + { + userObject.setAttribute(name, value); + } +}; + +/** + * Function: clone + * + * Returns a clone of the cell. Uses <cloneValue> to clone + * the user object. All fields in <mxTransient> are ignored + * during the cloning. + */ +mxCell.prototype.clone = function() +{ + var clone = mxUtils.clone(this, this.mxTransient); + clone.setValue(this.cloneValue()); + + return clone; +}; + +/** + * Function: cloneValue + * + * Returns a clone of the cell's user object. + */ +mxCell.prototype.cloneValue = function() +{ + var value = this.getValue(); + + if (value != null) + { + if (typeof(value.clone) == 'function') + { + value = value.clone(); + } + else if (!isNaN(value.nodeType)) + { + value = value.cloneNode(true); + } + } + + return value; +}; |