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.
89 lines
2.2 KiB
89 lines
2.2 KiB
import inherits from 'inherits-browser'; |
|
|
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor'; |
|
|
|
import { is } from '../../../util/ModelUtil'; |
|
|
|
import { isExpanded } from '../../../util/DiUtil'; |
|
|
|
import { selfAndAllChildren } from 'diagram-js/lib/util/Elements'; |
|
|
|
import { |
|
getResizedSourceAnchor, |
|
getResizedTargetAnchor |
|
} from 'diagram-js/lib/features/modeling/cmd/helper/AnchorsHelper'; |
|
|
|
/** |
|
* BPMN-specific message flow behavior. |
|
*/ |
|
export default function MessageFlowBehavior(eventBus, modeling) { |
|
|
|
CommandInterceptor.call(this, eventBus); |
|
|
|
this.postExecute('shape.replace', function(context) { |
|
var oldShape = context.oldShape, |
|
newShape = context.newShape; |
|
|
|
if (!isParticipantCollapse(oldShape, newShape)) { |
|
return; |
|
} |
|
|
|
var messageFlows = getMessageFlows(oldShape); |
|
|
|
messageFlows.incoming.forEach(function(incoming) { |
|
var anchor = getResizedTargetAnchor(incoming, newShape, oldShape); |
|
|
|
modeling.reconnectEnd(incoming, newShape, anchor); |
|
}); |
|
|
|
messageFlows.outgoing.forEach(function(outgoing) { |
|
var anchor = getResizedSourceAnchor(outgoing, newShape, oldShape); |
|
|
|
modeling.reconnectStart(outgoing, newShape, anchor); |
|
}); |
|
}, true); |
|
|
|
} |
|
|
|
MessageFlowBehavior.$inject = [ 'eventBus', 'modeling' ]; |
|
|
|
inherits(MessageFlowBehavior, CommandInterceptor); |
|
|
|
// helpers ////////// |
|
|
|
function isParticipantCollapse(oldShape, newShape) { |
|
return is(oldShape, 'bpmn:Participant') |
|
&& isExpanded(oldShape) |
|
&& is(newShape, 'bpmn:Participant') |
|
&& !isExpanded(newShape); |
|
} |
|
|
|
function getMessageFlows(parent) { |
|
var elements = selfAndAllChildren([ parent ], false); |
|
|
|
var incoming = [], |
|
outgoing = []; |
|
|
|
elements.forEach(function(element) { |
|
if (element === parent) { |
|
return; |
|
} |
|
|
|
element.incoming.forEach(function(connection) { |
|
if (is(connection, 'bpmn:MessageFlow')) { |
|
incoming.push(connection); |
|
} |
|
}); |
|
|
|
element.outgoing.forEach(function(connection) { |
|
if (is(connection, 'bpmn:MessageFlow')) { |
|
outgoing.push(connection); |
|
} |
|
}); |
|
}, []); |
|
|
|
return { |
|
incoming: incoming, |
|
outgoing: outgoing |
|
}; |
|
} |