Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
b94cec7e50
commit
fbb37983c3
218
js/ui/mxgraph/src/js/handler/mxPopupMenuHandler.js
Normal file
218
js/ui/mxgraph/src/js/handler/mxPopupMenuHandler.js
Normal file
|
@ -0,0 +1,218 @@
|
|||
/**
|
||||
* 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);
|
||||
};
|
Loading…
Reference in New Issue
Block a user