You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
85 lines
1.9 KiB
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); |
|
} |
|
} |
|
};
|
|
|