GlobalConnect.js 2.7 KB

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