12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import {
- getChildLanes,
- LANE_INDENTATION
- } from '../util/LaneUtil';
- /**
- * A handler that splits a lane into a number of sub-lanes,
- * creating new sub lanes, if necessary.
- *
- * @param {Modeling} modeling
- */
- export default function SplitLaneHandler(modeling, translate) {
- this._modeling = modeling;
- this._translate = translate;
- }
- SplitLaneHandler.$inject = [
- 'modeling',
- 'translate'
- ];
- SplitLaneHandler.prototype.preExecute = function(context) {
- var modeling = this._modeling,
- translate = this._translate;
- var shape = context.shape,
- newLanesCount = context.count;
- var childLanes = getChildLanes(shape),
- existingLanesCount = childLanes.length;
- if (existingLanesCount > newLanesCount) {
- throw new Error(translate('more than {count} child lanes', { count: newLanesCount }));
- }
- var newLanesHeight = Math.round(shape.height / newLanesCount);
- // Iterate from top to bottom in child lane order,
- // resizing existing lanes and creating new ones
- // so that they split the parent proportionally.
- //
- // Due to rounding related errors, the bottom lane
- // needs to take up all the remaining space.
- var laneY,
- laneHeight,
- laneBounds,
- newLaneAttrs,
- idx;
- for (idx = 0; idx < newLanesCount; idx++) {
- laneY = shape.y + idx * newLanesHeight;
- // if bottom lane
- if (idx === newLanesCount - 1) {
- laneHeight = shape.height - (newLanesHeight * idx);
- } else {
- laneHeight = newLanesHeight;
- }
- laneBounds = {
- x: shape.x + LANE_INDENTATION,
- y: laneY,
- width: shape.width - LANE_INDENTATION,
- height: laneHeight
- };
- if (idx < existingLanesCount) {
- // resize existing lane
- modeling.resizeShape(childLanes[idx], laneBounds);
- } else {
- // create a new lane at position
- newLaneAttrs = {
- type: 'bpmn:Lane'
- };
- modeling.createShape(newLaneAttrs, laneBounds, shape);
- }
- }
- };
|