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.
134 lines
3.1 KiB
134 lines
3.1 KiB
import { is } from '../../../util/ModelUtil'; |
|
|
|
import { |
|
getLanesRoot, |
|
computeLanesResize |
|
} from '../util/LaneUtil'; |
|
|
|
import { |
|
eachElement |
|
} from 'diagram-js/lib/util/Elements'; |
|
|
|
import { |
|
asTRBL |
|
} from 'diagram-js/lib/layout/LayoutUtil'; |
|
|
|
import { |
|
substractTRBL |
|
} from 'diagram-js/lib/features/resize/ResizeUtil'; |
|
|
|
|
|
/** |
|
* A handler that resizes a lane. |
|
* |
|
* @param {Modeling} modeling |
|
*/ |
|
export default function ResizeLaneHandler(modeling, spaceTool) { |
|
this._modeling = modeling; |
|
this._spaceTool = spaceTool; |
|
} |
|
|
|
ResizeLaneHandler.$inject = [ |
|
'modeling', |
|
'spaceTool' |
|
]; |
|
|
|
|
|
ResizeLaneHandler.prototype.preExecute = function(context) { |
|
|
|
var shape = context.shape, |
|
newBounds = context.newBounds, |
|
balanced = context.balanced; |
|
|
|
if (balanced !== false) { |
|
this.resizeBalanced(shape, newBounds); |
|
} else { |
|
this.resizeSpace(shape, newBounds); |
|
} |
|
}; |
|
|
|
|
|
/** |
|
* Resize balanced, adjusting next / previous lane sizes. |
|
* |
|
* @param {djs.model.Shape} shape |
|
* @param {Bounds} newBounds |
|
*/ |
|
ResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) { |
|
|
|
var modeling = this._modeling; |
|
|
|
var resizeNeeded = computeLanesResize(shape, newBounds); |
|
|
|
// resize the lane |
|
modeling.resizeShape(shape, newBounds); |
|
|
|
// resize other lanes as needed |
|
resizeNeeded.forEach(function(r) { |
|
modeling.resizeShape(r.shape, r.newBounds); |
|
}); |
|
}; |
|
|
|
|
|
/** |
|
* Resize, making actual space and moving below / above elements. |
|
* |
|
* @param {djs.model.Shape} shape |
|
* @param {Bounds} newBounds |
|
*/ |
|
ResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) { |
|
var spaceTool = this._spaceTool; |
|
|
|
var shapeTrbl = asTRBL(shape), |
|
newTrbl = asTRBL(newBounds); |
|
|
|
var trblDiff = substractTRBL(newTrbl, shapeTrbl); |
|
|
|
var lanesRoot = getLanesRoot(shape); |
|
|
|
var allAffected = [], |
|
allLanes = []; |
|
|
|
eachElement(lanesRoot, function(element) { |
|
allAffected.push(element); |
|
|
|
if (is(element, 'bpmn:Lane') || is(element, 'bpmn:Participant')) { |
|
allLanes.push(element); |
|
} |
|
|
|
return element.children; |
|
}); |
|
|
|
var change, |
|
spacePos, |
|
direction, |
|
offset, |
|
adjustments; |
|
|
|
if (trblDiff.bottom || trblDiff.top) { |
|
|
|
change = trblDiff.bottom || trblDiff.top; |
|
spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10); |
|
direction = trblDiff.bottom ? 's' : 'n'; |
|
|
|
offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change; |
|
|
|
adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos); |
|
|
|
spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction); |
|
} |
|
|
|
|
|
if (trblDiff.left || trblDiff.right) { |
|
|
|
change = trblDiff.right || trblDiff.left; |
|
spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100); |
|
direction = trblDiff.right ? 'e' : 'w'; |
|
|
|
offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change; |
|
|
|
adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos); |
|
|
|
spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction); |
|
} |
|
}; |