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.
138 lines
3.1 KiB
138 lines
3.1 KiB
2 years ago
|
import {
|
||
|
append as svgAppend,
|
||
|
attr as svgAttr,
|
||
|
create as svgCreate,
|
||
|
remove as svgRemove
|
||
|
} from 'tiny-svg';
|
||
|
|
||
|
import {
|
||
|
getDi,
|
||
|
is
|
||
|
} from '../../util/ModelUtil';
|
||
|
|
||
|
import {
|
||
|
translate
|
||
|
} from 'diagram-js/lib/util/SvgTransformUtil';
|
||
|
|
||
|
var MARKER_HIDDEN = 'djs-element-hidden',
|
||
|
MARKER_LABEL_HIDDEN = 'djs-label-hidden';
|
||
|
|
||
|
|
||
|
export default function LabelEditingPreview(
|
||
|
eventBus, canvas, elementRegistry,
|
||
|
pathMap) {
|
||
|
|
||
|
var self = this;
|
||
|
|
||
|
var defaultLayer = canvas.getDefaultLayer();
|
||
|
|
||
|
var element, absoluteElementBBox, gfx;
|
||
|
|
||
|
eventBus.on('directEditing.activate', function(context) {
|
||
|
var activeProvider = context.active;
|
||
|
|
||
|
element = activeProvider.element.label || activeProvider.element;
|
||
|
|
||
|
// text annotation
|
||
|
if (is(element, 'bpmn:TextAnnotation')) {
|
||
|
absoluteElementBBox = canvas.getAbsoluteBBox(element);
|
||
|
|
||
|
gfx = svgCreate('g');
|
||
|
|
||
|
var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {
|
||
|
xScaleFactor: 1,
|
||
|
yScaleFactor: 1,
|
||
|
containerWidth: element.width,
|
||
|
containerHeight: element.height,
|
||
|
position: {
|
||
|
mx: 0.0,
|
||
|
my: 0.0
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var path = self.path = svgCreate('path');
|
||
|
|
||
|
svgAttr(path, {
|
||
|
d: textPathData,
|
||
|
strokeWidth: 2,
|
||
|
stroke: getStrokeColor(element)
|
||
|
});
|
||
|
|
||
|
svgAppend(gfx, path);
|
||
|
|
||
|
svgAppend(defaultLayer, gfx);
|
||
|
|
||
|
translate(gfx, element.x, element.y);
|
||
|
}
|
||
|
|
||
|
if (is(element, 'bpmn:TextAnnotation') ||
|
||
|
element.labelTarget) {
|
||
|
canvas.addMarker(element, MARKER_HIDDEN);
|
||
|
} else if (is(element, 'bpmn:Task') ||
|
||
|
is(element, 'bpmn:CallActivity') ||
|
||
|
is(element, 'bpmn:SubProcess') ||
|
||
|
is(element, 'bpmn:Participant')) {
|
||
|
canvas.addMarker(element, MARKER_LABEL_HIDDEN);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
eventBus.on('directEditing.resize', function(context) {
|
||
|
|
||
|
// text annotation
|
||
|
if (is(element, 'bpmn:TextAnnotation')) {
|
||
|
var height = context.height,
|
||
|
dy = context.dy;
|
||
|
|
||
|
var newElementHeight = Math.max(element.height / absoluteElementBBox.height * (height + dy), 0);
|
||
|
|
||
|
var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {
|
||
|
xScaleFactor: 1,
|
||
|
yScaleFactor: 1,
|
||
|
containerWidth: element.width,
|
||
|
containerHeight: newElementHeight,
|
||
|
position: {
|
||
|
mx: 0.0,
|
||
|
my: 0.0
|
||
|
}
|
||
|
});
|
||
|
|
||
|
svgAttr(self.path, {
|
||
|
d: textPathData
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
eventBus.on([ 'directEditing.complete', 'directEditing.cancel' ], function(context) {
|
||
|
var activeProvider = context.active;
|
||
|
|
||
|
if (activeProvider) {
|
||
|
canvas.removeMarker(activeProvider.element.label || activeProvider.element, MARKER_HIDDEN);
|
||
|
canvas.removeMarker(element, MARKER_LABEL_HIDDEN);
|
||
|
}
|
||
|
|
||
|
element = undefined;
|
||
|
absoluteElementBBox = undefined;
|
||
|
|
||
|
if (gfx) {
|
||
|
svgRemove(gfx);
|
||
|
|
||
|
gfx = undefined;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
LabelEditingPreview.$inject = [
|
||
|
'eventBus',
|
||
|
'canvas',
|
||
|
'elementRegistry',
|
||
|
'pathMap'
|
||
|
];
|
||
|
|
||
|
|
||
|
// helpers ///////////////////
|
||
|
|
||
|
function getStrokeColor(element, defaultColor) {
|
||
|
var di = getDi(element);
|
||
|
|
||
|
return di.get('stroke') || defaultColor || 'black';
|
||
|
}
|