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
@@ -383,8 +383,8 @@ export default function BpmnRenderer(
383
383
  }
384
384
 
385
385
  function as(type) {
386
- return function(parentGfx, element) {
387
- return handlers[type](parentGfx, element);
386
+ return function(parentGfx, element, attrs) {
387
+ return handlers[type](parentGfx, element, attrs);
388
388
  };
389
389
  }
390
390
 
@@ -392,58 +392,58 @@ export default function BpmnRenderer(
392
392
  return handlers[type];
393
393
  }
394
394
 
395
- function renderEventContent(element, parentGfx) {
395
+ function renderEventContent(element, parentGfx, attrs) {
396
396
 
397
397
  var event = getSemantic(element);
398
398
  var isThrowing = isThrowEvent(event);
399
399
 
400
400
  if (event.eventDefinitions && event.eventDefinitions.length>1) {
401
401
  if (event.parallelMultiple) {
402
- return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);
402
+ return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, attrs, isThrowing);
403
403
  }
404
404
  else {
405
- return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);
405
+ return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, attrs, isThrowing);
406
406
  }
407
407
  }
408
408
 
409
409
  if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {
410
- return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);
410
+ return renderer('bpmn:MessageEventDefinition')(parentGfx, element, attrs, isThrowing);
411
411
  }
412
412
 
413
413
  if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {
414
- return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);
414
+ return renderer('bpmn:TimerEventDefinition')(parentGfx, element, attrs, isThrowing);
415
415
  }
416
416
 
417
417
  if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {
418
- return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);
418
+ return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element, attrs);
419
419
  }
420
420
 
421
421
  if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {
422
- return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);
422
+ return renderer('bpmn:SignalEventDefinition')(parentGfx, element, attrs, isThrowing);
423
423
  }
424
424
 
425
425
  if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {
426
- return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);
426
+ return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, attrs, isThrowing);
427
427
  }
428
428
 
429
429
  if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {
430
- return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);
430
+ return renderer('bpmn:LinkEventDefinition')(parentGfx, element, attrs, isThrowing);
431
431
  }
432
432
 
433
433
  if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {
434
- return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);
434
+ return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, attrs, isThrowing);
435
435
  }
436
436
 
437
437
  if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {
438
- return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);
438
+ return renderer('bpmn:CancelEventDefinition')(parentGfx, element, attrs, isThrowing);
439
439
  }
440
440
 
441
441
  if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {
442
- return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);
442
+ return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, attrs, isThrowing);
443
443
  }
444
444
 
445
445
  if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {
446
- return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);
446
+ return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, attrs, isThrowing);
447
447
  }
448
448
 
449
449
  return null;
@@ -466,20 +466,20 @@ export default function BpmnRenderer(
466
466
  return text;
467
467
  }
468
468
 
469
- function renderEmbeddedLabel(parentGfx, element, align) {
469
+ function renderEmbeddedLabel(parentGfx, element, align, attrs) {
470
470
  var semantic = getSemantic(element);
471
471
 
472
472
  return renderLabel(parentGfx, semantic.name, {
473
473
  box: element,
474
474
  align: align,
475
475
  padding: 5,
476
- style: {
476
+ style: assign({
477
477
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
478
- }
478
+ }, attrs)
479
479
  });
480
480
  }
481
481
 
482
- function renderExternalLabel(parentGfx, element) {
482
+ function renderExternalLabel(parentGfx, element, attrs) {
483
483
 
484
484
  var box = {
485
485
  width: 90,
@@ -496,21 +496,22 @@ export default function BpmnRenderer(
496
496
  textRenderer.getExternalStyle(),
497
497
  {
498
498
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
499
- }
499
+ },
500
+ attrs
500
501
  )
501
502
  });
502
503
  }
503
504
 
504
- function renderLaneLabel(parentGfx, text, element) {
505
+ function renderLaneLabel(parentGfx, text, element, attrs) {
505
506
  var textBox = renderLabel(parentGfx, text, {
506
507
  box: {
507
508
  height: 30,
508
509
  width: element.height
509
510
  },
510
511
  align: 'center-middle',
511
- style: {
512
+ style: assign({
512
513
  fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)
513
- }
514
+ }, attrs)
514
515
  });
515
516
 
516
517
  var top = -1 * element.height;
@@ -537,11 +538,11 @@ export default function BpmnRenderer(
537
538
 
538
539
  return drawCircle(parentGfx, element.width, element.height, attrs);
539
540
  },
540
- 'bpmn:StartEvent': function(parentGfx, element) {
541
- var attrs = {
541
+ 'bpmn:StartEvent': function(parentGfx, element, attrs) {
542
+ attrs = assign({
542
543
  fill: getFillColor(element, defaultFillColor),
543
544
  stroke: getStrokeColor(element, defaultStrokeColor)
544
- };
545
+ }, attrs);
545
546
 
546
547
  var semantic = getSemantic(element);
547
548
 
@@ -560,7 +561,7 @@ export default function BpmnRenderer(
560
561
 
561
562
  return circle;
562
563
  },
563
- 'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {
564
+ 'bpmn:MessageEventDefinition': function(parentGfx, element, attrs, isThrowing) {
564
565
  var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {
565
566
  xScaleFactor: 0.9,
566
567
  yScaleFactor: 0.9,
@@ -575,20 +576,24 @@ export default function BpmnRenderer(
575
576
  var fill = isThrowing ? getStrokeColor(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);
576
577
  var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor(element, defaultStrokeColor);
577
578
 
578
- var messagePath = drawPath(parentGfx, pathData, {
579
+ attrs = assign({
579
580
  strokeWidth: 1,
580
581
  fill: fill,
581
582
  stroke: stroke
582
- });
583
+ }, attrs);
584
+
585
+ var messagePath = drawPath(parentGfx, pathData, attrs);
583
586
 
584
587
  return messagePath;
585
588
  },
586
- 'bpmn:TimerEventDefinition': function(parentGfx, element) {
587
- var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {
589
+ 'bpmn:TimerEventDefinition': function(parentGfx, element, attrs) {
590
+ var outerAttrs = assign({
588
591
  strokeWidth: 2,
589
592
  fill: getFillColor(element, defaultFillColor),
590
593
  stroke: getStrokeColor(element, defaultStrokeColor)
591
- });
594
+ }, attrs);
595
+
596
+ var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, outerAttrs);
592
597
 
593
598
  var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {
594
599
  xScaleFactor: 0.75,
@@ -601,11 +606,13 @@ export default function BpmnRenderer(
601
606
  }
602
607
  });
603
608
 
604
- drawPath(parentGfx, pathData, {
609
+ var innerAttrs = assign({
605
610
  strokeWidth: 2,
606
611
  strokeLinecap: 'square',
607
612
  stroke: getStrokeColor(element, defaultStrokeColor)
608
- });
613
+ }, attrs);
614
+
615
+ drawPath(parentGfx, pathData, innerAttrs);
609
616
 
610
617
  for (var i = 0;i < 12; i++) {
611
618
 
@@ -623,17 +630,25 @@ export default function BpmnRenderer(
623
630
  var width = element.width / 2;
624
631
  var height = element.height / 2;
625
632
 
626
- drawPath(parentGfx, linePathData, {
633
+ var lineAttrs = assign({
627
634
  strokeWidth: 1,
628
635
  strokeLinecap: 'square',
629
636
  transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',
630
637
  stroke: getStrokeColor(element, defaultStrokeColor)
631
- });
638
+ }, attrs);
639
+
640
+ drawPath(parentGfx, linePathData, lineAttrs);
632
641
  }
633
642
 
634
643
  return circle;
635
644
  },
636
- 'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {
645
+ 'bpmn:EscalationEventDefinition': function(parentGfx, event, attrs, isThrowing) {
646
+ attrs = assign({
647
+ strokeWidth: 1,
648
+ fill: fill,
649
+ stroke: getStrokeColor(event, defaultStrokeColor)
650
+ }, attrs);
651
+
637
652
  var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {
638
653
  xScaleFactor: 1,
639
654
  yScaleFactor: 1,
@@ -647,13 +662,14 @@ export default function BpmnRenderer(
647
662
 
648
663
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
649
664
 
650
- return drawPath(parentGfx, pathData, {
665
+ return drawPath(parentGfx, pathData, attrs);
666
+ },
667
+ 'bpmn:ConditionalEventDefinition': function(parentGfx, event, attrs) {
668
+ attrs = assign({
651
669
  strokeWidth: 1,
652
- fill: fill,
653
670
  stroke: getStrokeColor(event, defaultStrokeColor)
654
- });
655
- },
656
- 'bpmn:ConditionalEventDefinition': function(parentGfx, event) {
671
+ }, attrs);
672
+
657
673
  var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {
658
674
  xScaleFactor: 1,
659
675
  yScaleFactor: 1,
@@ -665,12 +681,9 @@ export default function BpmnRenderer(
665
681
  }
666
682
  });
667
683
 
668
- return drawPath(parentGfx, pathData, {
669
- strokeWidth: 1,
670
- stroke: getStrokeColor(event, defaultStrokeColor)
671
- });
684
+ return drawPath(parentGfx, pathData, attrs);
672
685
  },
673
- 'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {
686
+ 'bpmn:LinkEventDefinition': function(parentGfx, event, attrs, isThrowing) {
674
687
  var pathData = pathMap.getScaledPath('EVENT_LINK', {
675
688
  xScaleFactor: 1,
676
689
  yScaleFactor: 1,
@@ -684,13 +697,15 @@ export default function BpmnRenderer(
684
697
 
685
698
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
686
699
 
687
- return drawPath(parentGfx, pathData, {
700
+ attrs = assign({
688
701
  strokeWidth: 1,
689
702
  fill: fill,
690
703
  stroke: getStrokeColor(event, defaultStrokeColor)
691
- });
704
+ }, attrs);
705
+
706
+ return drawPath(parentGfx, pathData, attrs);
692
707
  },
693
- 'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {
708
+ 'bpmn:ErrorEventDefinition': function(parentGfx, event, attrs, isThrowing) {
694
709
  var pathData = pathMap.getScaledPath('EVENT_ERROR', {
695
710
  xScaleFactor: 1.1,
696
711
  yScaleFactor: 1.1,
@@ -704,13 +719,15 @@ export default function BpmnRenderer(
704
719
 
705
720
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
706
721
 
707
- return drawPath(parentGfx, pathData, {
722
+ attrs = assign({
708
723
  strokeWidth: 1,
709
724
  fill: fill,
710
725
  stroke: getStrokeColor(event, defaultStrokeColor)
711
- });
726
+ }, attrs);
727
+
728
+ return drawPath(parentGfx, pathData, attrs);
712
729
  },
713
- 'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {
730
+ 'bpmn:CancelEventDefinition': function(parentGfx, event, attrs, isThrowing) {
714
731
  var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {
715
732
  xScaleFactor: 1.0,
716
733
  yScaleFactor: 1.0,
@@ -724,17 +741,19 @@ export default function BpmnRenderer(
724
741
 
725
742
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
726
743
 
727
- var path = drawPath(parentGfx, pathData, {
744
+ attrs = assign({
728
745
  strokeWidth: 1,
729
746
  fill: fill,
730
747
  stroke: getStrokeColor(event, defaultStrokeColor)
731
- });
748
+ }, attrs);
749
+
750
+ var path = drawPath(parentGfx, pathData, attrs);
732
751
 
733
752
  rotate(path, 45);
734
753
 
735
754
  return path;
736
755
  },
737
- 'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {
756
+ 'bpmn:CompensateEventDefinition': function(parentGfx, event, attrs, isThrowing) {
738
757
  var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {
739
758
  xScaleFactor: 1,
740
759
  yScaleFactor: 1,
@@ -748,13 +767,15 @@ export default function BpmnRenderer(
748
767
 
749
768
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
750
769
 
751
- return drawPath(parentGfx, pathData, {
770
+ attrs = assign({
752
771
  strokeWidth: 1,
753
772
  fill: fill,
754
773
  stroke: getStrokeColor(event, defaultStrokeColor)
755
- });
774
+ }, attrs);
775
+
776
+ return drawPath(parentGfx, pathData, attrs);
756
777
  },
757
- 'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {
778
+ 'bpmn:SignalEventDefinition': function(parentGfx, event, attrs, isThrowing) {
758
779
  var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {
759
780
  xScaleFactor: 0.9,
760
781
  yScaleFactor: 0.9,
@@ -768,13 +789,15 @@ export default function BpmnRenderer(
768
789
 
769
790
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
770
791
 
771
- return drawPath(parentGfx, pathData, {
792
+ attrs = assign({
772
793
  strokeWidth: 1,
773
794
  fill: fill,
774
795
  stroke: getStrokeColor(event, defaultStrokeColor)
775
- });
796
+ }, attrs);
797
+
798
+ return drawPath(parentGfx, pathData, attrs);
776
799
  },
777
- 'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {
800
+ 'bpmn:MultipleEventDefinition': function(parentGfx, event, attrs, isThrowing) {
778
801
  var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {
779
802
  xScaleFactor: 1.1,
780
803
  yScaleFactor: 1.1,
@@ -788,12 +811,14 @@ export default function BpmnRenderer(
788
811
 
789
812
  var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';
790
813
 
791
- return drawPath(parentGfx, pathData, {
814
+ attrs = assign({
792
815
  strokeWidth: 1,
793
816
  fill: fill
794
- });
817
+ }, attrs);
818
+
819
+ return drawPath(parentGfx, pathData, attrs);
795
820
  },
796
- 'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {
821
+ 'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event, attrs) {
797
822
  var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {
798
823
  xScaleFactor: 1.2,
799
824
  yScaleFactor: 1.2,
@@ -805,47 +830,54 @@ export default function BpmnRenderer(
805
830
  }
806
831
  });
807
832
 
808
- return drawPath(parentGfx, pathData, {
833
+ attrs = assign({
809
834
  strokeWidth: 1,
810
835
  fill: getStrokeColor(event, defaultStrokeColor),
811
836
  stroke: getStrokeColor(event, defaultStrokeColor)
812
- });
837
+ }, attrs);
838
+
839
+
840
+ return drawPath(parentGfx, pathData, attrs);
813
841
  },
814
- 'bpmn:EndEvent': function(parentGfx, element) {
815
- var circle = renderer('bpmn:Event')(parentGfx, element, {
842
+ 'bpmn:EndEvent': function(parentGfx, element, attrs) {
843
+ var outerAttrs = assign({
816
844
  strokeWidth: 4,
817
845
  fill: getFillColor(element, defaultFillColor),
818
- stroke: getStrokeColor(element, defaultStrokeColor)
819
- });
846
+ stroke: getStrokeColor(element, defaultStrokeColor),
847
+ }, attrs);
848
+
849
+ var circle = renderer('bpmn:Event')(parentGfx, element, outerAttrs);
820
850
 
821
- renderEventContent(element, parentGfx, true);
851
+ renderEventContent(element, parentGfx, attrs);
822
852
 
823
853
  return circle;
824
854
  },
825
- 'bpmn:TerminateEventDefinition': function(parentGfx, element) {
826
- var circle = drawCircle(parentGfx, element.width, element.height, 8, {
827
- strokeWidth: 4,
828
- fill: getStrokeColor(element, defaultStrokeColor),
829
- stroke: getStrokeColor(element, defaultStrokeColor)
830
- });
855
+ 'bpmn:TerminateEventDefinition': function(parentGfx, element, attrs) {
856
+ attrs = assign({
857
+ fill: getFillColor(element, defaultFillColor),
858
+ stroke: getStrokeColor(element, defaultStrokeColor),
859
+ strokeWidth: 4
860
+ }, attrs);
861
+
862
+ var circle = drawCircle(parentGfx, element.width, element.height, 8, attrs);
831
863
 
832
864
  return circle;
833
865
  },
834
- 'bpmn:IntermediateEvent': function(parentGfx, element) {
835
- var outer = renderer('bpmn:Event')(parentGfx, element, {
866
+ 'bpmn:IntermediateEvent': function(parentGfx, element, attrs) {
867
+ var outerAttrs = assign({
836
868
  strokeWidth: 1,
837
869
  fill: getFillColor(element, defaultFillColor),
838
870
  stroke: getStrokeColor(element, defaultStrokeColor)
839
- });
871
+ }, attrs);
872
+
873
+ var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);
840
874
 
841
875
  /* inner */
842
- drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {
843
- strokeWidth: 1,
876
+ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, assign({}, outerAttrs, {
844
877
  fill: getFillColor(element, 'none'),
845
- stroke: getStrokeColor(element, defaultStrokeColor)
846
- });
878
+ }));
847
879
 
848
- renderEventContent(element, parentGfx);
880
+ renderEventContent(element, parentGfx, attrs);
849
881
 
850
882
  return outer;
851
883
  },
@@ -863,21 +895,21 @@ export default function BpmnRenderer(
863
895
  return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);
864
896
  },
865
897
 
866
- 'bpmn:Task': function(parentGfx, element) {
867
- var attrs = {
898
+ 'bpmn:Task': function(parentGfx, element, attrs) {
899
+ attrs = assign({
868
900
  fill: getFillColor(element, defaultFillColor),
869
901
  stroke: getStrokeColor(element, defaultStrokeColor)
870
- };
902
+ }, attrs);
871
903
 
872
904
  var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);
873
905
 
874
906
  renderEmbeddedLabel(parentGfx, element, 'center-middle');
875
- attachTaskMarkers(parentGfx, element);
907
+ attachTaskMarkers(parentGfx, element, attrs);
876
908
 
877
909
  return rect;
878
910
  },
879
- 'bpmn:ServiceTask': function(parentGfx, element) {
880
- var task = renderer('bpmn:Task')(parentGfx, element);
911
+ 'bpmn:ServiceTask': function(parentGfx, element, attrs) {
912
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
881
913
 
882
914
  var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
883
915
  abspos: {
@@ -886,11 +918,12 @@ export default function BpmnRenderer(
886
918
  }
887
919
  });
888
920
 
889
- /* service bg */ drawPath(parentGfx, pathDataBG, {
921
+ var serviceAttrs = assign({
890
922
  strokeWidth: 1,
891
923
  fill: getFillColor(element, defaultFillColor),
892
924
  stroke: getStrokeColor(element, defaultStrokeColor)
893
- });
925
+ }, attrs);
926
+ /* service bg */ drawPath(parentGfx, pathDataBG, serviceAttrs);
894
927
 
895
928
  var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {
896
929
  abspos: {
@@ -899,10 +932,11 @@ export default function BpmnRenderer(
899
932
  }
900
933
  });
901
934
 
902
- /* service fill */ drawPath(parentGfx, fillPathData, {
935
+ var fillAttrs = assign({
903
936
  strokeWidth: 0,
904
937
  fill: getFillColor(element, defaultFillColor)
905
- });
938
+ }, attrs);
939
+ /* service fill */ drawPath(parentGfx, fillPathData, fillAttrs);
906
940
 
907
941
  var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
908
942
  abspos: {
@@ -911,16 +945,12 @@ export default function BpmnRenderer(
911
945
  }
912
946
  });
913
947
 
914
- /* service */ drawPath(parentGfx, pathData, {
915
- strokeWidth: 1,
916
- fill: getFillColor(element, defaultFillColor),
917
- stroke: getStrokeColor(element, defaultStrokeColor)
918
- });
948
+ /* service */ drawPath(parentGfx, pathData, serviceAttrs);
919
949
 
920
950
  return task;
921
951
  },
922
- 'bpmn:UserTask': function(parentGfx, element) {
923
- var task = renderer('bpmn:Task')(parentGfx, element);
952
+ 'bpmn:UserTask': function(parentGfx, element, attrs) {
953
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
924
954
 
925
955
  var x = 15;
926
956
  var y = 12;
@@ -932,11 +962,12 @@ export default function BpmnRenderer(
932
962
  }
933
963
  });
934
964
 
935
- /* user path */ drawPath(parentGfx, pathData, {
965
+ var userAttrs = assign({
936
966
  strokeWidth: 0.5,
937
967
  fill: getFillColor(element, defaultFillColor),
938
968
  stroke: getStrokeColor(element, defaultStrokeColor)
939
- });
969
+ }, attrs);
970
+ /* user path */ drawPath(parentGfx, pathData, userAttrs);
940
971
 
941
972
  var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {
942
973
  abspos: {
@@ -945,11 +976,7 @@ export default function BpmnRenderer(
945
976
  }
946
977
  });
947
978
 
948
- /* user2 path */ drawPath(parentGfx, pathData2, {
949
- strokeWidth: 0.5,
950
- fill: getFillColor(element, defaultFillColor),
951
- stroke: getStrokeColor(element, defaultStrokeColor)
952
- });
979
+ /* user2 path */ drawPath(parentGfx, pathData2, userAttrs);
953
980
 
954
981
  var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {
955
982
  abspos: {
@@ -958,16 +985,12 @@ export default function BpmnRenderer(
958
985
  }
959
986
  });
960
987
 
961
- /* user3 path */ drawPath(parentGfx, pathData3, {
962
- strokeWidth: 0.5,
963
- fill: getStrokeColor(element, defaultStrokeColor),
964
- stroke: getStrokeColor(element, defaultStrokeColor)
965
- });
988
+ /* user3 path */ drawPath(parentGfx, pathData3, userAttrs);
966
989
 
967
990
  return task;
968
991
  },
969
- 'bpmn:ManualTask': function(parentGfx, element) {
970
- var task = renderer('bpmn:Task')(parentGfx, element);
992
+ 'bpmn:ManualTask': function(parentGfx, element, attrs) {
993
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
971
994
 
972
995
  var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {
973
996
  abspos: {
@@ -976,16 +999,17 @@ export default function BpmnRenderer(
976
999
  }
977
1000
  });
978
1001
 
979
- /* manual path */ drawPath(parentGfx, pathData, {
1002
+ var manualAttrs = assign({
980
1003
  strokeWidth: 0.5, // 0.25,
981
1004
  fill: getFillColor(element, defaultFillColor),
982
1005
  stroke: getStrokeColor(element, defaultStrokeColor)
983
- });
1006
+ }, attrs);
1007
+ /* manual path */ drawPath(parentGfx, pathData, manualAttrs);
984
1008
 
985
1009
  return task;
986
1010
  },
987
- 'bpmn:SendTask': function(parentGfx, element) {
988
- var task = renderer('bpmn:Task')(parentGfx, element);
1011
+ 'bpmn:SendTask': function(parentGfx, element, attrs) {
1012
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
989
1013
 
990
1014
  var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {
991
1015
  xScaleFactor: 1,
@@ -998,22 +1022,25 @@ export default function BpmnRenderer(
998
1022
  }
999
1023
  });
1000
1024
 
1001
- /* send path */ drawPath(parentGfx, pathData, {
1025
+ /* send path */
1026
+ var pathAttrs = assign({
1002
1027
  strokeWidth: 1,
1003
1028
  fill: getStrokeColor(element, defaultStrokeColor),
1004
1029
  stroke: getFillColor(element, defaultFillColor)
1005
- });
1030
+ }, attrs);
1031
+
1032
+ drawPath(parentGfx, pathData, pathAttrs);
1006
1033
 
1007
1034
  return task;
1008
1035
  },
1009
- 'bpmn:ReceiveTask' : function(parentGfx, element) {
1036
+ 'bpmn:ReceiveTask' : function(parentGfx, element, attrs) {
1010
1037
  var semantic = getSemantic(element);
1011
1038
 
1012
- var task = renderer('bpmn:Task')(parentGfx, element);
1039
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
1013
1040
  var pathData;
1014
1041
 
1015
1042
  if (semantic.instantiate) {
1016
- drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });
1043
+ drawCircle(parentGfx, 28, 28, 20 * 0.22, assign({ strokeWidth: 1 }, attrs));
1017
1044
 
1018
1045
  pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {
1019
1046
  abspos: {
@@ -1035,16 +1062,18 @@ export default function BpmnRenderer(
1035
1062
  });
1036
1063
  }
1037
1064
 
1038
- /* receive path */ drawPath(parentGfx, pathData, {
1065
+ var receiveAttrs = assign({
1039
1066
  strokeWidth: 1,
1040
1067
  fill: getFillColor(element, defaultFillColor),
1041
1068
  stroke: getStrokeColor(element, defaultStrokeColor)
1042
- });
1069
+ }, attrs);
1070
+
1071
+ /* receive path */ drawPath(parentGfx, pathData, receiveAttrs);
1043
1072
 
1044
1073
  return task;
1045
1074
  },
1046
- 'bpmn:ScriptTask': function(parentGfx, element) {
1047
- var task = renderer('bpmn:Task')(parentGfx, element);
1075
+ 'bpmn:ScriptTask': function(parentGfx, element, attrs) {
1076
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
1048
1077
 
1049
1078
  var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {
1050
1079
  abspos: {
@@ -1053,15 +1082,16 @@ export default function BpmnRenderer(
1053
1082
  }
1054
1083
  });
1055
1084
 
1056
- /* script path */ drawPath(parentGfx, pathData, {
1085
+ var scriptAttrs = assign({
1057
1086
  strokeWidth: 1,
1058
1087
  stroke: getStrokeColor(element, defaultStrokeColor)
1059
- });
1088
+ }, attrs);
1089
+ /* script path */ drawPath(parentGfx, pathData, scriptAttrs);
1060
1090
 
1061
1091
  return task;
1062
1092
  },
1063
- 'bpmn:BusinessRuleTask': function(parentGfx, element) {
1064
- var task = renderer('bpmn:Task')(parentGfx, element);
1093
+ 'bpmn:BusinessRuleTask': function(parentGfx, element, attrs) {
1094
+ var task = renderer('bpmn:Task')(parentGfx, element, attrs);
1065
1095
 
1066
1096
  var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {
1067
1097
  abspos: {
@@ -1070,12 +1100,12 @@ export default function BpmnRenderer(
1070
1100
  }
1071
1101
  });
1072
1102
 
1073
- var businessHeaderPath = drawPath(parentGfx, headerPathData);
1074
- svgAttr(businessHeaderPath, {
1103
+ var headerAttrs = assign({
1075
1104
  strokeWidth: 1,
1076
1105
  fill: getFillColor(element, '#aaaaaa'),
1077
1106
  stroke: getStrokeColor(element, defaultStrokeColor)
1078
- });
1107
+ }, attrs);
1108
+ drawPath(parentGfx, headerPathData, headerAttrs);
1079
1109
 
1080
1110
  var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {
1081
1111
  abspos: {
@@ -1084,11 +1114,11 @@ export default function BpmnRenderer(
1084
1114
  }
1085
1115
  });
1086
1116
 
1087
- var businessPath = drawPath(parentGfx, headerData);
1088
- svgAttr(businessPath, {
1117
+ var businessAttrs = assign({
1089
1118
  strokeWidth: 1,
1090
1119
  stroke: getStrokeColor(element, defaultStrokeColor)
1091
- });
1120
+ }, attrs);
1121
+ drawPath(parentGfx, headerData, businessAttrs);
1092
1122
 
1093
1123
  return task;
1094
1124
  },
@@ -1111,41 +1141,42 @@ export default function BpmnRenderer(
1111
1141
  renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');
1112
1142
 
1113
1143
  if (expanded) {
1114
- attachTaskMarkers(parentGfx, element);
1144
+ attachTaskMarkers(parentGfx, element, attrs);
1115
1145
  } else {
1116
- attachTaskMarkers(parentGfx, element, ['SubProcessMarker']);
1146
+ attachTaskMarkers(parentGfx, element, attrs, ['SubProcessMarker']);
1117
1147
  }
1118
1148
 
1119
1149
  return rect;
1120
1150
  },
1121
- 'bpmn:AdHocSubProcess': function(parentGfx, element) {
1122
- return renderer('bpmn:SubProcess')(parentGfx, element);
1151
+ 'bpmn:AdHocSubProcess': function(parentGfx, element, attrs) {
1152
+ return renderer('bpmn:SubProcess')(parentGfx, element, attrs);
1123
1153
  },
1124
- 'bpmn:Transaction': function(parentGfx, element) {
1125
- var outer = renderer('bpmn:SubProcess')(parentGfx, element);
1154
+ 'bpmn:Transaction': function(parentGfx, element, attrs) {
1155
+ var outer = renderer('bpmn:SubProcess')(parentGfx, element, attrs);
1126
1156
 
1127
1157
  var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {
1128
1158
  stroke: getStrokeColor(element, defaultStrokeColor)
1129
1159
  });
1130
1160
 
1131
- /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs);
1161
+ /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, assign(innerAttrs, attrs));
1132
1162
 
1133
1163
  return outer;
1134
1164
  },
1135
- 'bpmn:CallActivity': function(parentGfx, element) {
1136
- return renderer('bpmn:SubProcess')(parentGfx, element, {
1165
+ 'bpmn:CallActivity': function(parentGfx, element, attrs) {
1166
+ attrs = assign({
1137
1167
  strokeWidth: 5
1138
- });
1139
- },
1140
- 'bpmn:Participant': function(parentGfx, element) {
1168
+ }, attrs);
1141
1169
 
1142
- var attrs = {
1170
+ return renderer('bpmn:SubProcess')(parentGfx, element, attrs);
1171
+ },
1172
+ 'bpmn:Participant': function(parentGfx, element, attrs) {
1173
+ var outerAttrs = assign({
1143
1174
  fillOpacity: DEFAULT_FILL_OPACITY,
1144
1175
  fill: getFillColor(element, defaultFillColor),
1145
1176
  stroke: getStrokeColor(element, defaultStrokeColor)
1146
- };
1177
+ }, attrs);
1147
1178
 
1148
- var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);
1179
+ var lane = renderer('bpmn:Lane')(parentGfx, element, outerAttrs);
1149
1180
 
1150
1181
  var expandedPool = isExpanded(element);
1151
1182
 
@@ -1153,9 +1184,9 @@ export default function BpmnRenderer(
1153
1184
  drawLine(parentGfx, [
1154
1185
  { x: 30, y: 0 },
1155
1186
  { x: 30, y: element.height }
1156
- ], {
1187
+ ], assign({
1157
1188
  stroke: getStrokeColor(element, defaultStrokeColor)
1158
- });
1189
+ }, attrs));
1159
1190
  var text = getSemantic(element).name;
1160
1191
  renderLaneLabel(parentGfx, text, element);
1161
1192
  } else {
@@ -1173,7 +1204,7 @@ export default function BpmnRenderer(
1173
1204
  var participantMultiplicity = !!(getSemantic(element).participantMultiplicity);
1174
1205
 
1175
1206
  if (participantMultiplicity) {
1176
- renderer('ParticipantMultiplicityMarker')(parentGfx, element);
1207
+ renderer('ParticipantMultiplicityMarker')(parentGfx, element, attrs);
1177
1208
  }
1178
1209
 
1179
1210
  return lane;
@@ -1194,20 +1225,23 @@ export default function BpmnRenderer(
1194
1225
 
1195
1226
  return rect;
1196
1227
  },
1197
- 'bpmn:InclusiveGateway': function(parentGfx, element) {
1198
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
1228
+ 'bpmn:InclusiveGateway': function(parentGfx, element, attrs) {
1229
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
1199
1230
 
1200
- /* circle path */
1201
- drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {
1231
+
1232
+ var circleAttrs = assign({
1202
1233
  strokeWidth: 2.5,
1203
1234
  fill: getFillColor(element, defaultFillColor),
1204
1235
  stroke: getStrokeColor(element, defaultStrokeColor)
1205
- });
1236
+ }, attrs);
1237
+
1238
+ /* circle path */
1239
+ drawCircle(parentGfx, element.width, element.height, element.height * 0.24, circleAttrs);
1206
1240
 
1207
1241
  return diamond;
1208
1242
  },
1209
- 'bpmn:ExclusiveGateway': function(parentGfx, element) {
1210
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
1243
+ 'bpmn:ExclusiveGateway': function(parentGfx, element, attrs) {
1244
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
1211
1245
 
1212
1246
  var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {
1213
1247
  xScaleFactor: 0.4,
@@ -1221,17 +1255,17 @@ export default function BpmnRenderer(
1221
1255
  });
1222
1256
 
1223
1257
  if ((getDi(element).isMarkerVisible)) {
1224
- drawPath(parentGfx, pathData, {
1258
+ drawPath(parentGfx, pathData, assign({
1225
1259
  strokeWidth: 1,
1226
1260
  fill: getStrokeColor(element, defaultStrokeColor),
1227
1261
  stroke: getStrokeColor(element, defaultStrokeColor)
1228
- });
1262
+ }, attrs));
1229
1263
  }
1230
1264
 
1231
1265
  return diamond;
1232
1266
  },
1233
- 'bpmn:ComplexGateway': function(parentGfx, element) {
1234
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
1267
+ 'bpmn:ComplexGateway': function(parentGfx, element, attrs) {
1268
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
1235
1269
 
1236
1270
  var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {
1237
1271
  xScaleFactor: 0.5,
@@ -1244,16 +1278,17 @@ export default function BpmnRenderer(
1244
1278
  }
1245
1279
  });
1246
1280
 
1247
- /* complex path */ drawPath(parentGfx, pathData, {
1281
+ var innerAttrs = assign({
1248
1282
  strokeWidth: 1,
1249
1283
  fill: getStrokeColor(element, defaultStrokeColor),
1250
1284
  stroke: getStrokeColor(element, defaultStrokeColor)
1251
- });
1285
+ }, attrs);
1286
+ /* complex path */ drawPath(parentGfx, pathData, innerAttrs);
1252
1287
 
1253
1288
  return diamond;
1254
1289
  },
1255
- 'bpmn:ParallelGateway': function(parentGfx, element) {
1256
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
1290
+ 'bpmn:ParallelGateway': function(parentGfx, element, attrs) {
1291
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
1257
1292
 
1258
1293
  var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
1259
1294
  xScaleFactor: 0.6,
@@ -1266,25 +1301,27 @@ export default function BpmnRenderer(
1266
1301
  }
1267
1302
  });
1268
1303
 
1269
- /* parallel path */ drawPath(parentGfx, pathData, {
1304
+ var innerAttrs = assign({
1270
1305
  strokeWidth: 1,
1271
1306
  fill: getStrokeColor(element, defaultStrokeColor),
1272
1307
  stroke: getStrokeColor(element, defaultStrokeColor)
1273
- });
1308
+ }, attrs);
1309
+ /* parallel path */ drawPath(parentGfx, pathData, innerAttrs);
1274
1310
 
1275
1311
  return diamond;
1276
1312
  },
1277
- 'bpmn:EventBasedGateway': function(parentGfx, element) {
1313
+ 'bpmn:EventBasedGateway': function(parentGfx, element, attrs) {
1278
1314
 
1279
1315
  var semantic = getSemantic(element);
1280
1316
 
1281
- var diamond = renderer('bpmn:Gateway')(parentGfx, element);
1317
+ var diamond = renderer('bpmn:Gateway')(parentGfx, element, attrs);
1282
1318
 
1283
- /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {
1319
+ var outerAttrs = assign({
1284
1320
  strokeWidth: 1,
1285
1321
  fill: 'none',
1286
1322
  stroke: getStrokeColor(element, defaultStrokeColor)
1287
- });
1323
+ }, attrs);
1324
+ /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, outerAttrs);
1288
1325
 
1289
1326
  var type = semantic.eventGatewayType;
1290
1327
  var instantiate = !!semantic.instantiate;
@@ -1302,13 +1339,12 @@ export default function BpmnRenderer(
1302
1339
  }
1303
1340
  });
1304
1341
 
1305
- var attrs = {
1342
+ var innerAttrs = assign({
1306
1343
  strokeWidth: 2,
1307
1344
  fill: getFillColor(element, 'none'),
1308
1345
  stroke: getStrokeColor(element, defaultStrokeColor)
1309
- };
1310
-
1311
- /* event path */ drawPath(parentGfx, pathData, attrs);
1346
+ }, attrs);
1347
+ /* event path */ drawPath(parentGfx, pathData, innerAttrs);
1312
1348
  }
1313
1349
 
1314
1350
  if (type === 'Parallel') {
@@ -1324,7 +1360,7 @@ export default function BpmnRenderer(
1324
1360
  }
1325
1361
  });
1326
1362
 
1327
- var parallelPath = drawPath(parentGfx, pathData);
1363
+ var parallelPath = drawPath(parentGfx, pathData, attrs);
1328
1364
  svgAttr(parallelPath, {
1329
1365
  strokeWidth: 1,
1330
1366
  fill: 'none'
@@ -1332,12 +1368,12 @@ export default function BpmnRenderer(
1332
1368
  } else if (type === 'Exclusive') {
1333
1369
 
1334
1370
  if (!instantiate) {
1335
- var innerCircle = drawCircle(parentGfx, element.width, element.height, element.height * 0.26);
1336
- svgAttr(innerCircle, {
1371
+ var innerCircleAttrs = assign({
1337
1372
  strokeWidth: 1,
1338
1373
  fill: 'none',
1339
1374
  stroke: getStrokeColor(element, defaultStrokeColor)
1340
- });
1375
+ }, attrs);
1376
+ drawCircle(parentGfx, element.width, element.height, element.height * 0.26, innerCircleAttrs);
1341
1377
  }
1342
1378
 
1343
1379
  drawEvent();
@@ -1346,26 +1382,28 @@ export default function BpmnRenderer(
1346
1382
 
1347
1383
  return diamond;
1348
1384
  },
1349
- 'bpmn:Gateway': function(parentGfx, element) {
1350
- var attrs = {
1385
+ 'bpmn:Gateway': function(parentGfx, element, attrs) {
1386
+ attrs = assign({
1351
1387
  fill: getFillColor(element, defaultFillColor),
1352
1388
  fillOpacity: DEFAULT_FILL_OPACITY,
1353
1389
  stroke: getStrokeColor(element, defaultStrokeColor)
1354
- };
1390
+ }, attrs);
1355
1391
 
1356
1392
  return drawDiamond(parentGfx, element.width, element.height, attrs);
1357
1393
  },
1358
- 'bpmn:SequenceFlow': function(parentGfx, element) {
1394
+ 'bpmn:SequenceFlow': function(parentGfx, element, attrs) {
1395
+ attrs = attrs || {};
1396
+
1359
1397
  var pathData = createPathFromConnection(element);
1360
1398
 
1361
- var fill = getFillColor(element, defaultFillColor),
1362
- stroke = getStrokeColor(element, defaultStrokeColor);
1399
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
1400
+ stroke = attrs.stroke || getStrokeColor(element, defaultStrokeColor);
1363
1401
 
1364
- var attrs = {
1402
+ attrs = assign({
1365
1403
  strokeLinejoin: 'round',
1366
1404
  markerEnd: marker('sequenceflow-end', fill, stroke),
1367
1405
  stroke: getStrokeColor(element, defaultStrokeColor)
1368
- };
1406
+ }, attrs || {});
1369
1407
 
1370
1408
  var path = drawPath(parentGfx, pathData, attrs);
1371
1409
 
@@ -1419,41 +1457,52 @@ export default function BpmnRenderer(
1419
1457
 
1420
1458
  return drawLine(parentGfx, element.waypoints, attrs);
1421
1459
  },
1422
- 'bpmn:DataInputAssociation': function(parentGfx, element) {
1423
- var fill = getFillColor(element, defaultFillColor),
1424
- stroke = getStrokeColor(element, defaultStrokeColor);
1460
+ 'bpmn:DataInputAssociation': function(parentGfx, element, attrs) {
1461
+ attrs = attrs || {};
1462
+
1463
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
1464
+ stroke = attrs.stroke || getStrokeColor(element, defaultStrokeColor);
1425
1465
 
1426
- return renderer('bpmn:Association')(parentGfx, element, {
1466
+ attrs = assign({
1427
1467
  markerEnd: marker('association-end', fill, stroke)
1428
- });
1468
+ }, attrs);
1469
+
1470
+ return renderer('bpmn:Association')(parentGfx, element, attrs);
1429
1471
  },
1430
- 'bpmn:DataOutputAssociation': function(parentGfx, element) {
1431
- var fill = getFillColor(element, defaultFillColor),
1432
- stroke = getStrokeColor(element, defaultStrokeColor);
1472
+ 'bpmn:DataOutputAssociation': function(parentGfx, element, attrs) {
1473
+ attrs = attrs || {};
1474
+
1475
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
1476
+ stroke = attrs.stroke || getStrokeColor(element, defaultStrokeColor);
1433
1477
 
1434
- return renderer('bpmn:Association')(parentGfx, element, {
1478
+
1479
+ attrs = assign({
1435
1480
  markerEnd: marker('association-end', fill, stroke)
1436
- });
1481
+ }, attrs);
1482
+
1483
+ return renderer('bpmn:Association')(parentGfx, element, attrs);
1437
1484
  },
1438
- 'bpmn:MessageFlow': function(parentGfx, element) {
1485
+ 'bpmn:MessageFlow': function(parentGfx, element, attrs) {
1486
+ attrs = attrs || {};
1439
1487
 
1440
1488
  var semantic = getSemantic(element),
1441
1489
  di = getDi(element);
1442
1490
 
1443
- var fill = getFillColor(element, defaultFillColor),
1444
- stroke = getStrokeColor(element, defaultStrokeColor);
1491
+ var fill = attrs.fill || getFillColor(element, defaultFillColor),
1492
+ stroke = attrs.stroke || getStrokeColor(element, defaultStrokeColor);
1445
1493
 
1446
1494
  var pathData = createPathFromConnection(element);
1447
1495
 
1448
- var attrs = {
1496
+
1497
+ attrs = assign({
1449
1498
  markerEnd: marker('messageflow-end', fill, stroke),
1450
1499
  markerStart: marker('messageflow-start', fill, stroke),
1451
1500
  strokeDasharray: '10, 12',
1452
1501
  strokeLinecap: 'round',
1453
1502
  strokeLinejoin: 'round',
1454
1503
  strokeWidth: '1.5px',
1455
- stroke: getStrokeColor(element, defaultStrokeColor)
1456
- };
1504
+ stroke: stroke
1505
+ }, attrs);
1457
1506
 
1458
1507
  var path = drawPath(parentGfx, pathData, attrs);
1459
1508
 
@@ -1500,7 +1549,7 @@ export default function BpmnRenderer(
1500
1549
 
1501
1550
  return path;
1502
1551
  },
1503
- 'bpmn:DataObject': function(parentGfx, element) {
1552
+ 'bpmn:DataObject': function(parentGfx, element, attrs) {
1504
1553
  var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {
1505
1554
  xScaleFactor: 1,
1506
1555
  yScaleFactor: 1,
@@ -1512,46 +1561,56 @@ export default function BpmnRenderer(
1512
1561
  }
1513
1562
  });
1514
1563
 
1515
- var elementObject = drawPath(parentGfx, pathData, {
1564
+ var outerAttrs = assign({
1516
1565
  fill: getFillColor(element, defaultFillColor),
1517
1566
  fillOpacity: DEFAULT_FILL_OPACITY,
1518
1567
  stroke: getStrokeColor(element, defaultStrokeColor)
1519
- });
1568
+ }, attrs);
1569
+ var elementObject = drawPath(parentGfx, pathData, outerAttrs);
1520
1570
 
1521
1571
  var semantic = getSemantic(element);
1522
1572
 
1523
1573
  if (isCollection(semantic)) {
1524
- renderDataItemCollection(parentGfx, element);
1574
+ renderDataItemCollection(parentGfx, element, attrs);
1525
1575
  }
1526
1576
 
1527
1577
  return elementObject;
1528
1578
  },
1529
1579
  'bpmn:DataObjectReference': as('bpmn:DataObject'),
1530
- 'bpmn:DataInput': function(parentGfx, element) {
1580
+ 'bpmn:DataInput': function(parentGfx, element, attrs) {
1531
1581
 
1532
1582
  var arrowPathData = pathMap.getRawPath('DATA_ARROW');
1533
1583
 
1534
1584
  // page
1535
- var elementObject = renderer('bpmn:DataObject')(parentGfx, element);
1585
+ var elementObject = renderer('bpmn:DataObject')(parentGfx, element, attrs);
1536
1586
 
1537
- /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });
1587
+ var innerAttrs = assign({ strokeWidth: 1 }, attrs);
1588
+ /* input arrow path */ drawPath(parentGfx, arrowPathData, innerAttrs);
1538
1589
 
1539
1590
  return elementObject;
1540
1591
  },
1541
- 'bpmn:DataOutput': function(parentGfx, element) {
1592
+ 'bpmn:DataOutput': function(parentGfx, element, attrs) {
1542
1593
  var arrowPathData = pathMap.getRawPath('DATA_ARROW');
1543
1594
 
1544
1595
  // page
1545
- var elementObject = renderer('bpmn:DataObject')(parentGfx, element);
1596
+ var elementObject = renderer('bpmn:DataObject')(parentGfx, element, attrs);
1546
1597
 
1547
- /* output arrow path */ drawPath(parentGfx, arrowPathData, {
1598
+ var arrowAttrs = assign({
1548
1599
  strokeWidth: 1,
1549
1600
  fill: 'black'
1550
- });
1601
+ }, attrs);
1602
+ /* output arrow path */ drawPath(parentGfx, arrowPathData, arrowAttrs);
1551
1603
 
1552
1604
  return elementObject;
1553
1605
  },
1554
- 'bpmn:DataStoreReference': function(parentGfx, element) {
1606
+ 'bpmn:DataStoreReference': function(parentGfx, element, attrs) {
1607
+ attrs = assign({
1608
+ strokeWidth: 2,
1609
+ fill: getFillColor(element, defaultFillColor),
1610
+ fillOpacity: DEFAULT_FILL_OPACITY,
1611
+ stroke: getStrokeColor(element, defaultStrokeColor)
1612
+ }, attrs);
1613
+
1555
1614
  var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {
1556
1615
  xScaleFactor: 1,
1557
1616
  yScaleFactor: 1,
@@ -1563,25 +1622,20 @@ export default function BpmnRenderer(
1563
1622
  }
1564
1623
  });
1565
1624
 
1566
- var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {
1567
- strokeWidth: 2,
1568
- fill: getFillColor(element, defaultFillColor),
1569
- fillOpacity: DEFAULT_FILL_OPACITY,
1570
- stroke: getStrokeColor(element, defaultStrokeColor)
1571
- });
1625
+ var elementStore = drawPath(parentGfx, DATA_STORE_PATH, attrs);
1572
1626
 
1573
1627
  return elementStore;
1574
1628
  },
1575
- 'bpmn:BoundaryEvent': function(parentGfx, element) {
1629
+ 'bpmn:BoundaryEvent': function(parentGfx, element, attrs) {
1576
1630
 
1577
1631
  var semantic = getSemantic(element),
1578
1632
  cancel = semantic.cancelActivity;
1579
1633
 
1580
- var attrs = {
1634
+ attrs = assign({
1581
1635
  strokeWidth: 1,
1582
1636
  fill: getFillColor(element, defaultFillColor),
1583
1637
  stroke: getStrokeColor(element, defaultStrokeColor)
1584
- };
1638
+ }, attrs);
1585
1639
 
1586
1640
  if (!cancel) {
1587
1641
  attrs.strokeDasharray = '6';
@@ -1602,30 +1656,32 @@ export default function BpmnRenderer(
1602
1656
 
1603
1657
  /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);
1604
1658
 
1605
- renderEventContent(element, parentGfx);
1659
+ renderEventContent(element, parentGfx, attrs);
1606
1660
 
1607
1661
  return outer;
1608
1662
  },
1609
- 'bpmn:Group': function(parentGfx, element) {
1663
+ 'bpmn:Group': function(parentGfx, element, attrs) {
1610
1664
 
1611
- var group = drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {
1665
+ attrs = assign({
1612
1666
  stroke: getStrokeColor(element, defaultStrokeColor),
1613
1667
  strokeWidth: 1,
1614
1668
  strokeDasharray: '8,3,1,3',
1615
1669
  fill: 'none',
1616
1670
  pointerEvents: 'none'
1617
- });
1671
+ }, attrs);
1672
+
1673
+ var group = drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);
1618
1674
 
1619
1675
  return group;
1620
1676
  },
1621
1677
  'label': function(parentGfx, element) {
1622
1678
  return renderExternalLabel(parentGfx, element);
1623
1679
  },
1624
- 'bpmn:TextAnnotation': function(parentGfx, element) {
1625
- var style = {
1680
+ 'bpmn:TextAnnotation': function(parentGfx, element, attrs) {
1681
+ var style = assign({}, attrs, {
1626
1682
  'fill': 'none',
1627
1683
  'stroke': 'none'
1628
- };
1684
+ });
1629
1685
 
1630
1686
  var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, style);
1631
1687
 
@@ -1640,9 +1696,10 @@ export default function BpmnRenderer(
1640
1696
  }
1641
1697
  });
1642
1698
 
1643
- drawPath(parentGfx, textPathData, {
1699
+ var pathAttrs = assign({
1644
1700
  stroke: getStrokeColor(element, defaultStrokeColor)
1645
- });
1701
+ }, attrs);
1702
+ drawPath(parentGfx, textPathData, pathAttrs);
1646
1703
 
1647
1704
  var text = getSemantic(element).text || '';
1648
1705
  renderLabel(parentGfx, text, {
@@ -1656,7 +1713,13 @@ export default function BpmnRenderer(
1656
1713
 
1657
1714
  return textElement;
1658
1715
  },
1659
- 'ParticipantMultiplicityMarker': function(parentGfx, element) {
1716
+ 'ParticipantMultiplicityMarker': function(parentGfx, element, attrs) {
1717
+ attrs = assign({
1718
+ strokeWidth: 2,
1719
+ fill: getFillColor(element, defaultFillColor),
1720
+ stroke: getStrokeColor(element, defaultStrokeColor)
1721
+ }, attrs);
1722
+
1660
1723
  var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
1661
1724
  xScaleFactor: 1,
1662
1725
  yScaleFactor: 1,
@@ -1668,18 +1731,15 @@ export default function BpmnRenderer(
1668
1731
  }
1669
1732
  });
1670
1733
 
1671
- drawMarker('participant-multiplicity', parentGfx, markerPath, {
1672
- strokeWidth: 2,
1673
- fill: getFillColor(element, defaultFillColor),
1674
- stroke: getStrokeColor(element, defaultStrokeColor)
1675
- });
1734
+ drawMarker('participant-multiplicity', parentGfx, markerPath, attrs);
1676
1735
  },
1677
- 'SubProcessMarker': function(parentGfx, element) {
1678
- var markerRect = drawRect(parentGfx, 14, 14, 0, {
1679
- strokeWidth: 1,
1736
+ 'SubProcessMarker': function(parentGfx, element, attrs) {
1737
+ attrs = assign({
1680
1738
  fill: getFillColor(element, defaultFillColor),
1681
1739
  stroke: getStrokeColor(element, defaultStrokeColor)
1682
- });
1740
+ }, attrs);
1741
+
1742
+ var markerRect = drawRect(parentGfx, 14, 14, 0, assign({ strokeWidth: 1 }, attrs));
1683
1743
 
1684
1744
  // Process marker is placed in the middle of the box
1685
1745
  // therefore fixed values can be used here
@@ -1696,12 +1756,14 @@ export default function BpmnRenderer(
1696
1756
  }
1697
1757
  });
1698
1758
 
1699
- drawMarker('sub-process', parentGfx, markerPath, {
1759
+ drawMarker('sub-process', parentGfx, markerPath, attrs);
1760
+ },
1761
+ 'ParallelMarker': function(parentGfx, element, attrs, position) {
1762
+ attrs = assign({
1700
1763
  fill: getFillColor(element, defaultFillColor),
1701
1764
  stroke: getStrokeColor(element, defaultStrokeColor)
1702
- });
1703
- },
1704
- 'ParallelMarker': function(parentGfx, element, position) {
1765
+ }, attrs);
1766
+
1705
1767
  var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
1706
1768
  xScaleFactor: 1,
1707
1769
  yScaleFactor: 1,
@@ -1713,12 +1775,13 @@ export default function BpmnRenderer(
1713
1775
  }
1714
1776
  });
1715
1777
 
1716
- drawMarker('parallel', parentGfx, markerPath, {
1778
+ drawMarker('parallel', parentGfx, markerPath, attrs);
1779
+ },
1780
+ 'SequentialMarker': function(parentGfx, element, attrs, position) {
1781
+ attrs = assign({
1717
1782
  fill: getFillColor(element, defaultFillColor),
1718
1783
  stroke: getStrokeColor(element, defaultStrokeColor)
1719
- });
1720
- },
1721
- 'SequentialMarker': function(parentGfx, element, position) {
1784
+ }, attrs);
1722
1785
  var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {
1723
1786
  xScaleFactor: 1,
1724
1787
  yScaleFactor: 1,
@@ -1730,12 +1793,15 @@ export default function BpmnRenderer(
1730
1793
  }
1731
1794
  });
1732
1795
 
1733
- drawMarker('sequential', parentGfx, markerPath, {
1796
+ drawMarker('sequential', parentGfx, markerPath, attrs);
1797
+ },
1798
+ 'CompensationMarker': function(parentGfx, element, attrs, position) {
1799
+ attrs = assign({
1800
+ strokeWidth: 1,
1734
1801
  fill: getFillColor(element, defaultFillColor),
1735
1802
  stroke: getStrokeColor(element, defaultStrokeColor)
1736
- });
1737
- },
1738
- 'CompensationMarker': function(parentGfx, element, position) {
1803
+ }, attrs);
1804
+
1739
1805
  var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {
1740
1806
  xScaleFactor: 1,
1741
1807
  yScaleFactor: 1,
@@ -1747,13 +1813,17 @@ export default function BpmnRenderer(
1747
1813
  }
1748
1814
  });
1749
1815
 
1750
- drawMarker('compensation', parentGfx, markerMath, {
1816
+ drawMarker('compensation', parentGfx, markerMath, attrs);
1817
+ },
1818
+ 'LoopMarker': function(parentGfx, element, attrs, position) {
1819
+ attrs = assign({
1751
1820
  strokeWidth: 1,
1752
1821
  fill: getFillColor(element, defaultFillColor),
1753
- stroke: getStrokeColor(element, defaultStrokeColor)
1754
- });
1755
- },
1756
- 'LoopMarker': function(parentGfx, element, position) {
1822
+ stroke: getStrokeColor(element, defaultStrokeColor),
1823
+ strokeLinecap: 'round',
1824
+ strokeMiterlimit: 0.5
1825
+ }, attrs);
1826
+
1757
1827
  var markerPath = pathMap.getScaledPath('MARKER_LOOP', {
1758
1828
  xScaleFactor: 1,
1759
1829
  yScaleFactor: 1,
@@ -1765,15 +1835,15 @@ export default function BpmnRenderer(
1765
1835
  }
1766
1836
  });
1767
1837
 
1768
- drawMarker('loop', parentGfx, markerPath, {
1769
- strokeWidth: 1,
1770
- fill: getFillColor(element, defaultFillColor),
1771
- stroke: getStrokeColor(element, defaultStrokeColor),
1772
- strokeLinecap: 'round',
1773
- strokeMiterlimit: 0.5
1774
- });
1838
+ drawMarker('loop', parentGfx, markerPath, attrs);
1775
1839
  },
1776
- 'AdhocMarker': function(parentGfx, element, position) {
1840
+ 'AdhocMarker': function(parentGfx, element, attrs, position) {
1841
+ attrs = assign({
1842
+ strokeWidth: 1,
1843
+ fill: getStrokeColor(element, defaultStrokeColor),
1844
+ stroke: getStrokeColor(element, defaultStrokeColor)
1845
+ }, attrs);
1846
+
1777
1847
  var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {
1778
1848
  xScaleFactor: 1,
1779
1849
  yScaleFactor: 1,
@@ -1785,15 +1855,11 @@ export default function BpmnRenderer(
1785
1855
  }
1786
1856
  });
1787
1857
 
1788
- drawMarker('adhoc', parentGfx, markerPath, {
1789
- strokeWidth: 1,
1790
- fill: getStrokeColor(element, defaultStrokeColor),
1791
- stroke: getStrokeColor(element, defaultStrokeColor)
1792
- });
1858
+ drawMarker('adhoc', parentGfx, markerPath, attrs);
1793
1859
  }
1794
1860
  };
1795
1861
 
1796
- function attachTaskMarkers(parentGfx, element, taskMarkers) {
1862
+ function attachTaskMarkers(parentGfx, element, attrs, taskMarkers) {
1797
1863
  var obj = getSemantic(element);
1798
1864
 
1799
1865
  var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;
@@ -1818,15 +1884,15 @@ export default function BpmnRenderer(
1818
1884
  }
1819
1885
 
1820
1886
  forEach(taskMarkers, function(marker) {
1821
- renderer(marker)(parentGfx, element, position);
1887
+ renderer(marker)(parentGfx, element, attrs, position);
1822
1888
  });
1823
1889
 
1824
1890
  if (obj.isForCompensation) {
1825
- renderer('CompensationMarker')(parentGfx, element, position);
1891
+ renderer('CompensationMarker')(parentGfx, element, attrs, position);
1826
1892
  }
1827
1893
 
1828
1894
  if (obj.$type === 'bpmn:AdHocSubProcess') {
1829
- renderer('AdhocMarker')(parentGfx, element, position);
1895
+ renderer('AdhocMarker')(parentGfx, element, attrs, position);
1830
1896
  }
1831
1897
 
1832
1898
  var loopCharacteristics = obj.loopCharacteristics,
@@ -1835,20 +1901,23 @@ export default function BpmnRenderer(
1835
1901
  if (loopCharacteristics) {
1836
1902
 
1837
1903
  if (isSequential === undefined) {
1838
- renderer('LoopMarker')(parentGfx, element, position);
1904
+ renderer('LoopMarker')(parentGfx, element, attrs, position);
1839
1905
  }
1840
1906
 
1841
1907
  if (isSequential === false) {
1842
- renderer('ParallelMarker')(parentGfx, element, position);
1908
+ renderer('ParallelMarker')(parentGfx, element, attrs, position);
1843
1909
  }
1844
1910
 
1845
1911
  if (isSequential === true) {
1846
- renderer('SequentialMarker')(parentGfx, element, position);
1912
+ renderer('SequentialMarker')(parentGfx, element, attrs, position);
1847
1913
  }
1848
1914
  }
1849
1915
  }
1850
1916
 
1851
- function renderDataItemCollection(parentGfx, element) {
1917
+ function renderDataItemCollection(parentGfx, element, attrs) {
1918
+ attrs = assign({
1919
+ strokeWidth: 2
1920
+ }, attrs);
1852
1921
 
1853
1922
  var yPosition = (element.height - 18) / element.height;
1854
1923
 
@@ -1863,9 +1932,7 @@ export default function BpmnRenderer(
1863
1932
  }
1864
1933
  });
1865
1934
 
1866
- /* collection path */ drawPath(parentGfx, pathData, {
1867
- strokeWidth: 2
1868
- });
1935
+ /* collection path */ drawPath(parentGfx, pathData, attrs);
1869
1936
  }
1870
1937
 
1871
1938
 
@@ -1891,20 +1958,20 @@ BpmnRenderer.prototype.canRender = function(element) {
1891
1958
  return is(element, 'bpmn:BaseElement');
1892
1959
  };
1893
1960
 
1894
- BpmnRenderer.prototype.drawShape = function(parentGfx, element) {
1961
+ BpmnRenderer.prototype.drawShape = function(parentGfx, element, attrs) {
1895
1962
  var type = element.type;
1896
1963
  var h = this.handlers[type];
1897
1964
 
1898
1965
  /* jshint -W040 */
1899
- return h(parentGfx, element);
1966
+ return h(parentGfx, element, attrs);
1900
1967
  };
1901
1968
 
1902
- BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {
1969
+ BpmnRenderer.prototype.drawConnection = function(parentGfx, element, attrs) {
1903
1970
  var type = element.type;
1904
1971
  var h = this.handlers[type];
1905
1972
 
1906
1973
  /* jshint -W040 */
1907
- return h(parentGfx, element);
1974
+ return h(parentGfx, element, attrs);
1908
1975
  };
1909
1976
 
1910
1977
  BpmnRenderer.prototype.getShapePath = function(element) {