2019-05-20 12:54:48 +00:00
|
|
|
import { is } from '../../../util/ModelUtil';
|
|
|
|
|
|
|
|
import { isExpanded } from '../../../util/DiUtil';
|
|
|
|
|
2021-10-14 20:55:46 +00:00
|
|
|
import {
|
|
|
|
asTRBL
|
|
|
|
} from 'diagram-js/lib/layout/LayoutUtil';
|
|
|
|
|
|
|
|
import {
|
|
|
|
collectLanes,
|
|
|
|
getLanesRoot
|
|
|
|
} from '../util/LaneUtil';
|
2019-05-20 12:54:48 +00:00
|
|
|
|
|
|
|
var HIGH_PRIORITY = 1500;
|
|
|
|
|
2020-03-10 18:48:21 +00:00
|
|
|
export var LANE_MIN_DIMENSIONS = { width: 300, height: 60 };
|
|
|
|
|
2020-01-19 09:07:52 +00:00
|
|
|
export var PARTICIPANT_MIN_DIMENSIONS = { width: 300, height: 150 };
|
|
|
|
|
|
|
|
export var SUB_PROCESS_MIN_DIMENSIONS = { width: 140, height: 120 };
|
|
|
|
|
|
|
|
export var TEXT_ANNOTATION_MIN_DIMENSIONS = { width: 50, height: 30 };
|
2019-05-20 12:54:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set minimum bounds/resize constraints on resize.
|
|
|
|
*
|
|
|
|
* @param {EventBus} eventBus
|
|
|
|
*/
|
|
|
|
export default function ResizeBehavior(eventBus) {
|
|
|
|
eventBus.on('resize.start', HIGH_PRIORITY, function(event) {
|
|
|
|
var context = event.context,
|
|
|
|
shape = context.shape,
|
|
|
|
direction = context.direction,
|
|
|
|
balanced = context.balanced;
|
|
|
|
|
|
|
|
if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
|
|
|
|
context.resizeConstraints = getParticipantResizeConstraints(shape, direction, balanced);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is(shape, 'bpmn:Participant')) {
|
|
|
|
context.minDimensions = PARTICIPANT_MIN_DIMENSIONS;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {
|
|
|
|
context.minDimensions = SUB_PROCESS_MIN_DIMENSIONS;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is(shape, 'bpmn:TextAnnotation')) {
|
|
|
|
context.minDimensions = TEXT_ANNOTATION_MIN_DIMENSIONS;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-10-14 20:55:46 +00:00
|
|
|
ResizeBehavior.$inject = [ 'eventBus' ];
|
|
|
|
|
|
|
|
|
|
|
|
var abs = Math.abs,
|
|
|
|
min = Math.min,
|
|
|
|
max = Math.max;
|
|
|
|
|
|
|
|
|
|
|
|
function addToTrbl(trbl, attr, value, choice) {
|
|
|
|
var current = trbl[attr];
|
|
|
|
|
|
|
|
// make sure to set the value if it does not exist
|
|
|
|
// or apply the correct value by comparing against
|
|
|
|
// choice(value, currentValue)
|
|
|
|
trbl[attr] = current === undefined ? value : choice(value, current);
|
|
|
|
}
|
|
|
|
|
|
|
|
function addMin(trbl, attr, value) {
|
|
|
|
return addToTrbl(trbl, attr, value, min);
|
|
|
|
}
|
|
|
|
|
|
|
|
function addMax(trbl, attr, value) {
|
|
|
|
return addToTrbl(trbl, attr, value, max);
|
|
|
|
}
|
|
|
|
|
|
|
|
var LANE_RIGHT_PADDING = 20,
|
|
|
|
LANE_LEFT_PADDING = 50,
|
|
|
|
LANE_TOP_PADDING = 20,
|
|
|
|
LANE_BOTTOM_PADDING = 20;
|
|
|
|
|
|
|
|
export function getParticipantResizeConstraints(laneShape, resizeDirection, balanced) {
|
|
|
|
var lanesRoot = getLanesRoot(laneShape);
|
|
|
|
|
|
|
|
var isFirst = true,
|
|
|
|
isLast = true;
|
|
|
|
|
|
|
|
// max top/bottom size for lanes
|
|
|
|
var allLanes = collectLanes(lanesRoot, [ lanesRoot ]);
|
|
|
|
|
|
|
|
var laneTrbl = asTRBL(laneShape);
|
|
|
|
|
|
|
|
var maxTrbl = {},
|
|
|
|
minTrbl = {};
|
|
|
|
|
|
|
|
if (/e/.test(resizeDirection)) {
|
|
|
|
minTrbl.right = laneTrbl.left + LANE_MIN_DIMENSIONS.width;
|
|
|
|
} else
|
|
|
|
if (/w/.test(resizeDirection)) {
|
|
|
|
minTrbl.left = laneTrbl.right - LANE_MIN_DIMENSIONS.width;
|
|
|
|
}
|
|
|
|
|
|
|
|
allLanes.forEach(function(other) {
|
|
|
|
|
|
|
|
var otherTrbl = asTRBL(other);
|
|
|
|
|
|
|
|
if (/n/.test(resizeDirection)) {
|
|
|
|
|
|
|
|
if (otherTrbl.top < (laneTrbl.top - 10)) {
|
|
|
|
isFirst = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// max top size (based on next element)
|
|
|
|
if (balanced && abs(laneTrbl.top - otherTrbl.bottom) < 10) {
|
|
|
|
addMax(maxTrbl, 'top', otherTrbl.top + LANE_MIN_DIMENSIONS.height);
|
|
|
|
}
|
|
|
|
|
|
|
|
// min top size (based on self or nested element)
|
|
|
|
if (abs(laneTrbl.top - otherTrbl.top) < 5) {
|
|
|
|
addMin(minTrbl, 'top', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (/s/.test(resizeDirection)) {
|
|
|
|
|
|
|
|
if (otherTrbl.bottom > (laneTrbl.bottom + 10)) {
|
|
|
|
isLast = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// max bottom size (based on previous element)
|
|
|
|
if (balanced && abs(laneTrbl.bottom - otherTrbl.top) < 10) {
|
|
|
|
addMin(maxTrbl, 'bottom', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);
|
|
|
|
}
|
|
|
|
|
|
|
|
// min bottom size (based on self or nested element)
|
|
|
|
if (abs(laneTrbl.bottom - otherTrbl.bottom) < 5) {
|
|
|
|
addMax(minTrbl, 'bottom', otherTrbl.top + LANE_MIN_DIMENSIONS.height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// max top/bottom/left/right size based on flow nodes
|
|
|
|
var flowElements = lanesRoot.children.filter(function(s) {
|
|
|
|
return !s.hidden && !s.waypoints && (is(s, 'bpmn:FlowElement') || is(s, 'bpmn:Artifact'));
|
|
|
|
});
|
|
|
|
|
|
|
|
flowElements.forEach(function(flowElement) {
|
|
|
|
|
|
|
|
var flowElementTrbl = asTRBL(flowElement);
|
|
|
|
|
|
|
|
if (isFirst && /n/.test(resizeDirection)) {
|
|
|
|
addMin(minTrbl, 'top', flowElementTrbl.top - LANE_TOP_PADDING);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (/e/.test(resizeDirection)) {
|
|
|
|
addMax(minTrbl, 'right', flowElementTrbl.right + LANE_RIGHT_PADDING);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isLast && /s/.test(resizeDirection)) {
|
|
|
|
addMax(minTrbl, 'bottom', flowElementTrbl.bottom + LANE_BOTTOM_PADDING);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (/w/.test(resizeDirection)) {
|
|
|
|
addMin(minTrbl, 'left', flowElementTrbl.left - LANE_LEFT_PADDING);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
min: minTrbl,
|
|
|
|
max: maxTrbl
|
|
|
|
};
|
|
|
|
}
|