CreateElementsHandler.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import {
  2. assign,
  3. filter,
  4. forEach,
  5. isNumber,
  6. map,
  7. pick,
  8. values
  9. } from 'min-dash';
  10. import {
  11. getBBox,
  12. getParents
  13. } from '../../../util/Elements';
  14. var round = Math.round;
  15. export default function CreateElementsHandler(modeling) {
  16. this._modeling = modeling;
  17. }
  18. CreateElementsHandler.$inject = [
  19. 'modeling'
  20. ];
  21. CreateElementsHandler.prototype.preExecute = function(context) {
  22. var elements = context.elements,
  23. parent = context.parent,
  24. parentIndex = context.parentIndex,
  25. position = context.position,
  26. hints = context.hints;
  27. var modeling = this._modeling;
  28. // make sure each element has x and y
  29. forEach(elements, function(element) {
  30. if (!isNumber(element.x)) {
  31. element.x = 0;
  32. }
  33. if (!isNumber(element.y)) {
  34. element.y = 0;
  35. }
  36. });
  37. var visibleElements = filter(elements, function(element) {
  38. return !element.hidden;
  39. });
  40. var bbox = getBBox(visibleElements);
  41. // center elements around position
  42. forEach(elements, function(element) {
  43. if (isConnection(element)) {
  44. element.waypoints = map(element.waypoints, function(waypoint) {
  45. return {
  46. x: round(waypoint.x - bbox.x - bbox.width / 2 + position.x),
  47. y: round(waypoint.y - bbox.y - bbox.height / 2 + position.y)
  48. };
  49. });
  50. }
  51. assign(element, {
  52. x: round(element.x - bbox.x - bbox.width / 2 + position.x),
  53. y: round(element.y - bbox.y - bbox.height / 2 + position.y)
  54. });
  55. });
  56. var parents = getParents(elements);
  57. var cache = {};
  58. forEach(elements, function(element) {
  59. if (isConnection(element)) {
  60. cache[ element.id ] = isNumber(parentIndex) ?
  61. modeling.createConnection(
  62. cache[ element.source.id ],
  63. cache[ element.target.id ],
  64. parentIndex,
  65. element,
  66. element.parent || parent,
  67. hints
  68. ) :
  69. modeling.createConnection(
  70. cache[ element.source.id ],
  71. cache[ element.target.id ],
  72. element,
  73. element.parent || parent,
  74. hints
  75. );
  76. return;
  77. }
  78. var createShapeHints = assign({}, hints);
  79. if (parents.indexOf(element) === -1) {
  80. createShapeHints.autoResize = false;
  81. }
  82. cache[ element.id ] = isNumber(parentIndex) ?
  83. modeling.createShape(
  84. element,
  85. pick(element, [ 'x', 'y', 'width', 'height' ]),
  86. element.parent || parent,
  87. parentIndex,
  88. createShapeHints
  89. ) :
  90. modeling.createShape(
  91. element,
  92. pick(element, [ 'x', 'y', 'width', 'height' ]),
  93. element.parent || parent,
  94. createShapeHints
  95. );
  96. });
  97. context.elements = values(cache);
  98. };
  99. // helpers //////////
  100. function isConnection(element) {
  101. return !!element.waypoints;
  102. }