bpmn-js
Version:
A bpmn 2.0 toolkit and web modeler
143 lines (115 loc) • 3.24 kB
JavaScript
import { is } from '../../util/ModelUtil';
import { isExpanded } from '../../util/DiUtil';
/**
* @typedef {import('diagram-js/lib/core/EventBus').default} EventBus
* @typedef {import('diagram-js/lib/features/interaction-events/InteractionEvents').default} InteractionEvents
*
* @typedef {import('../../model/Types').Element} Element
* @typedef {import('../../model/Types').Shape} Shape
*/
var LABEL_WIDTH = 30,
LABEL_HEIGHT = 30;
/**
* BPMN-specific hit zones and interaction fixes.
*
* @param {EventBus} eventBus
* @param {InteractionEvents} interactionEvents
*/
export default function BpmnInteractionEvents(eventBus, interactionEvents) {
this._interactionEvents = interactionEvents;
var self = this;
eventBus.on([
'interactionEvents.createHit',
'interactionEvents.updateHit'
], function(context) {
var element = context.element,
gfx = context.gfx;
if (is(element, 'bpmn:Lane')) {
return self._createParticipantHit(element, gfx);
} else
if (is(element, 'bpmn:Participant')) {
if (isExpanded(element)) {
return self._createParticipantHit(element, gfx);
} else {
return self._createDefaultHit(element, gfx);
}
} else
if (is(element, 'bpmn:SubProcess')) {
if (isExpanded(element)) {
return self._createSubProcessHit(element, gfx);
} else {
return self._createDefaultHit(element, gfx);
}
}
});
}
BpmnInteractionEvents.$inject = [
'eventBus',
'interactionEvents'
];
/**
* @param {Element} element
* @param {SVGElement} gfx
*
* @return {boolean}
*/
BpmnInteractionEvents.prototype._createDefaultHit = function(element, gfx) {
this._interactionEvents.removeHits(gfx);
this._interactionEvents.createDefaultHit(element, gfx);
// indicate that we created a hit
return true;
};
/**
* @param {Shape} element
* @param {SVGElement} gfx
*
* @return {boolean}
*/
BpmnInteractionEvents.prototype._createParticipantHit = function(element, gfx) {
// remove existing hits
this._interactionEvents.removeHits(gfx);
// add body hit
this._interactionEvents.createBoxHit(gfx, 'no-move', {
width: element.width,
height: element.height
});
// add outline hit
this._interactionEvents.createBoxHit(gfx, 'click-stroke', {
width: element.width,
height: element.height
});
// add label hit
this._interactionEvents.createBoxHit(gfx, 'all', {
width: LABEL_WIDTH,
height: element.height
});
// indicate that we created a hit
return true;
};
/**
* @param {Shape} element
* @param {SVGElement} gfx
*
* @return {boolean}
*/
BpmnInteractionEvents.prototype._createSubProcessHit = function(element, gfx) {
// remove existing hits
this._interactionEvents.removeHits(gfx);
// add body hit
this._interactionEvents.createBoxHit(gfx, 'no-move', {
width: element.width,
height: element.height
});
// add outline hit
this._interactionEvents.createBoxHit(gfx, 'click-stroke', {
width: element.width,
height: element.height
});
// add label hit
this._interactionEvents.createBoxHit(gfx, 'all', {
width: element.width,
height: LABEL_HEIGHT
});
// indicate that we created a hit
return true;
};