123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /**
- * Copyright (c) 2006-2015, JGraph Ltd
- * Copyright (c) 2006-2015, Gaudenz Alder
- */
- /**
- * Class: mxConnector
- *
- * Extends <mxShape> to implement a connector shape. The connector
- * shape allows for arrow heads on either side.
- *
- * This shape is registered under <mxConstants.SHAPE_CONNECTOR> in
- * <mxCellRenderer>.
- *
- * Constructor: mxConnector
- *
- * Constructs a new connector shape.
- *
- * Parameters:
- *
- * points - Array of <mxPoints> that define the points. This is stored in
- * <mxShape.points>.
- * stroke - String that defines the stroke color. This is stored in <stroke>.
- * Default is 'black'.
- * strokewidth - Optional integer that defines the stroke width. Default is
- * 1. This is stored in <strokewidth>.
- */
- function mxConnector(points, stroke, strokewidth)
- {
- mxPolyline.call(this, points, stroke, strokewidth);
- };
- /**
- * Extends mxPolyline.
- */
- mxUtils.extend(mxConnector, mxPolyline);
- /**
- * Function: updateBoundingBox
- *
- * Updates the <boundingBox> for this shape using <createBoundingBox> and
- * <augmentBoundingBox> and stores the result in <boundingBox>.
- */
- mxConnector.prototype.updateBoundingBox = function()
- {
- this.useSvgBoundingBox = this.style != null && this.style[mxConstants.STYLE_CURVED] == 1;
- mxShape.prototype.updateBoundingBox.apply(this, arguments);
- };
- /**
- * Function: paintEdgeShape
- *
- * Paints the line shape.
- */
- mxConnector.prototype.paintEdgeShape = function(c, pts)
- {
- // The indirection via functions for markers is needed in
- // order to apply the offsets before painting the line and
- // paint the markers after painting the line.
- var sourceMarker = this.createMarker(c, pts, true);
- var targetMarker = this.createMarker(c, pts, false);
- mxPolyline.prototype.paintEdgeShape.apply(this, arguments);
-
- // Disables shadows, dashed styles and fixes fill color for markers
- c.setFillColor(this.stroke);
- c.setShadow(false);
- c.setDashed(false);
-
- if (sourceMarker != null)
- {
- sourceMarker();
- }
-
- if (targetMarker != null)
- {
- targetMarker();
- }
- };
- /**
- * Function: createMarker
- *
- * Prepares the marker by adding offsets in pts and returning a function to
- * paint the marker.
- */
- mxConnector.prototype.createMarker = function(c, pts, source)
- {
- var result = null;
- var n = pts.length;
- var type = mxUtils.getValue(this.style, (source) ? mxConstants.STYLE_STARTARROW : mxConstants.STYLE_ENDARROW);
- var p0 = (source) ? pts[1] : pts[n - 2];
- var pe = (source) ? pts[0] : pts[n - 1];
-
- if (type != null && p0 != null && pe != null)
- {
- var count = 1;
-
- // Uses next non-overlapping point
- while (count < n - 1 && Math.round(p0.x - pe.x) == 0 && Math.round(p0.y - pe.y) == 0)
- {
- p0 = (source) ? pts[1 + count] : pts[n - 2 - count];
- count++;
- }
-
- // Computes the norm and the inverse norm
- var dx = pe.x - p0.x;
- var dy = pe.y - p0.y;
-
- var dist = Math.max(1, Math.sqrt(dx * dx + dy * dy));
-
- var unitX = dx / dist;
- var unitY = dy / dist;
-
- var size = mxUtils.getNumber(this.style, (source) ? mxConstants.STYLE_STARTSIZE : mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE);
-
- // Allow for stroke width in the end point used and the
- // orthogonal vectors describing the direction of the marker
- var filled = this.style[(source) ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL] != 0;
-
- result = mxMarker.createMarker(c, this, type, pe, unitX, unitY, size, source, this.strokewidth, filled);
- }
-
- return result;
- };
- /**
- * Function: augmentBoundingBox
- *
- * Augments the bounding box with the strokewidth and shadow offsets.
- */
- mxConnector.prototype.augmentBoundingBox = function(bbox)
- {
- mxShape.prototype.augmentBoundingBox.apply(this, arguments);
-
- // Adds marker sizes
- var size = 0;
-
- if (mxUtils.getValue(this.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- size = mxUtils.getNumber(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE) + 1;
- }
-
- if (mxUtils.getValue(this.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- size = Math.max(size, mxUtils.getNumber(this.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)) + 1;
- }
-
- bbox.grow(size * this.scale);
- };
- __mxOutput.mxConnector = typeof mxConnector !== 'undefined' ? mxConnector : undefined;
|