bpmn-js 8.8.1 → 9.0.0-subprocesses.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/assets/bpmn-js.css +57 -0
  3. package/dist/assets/diagram-js.css +2 -0
  4. package/dist/bpmn-modeler.development.js +1289 -795
  5. package/dist/bpmn-modeler.production.min.js +8 -7
  6. package/dist/bpmn-navigated-viewer.development.js +20635 -19973
  7. package/dist/bpmn-navigated-viewer.production.min.js +22 -20
  8. package/dist/bpmn-viewer.development.js +19836 -19174
  9. package/dist/bpmn-viewer.production.min.js +22 -20
  10. package/lib/BaseViewer.js +0 -13
  11. package/lib/Viewer.js +3 -1
  12. package/lib/draw/BpmnRenderUtil.js +6 -4
  13. package/lib/draw/BpmnRenderer.js +363 -296
  14. package/lib/features/context-pad/ContextPadProvider.js +1 -1
  15. package/lib/features/copy-paste/BpmnCopyPaste.js +13 -13
  16. package/lib/features/copy-paste/ModdleCopy.js +15 -3
  17. package/lib/features/di-ordering/BpmnDiOrdering.js +2 -3
  18. package/lib/features/drilldown/DrilldownCentering.js +41 -0
  19. package/lib/features/drilldown/DrilldownOverlays.js +109 -0
  20. package/lib/features/drilldown/SubprocessCompatibility.js +193 -0
  21. package/lib/features/drilldown/index.js +14 -0
  22. package/lib/features/label-editing/LabelEditingPreview.js +3 -3
  23. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +2 -1
  24. package/lib/features/modeling/BpmnFactory.js +8 -8
  25. package/lib/features/modeling/BpmnUpdater.js +35 -27
  26. package/lib/features/modeling/ElementFactory.js +60 -37
  27. package/lib/features/modeling/behavior/DataStoreBehavior.js +3 -1
  28. package/lib/features/modeling/behavior/IsHorizontalFix.js +7 -4
  29. package/lib/features/modeling/behavior/LabelBehavior.js +8 -7
  30. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +6 -6
  31. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +8 -6
  32. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +19 -12
  33. package/lib/features/modeling/cmd/UpdateSemanticParentHandler.js +5 -3
  34. package/lib/features/palette/PaletteProvider.js +3 -1
  35. package/lib/features/popup-menu/ReplaceMenuProvider.js +5 -5
  36. package/lib/features/popup-menu/util/TypeUtil.js +1 -1
  37. package/lib/features/replace/BpmnReplace.js +29 -29
  38. package/lib/import/BpmnImporter.js +27 -22
  39. package/lib/import/BpmnTreeWalker.js +19 -17
  40. package/lib/import/Importer.js +17 -6
  41. package/lib/util/CompatibilityUtil.js +21 -1
  42. package/lib/util/DiUtil.js +10 -3
  43. package/lib/util/LabelUtil.js +2 -3
  44. package/lib/util/ModelUtil.js +11 -0
  45. package/package.json +2 -2
  46. package/test/matchers/BoundsMatchers.js +10 -10
  47. package/test/matchers/ConnectionMatchers.js +5 -5
  48. package/test/util/MockEvents.js +10 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * bpmn-js - bpmn-modeler v8.8.1
2
+ * bpmn-js - bpmn-modeler v9.0.0-subprocesses.2
3
3
  *
4
4
  * Copyright (c) 2014-present, camunda Services GmbH
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * Source Code: https://github.com/bpmn-io/bpmn-js
10
10
  *
11
- * Date: 2021-10-15
11
+ * Date: 2021-11-05
12
12
  */
13
13
  (function (global, factory) {
14
14
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -2337,13 +2337,14 @@
2337
2337
  eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {
2338
2338
  var type = evt.type,
2339
2339
  element = context.element,
2340
- visuals = context.gfx;
2340
+ visuals = context.gfx,
2341
+ attrs = context.attrs;
2341
2342
 
2342
2343
  if (self.canRender(element)) {
2343
2344
  if (type === 'render.shape') {
2344
- return self.drawShape(visuals, element);
2345
+ return self.drawShape(visuals, element, attrs);
2345
2346
  } else {
2346
- return self.drawConnection(visuals, element);
2347
+ return self.drawConnection(visuals, element, attrs);
2347
2348
  }
2348
2349
  }
2349
2350
  });
@@ -2803,7 +2804,7 @@
2803
2804
  return true;
2804
2805
  };
2805
2806
 
2806
- DefaultRenderer.prototype.drawShape = function drawShape(visuals, element) {
2807
+ DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {
2807
2808
  var rect = create$1('rect');
2808
2809
 
2809
2810
  attr(rect, {
@@ -2814,9 +2815,9 @@
2814
2815
  });
2815
2816
 
2816
2817
  if (isFrameElement$1(element)) {
2817
- attr(rect, this.FRAME_STYLE);
2818
+ attr(rect, assign({}, this.FRAME_STYLE, attrs || {}));
2818
2819
  } else {
2819
- attr(rect, this.SHAPE_STYLE);
2820
+ attr(rect, assign({}, this.SHAPE_STYLE, attrs || {}));
2820
2821
  }
2821
2822
 
2822
2823
  append(visuals, rect);
@@ -2824,9 +2825,9 @@
2824
2825
  return rect;
2825
2826
  };
2826
2827
 
2827
- DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection) {
2828
+ DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {
2828
2829
 
2829
- var line = createLine(connection.waypoints, this.CONNECTION_STYLE);
2830
+ var line = createLine(connection.waypoints, assign({}, this.CONNECTION_STYLE, attrs || {}));
2830
2831
  append(visuals, line);
2831
2832
 
2832
2833
  return line;
@@ -4365,6 +4366,9 @@
4365
4366
  var BASE_LAYER = 'base';
4366
4367
  var HIDDEN_MARKER = 'djs-element-hidden';
4367
4368
 
4369
+ // render plane contents behind additional layers
4370
+ var PLANE_LAYER_INDEX = -10;
4371
+
4368
4372
 
4369
4373
  var REQUIRED_MODEL_ATTRS = {
4370
4374
  shape: [ 'x', 'y', 'width', 'height' ],
@@ -4463,7 +4467,8 @@
4463
4467
  'connection.added',
4464
4468
  'shape.removed',
4465
4469
  'connection.removed',
4466
- 'elements.changed'
4470
+ 'elements.changed',
4471
+ 'plane.set'
4467
4472
  ], function() {
4468
4473
  delete this._cachedViewbox;
4469
4474
  }, this);
@@ -4604,9 +4609,7 @@
4604
4609
  throw new Error('must specify a name');
4605
4610
  }
4606
4611
 
4607
- var plane = this._planes[name];
4608
-
4609
- return plane;
4612
+ return this._planes[name];
4610
4613
  };
4611
4614
 
4612
4615
  /**
@@ -4635,7 +4638,7 @@
4635
4638
  };
4636
4639
  }
4637
4640
 
4638
- var svgLayer = this.getLayer(name);
4641
+ var svgLayer = this.getLayer(name, PLANE_LAYER_INDEX);
4639
4642
  classes(svgLayer).add(HIDDEN_MARKER);
4640
4643
 
4641
4644
  var plane = this._planes[name] = {
@@ -5244,9 +5247,10 @@
5244
5247
  if (!box) {
5245
5248
 
5246
5249
  // compute the inner box based on the
5247
- // diagrams default layer. This allows us to exclude
5250
+ // diagrams active plane. This allows us to exclude
5248
5251
  // external components, such as overlays
5249
- innerBox = this.getDefaultLayer().getBBox();
5252
+
5253
+ innerBox = (this._activePlane && this._activePlane.layer.getBBox()) || {};
5250
5254
 
5251
5255
  transform = transform$1(viewport);
5252
5256
  matrix = transform ? transform.matrix : createMatrix();
@@ -5262,10 +5266,10 @@
5262
5266
  height: outerBox.height / scale,
5263
5267
  scale: scale,
5264
5268
  inner: {
5265
- width: innerBox.width,
5266
- height: innerBox.height,
5267
- x: innerBox.x,
5268
- y: innerBox.y
5269
+ width: innerBox.width || 0,
5270
+ height: innerBox.height || 0,
5271
+ x: innerBox.x || 0,
5272
+ y: innerBox.y || 0
5269
5273
  },
5270
5274
  outer: outerBox
5271
5275
  };
@@ -14940,10 +14944,74 @@
14940
14944
  return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />';
14941
14945
  }
14942
14946
 
14943
- var diRefs = new Refs(
14944
- { name: 'bpmnElement', enumerable: true },
14945
- { name: 'di', configurable: true }
14946
- );
14947
+ // TODO(nikku): remove with future bpmn-js version
14948
+
14949
+ /**
14950
+ * Wraps APIs to check:
14951
+ *
14952
+ * 1) If a callback is passed -> Warn users about callback deprecation.
14953
+ * 2) If Promise class is implemented in current environment.
14954
+ *
14955
+ * @private
14956
+ */
14957
+ function wrapForCompatibility(api) {
14958
+
14959
+ return function() {
14960
+
14961
+ if (!window.Promise) {
14962
+ throw new Error('Promises is not supported in this environment. Please polyfill Promise.');
14963
+ }
14964
+
14965
+ var argLen = arguments.length;
14966
+ if (argLen >= 1 && isFunction(arguments[argLen - 1])) {
14967
+
14968
+ var callback = arguments[argLen - 1];
14969
+
14970
+ console.warn(new Error(
14971
+ 'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +
14972
+ 'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'
14973
+ ));
14974
+
14975
+ var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);
14976
+
14977
+ api.apply(this, argsWithoutCallback).then(function(result) {
14978
+
14979
+ var firstKey = Object.keys(result)[0];
14980
+
14981
+ // The APIs we are wrapping all resolve a single item depending on the API.
14982
+ // For instance, importXML resolves { warnings } and saveXML returns { xml }.
14983
+ // That's why we can call the callback with the first item of result.
14984
+ return callback(null, result[firstKey]);
14985
+
14986
+ // Passing a second paramter instead of catch because we don't want to
14987
+ // catch errors thrown by callback().
14988
+ }, function(err) {
14989
+
14990
+ return callback(err, err.warnings);
14991
+ });
14992
+ } else {
14993
+
14994
+ return api.apply(this, arguments);
14995
+ }
14996
+ };
14997
+ }
14998
+
14999
+
15000
+ // TODO(nikku): remove with future bpmn-js version
15001
+
15002
+ var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';
15003
+
15004
+ function ensureCompatDiRef(businessObject) {
15005
+
15006
+ // bpmnElement can have multiple independent DIs
15007
+ if (!has(businessObject, 'di')) {
15008
+ Object.defineProperty(businessObject, 'di', {
15009
+ get: function() {
15010
+ throw new Error(DI_ERROR_MESSAGE);
15011
+ }
15012
+ });
15013
+ }
15014
+ }
14947
15015
 
14948
15016
  /**
14949
15017
  * Returns true if an element has the given meta-model type
@@ -14978,6 +15046,8 @@
14978
15046
  // prerequisites are drawn
14979
15047
  var deferred = [];
14980
15048
 
15049
+ var diMap = {};
15050
+
14981
15051
  // Helpers //////////////////////
14982
15052
 
14983
15053
  function contextual(fn, ctx) {
@@ -15006,17 +15076,17 @@
15006
15076
  }
15007
15077
 
15008
15078
  // call handler
15009
- return handler.element(element, ctx);
15079
+ return handler.element(element, diMap[element.id], ctx);
15010
15080
  }
15011
15081
 
15012
15082
  function visitRoot(element, diagram) {
15013
- return handler.root(element, diagram);
15083
+ return handler.root(element, diMap[element.id], diagram);
15014
15084
  }
15015
15085
 
15016
15086
  function visitIfDi(element, ctx) {
15017
15087
 
15018
15088
  try {
15019
- var gfx = element.di && visit(element, ctx);
15089
+ var gfx = diMap[element.id] && visit(element, ctx);
15020
15090
 
15021
15091
  handled(element);
15022
15092
 
@@ -15039,7 +15109,7 @@
15039
15109
  var bpmnElement = di.bpmnElement;
15040
15110
 
15041
15111
  if (bpmnElement) {
15042
- if (bpmnElement.di) {
15112
+ if (diMap[bpmnElement.id]) {
15043
15113
  logError(
15044
15114
  translate('multiple DI elements defined for {element}', {
15045
15115
  element: elementToString(bpmnElement)
@@ -15047,8 +15117,9 @@
15047
15117
  { element: bpmnElement }
15048
15118
  );
15049
15119
  } else {
15050
- diRefs.bind(bpmnElement, 'di');
15051
- bpmnElement.di = di;
15120
+ diMap[bpmnElement.id] = di;
15121
+
15122
+ ensureCompatDiRef(bpmnElement);
15052
15123
  }
15053
15124
  } else {
15054
15125
  logError(
@@ -15105,6 +15176,7 @@
15105
15176
  }
15106
15177
 
15107
15178
  // load DI from selected diagram only
15179
+ diMap = {};
15108
15180
  handleDiagram(diagram);
15109
15181
 
15110
15182
 
@@ -15144,10 +15216,10 @@
15144
15216
 
15145
15217
  var ctx = visitRoot(rootElement, plane);
15146
15218
 
15147
- if (is$2(rootElement, 'bpmn:Process')) {
15219
+ if (is$2(rootElement, 'bpmn:Process') || is$2(rootElement, 'bpmn:SubProcess')) {
15148
15220
  handleProcess(rootElement, ctx);
15149
15221
  } else if (is$2(rootElement, 'bpmn:Collaboration')) {
15150
- handleCollaboration(rootElement);
15222
+ handleCollaboration(rootElement, ctx);
15151
15223
 
15152
15224
  // force drawing of everything not yet drawn that is part of the target DI
15153
15225
  handleUnhandledProcesses(definitions.rootElements, ctx);
@@ -15354,15 +15426,15 @@
15354
15426
  }
15355
15427
  }
15356
15428
 
15357
- function handleCollaboration(collaboration) {
15429
+ function handleCollaboration(collaboration, context) {
15358
15430
 
15359
- forEach(collaboration.participants, contextual(handleParticipant));
15431
+ forEach(collaboration.participants, contextual(handleParticipant, context));
15360
15432
 
15361
- handleArtifacts(collaboration.artifacts);
15433
+ handleArtifacts(collaboration.artifacts, context);
15362
15434
 
15363
15435
  // handle message flows latest in the process
15364
15436
  deferred.push(function() {
15365
- handleMessageFlows(collaboration.messageFlows);
15437
+ handleMessageFlows(collaboration.messageFlows, context);
15366
15438
  });
15367
15439
  }
15368
15440
 
@@ -15421,7 +15493,8 @@
15421
15493
 
15422
15494
  var importer,
15423
15495
  eventBus,
15424
- translate;
15496
+ translate,
15497
+ canvas;
15425
15498
 
15426
15499
  var error,
15427
15500
  warnings = [];
@@ -15437,12 +15510,12 @@
15437
15510
 
15438
15511
  var visitor = {
15439
15512
 
15440
- root: function(element) {
15441
- return importer.add(element);
15513
+ root: function(element, di) {
15514
+ return importer.add(element, di);
15442
15515
  },
15443
15516
 
15444
- element: function(element, parentShape) {
15445
- return importer.add(element, parentShape);
15517
+ element: function(element, di, parentShape) {
15518
+ return importer.add(element, di, parentShape);
15446
15519
  },
15447
15520
 
15448
15521
  error: function(message, context) {
@@ -15454,7 +15527,16 @@
15454
15527
 
15455
15528
  // traverse BPMN 2.0 document model,
15456
15529
  // starting at definitions
15457
- walker.handleDefinitions(definitions, bpmnDiagram);
15530
+ if (!bpmnDiagram && definitions.diagrams) {
15531
+ for (var i = 0; i < definitions.diagrams.length; i++) {
15532
+ walker.handleDefinitions(definitions, definitions.diagrams[i]);
15533
+ }
15534
+ } else {
15535
+ walker.handleDefinitions(definitions, bpmnDiagram);
15536
+ }
15537
+
15538
+ var mainDiagram = bpmnDiagram || definitions.diagrams[0];
15539
+ canvas.setActivePlane(mainDiagram.plane.bpmnElement.id);
15458
15540
  }
15459
15541
 
15460
15542
  return new Promise(function(resolve, reject) {
@@ -15462,6 +15544,7 @@
15462
15544
  importer = diagram.get('bpmnImporter');
15463
15545
  eventBus = diagram.get('eventBus');
15464
15546
  translate = diagram.get('translate');
15547
+ canvas = diagram.get('canvas');
15465
15548
 
15466
15549
  eventBus.fire('import.render.start', { definitions: definitions });
15467
15550
 
@@ -15481,58 +15564,6 @@
15481
15564
  });
15482
15565
  }
15483
15566
 
15484
- // TODO(nikku): remove with future bpmn-js version
15485
-
15486
- /**
15487
- * Wraps APIs to check:
15488
- *
15489
- * 1) If a callback is passed -> Warn users about callback deprecation.
15490
- * 2) If Promise class is implemented in current environment.
15491
- *
15492
- * @private
15493
- */
15494
- function wrapForCompatibility(api) {
15495
-
15496
- return function() {
15497
-
15498
- if (!window.Promise) {
15499
- throw new Error('Promises is not supported in this environment. Please polyfill Promise.');
15500
- }
15501
-
15502
- var argLen = arguments.length;
15503
- if (argLen >= 1 && isFunction(arguments[argLen - 1])) {
15504
-
15505
- var callback = arguments[argLen - 1];
15506
-
15507
- console.warn(new Error(
15508
- 'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +
15509
- 'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'
15510
- ));
15511
-
15512
- var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);
15513
-
15514
- api.apply(this, argsWithoutCallback).then(function(result) {
15515
-
15516
- var firstKey = Object.keys(result)[0];
15517
-
15518
- // The APIs we are wrapping all resolve a single item depending on the API.
15519
- // For instance, importXML resolves { warnings } and saveXML returns { xml }.
15520
- // That's why we can call the callback with the first item of result.
15521
- return callback(null, result[firstKey]);
15522
-
15523
- // Passing a second paramter instead of catch because we don't want to
15524
- // catch errors thrown by callback().
15525
- }, function(err) {
15526
-
15527
- return callback(err, err.warnings);
15528
- });
15529
- } else {
15530
-
15531
- return api.apply(this, arguments);
15532
- }
15533
- };
15534
- }
15535
-
15536
15567
  /**
15537
15568
  * This file must not be changed or exchanged.
15538
15569
  *
@@ -16112,19 +16143,6 @@
16112
16143
  return;
16113
16144
  }
16114
16145
 
16115
- // remove businessObject#di binding
16116
- //
16117
- // this is necessary, as we establish the bindings
16118
- // in the BpmnTreeWalker (and assume none are given
16119
- // on reimport)
16120
- this.get('elementRegistry').forEach(function(element) {
16121
- var bo = element.businessObject;
16122
-
16123
- if (bo && bo.di) {
16124
- delete bo.di;
16125
- }
16126
- });
16127
-
16128
16146
  // remove drawn elements
16129
16147
  Diagram.prototype.clear.call(this);
16130
16148
  };
@@ -16453,14 +16471,31 @@
16453
16471
  return (element && element.businessObject) || element;
16454
16472
  }
16455
16473
 
16456
- function isExpanded(element) {
16474
+ /**
16475
+ * Return the di object for a given element.
16476
+ *
16477
+ * @param {djs.model.Base} element
16478
+ *
16479
+ * @return {ModdleElement}
16480
+ */
16481
+ function getDi(element) {
16482
+ return element && element.di;
16483
+ }
16484
+
16485
+ function isExpanded(element, di) {
16457
16486
 
16458
16487
  if (is$1(element, 'bpmn:CallActivity')) {
16459
16488
  return false;
16460
16489
  }
16461
16490
 
16462
16491
  if (is$1(element, 'bpmn:SubProcess')) {
16463
- return getBusinessObject(element).di && !!getBusinessObject(element).di.isExpanded;
16492
+ di = di || getDi(element);
16493
+
16494
+ if (di && is$1(di, 'bpmndi:BPMNPlane')) {
16495
+ return true;
16496
+ }
16497
+
16498
+ return di && !!di.isExpanded;
16464
16499
  }
16465
16500
 
16466
16501
  if (is$1(element, 'bpmn:Participant')) {
@@ -16605,10 +16640,6 @@
16605
16640
  return element.isCollection || (dataObject && dataObject.isCollection);
16606
16641
  }
16607
16642
 
16608
- function getDi(element) {
16609
- return element.businessObject.di;
16610
- }
16611
-
16612
16643
  function getSemantic(element) {
16613
16644
  return element.businessObject;
16614
16645
  }
@@ -17041,8 +17072,8 @@
17041
17072
  }
17042
17073
 
17043
17074
  function as(type) {
17044
- return function(parentGfx, element) {
17045
- return handlers[type](parentGfx, element);
17075
+ return function(parentGfx, element, attrs) {
17076
+ return handlers[type](parentGfx, element, attrs);
17046
17077
  };
17047
17078
  }
17048
17079
 
@@ -17050,58 +17081,58 @@
17050
17081
  return handlers[type];
17051
17082
  }
17052
17083
 
17053
- function renderEventContent(element, parentGfx) {
17084
+ function renderEventContent(element, parentGfx, attrs) {
17054
17085
 
17055
17086
  var event = getSemantic(element);
17056
17087
  var isThrowing = isThrowEvent(event);
17057
17088
 
17058
17089
  if (event.eventDefinitions && event.eventDefinitions.length>1) {
17059
17090
  if (event.parallelMultiple) {
17060
- return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);
17091
+ return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, attrs, isThrowing);
17061
17092
  }
17062
17093
  else {
17063
- return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);
17094
+ return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, attrs, isThrowing);
17064
17095
  }
17065
17096
  }
17066
17097
 
17067
17098
  if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {
17068
- return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);
17099
+ return renderer('bpmn:MessageEventDefinition')(parentGfx, element, attrs, isThrowing);
17069
17100
  }
17070
17101
 
17071
17102
  if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {
17072
- return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);
17103
+ return renderer('bpmn:TimerEventDefinition')(parentGfx, element, attrs, isThrowing);
17073
17104
  }
17074
17105
 
17075
17106
  if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {
17076
- return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);
17107
+ return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element, attrs);
17077
17108
  }
17078
17109
 
17079
17110
  if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {
17080
- return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);
17111
+ return renderer('bpmn:SignalEventDefinition')(parentGfx, element, attrs, isThrowing);
17081
17112
  }
17082
17113
 
17083
17114
  if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {
17084
- return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);
17115
+ return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, attrs, isThrowing);
17085
17116
  }
17086
17117
 
17087
17118
  if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {
17088
- return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);
17119
+ return renderer('bpmn:LinkEventDefinition')(parentGfx, element, attrs, isThrowing);
17089
17120
  }
17090
17121
 
17091
17122
  if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {
17092
- return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);
17123
+ return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, attrs, isThrowing);
17093
17124
  }
17094
17125
 
17095
17126
  if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {
17096
- return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);
17127
+ return renderer('bpmn:CancelEventDefinition')(parentGfx, element, attrs, isThrowing);
17097
17128
  }
17098
17129
 
17099
17130
  if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {
17100
- return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);
17131
+ return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, attrs, isThrowing);
17101
17132
  }
17102
17133
 
17103
17134
  if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {
17104
- return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);
17135
+ return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, attrs, isThrowing);
17105
17136
  }
17106
17137
 
17107
17138
  return null;
@@ -17124,20 +17155,20 @@
17124
17155
  return text;
17125
17156
  }
17126
17157
 
17127
- function renderEmbeddedLabel(parentGfx, element, align) {
17158
+ function renderEmbeddedLabel(parentGfx, element, align, attrs) {
17128
17159
  var semantic = getSemantic(element);
17129
17160
 
17130
17161
  return renderLabel(parentGfx, semantic.name, {
17131
17162
  box: element,
17132
17163
  align: align,
17133
17164
  padding: 5,
17134
- style: {
17165
+ style: assign({
17135
17166
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
17136
- }
17167
+ }, attrs)
17137
17168
  });
17138
17169
  }
17139
17170
 
17140
- function renderExternalLabel(parentGfx, element) {
17171
+ function renderExternalLabel(parentGfx, element, attrs) {
17141
17172
 
17142
17173
  var box = {
17143
17174
  width: 90,
@@ -17154,21 +17185,22 @@
17154
17185
  textRenderer.getExternalStyle(),
17155
17186
  {
17156
17187
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
17157
- }
17188
+ },
17189
+ attrs
17158
17190
  )
17159
17191
  });
17160
17192
  }
17161
17193
 
17162
- function renderLaneLabel(parentGfx, text, element) {
17194
+ function renderLaneLabel(parentGfx, text, element, attrs) {
17163
17195
  var textBox = renderLabel(parentGfx, text, {
17164
17196
  box: {
17165
17197
  height: 30,
17166
17198
  width: element.height
17167
17199
  },
17168
17200
  align: 'center-middle',
17169
- style: {
17201
+ style: assign({
17170
17202
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
17171
- }
17203
+ }, attrs)
17172
17204
  });
17173
17205
 
17174
17206
  var top = -1 * element.height;
@@ -17195,11 +17227,11 @@
17195
17227
 
17196
17228
  return drawCircle(parentGfx, element.width, element.height, attrs);
17197
17229
  },
17198
- 'bpmn:StartEvent': function(parentGfx, element) {
17199
- var attrs = {
17230
+ 'bpmn:StartEvent': function(parentGfx, element, attrs) {
17231
+ attrs = assign({
17200
17232
  fill: getFillColor(element, defaultFillColor),
17201
17233
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17202
- };
17234
+ }, attrs);
17203
17235
 
17204
17236
  var semantic = getSemantic(element);
17205
17237
 
@@ -17218,7 +17250,7 @@
17218
17250
 
17219
17251
  return circle;
17220
17252
  },
17221
- 'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {
17253
+ 'bpmn:MessageEventDefinition': function(parentGfx, element, attrs, isThrowing) {
17222
17254
  var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {
17223
17255
  xScaleFactor: 0.9,
17224
17256
  yScaleFactor: 0.9,
@@ -17233,20 +17265,24 @@
17233
17265
  var fill = isThrowing ? getStrokeColor$1(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);
17234
17266
  var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor$1(element, defaultStrokeColor);
17235
17267
 
17236
- var messagePath = drawPath(parentGfx, pathData, {
17268
+ attrs = assign({
17237
17269
  strokeWidth: 1,
17238
17270
  fill: fill,
17239
17271
  stroke: stroke
17240
- });
17272
+ }, attrs);
17273
+
17274
+ var messagePath = drawPath(parentGfx, pathData, attrs);
17241
17275
 
17242
17276
  return messagePath;
17243
17277
  },
17244
- 'bpmn:TimerEventDefinition': function(parentGfx, element) {
17245
- var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {
17278
+ 'bpmn:TimerEventDefinition': function(parentGfx, element, attrs) {
17279
+ var outerAttrs = assign({
17246
17280
  strokeWidth: 2,
17247
17281
  fill: getFillColor(element, defaultFillColor),
17248
17282
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17249
- });
17283
+ }, attrs);
17284
+
17285
+ var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, outerAttrs);
17250
17286
 
17251
17287
  var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {
17252
17288
  xScaleFactor: 0.75,
@@ -17259,11 +17295,13 @@
17259
17295
  }
17260
17296
  });
17261
17297
 
17262
- drawPath(parentGfx, pathData, {
17298
+ var innerAttrs = assign({
17263
17299
  strokeWidth: 2,
17264
17300
  strokeLinecap: 'square',
17265
17301
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17266
- });
17302
+ }, attrs);
17303
+
17304
+ drawPath(parentGfx, pathData, innerAttrs);
17267
17305
 
17268
17306
  for (var i = 0;i < 12; i++) {
17269
17307
 
@@ -17281,17 +17319,25 @@
17281
17319
  var width = element.width / 2;
17282
17320
  var height = element.height / 2;
17283
17321
 
17284
- drawPath(parentGfx, linePathData, {
17322
+ var lineAttrs = assign({
17285
17323
  strokeWidth: 1,
17286
17324
  strokeLinecap: 'square',
17287
17325
  transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',
17288
17326
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17289
- });
17327
+ }, attrs);
17328
+
17329
+ drawPath(parentGfx, linePathData, lineAttrs);
17290
17330
  }
17291
17331
 
17292
17332
  return circle;
17293
17333
  },
17294
- 'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {
17334
+ 'bpmn:EscalationEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17335
+ attrs = assign({
17336
+ strokeWidth: 1,
17337
+ fill: fill,
17338
+ stroke: getStrokeColor$1(event, defaultStrokeColor)
17339
+ }, attrs);
17340
+
17295
17341
  var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {
17296
17342
  xScaleFactor: 1,
17297
17343
  yScaleFactor: 1,
@@ -17305,13 +17351,14 @@
17305
17351
 
17306
17352
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17307
17353
 
17308
- return drawPath(parentGfx, pathData, {
17354
+ return drawPath(parentGfx, pathData, attrs);
17355
+ },
17356
+ 'bpmn:ConditionalEventDefinition': function(parentGfx, event, attrs) {
17357
+ attrs = assign({
17309
17358
  strokeWidth: 1,
17310
- fill: fill,
17311
17359
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17312
- });
17313
- },
17314
- 'bpmn:ConditionalEventDefinition': function(parentGfx, event) {
17360
+ }, attrs);
17361
+
17315
17362
  var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {
17316
17363
  xScaleFactor: 1,
17317
17364
  yScaleFactor: 1,
@@ -17323,12 +17370,9 @@
17323
17370
  }
17324
17371
  });
17325
17372
 
17326
- return drawPath(parentGfx, pathData, {
17327
- strokeWidth: 1,
17328
- stroke: getStrokeColor$1(event, defaultStrokeColor)
17329
- });
17373
+ return drawPath(parentGfx, pathData, attrs);
17330
17374
  },
17331
- 'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {
17375
+ 'bpmn:LinkEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17332
17376
  var pathData = pathMap.getScaledPath('EVENT_LINK', {
17333
17377
  xScaleFactor: 1,
17334
17378
  yScaleFactor: 1,
@@ -17342,13 +17386,15 @@
17342
17386
 
17343
17387
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17344
17388
 
17345
- return drawPath(parentGfx, pathData, {
17389
+ attrs = assign({
17346
17390
  strokeWidth: 1,
17347
17391
  fill: fill,
17348
17392
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17349
- });
17393
+ }, attrs);
17394
+
17395
+ return drawPath(parentGfx, pathData, attrs);
17350
17396
  },
17351
- 'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {
17397
+ 'bpmn:ErrorEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17352
17398
  var pathData = pathMap.getScaledPath('EVENT_ERROR', {
17353
17399
  xScaleFactor: 1.1,
17354
17400
  yScaleFactor: 1.1,
@@ -17362,13 +17408,15 @@
17362
17408
 
17363
17409
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17364
17410
 
17365
- return drawPath(parentGfx, pathData, {
17411
+ attrs = assign({
17366
17412
  strokeWidth: 1,
17367
17413
  fill: fill,
17368
17414
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17369
- });
17415
+ }, attrs);
17416
+
17417
+ return drawPath(parentGfx, pathData, attrs);
17370
17418
  },
17371
- 'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {
17419
+ 'bpmn:CancelEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17372
17420
  var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {
17373
17421
  xScaleFactor: 1.0,
17374
17422
  yScaleFactor: 1.0,
@@ -17382,17 +17430,19 @@
17382
17430
 
17383
17431
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17384
17432
 
17385
- var path = drawPath(parentGfx, pathData, {
17433
+ attrs = assign({
17386
17434
  strokeWidth: 1,
17387
17435
  fill: fill,
17388
17436
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17389
- });
17437
+ }, attrs);
17438
+
17439
+ var path = drawPath(parentGfx, pathData, attrs);
17390
17440
 
17391
17441
  rotate(path, 45);
17392
17442
 
17393
17443
  return path;
17394
17444
  },
17395
- 'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {
17445
+ 'bpmn:CompensateEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17396
17446
  var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {
17397
17447
  xScaleFactor: 1,
17398
17448
  yScaleFactor: 1,
@@ -17406,13 +17456,15 @@
17406
17456
 
17407
17457
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17408
17458
 
17409
- return drawPath(parentGfx, pathData, {
17459
+ attrs = assign({
17410
17460
  strokeWidth: 1,
17411
17461
  fill: fill,
17412
17462
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17413
- });
17463
+ }, attrs);
17464
+
17465
+ return drawPath(parentGfx, pathData, attrs);
17414
17466
  },
17415
- 'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {
17467
+ 'bpmn:SignalEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17416
17468
  var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {
17417
17469
  xScaleFactor: 0.9,
17418
17470
  yScaleFactor: 0.9,
@@ -17426,13 +17478,15 @@
17426
17478
 
17427
17479
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17428
17480
 
17429
- return drawPath(parentGfx, pathData, {
17481
+ attrs = assign({
17430
17482
  strokeWidth: 1,
17431
17483
  fill: fill,
17432
17484
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17433
- });
17485
+ }, attrs);
17486
+
17487
+ return drawPath(parentGfx, pathData, attrs);
17434
17488
  },
17435
- 'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {
17489
+ 'bpmn:MultipleEventDefinition': function(parentGfx, event, attrs, isThrowing) {
17436
17490
  var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {
17437
17491
  xScaleFactor: 1.1,
17438
17492
  yScaleFactor: 1.1,
@@ -17446,12 +17500,14 @@
17446
17500
 
17447
17501
  var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';
17448
17502
 
17449
- return drawPath(parentGfx, pathData, {
17503
+ attrs = assign({
17450
17504
  strokeWidth: 1,
17451
17505
  fill: fill
17452
- });
17506
+ }, attrs);
17507
+
17508
+ return drawPath(parentGfx, pathData, attrs);
17453
17509
  },
17454
- 'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {
17510
+ 'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event, attrs) {
17455
17511
  var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {
17456
17512
  xScaleFactor: 1.2,
17457
17513
  yScaleFactor: 1.2,
@@ -17463,47 +17519,54 @@
17463
17519
  }
17464
17520
  });
17465
17521
 
17466
- return drawPath(parentGfx, pathData, {
17522
+ attrs = assign({
17467
17523
  strokeWidth: 1,
17468
17524
  fill: getStrokeColor$1(event, defaultStrokeColor),
17469
17525
  stroke: getStrokeColor$1(event, defaultStrokeColor)
17470
- });
17526
+ }, attrs);
17527
+
17528
+
17529
+ return drawPath(parentGfx, pathData, attrs);
17471
17530
  },
17472
- 'bpmn:EndEvent': function(parentGfx, element) {
17473
- var circle = renderer('bpmn:Event')(parentGfx, element, {
17531
+ 'bpmn:EndEvent': function(parentGfx, element, attrs) {
17532
+ var outerAttrs = assign({
17474
17533
  strokeWidth: 4,
17475
17534
  fill: getFillColor(element, defaultFillColor),
17476
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17477
- });
17535
+ stroke: getStrokeColor$1(element, defaultStrokeColor),
17536
+ }, attrs);
17478
17537
 
17479
- renderEventContent(element, parentGfx);
17538
+ var circle = renderer('bpmn:Event')(parentGfx, element, outerAttrs);
17539
+
17540
+ renderEventContent(element, parentGfx, attrs);
17480
17541
 
17481
17542
  return circle;
17482
17543
  },
17483
- 'bpmn:TerminateEventDefinition': function(parentGfx, element) {
17484
- var circle = drawCircle(parentGfx, element.width, element.height, 8, {
17485
- strokeWidth: 4,
17486
- fill: getStrokeColor$1(element, defaultStrokeColor),
17487
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17488
- });
17544
+ 'bpmn:TerminateEventDefinition': function(parentGfx, element, attrs) {
17545
+ attrs = assign({
17546
+ fill: getFillColor(element, defaultFillColor),
17547
+ stroke: getStrokeColor$1(element, defaultStrokeColor),
17548
+ strokeWidth: 4
17549
+ }, attrs);
17550
+
17551
+ var circle = drawCircle(parentGfx, element.width, element.height, 8, attrs);
17489
17552
 
17490
17553
  return circle;
17491
17554
  },
17492
- 'bpmn:IntermediateEvent': function(parentGfx, element) {
17493
- var outer = renderer('bpmn:Event')(parentGfx, element, {
17555
+ 'bpmn:IntermediateEvent': function(parentGfx, element, attrs) {
17556
+ var outerAttrs = assign({
17494
17557
  strokeWidth: 1,
17495
17558
  fill: getFillColor(element, defaultFillColor),
17496
17559
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17497
- });
17560
+ }, attrs);
17561
+
17562
+ var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);
17498
17563
 
17499
17564
  /* inner */
17500
- drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {
17501
- strokeWidth: 1,
17565
+ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, assign({}, outerAttrs, {
17502
17566
  fill: getFillColor(element, 'none'),
17503
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17504
- });
17567
+ }));
17505
17568
 
17506
- renderEventContent(element, parentGfx);
17569
+ renderEventContent(element, parentGfx, attrs);
17507
17570
 
17508
17571
  return outer;
17509
17572
  },
@@ -17521,21 +17584,21 @@
17521
17584
  return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);
17522
17585
  },
17523
17586
 
17524
- 'bpmn:Task': function(parentGfx, element) {
17525
- var attrs = {
17587
+ 'bpmn:Task': function(parentGfx, element, attrs) {
17588
+ attrs = assign({
17526
17589
  fill: getFillColor(element, defaultFillColor),
17527
17590
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17528
- };
17591
+ }, attrs);
17529
17592
 
17530
17593
  var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);
17531
17594
 
17532
17595
  renderEmbeddedLabel(parentGfx, element, 'center-middle');
17533
- attachTaskMarkers(parentGfx, element);
17596
+ attachTaskMarkers(parentGfx, element, attrs);
17534
17597
 
17535
17598
  return rect;
17536
17599
  },
17537
- 'bpmn:ServiceTask': function(parentGfx, element) {
17538
- var task = renderer('bpmn:Task')(parentGfx, element);
17600
+ 'bpmn:ServiceTask': function(parentGfx, element, attrs) {
17601
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17539
17602
 
17540
17603
  var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
17541
17604
  abspos: {
@@ -17544,11 +17607,12 @@
17544
17607
  }
17545
17608
  });
17546
17609
 
17547
- /* service bg */ drawPath(parentGfx, pathDataBG, {
17610
+ var serviceAttrs = assign({
17548
17611
  strokeWidth: 1,
17549
17612
  fill: getFillColor(element, defaultFillColor),
17550
17613
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17551
- });
17614
+ }, attrs);
17615
+ /* service bg */ drawPath(parentGfx, pathDataBG, serviceAttrs);
17552
17616
 
17553
17617
  var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {
17554
17618
  abspos: {
@@ -17557,10 +17621,11 @@
17557
17621
  }
17558
17622
  });
17559
17623
 
17560
- /* service fill */ drawPath(parentGfx, fillPathData, {
17624
+ var fillAttrs = assign({
17561
17625
  strokeWidth: 0,
17562
17626
  fill: getFillColor(element, defaultFillColor)
17563
- });
17627
+ }, attrs);
17628
+ /* service fill */ drawPath(parentGfx, fillPathData, fillAttrs);
17564
17629
 
17565
17630
  var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
17566
17631
  abspos: {
@@ -17569,16 +17634,12 @@
17569
17634
  }
17570
17635
  });
17571
17636
 
17572
- /* service */ drawPath(parentGfx, pathData, {
17573
- strokeWidth: 1,
17574
- fill: getFillColor(element, defaultFillColor),
17575
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17576
- });
17637
+ /* service */ drawPath(parentGfx, pathData, serviceAttrs);
17577
17638
 
17578
17639
  return task;
17579
17640
  },
17580
- 'bpmn:UserTask': function(parentGfx, element) {
17581
- var task = renderer('bpmn:Task')(parentGfx, element);
17641
+ 'bpmn:UserTask': function(parentGfx, element, attrs) {
17642
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17582
17643
 
17583
17644
  var x = 15;
17584
17645
  var y = 12;
@@ -17590,11 +17651,12 @@
17590
17651
  }
17591
17652
  });
17592
17653
 
17593
- /* user path */ drawPath(parentGfx, pathData, {
17654
+ var userAttrs = assign({
17594
17655
  strokeWidth: 0.5,
17595
17656
  fill: getFillColor(element, defaultFillColor),
17596
17657
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17597
- });
17658
+ }, attrs);
17659
+ /* user path */ drawPath(parentGfx, pathData, userAttrs);
17598
17660
 
17599
17661
  var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {
17600
17662
  abspos: {
@@ -17603,11 +17665,7 @@
17603
17665
  }
17604
17666
  });
17605
17667
 
17606
- /* user2 path */ drawPath(parentGfx, pathData2, {
17607
- strokeWidth: 0.5,
17608
- fill: getFillColor(element, defaultFillColor),
17609
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17610
- });
17668
+ /* user2 path */ drawPath(parentGfx, pathData2, userAttrs);
17611
17669
 
17612
17670
  var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {
17613
17671
  abspos: {
@@ -17616,16 +17674,12 @@
17616
17674
  }
17617
17675
  });
17618
17676
 
17619
- /* user3 path */ drawPath(parentGfx, pathData3, {
17620
- strokeWidth: 0.5,
17621
- fill: getStrokeColor$1(element, defaultStrokeColor),
17622
- stroke: getStrokeColor$1(element, defaultStrokeColor)
17623
- });
17677
+ /* user3 path */ drawPath(parentGfx, pathData3, userAttrs);
17624
17678
 
17625
17679
  return task;
17626
17680
  },
17627
- 'bpmn:ManualTask': function(parentGfx, element) {
17628
- var task = renderer('bpmn:Task')(parentGfx, element);
17681
+ 'bpmn:ManualTask': function(parentGfx, element, attrs) {
17682
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17629
17683
 
17630
17684
  var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {
17631
17685
  abspos: {
@@ -17634,16 +17688,17 @@
17634
17688
  }
17635
17689
  });
17636
17690
 
17637
- /* manual path */ drawPath(parentGfx, pathData, {
17691
+ var manualAttrs = assign({
17638
17692
  strokeWidth: 0.5, // 0.25,
17639
17693
  fill: getFillColor(element, defaultFillColor),
17640
17694
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17641
- });
17695
+ }, attrs);
17696
+ /* manual path */ drawPath(parentGfx, pathData, manualAttrs);
17642
17697
 
17643
17698
  return task;
17644
17699
  },
17645
- 'bpmn:SendTask': function(parentGfx, element) {
17646
- var task = renderer('bpmn:Task')(parentGfx, element);
17700
+ 'bpmn:SendTask': function(parentGfx, element, attrs) {
17701
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17647
17702
 
17648
17703
  var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {
17649
17704
  xScaleFactor: 1,
@@ -17656,22 +17711,25 @@
17656
17711
  }
17657
17712
  });
17658
17713
 
17659
- /* send path */ drawPath(parentGfx, pathData, {
17714
+ /* send path */
17715
+ var pathAttrs = assign({
17660
17716
  strokeWidth: 1,
17661
17717
  fill: getStrokeColor$1(element, defaultStrokeColor),
17662
17718
  stroke: getFillColor(element, defaultFillColor)
17663
- });
17719
+ }, attrs);
17720
+
17721
+ drawPath(parentGfx, pathData, pathAttrs);
17664
17722
 
17665
17723
  return task;
17666
17724
  },
17667
- 'bpmn:ReceiveTask' : function(parentGfx, element) {
17725
+ 'bpmn:ReceiveTask' : function(parentGfx, element, attrs) {
17668
17726
  var semantic = getSemantic(element);
17669
17727
 
17670
- var task = renderer('bpmn:Task')(parentGfx, element);
17728
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17671
17729
  var pathData;
17672
17730
 
17673
17731
  if (semantic.instantiate) {
17674
- drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });
17732
+ drawCircle(parentGfx, 28, 28, 20 * 0.22, assign({ strokeWidth: 1 }, attrs));
17675
17733
 
17676
17734
  pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {
17677
17735
  abspos: {
@@ -17693,16 +17751,18 @@
17693
17751
  });
17694
17752
  }
17695
17753
 
17696
- /* receive path */ drawPath(parentGfx, pathData, {
17754
+ var receiveAttrs = assign({
17697
17755
  strokeWidth: 1,
17698
17756
  fill: getFillColor(element, defaultFillColor),
17699
17757
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17700
- });
17758
+ }, attrs);
17759
+
17760
+ /* receive path */ drawPath(parentGfx, pathData, receiveAttrs);
17701
17761
 
17702
17762
  return task;
17703
17763
  },
17704
- 'bpmn:ScriptTask': function(parentGfx, element) {
17705
- var task = renderer('bpmn:Task')(parentGfx, element);
17764
+ 'bpmn:ScriptTask': function(parentGfx, element, attrs) {
17765
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17706
17766
 
17707
17767
  var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {
17708
17768
  abspos: {
@@ -17711,15 +17771,16 @@
17711
17771
  }
17712
17772
  });
17713
17773
 
17714
- /* script path */ drawPath(parentGfx, pathData, {
17774
+ var scriptAttrs = assign({
17715
17775
  strokeWidth: 1,
17716
17776
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17717
- });
17777
+ }, attrs);
17778
+ /* script path */ drawPath(parentGfx, pathData, scriptAttrs);
17718
17779
 
17719
17780
  return task;
17720
17781
  },
17721
- 'bpmn:BusinessRuleTask': function(parentGfx, element) {
17722
- var task = renderer('bpmn:Task')(parentGfx, element);
17782
+ 'bpmn:BusinessRuleTask': function(parentGfx, element, attrs) {
17783
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
17723
17784
 
17724
17785
  var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {
17725
17786
  abspos: {
@@ -17728,12 +17789,12 @@
17728
17789
  }
17729
17790
  });
17730
17791
 
17731
- var businessHeaderPath = drawPath(parentGfx, headerPathData);
17732
- attr(businessHeaderPath, {
17792
+ var headerAttrs = assign({
17733
17793
  strokeWidth: 1,
17734
17794
  fill: getFillColor(element, '#aaaaaa'),
17735
17795
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17736
- });
17796
+ }, attrs);
17797
+ drawPath(parentGfx, headerPathData, headerAttrs);
17737
17798
 
17738
17799
  var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {
17739
17800
  abspos: {
@@ -17742,11 +17803,11 @@
17742
17803
  }
17743
17804
  });
17744
17805
 
17745
- var businessPath = drawPath(parentGfx, headerData);
17746
- attr(businessPath, {
17806
+ var businessAttrs = assign({
17747
17807
  strokeWidth: 1,
17748
17808
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17749
- });
17809
+ }, attrs);
17810
+ drawPath(parentGfx, headerData, businessAttrs);
17750
17811
 
17751
17812
  return task;
17752
17813
  },
@@ -17769,41 +17830,42 @@
17769
17830
  renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');
17770
17831
 
17771
17832
  if (expanded) {
17772
- attachTaskMarkers(parentGfx, element);
17833
+ attachTaskMarkers(parentGfx, element, attrs);
17773
17834
  } else {
17774
- attachTaskMarkers(parentGfx, element, ['SubProcessMarker']);
17835
+ attachTaskMarkers(parentGfx, element, attrs, ['SubProcessMarker']);
17775
17836
  }
17776
17837
 
17777
17838
  return rect;
17778
17839
  },
17779
- 'bpmn:AdHocSubProcess': function(parentGfx, element) {
17780
- return renderer('bpmn:SubProcess')(parentGfx, element);
17840
+ 'bpmn:AdHocSubProcess': function(parentGfx, element, attrs) {
17841
+ return renderer('bpmn:SubProcess')(parentGfx, element, attrs);
17781
17842
  },
17782
- 'bpmn:Transaction': function(parentGfx, element) {
17783
- var outer = renderer('bpmn:SubProcess')(parentGfx, element);
17843
+ 'bpmn:Transaction': function(parentGfx, element, attrs) {
17844
+ var outer = renderer('bpmn:SubProcess')(parentGfx, element, attrs);
17784
17845
 
17785
17846
  var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {
17786
17847
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17787
17848
  });
17788
17849
 
17789
- /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs);
17850
+ /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, assign(innerAttrs, attrs));
17790
17851
 
17791
17852
  return outer;
17792
17853
  },
17793
- 'bpmn:CallActivity': function(parentGfx, element) {
17794
- return renderer('bpmn:SubProcess')(parentGfx, element, {
17854
+ 'bpmn:CallActivity': function(parentGfx, element, attrs) {
17855
+ attrs = assign({
17795
17856
  strokeWidth: 5
17796
- });
17797
- },
17798
- 'bpmn:Participant': function(parentGfx, element) {
17857
+ }, attrs);
17799
17858
 
17800
- var attrs = {
17859
+ return renderer('bpmn:SubProcess')(parentGfx, element, attrs);
17860
+ },
17861
+ 'bpmn:Participant': function(parentGfx, element, attrs) {
17862
+ var outerAttrs = assign({
17801
17863
  fillOpacity: DEFAULT_FILL_OPACITY,
17802
17864
  fill: getFillColor(element, defaultFillColor),
17803
17865
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17804
- };
17866
+ }, attrs);
17805
17867
 
17806
- var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);
17868
+ var lane = renderer('bpmn:Lane')(parentGfx, element, outerAttrs);
17807
17869
 
17808
17870
  var expandedPool = isExpanded(element);
17809
17871
 
@@ -17811,9 +17873,9 @@
17811
17873
  drawLine(parentGfx, [
17812
17874
  { x: 30, y: 0 },
17813
17875
  { x: 30, y: element.height }
17814
- ], {
17876
+ ], assign({
17815
17877
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17816
- });
17878
+ }, attrs));
17817
17879
  var text = getSemantic(element).name;
17818
17880
  renderLaneLabel(parentGfx, text, element);
17819
17881
  } else {
@@ -17831,7 +17893,7 @@
17831
17893
  var participantMultiplicity = !!(getSemantic(element).participantMultiplicity);
17832
17894
 
17833
17895
  if (participantMultiplicity) {
17834
- renderer('ParticipantMultiplicityMarker')(parentGfx, element);
17896
+ renderer('ParticipantMultiplicityMarker')(parentGfx, element, attrs);
17835
17897
  }
17836
17898
 
17837
17899
  return lane;
@@ -17852,20 +17914,23 @@
17852
17914
 
17853
17915
  return rect;
17854
17916
  },
17855
- 'bpmn:InclusiveGateway': function(parentGfx, element) {
17856
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
17917
+ 'bpmn:InclusiveGateway': function(parentGfx, element, attrs) {
17918
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
17857
17919
 
17858
- /* circle path */
17859
- drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {
17920
+
17921
+ var circleAttrs = assign({
17860
17922
  strokeWidth: 2.5,
17861
17923
  fill: getFillColor(element, defaultFillColor),
17862
17924
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17863
- });
17925
+ }, attrs);
17926
+
17927
+ /* circle path */
17928
+ drawCircle(parentGfx, element.width, element.height, element.height * 0.24, circleAttrs);
17864
17929
 
17865
17930
  return diamond;
17866
17931
  },
17867
- 'bpmn:ExclusiveGateway': function(parentGfx, element) {
17868
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
17932
+ 'bpmn:ExclusiveGateway': function(parentGfx, element, attrs) {
17933
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
17869
17934
 
17870
17935
  var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {
17871
17936
  xScaleFactor: 0.4,
@@ -17879,17 +17944,17 @@
17879
17944
  });
17880
17945
 
17881
17946
  if ((getDi(element).isMarkerVisible)) {
17882
- drawPath(parentGfx, pathData, {
17947
+ drawPath(parentGfx, pathData, assign({
17883
17948
  strokeWidth: 1,
17884
17949
  fill: getStrokeColor$1(element, defaultStrokeColor),
17885
17950
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17886
- });
17951
+ }, attrs));
17887
17952
  }
17888
17953
 
17889
17954
  return diamond;
17890
17955
  },
17891
- 'bpmn:ComplexGateway': function(parentGfx, element) {
17892
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
17956
+ 'bpmn:ComplexGateway': function(parentGfx, element, attrs) {
17957
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
17893
17958
 
17894
17959
  var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {
17895
17960
  xScaleFactor: 0.5,
@@ -17902,16 +17967,17 @@
17902
17967
  }
17903
17968
  });
17904
17969
 
17905
- /* complex path */ drawPath(parentGfx, pathData, {
17970
+ var innerAttrs = assign({
17906
17971
  strokeWidth: 1,
17907
17972
  fill: getStrokeColor$1(element, defaultStrokeColor),
17908
17973
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17909
- });
17974
+ }, attrs);
17975
+ /* complex path */ drawPath(parentGfx, pathData, innerAttrs);
17910
17976
 
17911
17977
  return diamond;
17912
17978
  },
17913
- 'bpmn:ParallelGateway': function(parentGfx, element) {
17914
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
17979
+ 'bpmn:ParallelGateway': function(parentGfx, element, attrs) {
17980
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
17915
17981
 
17916
17982
  var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
17917
17983
  xScaleFactor: 0.6,
@@ -17924,25 +17990,27 @@
17924
17990
  }
17925
17991
  });
17926
17992
 
17927
- /* parallel path */ drawPath(parentGfx, pathData, {
17993
+ var innerAttrs = assign({
17928
17994
  strokeWidth: 1,
17929
17995
  fill: getStrokeColor$1(element, defaultStrokeColor),
17930
17996
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17931
- });
17997
+ }, attrs);
17998
+ /* parallel path */ drawPath(parentGfx, pathData, innerAttrs);
17932
17999
 
17933
18000
  return diamond;
17934
18001
  },
17935
- 'bpmn:EventBasedGateway': function(parentGfx, element) {
18002
+ 'bpmn:EventBasedGateway': function(parentGfx, element, attrs) {
17936
18003
 
17937
18004
  var semantic = getSemantic(element);
17938
18005
 
17939
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
18006
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
17940
18007
 
17941
- /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {
18008
+ var outerAttrs = assign({
17942
18009
  strokeWidth: 1,
17943
18010
  fill: 'none',
17944
18011
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17945
- });
18012
+ }, attrs);
18013
+ /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, outerAttrs);
17946
18014
 
17947
18015
  var type = semantic.eventGatewayType;
17948
18016
  var instantiate = !!semantic.instantiate;
@@ -17960,13 +18028,12 @@
17960
18028
  }
17961
18029
  });
17962
18030
 
17963
- var attrs = {
18031
+ var innerAttrs = assign({
17964
18032
  strokeWidth: 2,
17965
18033
  fill: getFillColor(element, 'none'),
17966
18034
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17967
- };
17968
-
17969
- /* event path */ drawPath(parentGfx, pathData, attrs);
18035
+ }, attrs);
18036
+ /* event path */ drawPath(parentGfx, pathData, innerAttrs);
17970
18037
  }
17971
18038
 
17972
18039
  if (type === 'Parallel') {
@@ -17982,7 +18049,7 @@
17982
18049
  }
17983
18050
  });
17984
18051
 
17985
- var parallelPath = drawPath(parentGfx, pathData);
18052
+ var parallelPath = drawPath(parentGfx, pathData, attrs);
17986
18053
  attr(parallelPath, {
17987
18054
  strokeWidth: 1,
17988
18055
  fill: 'none'
@@ -17990,12 +18057,12 @@
17990
18057
  } else if (type === 'Exclusive') {
17991
18058
 
17992
18059
  if (!instantiate) {
17993
- var innerCircle = drawCircle(parentGfx, element.width, element.height, element.height * 0.26);
17994
- attr(innerCircle, {
18060
+ var innerCircleAttrs = assign({
17995
18061
  strokeWidth: 1,
17996
18062
  fill: 'none',
17997
18063
  stroke: getStrokeColor$1(element, defaultStrokeColor)
17998
- });
18064
+ }, attrs);
18065
+ drawCircle(parentGfx, element.width, element.height, element.height * 0.26, innerCircleAttrs);
17999
18066
  }
18000
18067
 
18001
18068
  drawEvent();
@@ -18004,26 +18071,28 @@
18004
18071
 
18005
18072
  return diamond;
18006
18073
  },
18007
- 'bpmn:Gateway': function(parentGfx, element) {
18008
- var attrs = {
18074
+ 'bpmn:Gateway': function(parentGfx, element, attrs) {
18075
+ attrs = assign({
18009
18076
  fill: getFillColor(element, defaultFillColor),
18010
18077
  fillOpacity: DEFAULT_FILL_OPACITY,
18011
18078
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18012
- };
18079
+ }, attrs);
18013
18080
 
18014
18081
  return drawDiamond(parentGfx, element.width, element.height, attrs);
18015
18082
  },
18016
- 'bpmn:SequenceFlow': function(parentGfx, element) {
18083
+ 'bpmn:SequenceFlow': function(parentGfx, element, attrs) {
18084
+ attrs = attrs || {};
18085
+
18017
18086
  var pathData = createPathFromConnection(element);
18018
18087
 
18019
- var fill = getFillColor(element, defaultFillColor),
18020
- stroke = getStrokeColor$1(element, defaultStrokeColor);
18088
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
18089
+ stroke = attrs.stroke || getStrokeColor$1(element, defaultStrokeColor);
18021
18090
 
18022
- var attrs = {
18091
+ attrs = assign({
18023
18092
  strokeLinejoin: 'round',
18024
18093
  markerEnd: marker('sequenceflow-end', fill, stroke),
18025
18094
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18026
- };
18095
+ }, attrs || {});
18027
18096
 
18028
18097
  var path = drawPath(parentGfx, pathData, attrs);
18029
18098
 
@@ -18077,41 +18146,52 @@
18077
18146
 
18078
18147
  return drawLine(parentGfx, element.waypoints, attrs);
18079
18148
  },
18080
- 'bpmn:DataInputAssociation': function(parentGfx, element) {
18081
- var fill = getFillColor(element, defaultFillColor),
18082
- stroke = getStrokeColor$1(element, defaultStrokeColor);
18149
+ 'bpmn:DataInputAssociation': function(parentGfx, element, attrs) {
18150
+ attrs = attrs || {};
18083
18151
 
18084
- return renderer('bpmn:Association')(parentGfx, element, {
18152
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
18153
+ stroke = attrs.stroke || getStrokeColor$1(element, defaultStrokeColor);
18154
+
18155
+ attrs = assign({
18085
18156
  markerEnd: marker('association-end', fill, stroke)
18086
- });
18157
+ }, attrs);
18158
+
18159
+ return renderer('bpmn:Association')(parentGfx, element, attrs);
18087
18160
  },
18088
- 'bpmn:DataOutputAssociation': function(parentGfx, element) {
18089
- var fill = getFillColor(element, defaultFillColor),
18090
- stroke = getStrokeColor$1(element, defaultStrokeColor);
18161
+ 'bpmn:DataOutputAssociation': function(parentGfx, element, attrs) {
18162
+ attrs = attrs || {};
18091
18163
 
18092
- return renderer('bpmn:Association')(parentGfx, element, {
18164
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
18165
+ stroke = attrs.stroke || getStrokeColor$1(element, defaultStrokeColor);
18166
+
18167
+
18168
+ attrs = assign({
18093
18169
  markerEnd: marker('association-end', fill, stroke)
18094
- });
18170
+ }, attrs);
18171
+
18172
+ return renderer('bpmn:Association')(parentGfx, element, attrs);
18095
18173
  },
18096
- 'bpmn:MessageFlow': function(parentGfx, element) {
18174
+ 'bpmn:MessageFlow': function(parentGfx, element, attrs) {
18175
+ attrs = attrs || {};
18097
18176
 
18098
18177
  var semantic = getSemantic(element),
18099
18178
  di = getDi(element);
18100
18179
 
18101
- var fill = getFillColor(element, defaultFillColor),
18102
- stroke = getStrokeColor$1(element, defaultStrokeColor);
18180
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
18181
+ stroke = attrs.stroke || getStrokeColor$1(element, defaultStrokeColor);
18103
18182
 
18104
18183
  var pathData = createPathFromConnection(element);
18105
18184
 
18106
- var attrs = {
18185
+
18186
+ attrs = assign({
18107
18187
  markerEnd: marker('messageflow-end', fill, stroke),
18108
18188
  markerStart: marker('messageflow-start', fill, stroke),
18109
18189
  strokeDasharray: '10, 12',
18110
18190
  strokeLinecap: 'round',
18111
18191
  strokeLinejoin: 'round',
18112
18192
  strokeWidth: '1.5px',
18113
- stroke: getStrokeColor$1(element, defaultStrokeColor)
18114
- };
18193
+ stroke: stroke
18194
+ }, attrs);
18115
18195
 
18116
18196
  var path = drawPath(parentGfx, pathData, attrs);
18117
18197
 
@@ -18158,7 +18238,7 @@
18158
18238
 
18159
18239
  return path;
18160
18240
  },
18161
- 'bpmn:DataObject': function(parentGfx, element) {
18241
+ 'bpmn:DataObject': function(parentGfx, element, attrs) {
18162
18242
  var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {
18163
18243
  xScaleFactor: 1,
18164
18244
  yScaleFactor: 1,
@@ -18170,46 +18250,56 @@
18170
18250
  }
18171
18251
  });
18172
18252
 
18173
- var elementObject = drawPath(parentGfx, pathData, {
18253
+ var outerAttrs = assign({
18174
18254
  fill: getFillColor(element, defaultFillColor),
18175
18255
  fillOpacity: DEFAULT_FILL_OPACITY,
18176
18256
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18177
- });
18257
+ }, attrs);
18258
+ var elementObject = drawPath(parentGfx, pathData, outerAttrs);
18178
18259
 
18179
18260
  var semantic = getSemantic(element);
18180
18261
 
18181
18262
  if (isCollection(semantic)) {
18182
- renderDataItemCollection(parentGfx, element);
18263
+ renderDataItemCollection(parentGfx, element, attrs);
18183
18264
  }
18184
18265
 
18185
18266
  return elementObject;
18186
18267
  },
18187
18268
  'bpmn:DataObjectReference': as('bpmn:DataObject'),
18188
- 'bpmn:DataInput': function(parentGfx, element) {
18269
+ 'bpmn:DataInput': function(parentGfx, element, attrs) {
18189
18270
 
18190
18271
  var arrowPathData = pathMap.getRawPath('DATA_ARROW');
18191
18272
 
18192
18273
  // page
18193
- var elementObject = renderer('bpmn:DataObject')(parentGfx, element);
18274
+ var elementObject = renderer('bpmn:DataObject')(parentGfx, element, attrs);
18194
18275
 
18195
- /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });
18276
+ var innerAttrs = assign({ strokeWidth: 1 }, attrs);
18277
+ /* input arrow path */ drawPath(parentGfx, arrowPathData, innerAttrs);
18196
18278
 
18197
18279
  return elementObject;
18198
18280
  },
18199
- 'bpmn:DataOutput': function(parentGfx, element) {
18281
+ 'bpmn:DataOutput': function(parentGfx, element, attrs) {
18200
18282
  var arrowPathData = pathMap.getRawPath('DATA_ARROW');
18201
18283
 
18202
18284
  // page
18203
- var elementObject = renderer('bpmn:DataObject')(parentGfx, element);
18285
+ var elementObject = renderer('bpmn:DataObject')(parentGfx, element, attrs);
18204
18286
 
18205
- /* output arrow path */ drawPath(parentGfx, arrowPathData, {
18287
+ var arrowAttrs = assign({
18206
18288
  strokeWidth: 1,
18207
18289
  fill: 'black'
18208
- });
18290
+ }, attrs);
18291
+ /* output arrow path */ drawPath(parentGfx, arrowPathData, arrowAttrs);
18209
18292
 
18210
18293
  return elementObject;
18211
18294
  },
18212
- 'bpmn:DataStoreReference': function(parentGfx, element) {
18295
+ 'bpmn:DataStoreReference': function(parentGfx, element, attrs) {
18296
+ attrs = assign({
18297
+ strokeWidth: 2,
18298
+ fill: getFillColor(element, defaultFillColor),
18299
+ fillOpacity: DEFAULT_FILL_OPACITY,
18300
+ stroke: getStrokeColor$1(element, defaultStrokeColor)
18301
+ }, attrs);
18302
+
18213
18303
  var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {
18214
18304
  xScaleFactor: 1,
18215
18305
  yScaleFactor: 1,
@@ -18221,25 +18311,20 @@
18221
18311
  }
18222
18312
  });
18223
18313
 
18224
- var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {
18225
- strokeWidth: 2,
18226
- fill: getFillColor(element, defaultFillColor),
18227
- fillOpacity: DEFAULT_FILL_OPACITY,
18228
- stroke: getStrokeColor$1(element, defaultStrokeColor)
18229
- });
18314
+ var elementStore = drawPath(parentGfx, DATA_STORE_PATH, attrs);
18230
18315
 
18231
18316
  return elementStore;
18232
18317
  },
18233
- 'bpmn:BoundaryEvent': function(parentGfx, element) {
18318
+ 'bpmn:BoundaryEvent': function(parentGfx, element, attrs) {
18234
18319
 
18235
18320
  var semantic = getSemantic(element),
18236
18321
  cancel = semantic.cancelActivity;
18237
18322
 
18238
- var attrs = {
18323
+ attrs = assign({
18239
18324
  strokeWidth: 1,
18240
18325
  fill: getFillColor(element, defaultFillColor),
18241
18326
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18242
- };
18327
+ }, attrs);
18243
18328
 
18244
18329
  if (!cancel) {
18245
18330
  attrs.strokeDasharray = '6';
@@ -18260,30 +18345,32 @@
18260
18345
 
18261
18346
  /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);
18262
18347
 
18263
- renderEventContent(element, parentGfx);
18348
+ renderEventContent(element, parentGfx, attrs);
18264
18349
 
18265
18350
  return outer;
18266
18351
  },
18267
- 'bpmn:Group': function(parentGfx, element) {
18352
+ 'bpmn:Group': function(parentGfx, element, attrs) {
18268
18353
 
18269
- var group = drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {
18354
+ attrs = assign({
18270
18355
  stroke: getStrokeColor$1(element, defaultStrokeColor),
18271
18356
  strokeWidth: 1,
18272
18357
  strokeDasharray: '8,3,1,3',
18273
18358
  fill: 'none',
18274
18359
  pointerEvents: 'none'
18275
- });
18360
+ }, attrs);
18361
+
18362
+ var group = drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);
18276
18363
 
18277
18364
  return group;
18278
18365
  },
18279
18366
  'label': function(parentGfx, element) {
18280
18367
  return renderExternalLabel(parentGfx, element);
18281
18368
  },
18282
- 'bpmn:TextAnnotation': function(parentGfx, element) {
18283
- var style = {
18369
+ 'bpmn:TextAnnotation': function(parentGfx, element, attrs) {
18370
+ var style = assign({}, attrs, {
18284
18371
  'fill': 'none',
18285
18372
  'stroke': 'none'
18286
- };
18373
+ });
18287
18374
 
18288
18375
  var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, style);
18289
18376
 
@@ -18298,9 +18385,10 @@
18298
18385
  }
18299
18386
  });
18300
18387
 
18301
- drawPath(parentGfx, textPathData, {
18388
+ var pathAttrs = assign({
18302
18389
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18303
- });
18390
+ }, attrs);
18391
+ drawPath(parentGfx, textPathData, pathAttrs);
18304
18392
 
18305
18393
  var text = getSemantic(element).text || '';
18306
18394
  renderLabel(parentGfx, text, {
@@ -18314,7 +18402,13 @@
18314
18402
 
18315
18403
  return textElement;
18316
18404
  },
18317
- 'ParticipantMultiplicityMarker': function(parentGfx, element) {
18405
+ 'ParticipantMultiplicityMarker': function(parentGfx, element, attrs) {
18406
+ attrs = assign({
18407
+ strokeWidth: 2,
18408
+ fill: getFillColor(element, defaultFillColor),
18409
+ stroke: getStrokeColor$1(element, defaultStrokeColor)
18410
+ }, attrs);
18411
+
18318
18412
  var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
18319
18413
  xScaleFactor: 1,
18320
18414
  yScaleFactor: 1,
@@ -18326,18 +18420,15 @@
18326
18420
  }
18327
18421
  });
18328
18422
 
18329
- drawMarker('participant-multiplicity', parentGfx, markerPath, {
18330
- strokeWidth: 2,
18331
- fill: getFillColor(element, defaultFillColor),
18332
- stroke: getStrokeColor$1(element, defaultStrokeColor)
18333
- });
18423
+ drawMarker('participant-multiplicity', parentGfx, markerPath, attrs);
18334
18424
  },
18335
- 'SubProcessMarker': function(parentGfx, element) {
18336
- var markerRect = drawRect(parentGfx, 14, 14, 0, {
18337
- strokeWidth: 1,
18425
+ 'SubProcessMarker': function(parentGfx, element, attrs) {
18426
+ attrs = assign({
18338
18427
  fill: getFillColor(element, defaultFillColor),
18339
18428
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18340
- });
18429
+ }, attrs);
18430
+
18431
+ var markerRect = drawRect(parentGfx, 14, 14, 0, assign({ strokeWidth: 1 }, attrs));
18341
18432
 
18342
18433
  // Process marker is placed in the middle of the box
18343
18434
  // therefore fixed values can be used here
@@ -18354,12 +18445,14 @@
18354
18445
  }
18355
18446
  });
18356
18447
 
18357
- drawMarker('sub-process', parentGfx, markerPath, {
18448
+ drawMarker('sub-process', parentGfx, markerPath, attrs);
18449
+ },
18450
+ 'ParallelMarker': function(parentGfx, element, attrs, position) {
18451
+ attrs = assign({
18358
18452
  fill: getFillColor(element, defaultFillColor),
18359
18453
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18360
- });
18361
- },
18362
- 'ParallelMarker': function(parentGfx, element, position) {
18454
+ }, attrs);
18455
+
18363
18456
  var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
18364
18457
  xScaleFactor: 1,
18365
18458
  yScaleFactor: 1,
@@ -18371,12 +18464,13 @@
18371
18464
  }
18372
18465
  });
18373
18466
 
18374
- drawMarker('parallel', parentGfx, markerPath, {
18467
+ drawMarker('parallel', parentGfx, markerPath, attrs);
18468
+ },
18469
+ 'SequentialMarker': function(parentGfx, element, attrs, position) {
18470
+ attrs = assign({
18375
18471
  fill: getFillColor(element, defaultFillColor),
18376
18472
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18377
- });
18378
- },
18379
- 'SequentialMarker': function(parentGfx, element, position) {
18473
+ }, attrs);
18380
18474
  var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {
18381
18475
  xScaleFactor: 1,
18382
18476
  yScaleFactor: 1,
@@ -18388,12 +18482,15 @@
18388
18482
  }
18389
18483
  });
18390
18484
 
18391
- drawMarker('sequential', parentGfx, markerPath, {
18485
+ drawMarker('sequential', parentGfx, markerPath, attrs);
18486
+ },
18487
+ 'CompensationMarker': function(parentGfx, element, attrs, position) {
18488
+ attrs = assign({
18489
+ strokeWidth: 1,
18392
18490
  fill: getFillColor(element, defaultFillColor),
18393
18491
  stroke: getStrokeColor$1(element, defaultStrokeColor)
18394
- });
18395
- },
18396
- 'CompensationMarker': function(parentGfx, element, position) {
18492
+ }, attrs);
18493
+
18397
18494
  var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {
18398
18495
  xScaleFactor: 1,
18399
18496
  yScaleFactor: 1,
@@ -18405,13 +18502,17 @@
18405
18502
  }
18406
18503
  });
18407
18504
 
18408
- drawMarker('compensation', parentGfx, markerMath, {
18505
+ drawMarker('compensation', parentGfx, markerMath, attrs);
18506
+ },
18507
+ 'LoopMarker': function(parentGfx, element, attrs, position) {
18508
+ attrs = assign({
18409
18509
  strokeWidth: 1,
18410
18510
  fill: getFillColor(element, defaultFillColor),
18411
- stroke: getStrokeColor$1(element, defaultStrokeColor)
18412
- });
18413
- },
18414
- 'LoopMarker': function(parentGfx, element, position) {
18511
+ stroke: getStrokeColor$1(element, defaultStrokeColor),
18512
+ strokeLinecap: 'round',
18513
+ strokeMiterlimit: 0.5
18514
+ }, attrs);
18515
+
18415
18516
  var markerPath = pathMap.getScaledPath('MARKER_LOOP', {
18416
18517
  xScaleFactor: 1,
18417
18518
  yScaleFactor: 1,
@@ -18423,15 +18524,15 @@
18423
18524
  }
18424
18525
  });
18425
18526
 
18426
- drawMarker('loop', parentGfx, markerPath, {
18427
- strokeWidth: 1,
18428
- fill: getFillColor(element, defaultFillColor),
18429
- stroke: getStrokeColor$1(element, defaultStrokeColor),
18430
- strokeLinecap: 'round',
18431
- strokeMiterlimit: 0.5
18432
- });
18527
+ drawMarker('loop', parentGfx, markerPath, attrs);
18433
18528
  },
18434
- 'AdhocMarker': function(parentGfx, element, position) {
18529
+ 'AdhocMarker': function(parentGfx, element, attrs, position) {
18530
+ attrs = assign({
18531
+ strokeWidth: 1,
18532
+ fill: getStrokeColor$1(element, defaultStrokeColor),
18533
+ stroke: getStrokeColor$1(element, defaultStrokeColor)
18534
+ }, attrs);
18535
+
18435
18536
  var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {
18436
18537
  xScaleFactor: 1,
18437
18538
  yScaleFactor: 1,
@@ -18443,15 +18544,11 @@
18443
18544
  }
18444
18545
  });
18445
18546
 
18446
- drawMarker('adhoc', parentGfx, markerPath, {
18447
- strokeWidth: 1,
18448
- fill: getStrokeColor$1(element, defaultStrokeColor),
18449
- stroke: getStrokeColor$1(element, defaultStrokeColor)
18450
- });
18547
+ drawMarker('adhoc', parentGfx, markerPath, attrs);
18451
18548
  }
18452
18549
  };
18453
18550
 
18454
- function attachTaskMarkers(parentGfx, element, taskMarkers) {
18551
+ function attachTaskMarkers(parentGfx, element, attrs, taskMarkers) {
18455
18552
  var obj = getSemantic(element);
18456
18553
 
18457
18554
  var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;
@@ -18476,15 +18573,15 @@
18476
18573
  }
18477
18574
 
18478
18575
  forEach(taskMarkers, function(marker) {
18479
- renderer(marker)(parentGfx, element, position);
18576
+ renderer(marker)(parentGfx, element, attrs, position);
18480
18577
  });
18481
18578
 
18482
18579
  if (obj.isForCompensation) {
18483
- renderer('CompensationMarker')(parentGfx, element, position);
18580
+ renderer('CompensationMarker')(parentGfx, element, attrs, position);
18484
18581
  }
18485
18582
 
18486
18583
  if (obj.$type === 'bpmn:AdHocSubProcess') {
18487
- renderer('AdhocMarker')(parentGfx, element, position);
18584
+ renderer('AdhocMarker')(parentGfx, element, attrs, position);
18488
18585
  }
18489
18586
 
18490
18587
  var loopCharacteristics = obj.loopCharacteristics,
@@ -18493,20 +18590,23 @@
18493
18590
  if (loopCharacteristics) {
18494
18591
 
18495
18592
  if (isSequential === undefined) {
18496
- renderer('LoopMarker')(parentGfx, element, position);
18593
+ renderer('LoopMarker')(parentGfx, element, attrs, position);
18497
18594
  }
18498
18595
 
18499
18596
  if (isSequential === false) {
18500
- renderer('ParallelMarker')(parentGfx, element, position);
18597
+ renderer('ParallelMarker')(parentGfx, element, attrs, position);
18501
18598
  }
18502
18599
 
18503
18600
  if (isSequential === true) {
18504
- renderer('SequentialMarker')(parentGfx, element, position);
18601
+ renderer('SequentialMarker')(parentGfx, element, attrs, position);
18505
18602
  }
18506
18603
  }
18507
18604
  }
18508
18605
 
18509
- function renderDataItemCollection(parentGfx, element) {
18606
+ function renderDataItemCollection(parentGfx, element, attrs) {
18607
+ attrs = assign({
18608
+ strokeWidth: 2
18609
+ }, attrs);
18510
18610
 
18511
18611
  var yPosition = (element.height - 18) / element.height;
18512
18612
 
@@ -18521,9 +18621,7 @@
18521
18621
  }
18522
18622
  });
18523
18623
 
18524
- /* collection path */ drawPath(parentGfx, pathData, {
18525
- strokeWidth: 2
18526
- });
18624
+ /* collection path */ drawPath(parentGfx, pathData, attrs);
18527
18625
  }
18528
18626
 
18529
18627
 
@@ -18549,20 +18647,20 @@
18549
18647
  return is$1(element, 'bpmn:BaseElement');
18550
18648
  };
18551
18649
 
18552
- BpmnRenderer.prototype.drawShape = function(parentGfx, element) {
18650
+ BpmnRenderer.prototype.drawShape = function(parentGfx, element, attrs) {
18553
18651
  var type = element.type;
18554
18652
  var h = this.handlers[type];
18555
18653
 
18556
18654
  /* jshint -W040 */
18557
- return h(parentGfx, element);
18655
+ return h(parentGfx, element, attrs);
18558
18656
  };
18559
18657
 
18560
- BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {
18658
+ BpmnRenderer.prototype.drawConnection = function(parentGfx, element, attrs) {
18561
18659
  var type = element.type;
18562
18660
  var h = this.handlers[type];
18563
18661
 
18564
18662
  /* jshint -W040 */
18565
- return h(parentGfx, element);
18663
+ return h(parentGfx, element, attrs);
18566
18664
  };
18567
18665
 
18568
18666
  BpmnRenderer.prototype.getShapePath = function(element) {
@@ -19679,15 +19777,14 @@
19679
19777
  * Returns the bounds of an elements label, parsed from the elements DI or
19680
19778
  * generated from its bounds.
19681
19779
  *
19682
- * @param {BpmnElement} semantic
19780
+ * @param {BpmndDi} di
19683
19781
  * @param {djs.model.Base} element
19684
19782
  */
19685
- function getExternalLabelBounds(semantic, element) {
19783
+ function getExternalLabelBounds(di, element) {
19686
19784
 
19687
19785
  var mid,
19688
19786
  size,
19689
19787
  bounds,
19690
- di = semantic.di,
19691
19788
  label = di.label;
19692
19789
 
19693
19790
  if (label && label.bounds) {
@@ -19719,17 +19816,18 @@
19719
19816
  return element && !!element.labelTarget;
19720
19817
  }
19721
19818
 
19722
- function elementData(semantic, attrs) {
19819
+ function elementData(semantic, di, attrs) {
19723
19820
  return assign({
19724
19821
  id: semantic.id,
19725
19822
  type: semantic.$type,
19726
- businessObject: semantic
19823
+ businessObject: semantic,
19824
+ di: di
19727
19825
  }, attrs);
19728
19826
  }
19729
19827
 
19730
- function getWaypoints(bo, source, target) {
19828
+ function getWaypoints(di, source, target) {
19731
19829
 
19732
- var waypoints = bo.di.waypoint;
19830
+ var waypoints = di.waypoint;
19733
19831
 
19734
19832
  if (!waypoints || waypoints.length < 2) {
19735
19833
  return [ getMid(source), getMid(target) ];
@@ -19785,10 +19883,8 @@
19785
19883
  * Add bpmn element (semantic) to the canvas onto the
19786
19884
  * specified parent shape.
19787
19885
  */
19788
- BpmnImporter.prototype.add = function(semantic, parentElement) {
19789
-
19790
- var di = semantic.di,
19791
- element,
19886
+ BpmnImporter.prototype.add = function(semantic, di, parentElement) {
19887
+ var element,
19792
19888
  translate = this._translate,
19793
19889
  hidden;
19794
19890
 
@@ -19796,25 +19892,31 @@
19796
19892
 
19797
19893
  // ROOT ELEMENT
19798
19894
  // handle the special case that we deal with a
19799
- // invisible root element (process or collaboration)
19895
+ // invisible root element (process, subprocess or collaboration)
19800
19896
  if (is$1(di, 'bpmndi:BPMNPlane')) {
19801
19897
 
19802
19898
  // add a virtual element (not being drawn)
19803
- element = this._elementFactory.createRoot(elementData(semantic));
19899
+ element = this._elementFactory.createRoot(elementData(semantic, di));
19804
19900
 
19805
- this._canvas.setRootElement(element);
19901
+ // for subprocesses, the id is already defined on the collapsed shape
19902
+ if (is$1(semantic, 'bpmn:SubProcess')) {
19903
+ element.id = element.id + '_plane';
19904
+ }
19905
+
19906
+ this._canvas.createPlane(semantic.id, element);
19806
19907
  }
19807
19908
 
19808
19909
  // SHAPE
19809
19910
  else if (is$1(di, 'bpmndi:BPMNShape')) {
19810
19911
 
19811
- var collapsed = !isExpanded(semantic),
19912
+ var collapsed = !isExpanded(semantic, di),
19812
19913
  isFrame = isFrameElement(semantic);
19914
+
19813
19915
  hidden = parentElement && (parentElement.hidden || parentElement.collapsed);
19814
19916
 
19815
- var bounds = semantic.di.bounds;
19917
+ var bounds = di.bounds;
19816
19918
 
19817
- element = this._elementFactory.createShape(elementData(semantic, {
19919
+ element = this._elementFactory.createShape(elementData(semantic, di, {
19818
19920
  collapsed: collapsed,
19819
19921
  hidden: hidden,
19820
19922
  x: Math.round(bounds.x),
@@ -19837,7 +19939,7 @@
19837
19939
 
19838
19940
  // check whether data store is inside our outside of its semantic parent
19839
19941
  if (!isPointInsideBBox$1(parentElement, getMid(bounds))) {
19840
- parentElement = this._canvas.getRootElement();
19942
+ parentElement = this._canvas.findPlane(parentElement).rootElement;
19841
19943
  }
19842
19944
  }
19843
19945
 
@@ -19852,11 +19954,11 @@
19852
19954
 
19853
19955
  hidden = parentElement && (parentElement.hidden || parentElement.collapsed);
19854
19956
 
19855
- element = this._elementFactory.createConnection(elementData(semantic, {
19957
+ element = this._elementFactory.createConnection(elementData(semantic, di, {
19856
19958
  hidden: hidden,
19857
19959
  source: source,
19858
19960
  target: target,
19859
- waypoints: getWaypoints(semantic, source, target)
19961
+ waypoints: getWaypoints(di, source, target)
19860
19962
  }));
19861
19963
 
19862
19964
  if (is$1(semantic, 'bpmn:DataAssociation')) {
@@ -19865,7 +19967,7 @@
19865
19967
  // are rendered correctly across different "hacks" people
19866
19968
  // love to model such as cross participant / sub process
19867
19969
  // associations
19868
- parentElement = null;
19970
+ parentElement = this._canvas.findPlane(parentElement).rootElement;
19869
19971
  }
19870
19972
 
19871
19973
  // insert sequence flows behind other flow nodes (cf. #727)
@@ -19883,7 +19985,7 @@
19883
19985
 
19884
19986
  // (optional) LABEL
19885
19987
  if (isLabelExternal(semantic) && getLabel(element)) {
19886
- this.addLabel(semantic, element);
19988
+ this.addLabel(semantic, di, element);
19887
19989
  }
19888
19990
 
19889
19991
 
@@ -19932,12 +20034,12 @@
19932
20034
  /**
19933
20035
  * add label for an element
19934
20036
  */
19935
- BpmnImporter.prototype.addLabel = function(semantic, element) {
20037
+ BpmnImporter.prototype.addLabel = function(semantic, di, element) {
19936
20038
  var bounds,
19937
20039
  text,
19938
20040
  label;
19939
20041
 
19940
- bounds = getExternalLabelBounds(semantic, element);
20042
+ bounds = getExternalLabelBounds(di, element);
19941
20043
 
19942
20044
  text = getLabel(element);
19943
20045
 
@@ -19947,7 +20049,7 @@
19947
20049
  bounds = this._textRenderer.getExternalLabelBounds(bounds, text);
19948
20050
  }
19949
20051
 
19950
- label = this._elementFactory.createLabel(elementData(semantic, {
20052
+ label = this._elementFactory.createLabel(elementData(semantic, di, {
19951
20053
  id: semantic.id + '_label',
19952
20054
  labelTarget: element,
19953
20055
  type: 'label',
@@ -21491,22 +21593,26 @@
21491
21593
 
21492
21594
  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {
21493
21595
  var show = overlay.show,
21596
+ plane = overlay.plane,
21494
21597
  minZoom = show && show.minZoom,
21495
21598
  maxZoom = show && show.maxZoom,
21496
21599
  htmlContainer = overlay.htmlContainer,
21600
+ activePlane = this._canvas.getActivePlane(),
21497
21601
  visible = true;
21498
21602
 
21499
- if (show) {
21603
+ if (plane !== activePlane) {
21604
+ visible = false;
21605
+ } else if (show) {
21500
21606
  if (
21501
21607
  (isDefined(minZoom) && minZoom > viewbox.scale) ||
21502
21608
  (isDefined(maxZoom) && maxZoom < viewbox.scale)
21503
21609
  ) {
21504
21610
  visible = false;
21505
21611
  }
21506
-
21507
- setVisible$1(htmlContainer, visible);
21508
21612
  }
21509
21613
 
21614
+ setVisible$1(htmlContainer, visible);
21615
+
21510
21616
  this._updateOverlayScale(overlay, viewbox);
21511
21617
  };
21512
21618
 
@@ -21677,6 +21783,544 @@
21677
21783
  overlays: [ 'type', Overlays ]
21678
21784
  };
21679
21785
 
21786
+ /**
21787
+ * Adds change support to the diagram, including
21788
+ *
21789
+ * <ul>
21790
+ * <li>redrawing shapes and connections on change</li>
21791
+ * </ul>
21792
+ *
21793
+ * @param {EventBus} eventBus
21794
+ * @param {Canvas} canvas
21795
+ * @param {ElementRegistry} elementRegistry
21796
+ * @param {GraphicsFactory} graphicsFactory
21797
+ */
21798
+ function ChangeSupport(
21799
+ eventBus, canvas, elementRegistry,
21800
+ graphicsFactory) {
21801
+
21802
+
21803
+ // redraw shapes / connections on change
21804
+
21805
+ eventBus.on('element.changed', function(event) {
21806
+
21807
+ var element = event.element;
21808
+
21809
+ // element might have been deleted and replaced by new element with same ID
21810
+ // thus check for parent of element except for root element
21811
+ if (element.parent || element === canvas.getRootElement()) {
21812
+ event.gfx = elementRegistry.getGraphics(element);
21813
+ }
21814
+
21815
+ // shape + gfx may have been deleted
21816
+ if (!event.gfx) {
21817
+ return;
21818
+ }
21819
+
21820
+ eventBus.fire(getType(element) + '.changed', event);
21821
+ });
21822
+
21823
+ eventBus.on('elements.changed', function(event) {
21824
+
21825
+ var elements = event.elements;
21826
+
21827
+ elements.forEach(function(e) {
21828
+ eventBus.fire('element.changed', { element: e });
21829
+ });
21830
+
21831
+ graphicsFactory.updateContainments(elements);
21832
+ });
21833
+
21834
+ eventBus.on('shape.changed', function(event) {
21835
+ graphicsFactory.update('shape', event.element, event.gfx);
21836
+ });
21837
+
21838
+ eventBus.on('connection.changed', function(event) {
21839
+ graphicsFactory.update('connection', event.element, event.gfx);
21840
+ });
21841
+ }
21842
+
21843
+ ChangeSupport.$inject = [
21844
+ 'eventBus',
21845
+ 'canvas',
21846
+ 'elementRegistry',
21847
+ 'graphicsFactory'
21848
+ ];
21849
+
21850
+ var ChangeSupportModule = {
21851
+ __init__: [ 'changeSupport'],
21852
+ changeSupport: [ 'type', ChangeSupport ]
21853
+ };
21854
+
21855
+ var css_escape = {exports: {}};
21856
+
21857
+ /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */
21858
+
21859
+ (function (module, exports) {
21860
+ (function(root, factory) {
21861
+ // https://github.com/umdjs/umd/blob/master/returnExports.js
21862
+ {
21863
+ // For Node.js.
21864
+ module.exports = factory(root);
21865
+ }
21866
+ }(typeof commonjsGlobal != 'undefined' ? commonjsGlobal : commonjsGlobal, function(root) {
21867
+
21868
+ if (root.CSS && root.CSS.escape) {
21869
+ return root.CSS.escape;
21870
+ }
21871
+
21872
+ // https://drafts.csswg.org/cssom/#serialize-an-identifier
21873
+ var cssEscape = function(value) {
21874
+ if (arguments.length == 0) {
21875
+ throw new TypeError('`CSS.escape` requires an argument.');
21876
+ }
21877
+ var string = String(value);
21878
+ var length = string.length;
21879
+ var index = -1;
21880
+ var codeUnit;
21881
+ var result = '';
21882
+ var firstCodeUnit = string.charCodeAt(0);
21883
+ while (++index < length) {
21884
+ codeUnit = string.charCodeAt(index);
21885
+ // Note: there’s no need to special-case astral symbols, surrogate
21886
+ // pairs, or lone surrogates.
21887
+
21888
+ // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER
21889
+ // (U+FFFD).
21890
+ if (codeUnit == 0x0000) {
21891
+ result += '\uFFFD';
21892
+ continue;
21893
+ }
21894
+
21895
+ if (
21896
+ // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is
21897
+ // U+007F, […]
21898
+ (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||
21899
+ // If the character is the first character and is in the range [0-9]
21900
+ // (U+0030 to U+0039), […]
21901
+ (index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||
21902
+ // If the character is the second character and is in the range [0-9]
21903
+ // (U+0030 to U+0039) and the first character is a `-` (U+002D), […]
21904
+ (
21905
+ index == 1 &&
21906
+ codeUnit >= 0x0030 && codeUnit <= 0x0039 &&
21907
+ firstCodeUnit == 0x002D
21908
+ )
21909
+ ) {
21910
+ // https://drafts.csswg.org/cssom/#escape-a-character-as-code-point
21911
+ result += '\\' + codeUnit.toString(16) + ' ';
21912
+ continue;
21913
+ }
21914
+
21915
+ if (
21916
+ // If the character is the first character and is a `-` (U+002D), and
21917
+ // there is no second character, […]
21918
+ index == 0 &&
21919
+ length == 1 &&
21920
+ codeUnit == 0x002D
21921
+ ) {
21922
+ result += '\\' + string.charAt(index);
21923
+ continue;
21924
+ }
21925
+
21926
+ // If the character is not handled by one of the above rules and is
21927
+ // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or
21928
+ // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to
21929
+ // U+005A), or [a-z] (U+0061 to U+007A), […]
21930
+ if (
21931
+ codeUnit >= 0x0080 ||
21932
+ codeUnit == 0x002D ||
21933
+ codeUnit == 0x005F ||
21934
+ codeUnit >= 0x0030 && codeUnit <= 0x0039 ||
21935
+ codeUnit >= 0x0041 && codeUnit <= 0x005A ||
21936
+ codeUnit >= 0x0061 && codeUnit <= 0x007A
21937
+ ) {
21938
+ // the character itself
21939
+ result += string.charAt(index);
21940
+ continue;
21941
+ }
21942
+
21943
+ // Otherwise, the escaped character.
21944
+ // https://drafts.csswg.org/cssom/#escape-a-character
21945
+ result += '\\' + string.charAt(index);
21946
+
21947
+ }
21948
+ return result;
21949
+ };
21950
+
21951
+ if (!root.CSS) {
21952
+ root.CSS = {};
21953
+ }
21954
+
21955
+ root.CSS.escape = cssEscape;
21956
+ return cssEscape;
21957
+
21958
+ }));
21959
+ }(css_escape));
21960
+
21961
+ var cssEscape = css_escape.exports;
21962
+
21963
+ var HTML_ESCAPE_MAP = {
21964
+ '&': '&amp;',
21965
+ '<': '&lt;',
21966
+ '>': '&gt;',
21967
+ '"': '&quot;',
21968
+ '\'': '&#39;'
21969
+ };
21970
+
21971
+ function escapeHTML(str) {
21972
+ str = '' + str;
21973
+
21974
+ return str && str.replace(/[&<>"']/g, function(match) {
21975
+ return HTML_ESCAPE_MAP[match];
21976
+ });
21977
+ }
21978
+
21979
+ var ARROW_DOWN_SVG = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z"/></svg>';
21980
+
21981
+ /**
21982
+ * Adds Overlays that allow switching planes on collapsed subprocesses.
21983
+ *
21984
+ * @param {eventBus} eventBus
21985
+ * @param {elementRegistry} elementRegistry
21986
+ * @param {overlays} overlays
21987
+ * @param {canvas} canvas
21988
+ */
21989
+ function DrilldownOverlays(eventBus, elementRegistry, overlays, canvas) {
21990
+ var breadcrumbs = domify('<ul class="bjs-breadcrumbs djs-element-hidden"></ul>');
21991
+ var container = canvas.getContainer();
21992
+ container.appendChild(breadcrumbs);
21993
+
21994
+ function updateBreadcrumbs(plane) {
21995
+ var subProcess = elementRegistry.get(plane.name);
21996
+ var parents = getParentChain(subProcess);
21997
+
21998
+ var path = parents.map(function(el) {
21999
+ var title = escapeHTML(el.name || el.id);
22000
+ var link = domify('<li><span class="bjs-crumb"><a title="' + title + '">' + title + '</a></span></li>');
22001
+
22002
+ link.addEventListener('click', function() {
22003
+ if (canvas.getPlane(el.id)) {
22004
+ canvas.setActivePlane(el.id);
22005
+ } else {
22006
+ var plane = canvas.findPlane(el.id);
22007
+ canvas.setActivePlane(plane);
22008
+ }
22009
+ });
22010
+
22011
+ return link;
22012
+ });
22013
+
22014
+ breadcrumbs.innerHTML = '';
22015
+
22016
+ if (path.length > 1) {
22017
+ breadcrumbs.classList.remove('djs-element-hidden');
22018
+ } else {
22019
+ breadcrumbs.classList.add('djs-element-hidden');
22020
+ }
22021
+
22022
+ path.forEach(function(el) {
22023
+ breadcrumbs.appendChild(el);
22024
+ });
22025
+ }
22026
+
22027
+ eventBus.on('plane.set', function(event) {
22028
+ var plane = event.plane;
22029
+
22030
+ updateBreadcrumbs(plane);
22031
+ });
22032
+
22033
+ var createOverlay = function(element) {
22034
+ var html = domify('<button class="bjs-drilldown">' + ARROW_DOWN_SVG + '</button>');
22035
+
22036
+ html.addEventListener('click', function() {
22037
+ canvas.setActivePlane(element.id);
22038
+ });
22039
+
22040
+ overlays.add(element, {
22041
+ position: {
22042
+ bottom: -7,
22043
+ right: -8
22044
+ },
22045
+ html: html
22046
+ });
22047
+ };
22048
+
22049
+ var addOverlays = function(elements) {
22050
+ elements.forEach(function(element) {
22051
+ if (is$1(element, 'bpmn:SubProcess')
22052
+ && element.collapsed
22053
+ && canvas.getPlane(element.id)) {
22054
+ createOverlay(element);
22055
+ }
22056
+ });
22057
+ };
22058
+
22059
+ eventBus.on('import.done', function() {
22060
+ addOverlays(elementRegistry.filter(function(el) {
22061
+ return is$1(el, 'bpmn:SubProcess');
22062
+ }));
22063
+ });
22064
+ }
22065
+
22066
+ DrilldownOverlays.$inject = [ 'eventBus', 'elementRegistry', 'overlays', 'canvas' ];
22067
+
22068
+
22069
+ // helpers
22070
+ var getParentChain = function(child) {
22071
+ var bo = getBusinessObject(child);
22072
+
22073
+ var parents = [];
22074
+
22075
+ for (var element = bo; element; element = element.$parent) {
22076
+ if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {
22077
+ parents.push(element);
22078
+ }
22079
+ }
22080
+
22081
+ return parents.reverse();
22082
+ };
22083
+
22084
+ /**
22085
+ * Move collapsed subprocesses into view when drilling down. Zoom and scroll
22086
+ * are saved in a session.
22087
+ *
22088
+ * @param {eventBus} eventBus
22089
+ * @param {canvas} canvas
22090
+ */
22091
+ function DrilldownCentering(eventBus, canvas) {
22092
+ var currentPlane = 'base';
22093
+ var positionMap = {};
22094
+
22095
+ eventBus.on('plane.set', function(event) {
22096
+ var currentViewbox = canvas.viewbox();
22097
+ positionMap[currentPlane] = {
22098
+ x: currentViewbox.x,
22099
+ y: currentViewbox.y,
22100
+ zoom: currentViewbox.scale
22101
+ };
22102
+
22103
+ var planeId = event.plane.name;
22104
+ var storedViewbox = positionMap[planeId] || { x: 0, y: 0, zoom: 1 };
22105
+
22106
+ var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,
22107
+ dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;
22108
+
22109
+ if (dx !== 0 || dy !== 0) {
22110
+ canvas.scroll({
22111
+ dx: dx,
22112
+ dy: dy
22113
+ });
22114
+ }
22115
+
22116
+ if (storedViewbox.zoom !== currentViewbox.scale) {
22117
+ canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });
22118
+ }
22119
+
22120
+ currentPlane = planeId;
22121
+ });
22122
+ }
22123
+
22124
+ DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];
22125
+
22126
+ var DEFAULT_POSITION = {
22127
+ x: 180,
22128
+ y: 160
22129
+ };
22130
+
22131
+ /**
22132
+ * Hook into `import.render.start` and create new planes for diagrams with
22133
+ * collapsed subprocesses and all dis on the same plane.
22134
+ *
22135
+ * @param {eventBus} eventBus
22136
+ * @param {moddle} moddle
22137
+ */
22138
+ function SubprocessCompatibility(eventBus, moddle) {
22139
+ this._eventBus = eventBus;
22140
+ this._moddle = moddle;
22141
+
22142
+ var self = this;
22143
+
22144
+ eventBus.on('import.render.start', 1500, function(e, context) {
22145
+ self.handleImport(context.definitions);
22146
+ });
22147
+ }
22148
+
22149
+ SubprocessCompatibility.prototype.handleImport = function(definitions) {
22150
+ if (!definitions.diagrams) {
22151
+ return;
22152
+ }
22153
+
22154
+ var self = this;
22155
+ this._definitions = definitions;
22156
+ this._processToDiagramMap = {};
22157
+
22158
+ definitions.diagrams.forEach(function(diagram) {
22159
+ if (!diagram.plane || !diagram.plane.bpmnElement) {
22160
+ return;
22161
+ }
22162
+
22163
+ self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;
22164
+ });
22165
+
22166
+ var newDiagrams = [];
22167
+ definitions.diagrams.forEach(function(diagram) {
22168
+ var createdDiagrams = self.createNewDiagrams(diagram.plane);
22169
+ Array.prototype.push.apply(newDiagrams, createdDiagrams);
22170
+ });
22171
+
22172
+ newDiagrams.forEach(function(diagram) {
22173
+ self.movePlaneElementsToOrigin(diagram.plane);
22174
+ });
22175
+ };
22176
+
22177
+
22178
+ /**
22179
+ * Moves all DI elements from collapsed subprocesses to a new plane.
22180
+ *
22181
+ * @param {Object} plane
22182
+ * @return {Array} new diagrams created for the collapsed subprocesses
22183
+ */
22184
+ SubprocessCompatibility.prototype.createNewDiagrams = function(plane) {
22185
+ var self = this;
22186
+
22187
+ var collapsedElements = [];
22188
+ var elementsToMove = [];
22189
+
22190
+ plane.get('planeElement').forEach(function(diElement) {
22191
+ var bo = diElement.bpmnElement;
22192
+ var parent = bo.$parent;
22193
+
22194
+ if (is$1(bo, 'bpmn:SubProcess') && !diElement.isExpanded) {
22195
+ collapsedElements.push(bo);
22196
+ }
22197
+
22198
+ if (is$1(parent, 'bpmn:SubProcess') && parent !== plane.bpmnElement) {
22199
+
22200
+ // don't change the array while we iterate over it
22201
+ elementsToMove.push({ diElement: diElement, parent: parent });
22202
+ }
22203
+ });
22204
+
22205
+ var newDiagrams = [];
22206
+
22207
+ elementsToMove.forEach(function(element) {
22208
+ var diElement = element.diElement;
22209
+ var parent = element.parent;
22210
+
22211
+ // parent is expanded, get nearest collapsed parent
22212
+ while (parent && !collapsedElements.includes(parent)) {
22213
+ parent = parent.$parent;
22214
+ }
22215
+
22216
+ // false positive, all parents are expanded
22217
+ if (!parent) {
22218
+ return;
22219
+ }
22220
+
22221
+ var diagram = self._processToDiagramMap[parent.id];
22222
+ if (!diagram) {
22223
+ diagram = self.createDiagram(parent);
22224
+ self._processToDiagramMap[parent.id] = diagram;
22225
+ newDiagrams.push(diagram);
22226
+ }
22227
+
22228
+ self.moveToDiPlane(diElement, diagram.plane);
22229
+ });
22230
+
22231
+ return newDiagrams;
22232
+ };
22233
+
22234
+ SubprocessCompatibility.prototype.movePlaneElementsToOrigin = function(plane) {
22235
+ var elements = plane.get('planeElement');
22236
+
22237
+ // get bounding box of all elements
22238
+ var planeBounds = getPlaneBounds(plane);
22239
+
22240
+ var offset = {
22241
+ x: planeBounds.x - DEFAULT_POSITION.x,
22242
+ y: planeBounds.y - DEFAULT_POSITION.y
22243
+ };
22244
+
22245
+ elements.forEach(function(diElement) {
22246
+ if (diElement.waypoint) {
22247
+ diElement.waypoint.forEach(function(waypoint) {
22248
+ waypoint.x = waypoint.x - offset.x;
22249
+ waypoint.y = waypoint.y - offset.y;
22250
+ });
22251
+ } else if (diElement.bounds) {
22252
+ diElement.bounds.x = diElement.bounds.x - offset.x;
22253
+ diElement.bounds.y = diElement.bounds.y - offset.y;
22254
+ }
22255
+ });
22256
+ };
22257
+
22258
+
22259
+ SubprocessCompatibility.prototype.moveToDiPlane = function(diElement, newPlane) {
22260
+ var containingDiagram = findRootDiagram(diElement);
22261
+
22262
+ // remove DI from old Plane and add it to the new one
22263
+ var parentPlaneElement = containingDiagram.plane.get('planeElement');
22264
+ parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);
22265
+ newPlane.get('planeElement').push(diElement);
22266
+ };
22267
+
22268
+
22269
+ SubprocessCompatibility.prototype.createDiagram = function(bo) {
22270
+ var plane = this._moddle.create('bpmndi:BPMNPlane', { bpmnElement: bo });
22271
+ var diagram = this._moddle.create('bpmndi:BPMNDiagram', {
22272
+ plane: plane
22273
+ });
22274
+ plane.$parent = diagram;
22275
+ plane.bpmnElement = bo;
22276
+ diagram.$parent = this._definitions;
22277
+ this._definitions.diagrams.push(diagram);
22278
+ return diagram;
22279
+ };
22280
+
22281
+ SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];
22282
+
22283
+
22284
+ // helpers
22285
+
22286
+ function findRootDiagram(element) {
22287
+ if (is$1(element, 'bpmndi:BPMNDiagram')) {
22288
+ return element;
22289
+ } else {
22290
+ return findRootDiagram(element.$parent);
22291
+ }
22292
+ }
22293
+
22294
+ function getPlaneBounds(plane) {
22295
+ var planeTrbl = {
22296
+ top: Infinity,
22297
+ right: -Infinity,
22298
+ bottom: -Infinity,
22299
+ left: Infinity
22300
+ };
22301
+
22302
+ plane.planeElement.forEach(function(element) {
22303
+ if (!element.bounds) {
22304
+ return;
22305
+ }
22306
+
22307
+ var trbl = asTRBL(element.bounds);
22308
+
22309
+ planeTrbl.top = Math.min(trbl.top, planeTrbl.top);
22310
+ planeTrbl.left = Math.min(trbl.left, planeTrbl.left);
22311
+ });
22312
+
22313
+ return asBounds(planeTrbl);
22314
+ }
22315
+
22316
+ var DrilldownModdule = {
22317
+ __depends__: [ OverlaysModule, ChangeSupportModule ],
22318
+ __init__: [ 'drilldownOverlays', 'drilldownCentering', 'subprocessCompatibility'],
22319
+ drilldownOverlays: [ 'type', DrilldownOverlays ],
22320
+ drilldownCentering: [ 'type', DrilldownCentering ],
22321
+ subprocessCompatibility: [ 'type', SubprocessCompatibility ]
22322
+ };
22323
+
21680
22324
  /**
21681
22325
  * A viewer for BPMN 2.0 diagrams.
21682
22326
  *
@@ -21735,7 +22379,8 @@
21735
22379
  CoreModule,
21736
22380
  translate,
21737
22381
  SelectionModule,
21738
- OverlaysModule
22382
+ OverlaysModule,
22383
+ DrilldownModdule
21739
22384
  ];
21740
22385
 
21741
22386
  // default moddle extensions the viewer is composed of
@@ -28263,130 +28908,6 @@
28263
28908
  calculateSegmentMoveRegion(segmentLengthYAxis);
28264
28909
  }
28265
28910
 
28266
- var css_escape = {exports: {}};
28267
-
28268
- /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */
28269
-
28270
- (function (module, exports) {
28271
- (function(root, factory) {
28272
- // https://github.com/umdjs/umd/blob/master/returnExports.js
28273
- {
28274
- // For Node.js.
28275
- module.exports = factory(root);
28276
- }
28277
- }(typeof commonjsGlobal != 'undefined' ? commonjsGlobal : commonjsGlobal, function(root) {
28278
-
28279
- if (root.CSS && root.CSS.escape) {
28280
- return root.CSS.escape;
28281
- }
28282
-
28283
- // https://drafts.csswg.org/cssom/#serialize-an-identifier
28284
- var cssEscape = function(value) {
28285
- if (arguments.length == 0) {
28286
- throw new TypeError('`CSS.escape` requires an argument.');
28287
- }
28288
- var string = String(value);
28289
- var length = string.length;
28290
- var index = -1;
28291
- var codeUnit;
28292
- var result = '';
28293
- var firstCodeUnit = string.charCodeAt(0);
28294
- while (++index < length) {
28295
- codeUnit = string.charCodeAt(index);
28296
- // Note: there’s no need to special-case astral symbols, surrogate
28297
- // pairs, or lone surrogates.
28298
-
28299
- // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER
28300
- // (U+FFFD).
28301
- if (codeUnit == 0x0000) {
28302
- result += '\uFFFD';
28303
- continue;
28304
- }
28305
-
28306
- if (
28307
- // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is
28308
- // U+007F, […]
28309
- (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||
28310
- // If the character is the first character and is in the range [0-9]
28311
- // (U+0030 to U+0039), […]
28312
- (index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||
28313
- // If the character is the second character and is in the range [0-9]
28314
- // (U+0030 to U+0039) and the first character is a `-` (U+002D), […]
28315
- (
28316
- index == 1 &&
28317
- codeUnit >= 0x0030 && codeUnit <= 0x0039 &&
28318
- firstCodeUnit == 0x002D
28319
- )
28320
- ) {
28321
- // https://drafts.csswg.org/cssom/#escape-a-character-as-code-point
28322
- result += '\\' + codeUnit.toString(16) + ' ';
28323
- continue;
28324
- }
28325
-
28326
- if (
28327
- // If the character is the first character and is a `-` (U+002D), and
28328
- // there is no second character, […]
28329
- index == 0 &&
28330
- length == 1 &&
28331
- codeUnit == 0x002D
28332
- ) {
28333
- result += '\\' + string.charAt(index);
28334
- continue;
28335
- }
28336
-
28337
- // If the character is not handled by one of the above rules and is
28338
- // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or
28339
- // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to
28340
- // U+005A), or [a-z] (U+0061 to U+007A), […]
28341
- if (
28342
- codeUnit >= 0x0080 ||
28343
- codeUnit == 0x002D ||
28344
- codeUnit == 0x005F ||
28345
- codeUnit >= 0x0030 && codeUnit <= 0x0039 ||
28346
- codeUnit >= 0x0041 && codeUnit <= 0x005A ||
28347
- codeUnit >= 0x0061 && codeUnit <= 0x007A
28348
- ) {
28349
- // the character itself
28350
- result += string.charAt(index);
28351
- continue;
28352
- }
28353
-
28354
- // Otherwise, the escaped character.
28355
- // https://drafts.csswg.org/cssom/#escape-a-character
28356
- result += '\\' + string.charAt(index);
28357
-
28358
- }
28359
- return result;
28360
- };
28361
-
28362
- if (!root.CSS) {
28363
- root.CSS = {};
28364
- }
28365
-
28366
- root.CSS.escape = cssEscape;
28367
- return cssEscape;
28368
-
28369
- }));
28370
- }(css_escape));
28371
-
28372
- var cssEscape = css_escape.exports;
28373
-
28374
- var HTML_ESCAPE_MAP = {
28375
- '&': '&amp;',
28376
- '<': '&lt;',
28377
- '>': '&gt;',
28378
- '"': '&quot;',
28379
- '\'': '&#39;'
28380
- };
28381
-
28382
- function escapeHTML(str) {
28383
- str = '' + str;
28384
-
28385
- return str && str.replace(/[&<>"']/g, function(match) {
28386
- return HTML_ESCAPE_MAP[match];
28387
- });
28388
- }
28389
-
28390
28911
  /**
28391
28912
  * A service that adds editable bendpoints to connections.
28392
28913
  */
@@ -33447,23 +33968,13 @@
33447
33968
  element = context.element;
33448
33969
 
33449
33970
  var businessObject = descriptor.oldBusinessObject = getBusinessObject(element);
33971
+ var di = descriptor.oldDi = getDi(element);
33450
33972
 
33451
33973
  descriptor.type = element.type;
33452
33974
 
33453
33975
  copyProperties$1(businessObject, descriptor, 'name');
33454
33976
 
33455
- descriptor.di = {};
33456
-
33457
- // colors will be set to DI
33458
- copyProperties$1(businessObject.di, descriptor.di, [
33459
- 'fill',
33460
- 'stroke',
33461
- 'background-color',
33462
- 'border-color',
33463
- 'color'
33464
- ]);
33465
-
33466
- copyProperties$1(businessObject.di, descriptor, 'isExpanded');
33977
+ copyProperties$1(di, descriptor, 'isExpanded');
33467
33978
 
33468
33979
  if (isLabel$3(descriptor)) {
33469
33980
  return descriptor;
@@ -33537,11 +34048,13 @@
33537
34048
  var cache = context.cache,
33538
34049
  descriptor = context.descriptor,
33539
34050
  oldBusinessObject = descriptor.oldBusinessObject,
33540
- newBusinessObject;
34051
+ oldDi = descriptor.oldDi,
34052
+ newBusinessObject, newDi;
33541
34053
 
33542
34054
  // do NOT copy business object if external label
33543
34055
  if (isLabel$3(descriptor)) {
33544
34056
  descriptor.businessObject = getBusinessObject(cache[ descriptor.labelTarget ]);
34057
+ descriptor.di = getDi(cache[ descriptor.labelTarget ]);
33545
34058
 
33546
34059
  return;
33547
34060
  }
@@ -33553,6 +34066,13 @@
33553
34066
  newBusinessObject
33554
34067
  );
33555
34068
 
34069
+ newDi = bpmnFactory.create(oldDi.$type);
34070
+
34071
+ descriptor.di = moddleCopy.copyElement(
34072
+ oldDi,
34073
+ newDi
34074
+ );
34075
+
33556
34076
  // resolve references e.g. default sequence flow
33557
34077
  resolveReferences(descriptor, cache);
33558
34078
 
@@ -33789,9 +34309,9 @@
33789
34309
  return;
33790
34310
  }
33791
34311
 
33792
- // disallow copying IDs if already assigned
33793
- if (propertyDescriptor.isId && this._moddle.ids.assigned(property)) {
33794
- return;
34312
+ // copy id
34313
+ if (propertyDescriptor.isId) {
34314
+ return this._copyId(property, parent);
33795
34315
  }
33796
34316
 
33797
34317
  // copy arrays
@@ -33832,6 +34352,18 @@
33832
34352
  return property;
33833
34353
  };
33834
34354
 
34355
+ ModdleCopy.prototype._copyId = function(id, element) {
34356
+
34357
+ // disallow if already taken
34358
+ if (this._moddle.ids.assigned(id)) {
34359
+ return;
34360
+ } else {
34361
+
34362
+ this._moddle.ids.claim(id, element);
34363
+ return id;
34364
+ }
34365
+ };
34366
+
33835
34367
  // helpers //////////
33836
34368
 
33837
34369
  function getPropertyNames(descriptor, keepDefaultProperties) {
@@ -33932,6 +34464,7 @@
33932
34464
  });
33933
34465
  }
33934
34466
 
34467
+
33935
34468
  var CUSTOM_PROPERTIES = [
33936
34469
  'cancelActivity',
33937
34470
  'instantiate',
@@ -33940,8 +34473,10 @@
33940
34473
  'isInterrupting'
33941
34474
  ];
33942
34475
 
33943
-
33944
- function toggeling(element, target) {
34476
+ /**
34477
+ * Check if element should be collapsed or expanded.
34478
+ */
34479
+ function shouldToggleCollapsed(element, targetElement) {
33945
34480
 
33946
34481
  var oldCollapsed = (
33947
34482
  element && has(element, 'collapsed') ? element.collapsed : !isExpanded(element)
@@ -33949,11 +34484,11 @@
33949
34484
 
33950
34485
  var targetCollapsed;
33951
34486
 
33952
- if (target && (has(target, 'collapsed') || has(target, 'isExpanded'))) {
34487
+ if (targetElement && (has(targetElement, 'collapsed') || has(targetElement, 'isExpanded'))) {
33953
34488
 
33954
34489
  // property is explicitly set so use it
33955
34490
  targetCollapsed = (
33956
- has(target, 'collapsed') ? target.collapsed : !target.isExpanded
34491
+ has(targetElement, 'collapsed') ? targetElement.collapsed : !targetElement.isExpanded
33957
34492
  );
33958
34493
  } else {
33959
34494
 
@@ -33962,7 +34497,6 @@
33962
34497
  }
33963
34498
 
33964
34499
  if (oldCollapsed !== targetCollapsed) {
33965
- element.collapsed = oldCollapsed;
33966
34500
  return true;
33967
34501
  }
33968
34502
 
@@ -33970,7 +34504,6 @@
33970
34504
  }
33971
34505
 
33972
34506
 
33973
-
33974
34507
  /**
33975
34508
  * This module takes care of replacing BPMN elements
33976
34509
  */
@@ -34001,15 +34534,13 @@
34001
34534
  var type = target.type,
34002
34535
  oldBusinessObject = element.businessObject;
34003
34536
 
34004
- if (isSubProcess(oldBusinessObject)) {
34005
- if (type === 'bpmn:SubProcess') {
34006
- if (toggeling(element, target)) {
34537
+ if (isSubProcess(oldBusinessObject) && type === 'bpmn:SubProcess') {
34538
+ if (shouldToggleCollapsed(element, target)) {
34007
34539
 
34008
- // expanding or collapsing process
34009
- modeling.toggleCollapse(element);
34540
+ // expanding or collapsing process
34541
+ modeling.toggleCollapse(element);
34010
34542
 
34011
- return element;
34012
- }
34543
+ return element;
34013
34544
  }
34014
34545
  }
34015
34546
 
@@ -34017,9 +34548,20 @@
34017
34548
 
34018
34549
  var newElement = {
34019
34550
  type: type,
34020
- businessObject: newBusinessObject
34551
+ businessObject: newBusinessObject,
34021
34552
  };
34022
34553
 
34554
+ newElement.di = {};
34555
+
34556
+ // colors will be set to DI
34557
+ copyProperties(element.di, newElement.di, [
34558
+ 'fill',
34559
+ 'stroke',
34560
+ 'background-color',
34561
+ 'border-color',
34562
+ 'color'
34563
+ ]);
34564
+
34023
34565
  var elementProps = getPropertyNames(oldBusinessObject.$descriptor),
34024
34566
  newElementProps = getPropertyNames(newBusinessObject.$descriptor, true),
34025
34567
  copyProps = intersection(elementProps, newElementProps);
@@ -34079,7 +34621,7 @@
34079
34621
  if (isSubProcess(oldBusinessObject)) {
34080
34622
 
34081
34623
  // no toggeling, so keep old state
34082
- newElement.isExpanded = isExpanded(oldBusinessObject);
34624
+ newElement.isExpanded = isExpanded(element);
34083
34625
  }
34084
34626
 
34085
34627
  // else if property is explicitly set, use it
@@ -34090,7 +34632,7 @@
34090
34632
  // TODO: need also to respect min/max Size
34091
34633
  // copy size, from an expanded subprocess to an expanded alternative subprocess
34092
34634
  // except bpmn:Task, because Task is always expanded
34093
- if ((isExpanded(oldBusinessObject) && !is$1(oldBusinessObject, 'bpmn:Task')) && newElement.isExpanded) {
34635
+ if ((isExpanded(element) && !is$1(oldBusinessObject, 'bpmn:Task')) && newElement.isExpanded) {
34094
34636
  newElement.width = element.width;
34095
34637
  newElement.height = element.height;
34096
34638
  }
@@ -34115,12 +34657,12 @@
34115
34657
 
34116
34658
  // apply same width and default height
34117
34659
  newElement.width = element.width;
34118
- newElement.height = elementFactory._getDefaultSize(newBusinessObject).height;
34660
+ newElement.height = elementFactory.getDefaultSize(newElement).height;
34119
34661
  }
34120
34662
 
34121
34663
  if (!rules.allowed('shape.resize', { shape: newBusinessObject })) {
34122
- newElement.height = elementFactory._getDefaultSize(newBusinessObject).height;
34123
- newElement.width = elementFactory._getDefaultSize(newBusinessObject).width;
34664
+ newElement.height = elementFactory.getDefaultSize(newElement).height;
34665
+ newElement.width = elementFactory.getDefaultSize(newElement).width;
34124
34666
  }
34125
34667
 
34126
34668
  newBusinessObject.name = oldBusinessObject.name;
@@ -34158,16 +34700,6 @@
34158
34700
  newElement.x = element.x + (element.width - newElement.width) / 2;
34159
34701
  }
34160
34702
 
34161
- newElement.di = {};
34162
-
34163
- // colors will be set to DI
34164
- copyProperties(oldBusinessObject.di, newElement.di, [
34165
- 'fill',
34166
- 'stroke',
34167
- 'background-color',
34168
- 'border-color',
34169
- 'color'
34170
- ]);
34171
34703
 
34172
34704
  newElement = replace.replaceElement(element, newElement, hints);
34173
34705
 
@@ -34252,7 +34784,7 @@
34252
34784
 
34253
34785
  var isExpandedEqual = (
34254
34786
  target.isExpanded === undefined ||
34255
- target.isExpanded === isExpanded(businessObject)
34787
+ target.isExpanded === isExpanded(element)
34256
34788
  );
34257
34789
 
34258
34790
  return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual || !isExpandedEqual;
@@ -35189,7 +35721,7 @@
35189
35721
  if (is$1(businessObject, 'bpmn:Participant')) {
35190
35722
 
35191
35723
  entries = filter(PARTICIPANT, function(entry) {
35192
- return isExpanded(businessObject) !== entry.target.isExpanded;
35724
+ return isExpanded(element) !== entry.target.isExpanded;
35193
35725
  });
35194
35726
 
35195
35727
  return this._createEntries(element, entries);
@@ -35285,7 +35817,7 @@
35285
35817
  }
35286
35818
 
35287
35819
  // expanded event sub processes
35288
- if (isEventSubProcess(businessObject) && isExpanded(businessObject)) {
35820
+ if (isEventSubProcess(businessObject) && isExpanded(element)) {
35289
35821
 
35290
35822
  entries = filter(EVENT_SUB_PROCESS, differentType);
35291
35823
 
@@ -35293,7 +35825,7 @@
35293
35825
  }
35294
35826
 
35295
35827
  // expanded sub processes
35296
- if (is$1(businessObject, 'bpmn:SubProcess') && isExpanded(businessObject)) {
35828
+ if (is$1(businessObject, 'bpmn:SubProcess') && isExpanded(element)) {
35297
35829
 
35298
35830
  entries = filter(SUBPROCESS_EXPANDED, differentType);
35299
35831
 
@@ -35301,7 +35833,7 @@
35301
35833
  }
35302
35834
 
35303
35835
  // collapsed ad hoc sub processes
35304
- if (is$1(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(businessObject)) {
35836
+ if (is$1(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(element)) {
35305
35837
 
35306
35838
  entries = filter(TASK, function(entry) {
35307
35839
 
@@ -35327,7 +35859,7 @@
35327
35859
  entries = filter(TASK, differentType);
35328
35860
 
35329
35861
  // collapsed SubProcess can not be replaced with itself
35330
- if (is$1(businessObject, 'bpmn:SubProcess') && !isExpanded(businessObject)) {
35862
+ if (is$1(businessObject, 'bpmn:SubProcess') && !isExpanded(element)) {
35331
35863
  entries = filter(entries, function(entry) {
35332
35864
  return entry.label !== 'Sub Process (collapsed)';
35333
35865
  });
@@ -36233,7 +36765,7 @@
36233
36765
  }
36234
36766
 
36235
36767
 
36236
- if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(businessObject)) {
36768
+ if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(element)) {
36237
36769
 
36238
36770
  var childLanes = getChildLanes(element);
36239
36771
 
@@ -38460,75 +38992,6 @@
38460
38992
  keyboardMoveSelection: [ 'type', KeyboardMoveSelection ]
38461
38993
  };
38462
38994
 
38463
- /**
38464
- * Adds change support to the diagram, including
38465
- *
38466
- * <ul>
38467
- * <li>redrawing shapes and connections on change</li>
38468
- * </ul>
38469
- *
38470
- * @param {EventBus} eventBus
38471
- * @param {Canvas} canvas
38472
- * @param {ElementRegistry} elementRegistry
38473
- * @param {GraphicsFactory} graphicsFactory
38474
- */
38475
- function ChangeSupport(
38476
- eventBus, canvas, elementRegistry,
38477
- graphicsFactory) {
38478
-
38479
-
38480
- // redraw shapes / connections on change
38481
-
38482
- eventBus.on('element.changed', function(event) {
38483
-
38484
- var element = event.element;
38485
-
38486
- // element might have been deleted and replaced by new element with same ID
38487
- // thus check for parent of element except for root element
38488
- if (element.parent || element === canvas.getRootElement()) {
38489
- event.gfx = elementRegistry.getGraphics(element);
38490
- }
38491
-
38492
- // shape + gfx may have been deleted
38493
- if (!event.gfx) {
38494
- return;
38495
- }
38496
-
38497
- eventBus.fire(getType(element) + '.changed', event);
38498
- });
38499
-
38500
- eventBus.on('elements.changed', function(event) {
38501
-
38502
- var elements = event.elements;
38503
-
38504
- elements.forEach(function(e) {
38505
- eventBus.fire('element.changed', { element: e });
38506
- });
38507
-
38508
- graphicsFactory.updateContainments(elements);
38509
- });
38510
-
38511
- eventBus.on('shape.changed', function(event) {
38512
- graphicsFactory.update('shape', event.element, event.gfx);
38513
- });
38514
-
38515
- eventBus.on('connection.changed', function(event) {
38516
- graphicsFactory.update('connection', event.element, event.gfx);
38517
- });
38518
- }
38519
-
38520
- ChangeSupport.$inject = [
38521
- 'eventBus',
38522
- 'canvas',
38523
- 'elementRegistry',
38524
- 'graphicsFactory'
38525
- ];
38526
-
38527
- var ChangeSupportModule = {
38528
- __init__: [ 'changeSupport'],
38529
- changeSupport: [ 'type', ChangeSupport ]
38530
- };
38531
-
38532
38995
  var DEFAULT_MIN_WIDTH = 10;
38533
38996
 
38534
38997
 
@@ -39620,9 +40083,9 @@
39620
40083
  // helpers ///////////////////
39621
40084
 
39622
40085
  function getStrokeColor(element, defaultColor) {
39623
- var bo = getBusinessObject(element);
40086
+ var di = getDi(element);
39624
40087
 
39625
- return bo.di.get('stroke') || defaultColor || 'black';
40088
+ return di.get('stroke') || defaultColor || 'black';
39626
40089
  }
39627
40090
 
39628
40091
  var LabelEditingModule = {
@@ -40833,21 +41296,23 @@
40833
41296
 
40834
41297
  UpdateSemanticParentHandler.prototype.execute = function(context) {
40835
41298
  var dataStoreBo = context.dataStoreBo,
41299
+ dataStoreDi = context.dataStoreDi,
40836
41300
  newSemanticParent = context.newSemanticParent,
40837
41301
  newDiParent = context.newDiParent;
40838
41302
 
40839
41303
  context.oldSemanticParent = dataStoreBo.$parent;
40840
- context.oldDiParent = dataStoreBo.di.$parent;
41304
+ context.oldDiParent = dataStoreDi.$parent;
40841
41305
 
40842
41306
  // update semantic parent
40843
41307
  this._bpmnUpdater.updateSemanticParent(dataStoreBo, newSemanticParent);
40844
41308
 
40845
41309
  // update DI parent
40846
- this._bpmnUpdater.updateDiParent(dataStoreBo.di, newDiParent);
41310
+ this._bpmnUpdater.updateDiParent(dataStoreDi, newDiParent);
40847
41311
  };
40848
41312
 
40849
41313
  UpdateSemanticParentHandler.prototype.revert = function(context) {
40850
41314
  var dataStoreBo = context.dataStoreBo,
41315
+ dataStoreDi = context.dataStoreDi,
40851
41316
  oldSemanticParent = context.oldSemanticParent,
40852
41317
  oldDiParent = context.oldDiParent;
40853
41318
 
@@ -40855,7 +41320,7 @@
40855
41320
  this._bpmnUpdater.updateSemanticParent(dataStoreBo, oldSemanticParent);
40856
41321
 
40857
41322
  // update DI parent
40858
- this._bpmnUpdater.updateDiParent(dataStoreBo.di, oldDiParent);
41323
+ this._bpmnUpdater.updateDiParent(dataStoreDi, oldDiParent);
40859
41324
  };
40860
41325
 
40861
41326
  /**
@@ -40891,8 +41356,9 @@
40891
41356
 
40892
41357
  commandStack.execute('dataStore.updateContainment', {
40893
41358
  dataStoreBo: dataStoreBo,
41359
+ dataStoreDi: getDi(dataStore),
40894
41360
  newSemanticParent: newDataStoreParentBo.processRef || newDataStoreParentBo,
40895
- newDiParent: newDataStoreParentBo.di
41361
+ newDiParent: getDi(newDataStoreParent)
40896
41362
  });
40897
41363
  }
40898
41364
  }
@@ -41832,12 +42298,14 @@
41832
42298
  ];
41833
42299
 
41834
42300
  this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], function(event) {
41835
- var bo = getBusinessObject(event.context.shape);
42301
+ var shape = event.context.shape,
42302
+ bo = getBusinessObject(shape),
42303
+ di = getDi(shape);
41836
42304
 
41837
- if (isAny(bo, elementTypesToUpdate) && !bo.di.get('isHorizontal')) {
42305
+ if (isAny(bo, elementTypesToUpdate) && !di.get('isHorizontal')) {
41838
42306
 
41839
42307
  // set attribute directly to avoid modeling#updateProperty side effects
41840
- bo.di.set('isHorizontal', true);
42308
+ di.set('isHorizontal', true);
41841
42309
  }
41842
42310
  });
41843
42311
 
@@ -42643,27 +43111,27 @@
42643
43111
 
42644
43112
  var context = event.context,
42645
43113
  element = context.shape,
42646
- businessObject,
43114
+ labelTarget = context.labelTarget,
42647
43115
  di;
42648
43116
 
42649
43117
  // we want to trigger on real labels only
42650
- if (!element.labelTarget) {
43118
+ if (!labelTarget) {
42651
43119
  return;
42652
43120
  }
42653
43121
 
42654
43122
  // we want to trigger on BPMN elements only
42655
- if (!is$1(element.labelTarget || element, 'bpmn:BaseElement')) {
43123
+ if (!is$1(labelTarget, 'bpmn:BaseElement')) {
42656
43124
  return;
42657
43125
  }
42658
43126
 
42659
- businessObject = element.businessObject,
42660
- di = businessObject.di;
42661
-
43127
+ di = getDi(labelTarget);
42662
43128
 
42663
43129
  if (!di.label) {
42664
43130
  di.label = bpmnFactory.create('bpmndi:BPMNLabel', {
42665
43131
  bounds: bpmnFactory.create('dc:Bounds')
42666
43132
  });
43133
+
43134
+ element.di = di;
42667
43135
  }
42668
43136
 
42669
43137
  assign(di.label.bounds, {
@@ -43949,11 +44417,11 @@
43949
44417
  hideEmptyLabels(shape.children);
43950
44418
 
43951
44419
  // remove collapsed marker
43952
- getBusinessObject(shape).di.isExpanded = true;
44420
+ getDi(shape).isExpanded = true;
43953
44421
  } else {
43954
44422
 
43955
44423
  // place collapsed marker
43956
- getBusinessObject(shape).di.isExpanded = false;
44424
+ getDi(shape).isExpanded = false;
43957
44425
  }
43958
44426
  });
43959
44427
 
@@ -43965,16 +44433,16 @@
43965
44433
 
43966
44434
  // revert removing/placing collapsed marker
43967
44435
  if (!shape.collapsed) {
43968
- getBusinessObject(shape).di.isExpanded = true;
44436
+ getDi(shape).isExpanded = true;
43969
44437
 
43970
44438
  } else {
43971
- getBusinessObject(shape).di.isExpanded = false;
44439
+ getDi(shape).isExpanded = false;
43972
44440
  }
43973
44441
  });
43974
44442
 
43975
44443
  this.postExecuted([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {
43976
44444
  var shape = e.context.shape,
43977
- defaultSize = elementFactory._getDefaultSize(shape),
44445
+ defaultSize = elementFactory.getDefaultSize(shape),
43978
44446
  newBounds;
43979
44447
 
43980
44448
  if (shape.collapsed) {
@@ -45280,7 +45748,7 @@
45280
45748
 
45281
45749
  function orderDi() {
45282
45750
  var root = canvas.getRootElement(),
45283
- rootDi = getBusinessObject(root).di,
45751
+ rootDi = getDi(root),
45284
45752
  elements,
45285
45753
  diElements;
45286
45754
 
@@ -48041,11 +48509,10 @@
48041
48509
  };
48042
48510
 
48043
48511
 
48044
- BpmnFactory.prototype.createDiShape = function(semantic, bounds, attrs) {
48045
-
48512
+ BpmnFactory.prototype.createDiShape = function(semantic, attrs) {
48046
48513
  return this.create('bpmndi:BPMNShape', assign({
48047
48514
  bpmnElement: semantic,
48048
- bounds: this.createDiBounds(bounds)
48515
+ bounds: this.createDiBounds()
48049
48516
  }, attrs));
48050
48517
  };
48051
48518
 
@@ -48068,16 +48535,17 @@
48068
48535
  };
48069
48536
 
48070
48537
 
48071
- BpmnFactory.prototype.createDiEdge = function(semantic, waypoints, attrs) {
48538
+ BpmnFactory.prototype.createDiEdge = function(semantic, attrs) {
48072
48539
  return this.create('bpmndi:BPMNEdge', assign({
48073
- bpmnElement: semantic
48540
+ bpmnElement: semantic,
48541
+ waypoints: this.createDiWaypoints([])
48074
48542
  }, attrs));
48075
48543
  };
48076
48544
 
48077
- BpmnFactory.prototype.createDiPlane = function(semantic) {
48078
- return this.create('bpmndi:BPMNPlane', {
48545
+ BpmnFactory.prototype.createDiPlane = function(semantic, attrs) {
48546
+ return this.create('bpmndi:BPMNPlane', assign({
48079
48547
  bpmnElement: semantic
48080
- });
48548
+ }, attrs));
48081
48549
  };
48082
48550
 
48083
48551
  /**
@@ -48362,8 +48830,9 @@
48362
48830
  var parentShape = element.parent;
48363
48831
 
48364
48832
  var businessObject = element.businessObject,
48833
+ di = getDi(element),
48365
48834
  parentBusinessObject = parentShape && parentShape.businessObject,
48366
- parentDi = parentBusinessObject && parentBusinessObject.di;
48835
+ parentDi = getDi(parentShape);
48367
48836
 
48368
48837
  if (is$1(element, 'bpmn:FlowNode')) {
48369
48838
  this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
@@ -48391,13 +48860,13 @@
48391
48860
  this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
48392
48861
  }
48393
48862
 
48394
- this.updateDiParent(businessObject.di, parentDi);
48863
+ this.updateDiParent(di, parentDi);
48395
48864
  };
48396
48865
 
48397
48866
 
48398
48867
  BpmnUpdater.prototype.updateBounds = function(shape) {
48399
48868
 
48400
- var di = shape.businessObject.di;
48869
+ var di = getDi(shape);
48401
48870
 
48402
48871
  var target = (shape instanceof Label) ? this._getLabel(di) : di;
48403
48872
 
@@ -48437,14 +48906,17 @@
48437
48906
 
48438
48907
 
48439
48908
  // update existing sourceElement and targetElement di information
48440
- BpmnUpdater.prototype.updateDiConnection = function(di, newSource, newTarget) {
48909
+ BpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {
48910
+ var connectionDi = getDi(connection),
48911
+ newSourceDi = getDi(newSource),
48912
+ newTargetDi = getDi(newTarget);
48441
48913
 
48442
- if (di.sourceElement && di.sourceElement.bpmnElement !== newSource) {
48443
- di.sourceElement = newSource && newSource.di;
48914
+ if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {
48915
+ connectionDi.sourceElement = newSource && newSourceDi;
48444
48916
  }
48445
48917
 
48446
- if (di.targetElement && di.targetElement.bpmnElement !== newTarget) {
48447
- di.targetElement = newTarget && newTarget.di;
48918
+ if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {
48919
+ connectionDi.targetElement = newTarget && newTargetDi;
48448
48920
  }
48449
48921
 
48450
48922
  };
@@ -48669,69 +49141,72 @@
48669
49141
 
48670
49142
 
48671
49143
  BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
48672
- connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
49144
+ var di = getDi(connection);
49145
+
49146
+ di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
48673
49147
  };
48674
49148
 
48675
49149
 
48676
49150
  BpmnUpdater.prototype.updateConnection = function(context) {
48677
-
48678
49151
  var connection = context.connection,
48679
49152
  businessObject = getBusinessObject(connection),
48680
- newSource = getBusinessObject(connection.source),
48681
- newTarget = getBusinessObject(connection.target),
49153
+ newSource = connection.source,
49154
+ newSourceBo = getBusinessObject(newSource),
49155
+ newTarget = connection.target,
49156
+ newTargetBo = getBusinessObject(connection.target),
48682
49157
  visualParent;
48683
49158
 
48684
49159
  if (!is$1(businessObject, 'bpmn:DataAssociation')) {
48685
49160
 
48686
49161
  var inverseSet = is$1(businessObject, 'bpmn:SequenceFlow');
48687
49162
 
48688
- if (businessObject.sourceRef !== newSource) {
49163
+ if (businessObject.sourceRef !== newSourceBo) {
48689
49164
  if (inverseSet) {
48690
49165
  remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
48691
49166
 
48692
- if (newSource && newSource.get('outgoing')) {
48693
- newSource.get('outgoing').push(businessObject);
49167
+ if (newSourceBo && newSourceBo.get('outgoing')) {
49168
+ newSourceBo.get('outgoing').push(businessObject);
48694
49169
  }
48695
49170
  }
48696
49171
 
48697
- businessObject.sourceRef = newSource;
49172
+ businessObject.sourceRef = newSourceBo;
48698
49173
  }
48699
49174
 
48700
- if (businessObject.targetRef !== newTarget) {
49175
+ if (businessObject.targetRef !== newTargetBo) {
48701
49176
  if (inverseSet) {
48702
49177
  remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
48703
49178
 
48704
- if (newTarget && newTarget.get('incoming')) {
48705
- newTarget.get('incoming').push(businessObject);
49179
+ if (newTargetBo && newTargetBo.get('incoming')) {
49180
+ newTargetBo.get('incoming').push(businessObject);
48706
49181
  }
48707
49182
  }
48708
49183
 
48709
- businessObject.targetRef = newTarget;
49184
+ businessObject.targetRef = newTargetBo;
48710
49185
  }
48711
49186
  } else
48712
49187
 
48713
49188
  if (is$1(businessObject, 'bpmn:DataInputAssociation')) {
48714
49189
 
48715
49190
  // handle obnoxious isMsome sourceRef
48716
- businessObject.get('sourceRef')[0] = newSource;
49191
+ businessObject.get('sourceRef')[0] = newSourceBo;
48717
49192
 
48718
- visualParent = context.parent || context.newParent || newTarget;
49193
+ visualParent = context.parent || context.newParent || newTargetBo;
48719
49194
 
48720
- this.updateSemanticParent(businessObject, newTarget, visualParent);
49195
+ this.updateSemanticParent(businessObject, newTargetBo, visualParent);
48721
49196
  } else
48722
49197
 
48723
49198
  if (is$1(businessObject, 'bpmn:DataOutputAssociation')) {
48724
- visualParent = context.parent || context.newParent || newSource;
49199
+ visualParent = context.parent || context.newParent || newSourceBo;
48725
49200
 
48726
- this.updateSemanticParent(businessObject, newSource, visualParent);
49201
+ this.updateSemanticParent(businessObject, newSourceBo, visualParent);
48727
49202
 
48728
49203
  // targetRef = new target
48729
- businessObject.targetRef = newTarget;
49204
+ businessObject.targetRef = newTargetBo;
48730
49205
  }
48731
49206
 
48732
49207
  this.updateConnectionWaypoints(connection);
48733
49208
 
48734
- this.updateDiConnection(businessObject.di, newSource, newTarget);
49209
+ this.updateDiConnection(connection, newSource, newTarget);
48735
49210
  };
48736
49211
 
48737
49212
 
@@ -48793,7 +49268,8 @@
48793
49268
  // we assume their businessObjects have already been created
48794
49269
  // and wired via attrs
48795
49270
  if (elementType === 'label') {
48796
- return this.baseCreate(elementType, assign({ type: 'label' }, DEFAULT_LABEL_SIZE, attrs));
49271
+ var di = attrs.di || this._bpmnFactory.createDiLabel();
49272
+ return this.baseCreate(elementType, assign({ type: 'label', di: di }, DEFAULT_LABEL_SIZE, attrs));
48797
49273
  }
48798
49274
 
48799
49275
  return this.createBpmnElement(elementType, attrs);
@@ -48805,7 +49281,8 @@
48805
49281
 
48806
49282
  attrs = attrs || {};
48807
49283
 
48808
- var businessObject = attrs.businessObject;
49284
+ var businessObject = attrs.businessObject,
49285
+ di = attrs.di;
48809
49286
 
48810
49287
  if (!businessObject) {
48811
49288
  if (!attrs.type) {
@@ -48813,22 +49290,23 @@
48813
49290
  }
48814
49291
 
48815
49292
  businessObject = this._bpmnFactory.create(attrs.type);
49293
+
49294
+ ensureCompatDiRef(businessObject);
48816
49295
  }
48817
49296
 
48818
- if (!businessObject.di) {
49297
+ if (!isModdleDi(di)) {
49298
+ var diAttrs = assign(
49299
+ di || {},
49300
+ { id: businessObject.id + '_di' }
49301
+ );
49302
+
48819
49303
  if (elementType === 'root') {
48820
- businessObject.di = this._bpmnFactory.createDiPlane(businessObject, [], {
48821
- id: businessObject.id + '_di'
48822
- });
49304
+ di = this._bpmnFactory.createDiPlane(businessObject, diAttrs);
48823
49305
  } else
48824
49306
  if (elementType === 'connection') {
48825
- businessObject.di = this._bpmnFactory.createDiEdge(businessObject, [], {
48826
- id: businessObject.id + '_di'
48827
- });
49307
+ di = this._bpmnFactory.createDiEdge(businessObject, diAttrs);
48828
49308
  } else {
48829
- businessObject.di = this._bpmnFactory.createDiShape(businessObject, {}, {
48830
- id: businessObject.id + '_di'
48831
- });
49309
+ di = this._bpmnFactory.createDiShape(businessObject, diAttrs);
48832
49310
  }
48833
49311
  }
48834
49312
 
@@ -48838,12 +49316,6 @@
48838
49316
  }, attrs);
48839
49317
  }
48840
49318
 
48841
- if (attrs.di) {
48842
- assign(businessObject.di, attrs.di);
48843
-
48844
- delete attrs.di;
48845
- }
48846
-
48847
49319
  applyAttributes(businessObject, attrs, [
48848
49320
  'processRef',
48849
49321
  'isInterrupting',
@@ -48852,11 +49324,11 @@
48852
49324
  ]);
48853
49325
 
48854
49326
  if (attrs.isExpanded) {
48855
- applyAttribute(businessObject.di, attrs, 'isExpanded');
49327
+ applyAttribute(di, attrs, 'isExpanded');
48856
49328
  }
48857
49329
 
48858
49330
  if (is$1(businessObject, 'bpmn:ExclusiveGateway')) {
48859
- businessObject.di.isMarkerVisible = true;
49331
+ di.isMarkerVisible = true;
48860
49332
  }
48861
49333
 
48862
49334
  var eventDefinitions,
@@ -48878,65 +49350,69 @@
48878
49350
  delete attrs.eventDefinitionType;
48879
49351
  }
48880
49352
 
48881
- size = this._getDefaultSize(businessObject);
49353
+ size = this.getDefaultSize(businessObject, di);
48882
49354
 
48883
49355
  attrs = assign({
48884
- businessObject: businessObject,
48885
49356
  id: businessObject.id
48886
- }, size, attrs);
49357
+ }, size, attrs, {
49358
+ businessObject: businessObject,
49359
+ di: di
49360
+ });
48887
49361
 
48888
49362
  return this.baseCreate(elementType, attrs);
48889
49363
  };
48890
49364
 
48891
49365
 
48892
- ElementFactory.prototype._getDefaultSize = function(semantic) {
49366
+ ElementFactory.prototype.getDefaultSize = function(element, di) {
48893
49367
 
48894
- if (is$1(semantic, 'bpmn:SubProcess')) {
49368
+ var bo = getBusinessObject(element);
49369
+ di = di || getDi(element);
48895
49370
 
48896
- if (isExpanded(semantic)) {
49371
+ if (is$1(bo, 'bpmn:SubProcess')) {
49372
+ if (isExpanded(bo, di)) {
48897
49373
  return { width: 350, height: 200 };
48898
49374
  } else {
48899
49375
  return { width: 100, height: 80 };
48900
49376
  }
48901
49377
  }
48902
49378
 
48903
- if (is$1(semantic, 'bpmn:Task')) {
49379
+ if (is$1(bo, 'bpmn:Task')) {
48904
49380
  return { width: 100, height: 80 };
48905
49381
  }
48906
49382
 
48907
- if (is$1(semantic, 'bpmn:Gateway')) {
49383
+ if (is$1(bo, 'bpmn:Gateway')) {
48908
49384
  return { width: 50, height: 50 };
48909
49385
  }
48910
49386
 
48911
- if (is$1(semantic, 'bpmn:Event')) {
49387
+ if (is$1(bo, 'bpmn:Event')) {
48912
49388
  return { width: 36, height: 36 };
48913
49389
  }
48914
49390
 
48915
- if (is$1(semantic, 'bpmn:Participant')) {
48916
- if (isExpanded(semantic)) {
49391
+ if (is$1(bo, 'bpmn:Participant')) {
49392
+ if (isExpanded(bo, di)) {
48917
49393
  return { width: 600, height: 250 };
48918
49394
  } else {
48919
49395
  return { width: 400, height: 60 };
48920
49396
  }
48921
49397
  }
48922
49398
 
48923
- if (is$1(semantic, 'bpmn:Lane')) {
49399
+ if (is$1(bo, 'bpmn:Lane')) {
48924
49400
  return { width: 400, height: 100 };
48925
49401
  }
48926
49402
 
48927
- if (is$1(semantic, 'bpmn:DataObjectReference')) {
49403
+ if (is$1(bo, 'bpmn:DataObjectReference')) {
48928
49404
  return { width: 36, height: 50 };
48929
49405
  }
48930
49406
 
48931
- if (is$1(semantic, 'bpmn:DataStoreReference')) {
49407
+ if (is$1(bo, 'bpmn:DataStoreReference')) {
48932
49408
  return { width: 50, height: 50 };
48933
49409
  }
48934
49410
 
48935
- if (is$1(semantic, 'bpmn:TextAnnotation')) {
49411
+ if (is$1(bo, 'bpmn:TextAnnotation')) {
48936
49412
  return { width: 100, height: 30 };
48937
49413
  }
48938
49414
 
48939
- if (is$1(semantic, 'bpmn:Group')) {
49415
+ if (is$1(bo, 'bpmn:Group')) {
48940
49416
  return { width: 300, height: 300 };
48941
49417
  }
48942
49418
 
@@ -49001,6 +49477,16 @@
49001
49477
  delete attrs[attributeName];
49002
49478
  }
49003
49479
 
49480
+
49481
+ function isModdleDi(element) {
49482
+ return isAny(element, [
49483
+ 'bpmndi:BPMNShape',
49484
+ 'bpmndi:BPMNEdge',
49485
+ 'bpmndi:BPMNDiagram',
49486
+ 'bpmndi:BPMNPlane',
49487
+ ]);
49488
+ }
49489
+
49004
49490
  /**
49005
49491
  * A handler that align elements in a certain way.
49006
49492
  *
@@ -51468,7 +51954,7 @@
51468
51954
 
51469
51955
  var businessObject = element.businessObject,
51470
51956
  properties = unwrapBusinessObjects(context.properties),
51471
- oldProperties = context.oldProperties || getProperties(businessObject, properties);
51957
+ oldProperties = context.oldProperties || getProperties(element, properties);
51472
51958
 
51473
51959
  if (isIdChange(properties, businessObject)) {
51474
51960
  ids.unclaim(businessObject[ID]);
@@ -51491,7 +51977,7 @@
51491
51977
  }
51492
51978
 
51493
51979
  // update properties
51494
- setProperties(businessObject, properties);
51980
+ setProperties(element, properties);
51495
51981
 
51496
51982
  // store old values
51497
51983
  context.oldProperties = oldProperties;
@@ -51536,7 +52022,7 @@
51536
52022
  ids = this._moddle.ids;
51537
52023
 
51538
52024
  // update properties
51539
- setProperties(businessObject, oldProperties);
52025
+ setProperties(element, oldProperties);
51540
52026
 
51541
52027
  if (isIdChange(properties, businessObject)) {
51542
52028
  ids.unclaim(properties[ID]);
@@ -51555,16 +52041,19 @@
51555
52041
  }
51556
52042
 
51557
52043
 
51558
- function getProperties(businessObject, properties) {
51559
- var propertyNames = keys(properties);
52044
+ function getProperties(element, properties) {
52045
+ var propertyNames = keys(properties),
52046
+ businessObject = element.businessObject,
52047
+ di = getDi(element);
51560
52048
 
51561
52049
  return reduce(propertyNames, function(result, key) {
51562
52050
 
51563
52051
  // handle DI separately
51564
52052
  if (key !== DI) {
51565
52053
  result[key] = businessObject.get(key);
52054
+
51566
52055
  } else {
51567
- result[key] = getDiProperties(businessObject.di, keys(properties.di));
52056
+ result[key] = getDiProperties(di, keys(properties.di));
51568
52057
  }
51569
52058
 
51570
52059
  return result;
@@ -51574,23 +52063,26 @@
51574
52063
 
51575
52064
  function getDiProperties(di, propertyNames) {
51576
52065
  return reduce(propertyNames, function(result, key) {
51577
- result[key] = di.get(key);
52066
+ result[key] = di && di.get(key);
51578
52067
 
51579
52068
  return result;
51580
52069
  }, {});
51581
52070
  }
51582
52071
 
51583
52072
 
51584
- function setProperties(businessObject, properties) {
52073
+ function setProperties(element, properties) {
52074
+ var businessObject = element.businessObject,
52075
+ di = getDi(element);
52076
+
51585
52077
  forEach(properties, function(value, key) {
51586
52078
 
51587
52079
  if (key !== DI) {
51588
52080
  businessObject.set(key, value);
51589
52081
  } else {
51590
52082
 
51591
- // only update, if businessObject.di exists
51592
- if (businessObject.di) {
51593
- setDiProperties(businessObject.di, value);
52083
+ // only update, if di exists
52084
+ if (di) {
52085
+ setDiProperties(di, value);
51594
52086
  }
51595
52087
  }
51596
52088
  });
@@ -51648,7 +52140,7 @@
51648
52140
  oldRoot = canvas.getRootElement(),
51649
52141
  oldRootBusinessObject = oldRoot.businessObject,
51650
52142
  bpmnDefinitions = oldRootBusinessObject.$parent,
51651
- diPlane = oldRootBusinessObject.di;
52143
+ diPlane = getDi(oldRoot);
51652
52144
 
51653
52145
  // (1) replace process old <> new root
51654
52146
  canvas.setRootElement(newRoot, true);
@@ -51661,10 +52153,10 @@
51661
52153
  oldRootBusinessObject.$parent = null;
51662
52154
 
51663
52155
  // (3) wire di
51664
- oldRootBusinessObject.di = null;
52156
+ oldRoot.di = null;
51665
52157
 
51666
52158
  diPlane.bpmnElement = newRootBusinessObject;
51667
- newRootBusinessObject.di = diPlane;
52159
+ newRoot.di = diPlane;
51668
52160
 
51669
52161
  context.oldRoot = oldRoot;
51670
52162
 
@@ -51682,7 +52174,7 @@
51682
52174
  oldRoot = context.oldRoot,
51683
52175
  oldRootBusinessObject = oldRoot.businessObject,
51684
52176
  bpmnDefinitions = newRootBusinessObject.$parent,
51685
- diPlane = newRootBusinessObject.di;
52177
+ diPlane = getDi(newRoot);
51686
52178
 
51687
52179
  // (1) replace process old <> new root
51688
52180
  canvas.setRootElement(oldRoot, true);
@@ -51695,10 +52187,10 @@
51695
52187
  oldRootBusinessObject.$parent = bpmnDefinitions;
51696
52188
 
51697
52189
  // (3) wire di
51698
- newRootBusinessObject.di = null;
52190
+ newRoot.di = null;
51699
52191
 
51700
52192
  diPlane.bpmnElement = oldRootBusinessObject;
51701
- oldRootBusinessObject.di = diPlane;
52193
+ oldRoot.di = diPlane;
51702
52194
 
51703
52195
  // TODO(nikku): return changed elements?
51704
52196
  // return [ newRoot, oldRoot ];
@@ -52367,7 +52859,8 @@
52367
52859
 
52368
52860
  modeling.createLabel(element, labelCenter, {
52369
52861
  id: businessObject.id + '_label',
52370
- businessObject: businessObject
52862
+ businessObject: businessObject,
52863
+ di: element.di
52371
52864
  });
52372
52865
  }
52373
52866
  }
@@ -55428,7 +55921,8 @@
55428
55921
  var shape = elementFactory.createShape(assign({ type: type }, options));
55429
55922
 
55430
55923
  if (options) {
55431
- shape.businessObject.di.isExpanded = options.isExpanded;
55924
+ var di = getDi(shape);
55925
+ di.isExpanded = options.isExpanded;
55432
55926
  }
55433
55927
 
55434
55928
  create.start(event, shape);