actionsbuilder.contextMenu.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. var ActionsBuilder;
  2. (function (ActionsBuilder) {
  3. var ContextMenu = (function () {
  4. /*
  5. * Constructor
  6. * @param viewer: the graph viewer
  7. */
  8. function ContextMenu(viewer) {
  9. this.showing = false;
  10. this.savedColor = Raphael.rgb(255, 255, 255);
  11. this.overColor = Raphael.rgb(140, 200, 230);
  12. this._viewer = null;
  13. this.elements = [
  14. { text: "Reduce", node: null, action: "onReduce" },
  15. { text: "Delete", node: null, action: "onRemoveNode" },
  16. { text: "Delete branch", node: null, action: "onRemoveBranch" },
  17. { text: "Connect / Disconnect", node: null, action: "onDetachAction" },
  18. { text: "Copy", node: null, action: "onCopyStructure" },
  19. { text: "Paste", node: null, action: "onPasteStructure" },
  20. // Add other elements here
  21. { text: "", node: null, action: null } // Color separator (top)
  22. ];
  23. // Members
  24. this._viewer = viewer;
  25. // Configure
  26. this.attachControl(this._viewer.paper.canvas);
  27. }
  28. ContextMenu.prototype.attachControl = function (element) {
  29. var _this = this;
  30. var onClick = function (event) {
  31. var x = _this._viewer.mousex;
  32. var y = _this._viewer.mousey;
  33. // Remove all context menu nodes, and run action if selected
  34. if (_this.showing) {
  35. for (var i = 0; i < _this.elements.length; i++) {
  36. var element = _this.elements[i];
  37. if (element.action && element.node.rect.isPointInside(x, y)) {
  38. _this._viewer.utils[element.action]();
  39. _this._viewer.update();
  40. }
  41. element.node.rect.remove();
  42. element.node.text.remove();
  43. }
  44. }
  45. _this.showing = false;
  46. };
  47. var onMouseMove = function (event) {
  48. // Override context menu's node color if mouse is inside
  49. if (_this.showing) {
  50. for (var i = 0; i < _this.elements.length; i++) {
  51. var element = _this.elements[i];
  52. if (element.text === "")
  53. continue;
  54. var x = _this._viewer.mousex;
  55. var y = _this._viewer.mousey;
  56. if (element.node.rect.isPointInside(x, y)) {
  57. element.node.rect.attr("fill", _this.overColor);
  58. }
  59. else {
  60. element.node.rect.attr("fill", _this.savedColor);
  61. }
  62. }
  63. }
  64. };
  65. var onRightClick = function (event) {
  66. var x = _this._viewer.mousex;
  67. var y = _this._viewer.mousey;
  68. _this._viewer.onClick(event);
  69. // Set selected node
  70. var result = _this._viewer.traverseGraph(null, x, y, true);
  71. if (result.hit) {
  72. }
  73. // Properly draw the context menu on the screen
  74. if (y + (ActionsBuilder.Viewer.NODE_HEIGHT * _this.elements.length) > _this._viewer.viewerElement.offsetHeight + _this._viewer.viewerElement.scrollTop) {
  75. y = (ActionsBuilder.Viewer.NODE_HEIGHT * _this.elements.length);
  76. }
  77. if (x + ActionsBuilder.Viewer.NODE_WIDTH > _this._viewer.viewerElement.offsetWidth + _this._viewer.viewerElement.scrollLeft) {
  78. x -= ActionsBuilder.Viewer.NODE_WIDTH;
  79. }
  80. if (!_this.showing) {
  81. if (_this._viewer.selectedNode === null)
  82. return;
  83. // Create elements
  84. var yOffset = 10;
  85. for (var i = 0; i < _this.elements.length - 1; i++) {
  86. var element = _this.elements[i];
  87. element.node = _this._viewer._createNode(element.text, ActionsBuilder.Type.OBJECT, true);
  88. element.node.rect.attr("fill", Raphael.rgb(216, 216, 216));
  89. element.node.rect.attr("x", x);
  90. element.node.rect.attr("y", y + yOffset);
  91. element.node.text.attr("x", x + 5);
  92. element.node.text.attr("y", y + yOffset + element.node.rect.attr("height") / 2);
  93. yOffset += ActionsBuilder.Viewer.NODE_HEIGHT;
  94. }
  95. // Color separator
  96. var separator = _this.elements[_this.elements.length - 1];
  97. separator.node = _this._viewer._createNode("", ActionsBuilder.Type.OBJECT, true);
  98. separator.node.rect.attr("fill", _this._viewer.getNodeColor(_this._viewer.selectedNode.type, _this._viewer.selectedNode.node.detached));
  99. separator.node.rect.attr("x", x);
  100. separator.node.rect.attr("y", y);
  101. separator.node.rect.attr("height", 10);
  102. // Finish
  103. _this.showing = true;
  104. }
  105. else {
  106. onClick(event);
  107. onRightClick(event);
  108. }
  109. window.event.returnValue = false;
  110. };
  111. document.addEventListener("click", onClick);
  112. document.addEventListener("mousemove", onMouseMove);
  113. element.addEventListener("contextmenu", onRightClick);
  114. };
  115. return ContextMenu;
  116. })();
  117. ActionsBuilder.ContextMenu = ContextMenu;
  118. })(ActionsBuilder || (ActionsBuilder = {}));
  119. //# sourceMappingURL=actionsbuilder.contextMenu.js.map