mirror of
https://github.com/sartography/bpmn-js.git
synced 2025-01-10 17:16:02 +00:00
b4bd6557b1
Inline `ResizeUtil` into behavior to prevent circular depdendency. It is not being used outside the behavior anyway and uses behavior internals (lane dimensions).
174 lines
4.7 KiB
JavaScript
174 lines
4.7 KiB
JavaScript
import { is } from '../../../util/ModelUtil';
|
|
|
|
import { isExpanded } from '../../../util/DiUtil';
|
|
|
|
import {
|
|
asTRBL
|
|
} from 'diagram-js/lib/layout/LayoutUtil';
|
|
|
|
import {
|
|
collectLanes,
|
|
getLanesRoot
|
|
} from '../util/LaneUtil';
|
|
|
|
var HIGH_PRIORITY = 1500;
|
|
|
|
export var LANE_MIN_DIMENSIONS = { width: 300, height: 60 };
|
|
|
|
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 };
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
});
|
|
}
|
|
|
|
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
|
|
};
|
|
} |