GlobalConnect.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. var MARKER_OK = 'connect-ok',
  2. MARKER_NOT_OK = 'connect-not-ok';
  3. /**
  4. * @class
  5. * @constructor
  6. *
  7. * @param {EventBus} eventBus
  8. * @param {Dragging} dragging
  9. * @param {Connect} connect
  10. * @param {Canvas} canvas
  11. * @param {ToolManager} toolManager
  12. * @param {Rules} rules
  13. * @param {Mouse} mouse
  14. */
  15. export default function GlobalConnect(
  16. eventBus, dragging, connect,
  17. canvas, toolManager, rules,
  18. mouse) {
  19. var self = this;
  20. this._dragging = dragging;
  21. this._rules = rules;
  22. this._mouse = mouse;
  23. toolManager.registerTool('global-connect', {
  24. tool: 'global-connect',
  25. dragging: 'global-connect.drag'
  26. });
  27. eventBus.on('global-connect.hover', function(event) {
  28. var context = event.context,
  29. startTarget = event.hover;
  30. var canStartConnect = context.canStartConnect = self.canStartConnect(startTarget);
  31. // simply ignore hover
  32. if (canStartConnect === null) {
  33. return;
  34. }
  35. context.startTarget = startTarget;
  36. canvas.addMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);
  37. });
  38. eventBus.on([ 'global-connect.out', 'global-connect.cleanup' ], function(event) {
  39. var startTarget = event.context.startTarget,
  40. canStartConnect = event.context.canStartConnect;
  41. if (startTarget) {
  42. canvas.removeMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);
  43. }
  44. });
  45. eventBus.on([ 'global-connect.ended' ], function(event) {
  46. var context = event.context,
  47. startTarget = context.startTarget,
  48. startPosition = {
  49. x: event.x,
  50. y: event.y
  51. };
  52. var canStartConnect = self.canStartConnect(startTarget);
  53. if (!canStartConnect) {
  54. return;
  55. }
  56. eventBus.once('element.out', function() {
  57. eventBus.once([ 'connect.ended', 'connect.canceled' ], function() {
  58. eventBus.fire('global-connect.drag.ended');
  59. });
  60. connect.start(null, startTarget, startPosition);
  61. });
  62. return false;
  63. });
  64. }
  65. GlobalConnect.$inject = [
  66. 'eventBus',
  67. 'dragging',
  68. 'connect',
  69. 'canvas',
  70. 'toolManager',
  71. 'rules',
  72. 'mouse'
  73. ];
  74. /**
  75. * Initiates tool activity.
  76. */
  77. GlobalConnect.prototype.start = function(event, autoActivate) {
  78. this._dragging.init(event, 'global-connect', {
  79. autoActivate: autoActivate,
  80. trapClick: false,
  81. data: {
  82. context: {}
  83. }
  84. });
  85. };
  86. GlobalConnect.prototype.toggle = function() {
  87. if (this.isActive()) {
  88. return this._dragging.cancel();
  89. }
  90. var mouseEvent = this._mouse.getLastMoveEvent();
  91. return this.start(mouseEvent, !!mouseEvent);
  92. };
  93. GlobalConnect.prototype.isActive = function() {
  94. var context = this._dragging.context();
  95. return context && /^global-connect/.test(context.prefix);
  96. };
  97. /**
  98. * Check if source shape can initiate connection.
  99. *
  100. * @param {Shape} startTarget
  101. * @return {boolean}
  102. */
  103. GlobalConnect.prototype.canStartConnect = function(startTarget) {
  104. return this._rules.allowed('connection.start', { source: startTarget });
  105. };