150 lines
4.1 KiB
JavaScript
150 lines
4.1 KiB
JavaScript
/**
|
|
* 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);
|
|
};
|