123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /**
- * Copyright (c) 2006-2015, JGraph Ltd
- * Copyright (c) 2006-2015, Gaudenz Alder
- */
- /**
- * Class: mxPopupMenuHandler
- *
- * Event handler that creates popupmenus.
- *
- * Constructor: mxPopupMenuHandler
- *
- * Constructs an event handler that creates a <mxPopupMenu>.
- */
- function mxPopupMenuHandler(graph, factoryMethod)
- {
- if (graph != null)
- {
- this.graph = graph;
- this.factoryMethod = factoryMethod;
- this.graph.addMouseListener(this);
-
- // Does not show menu if any touch gestures take place after the trigger
- this.gestureHandler = mxUtils.bind(this, function(sender, eo)
- {
- this.inTolerance = false;
- });
-
- this.graph.addListener(mxEvent.GESTURE, this.gestureHandler);
-
- this.init();
- }
- };
- /**
- * Extends mxPopupMenu.
- */
- mxPopupMenuHandler.prototype = new mxPopupMenu();
- mxPopupMenuHandler.prototype.constructor = mxPopupMenuHandler;
- /**
- * Variable: graph
- *
- * Reference to the enclosing <mxGraph>.
- */
- mxPopupMenuHandler.prototype.graph = null;
- /**
- * Variable: selectOnPopup
- *
- * Specifies if cells should be selected if a popupmenu is displayed for
- * them. Default is true.
- */
- mxPopupMenuHandler.prototype.selectOnPopup = true;
- /**
- * Variable: clearSelectionOnBackground
- *
- * Specifies if cells should be deselected if a popupmenu is displayed for
- * the diagram background. Default is true.
- */
- mxPopupMenuHandler.prototype.clearSelectionOnBackground = true;
- /**
- * Variable: triggerX
- *
- * X-coordinate of the mouse down event.
- */
- mxPopupMenuHandler.prototype.triggerX = null;
- /**
- * Variable: triggerY
- *
- * Y-coordinate of the mouse down event.
- */
- mxPopupMenuHandler.prototype.triggerY = null;
- /**
- * Variable: screenX
- *
- * Screen X-coordinate of the mouse down event.
- */
- mxPopupMenuHandler.prototype.screenX = null;
- /**
- * Variable: screenY
- *
- * Screen Y-coordinate of the mouse down event.
- */
- mxPopupMenuHandler.prototype.screenY = null;
- /**
- * Function: init
- *
- * Initializes the shapes required for this vertex handler.
- */
- mxPopupMenuHandler.prototype.init = function()
- {
- // Supercall
- mxPopupMenu.prototype.init.apply(this);
- // Hides the tooltip if the mouse is over
- // the context menu
- mxEvent.addGestureListeners(this.div, mxUtils.bind(this, function(evt)
- {
- this.graph.tooltipHandler.hide();
- }));
- };
- /**
- * Function: isSelectOnPopup
- *
- * Hook for returning if a cell should be selected for a given <mxMouseEvent>.
- * This implementation returns <selectOnPopup>.
- */
- mxPopupMenuHandler.prototype.isSelectOnPopup = function(me)
- {
- return this.selectOnPopup;
- };
- /**
- * Function: mouseDown
- *
- * Handles the event by initiating the panning. By consuming the event all
- * subsequent events of the gesture are redirected to this handler.
- */
- mxPopupMenuHandler.prototype.mouseDown = function(sender, me)
- {
- if (this.isEnabled() && !mxEvent.isMultiTouchEvent(me.getEvent()))
- {
- // Hides the popupmenu if is is being displayed
- this.hideMenu();
- this.triggerX = me.getGraphX();
- this.triggerY = me.getGraphY();
- this.screenX = mxEvent.getMainEvent(me.getEvent()).screenX;
- this.screenY = mxEvent.getMainEvent(me.getEvent()).screenY;
- this.popupTrigger = this.isPopupTrigger(me);
- this.inTolerance = true;
- }
- };
- /**
- * Function: mouseMove
- *
- * Handles the event by updating the panning on the graph.
- */
- mxPopupMenuHandler.prototype.mouseMove = function(sender, me)
- {
- // Popup trigger may change on mouseUp so ignore it
- if (this.inTolerance && this.screenX != null && this.screenY != null)
- {
- if (Math.abs(mxEvent.getMainEvent(me.getEvent()).screenX - this.screenX) > this.graph.tolerance ||
- Math.abs(mxEvent.getMainEvent(me.getEvent()).screenY - this.screenY) > this.graph.tolerance)
- {
- this.inTolerance = false;
- }
- }
- };
- /**
- * Function: mouseUp
- *
- * Handles the event by setting the translation on the view or showing the
- * popupmenu.
- */
- mxPopupMenuHandler.prototype.mouseUp = function(sender, me)
- {
- if (this.popupTrigger && this.inTolerance && this.triggerX != null && this.triggerY != null)
- {
- var cell = this.getCellForPopupEvent(me);
- // Selects the cell for which the context menu is being displayed
- if (this.graph.isEnabled() && this.isSelectOnPopup(me) &&
- cell != null && !this.graph.isCellSelected(cell))
- {
- this.graph.setSelectionCell(cell);
- }
- else if (this.clearSelectionOnBackground && cell == null)
- {
- this.graph.clearSelection();
- }
-
- // Hides the tooltip if there is one
- this.graph.tooltipHandler.hide();
- // Menu is shifted by 1 pixel so that the mouse up event
- // is routed via the underlying shape instead of the DIV
- var origin = mxUtils.getScrollOrigin();
- this.popup(me.getX() + origin.x + 1, me.getY() + origin.y + 1, cell, me.getEvent());
- me.consume();
- }
-
- this.popupTrigger = false;
- this.inTolerance = false;
- };
- /**
- * Function: getCellForPopupEvent
- *
- * Hook to return the cell for the mouse up popup trigger handling.
- */
- mxPopupMenuHandler.prototype.getCellForPopupEvent = function(me)
- {
- return me.getCell();
- };
- /**
- * Function: destroy
- *
- * Destroys the handler and all its resources and DOM nodes.
- */
- mxPopupMenuHandler.prototype.destroy = function()
- {
- this.graph.removeMouseListener(this);
- this.graph.removeListener(this.gestureHandler);
-
- // Supercall
- mxPopupMenu.prototype.destroy.apply(this);
- };
- __mxOutput.mxPopupMenuHandler = typeof mxPopupMenuHandler !== 'undefined' ? mxPopupMenuHandler : undefined;
|