import { assign } from 'min-dash'; import { getElementLineIntersection } from './LayoutUtil'; function dockingToPoint(docking) { // use the dockings actual point and // retain the original docking return assign({ original: docking.point.original || docking.point }, docking.actual); } /** * A {@link ConnectionDocking} that crops connection waypoints based on * the path(s) of the connection source and target. * * @param {djs.core.ElementRegistry} elementRegistry */ export default function CroppingConnectionDocking(elementRegistry, graphicsFactory) { this._elementRegistry = elementRegistry; this._graphicsFactory = graphicsFactory; } CroppingConnectionDocking.$inject = [ 'elementRegistry', 'graphicsFactory' ]; /** * @inheritDoc ConnectionDocking#getCroppedWaypoints */ CroppingConnectionDocking.prototype.getCroppedWaypoints = function(connection, source, target) { source = source || connection.source; target = target || connection.target; var sourceDocking = this.getDockingPoint(connection, source, true), targetDocking = this.getDockingPoint(connection, target); var croppedWaypoints = connection.waypoints.slice(sourceDocking.idx + 1, targetDocking.idx); croppedWaypoints.unshift(dockingToPoint(sourceDocking)); croppedWaypoints.push(dockingToPoint(targetDocking)); return croppedWaypoints; }; /** * Return the connection docking point on the specified shape * * @inheritDoc ConnectionDocking#getDockingPoint */ CroppingConnectionDocking.prototype.getDockingPoint = function(connection, shape, dockStart) { var waypoints = connection.waypoints, dockingIdx, dockingPoint, croppedPoint; dockingIdx = dockStart ? 0 : waypoints.length - 1; dockingPoint = waypoints[dockingIdx]; croppedPoint = this._getIntersection(shape, connection, dockStart); return { point: dockingPoint, actual: croppedPoint || dockingPoint, idx: dockingIdx }; }; // helpers ////////////////////// CroppingConnectionDocking.prototype._getIntersection = function(shape, connection, takeFirst) { var shapePath = this._getShapePath(shape), connectionPath = this._getConnectionPath(connection); return getElementLineIntersection(shapePath, connectionPath, takeFirst); }; CroppingConnectionDocking.prototype._getConnectionPath = function(connection) { return this._graphicsFactory.getConnectionPath(connection); }; CroppingConnectionDocking.prototype._getShapePath = function(shape) { return this._graphicsFactory.getShapePath(shape); }; CroppingConnectionDocking.prototype._getGfx = function(element) { return this._elementRegistry.getGraphics(element); };