diff options
Diffstat (limited to 'src/js/shape/mxLine.js')
-rw-r--r-- | src/js/shape/mxLine.js | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/src/js/shape/mxLine.js b/src/js/shape/mxLine.js new file mode 100644 index 0000000..5ef3eb0 --- /dev/null +++ b/src/js/shape/mxLine.js @@ -0,0 +1,217 @@ +/** + * $Id: mxLine.js,v 1.36 2012-03-30 04:44:59 gaudenz Exp $ + * Copyright (c) 2006-2010, JGraph Ltd + */ +/** + * Class: mxLine + * + * Extends <mxShape> to implement a horizontal line shape. + * This shape is registered under <mxConstants.SHAPE_LINE> in + * <mxCellRenderer>. + * + * Constructor: mxLine + * + * Constructs a new line shape. + * + * Parameters: + * + * bounds - <mxRectangle> that defines the bounds. This is stored in + * <mxShape.bounds>. + * stroke - String that defines the stroke color. Default is 'black'. This is + * stored in <stroke>. + * strokewidth - Optional integer that defines the stroke width. Default is + * 1. This is stored in <strokewidth>. + */ +function mxLine(bounds, stroke, strokewidth) +{ + this.bounds = bounds; + this.stroke = stroke; + this.strokewidth = (strokewidth != null) ? strokewidth : 1; +}; + +/** + * Extends mxShape. + */ +mxLine.prototype = new mxShape(); +mxLine.prototype.constructor = mxLine; + +/** + * Variable: vmlNodes + * + * Adds local references to <mxShape.vmlNodes>. + */ +mxLine.prototype.vmlNodes = mxLine.prototype.vmlNodes.concat(['label', 'innerNode']); + +/** + * Variable: mixedModeHtml + * + * Overrides the parent value with false, meaning it will + * draw in VML in mixed Html mode. + */ +mxLine.prototype.mixedModeHtml = false; + +/** + * Variable: preferModeHtml + * + * Overrides the parent value with false, meaning it will + * draw as VML in prefer Html mode. + */ +mxLine.prototype.preferModeHtml = false; + +/** + * Function: clone + * + * Overrides the clone method to add special fields. + */ +mxLine.prototype.clone = function() +{ + var clone = new mxLine(this.bounds, + this.stroke, this.strokewidth); + clone.isDashed = this.isDashed; + + return clone; +}; + +/** + * Function: createVml + * + * Creates and returns the VML node to represent this shape. + */ +mxLine.prototype.createVml = function() +{ + var node = document.createElement('v:group'); + node.style.position = 'absolute'; + + // Represents the text label container + this.label = document.createElement('v:rect'); + this.label.style.position = 'absolute'; + this.label.stroked = 'false'; + this.label.filled = 'false'; + node.appendChild(this.label); + + // Represents the straight line shape + this.innerNode = document.createElement('v:shape'); + this.configureVmlShape(this.innerNode); + node.appendChild(this.innerNode); + + return node; +}; + +/** + * Function: redrawVml + * + * Redraws this VML shape by invoking <updateVmlShape> on this.node. + */ +mxLine.prototype.reconfigure = function() +{ + if (mxUtils.isVml(this.node)) + { + this.configureVmlShape(this.innerNode); + } + else + { + mxShape.prototype.reconfigure.apply(this, arguments); + } +}; + +/** + * Function: redrawVml + * + * Updates the VML node(s) to reflect the latest bounds and scale. + */ +mxLine.prototype.redrawVml = function() +{ + this.updateVmlShape(this.node); + this.updateVmlShape(this.label); + + this.innerNode.coordsize = this.node.coordsize; + this.innerNode.strokeweight = (this.strokewidth * this.scale) + 'px'; + this.innerNode.style.width = this.node.style.width; + this.innerNode.style.height = this.node.style.height; + + var w = this.bounds.width; + var h =this.bounds.height; + + if (this.direction == mxConstants.DIRECTION_NORTH || + this.direction == mxConstants.DIRECTION_SOUTH) + { + this.innerNode.path = 'm ' + Math.round(w / 2) + ' 0' + + ' l ' + Math.round(w / 2) + ' ' + Math.round(h) + ' e'; + } + else + { + this.innerNode.path = 'm 0 ' + Math.round(h / 2) + + ' l ' + Math.round(w) + ' ' + Math.round(h / 2) + ' e'; + } +}; + +/** + * Function: createSvg + * + * Creates and returns the SVG node(s) to represent this shape. + */ +mxLine.prototype.createSvg = function() +{ + var g = this.createSvgGroup('path'); + + // Creates an invisible shape around the path for easier + // selection with the mouse. Note: Firefox does not ignore + // the value of the stroke attribute for pointer-events: stroke. + // It does, however, ignore the visibility attribute. + this.pipe = this.createSvgPipe(); + g.appendChild(this.pipe); + + return g; +}; + +/** + * Function: redrawSvg + * + * Updates the SVG node(s) to reflect the latest bounds and scale. + */ +mxLine.prototype.redrawSvg = function() +{ + var strokeWidth = Math.round(Math.max(1, this.strokewidth * this.scale)); + this.innerNode.setAttribute('stroke-width', strokeWidth); + + if (this.bounds != null) + { + var x = this.bounds.x; + var y = this.bounds.y; + var w = this.bounds.width; + var h = this.bounds.height; + + var d = null; + + if (this.direction == mxConstants.DIRECTION_NORTH || this.direction == mxConstants.DIRECTION_SOUTH) + { + d = 'M ' + Math.round(x + w / 2) + ' ' + Math.round(y) + ' L ' + Math.round(x + w / 2) + ' ' + Math.round(y + h); + } + else + { + d = 'M ' + Math.round(x) + ' ' + Math.round(y + h / 2) + ' L ' + Math.round(x + w) + ' ' + Math.round(y + h / 2); + } + + this.innerNode.setAttribute('d', d); + this.pipe.setAttribute('d', d); + this.pipe.setAttribute('stroke-width', this.strokewidth + mxShape.prototype.SVG_STROKE_TOLERANCE); + + this.updateSvgTransform(this.innerNode, false); + this.updateSvgTransform(this.pipe, false); + + if (this.crisp) + { + this.innerNode.setAttribute('shape-rendering', 'crispEdges'); + } + else + { + this.innerNode.removeAttribute('shape-rendering'); + } + + if (this.isDashed) + { + var phase = Math.max(1, Math.round(3 * this.scale * this.strokewidth)); + this.innerNode.setAttribute('stroke-dasharray', phase + ' ' + phase); + } + } +}; |