Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
		
							parent
							
								
									b4c1e7050e
								
							
						
					
					
						commit
						dbf743afe7
					
				
							
								
								
									
										229
									
								
								js/ui/mxgraph/src/js/handler/mxElbowEdgeHandler.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								js/ui/mxgraph/src/js/handler/mxElbowEdgeHandler.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,229 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2015, JGraph Ltd
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2015, Gaudenz Alder
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Class: mxElbowEdgeHandler
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Graph event handler that reconnects edges and modifies control points and
 | 
				
			||||||
 | 
					 * the edge label location. Uses <mxTerminalMarker> for finding and
 | 
				
			||||||
 | 
					 * highlighting new source and target vertices. This handler is automatically
 | 
				
			||||||
 | 
					 * created in <mxGraph.createHandler>. It extends <mxEdgeHandler>.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Constructor: mxEdgeHandler
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Constructs an edge handler for the specified <mxCellState>.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Parameters:
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * state - <mxCellState> of the cell to be modified.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function mxElbowEdgeHandler(state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						mxEdgeHandler.call(this, state);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Extends mxEdgeHandler.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxUtils.extend(mxElbowEdgeHandler, mxEdgeHandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Specifies if a double click on the middle handle should call
 | 
				
			||||||
 | 
					 * <mxGraph.flipEdge>. Default is true.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.flipEnabled = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Variable: doubleClickOrientationResource
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Specifies the resource key for the tooltip to be displayed on the single
 | 
				
			||||||
 | 
					 * control point for routed edges. If the resource for this key does not
 | 
				
			||||||
 | 
					 * exist then the value is used as the error message. Default is
 | 
				
			||||||
 | 
					 * 'doubleClickOrientation'.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.doubleClickOrientationResource =
 | 
				
			||||||
 | 
						(mxClient.language != 'none') ? 'doubleClickOrientation' : '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: createBends
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Overrides <mxEdgeHandler.createBends> to create custom bends.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 mxElbowEdgeHandler.prototype.createBends = function()
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
						var bends = [];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Source
 | 
				
			||||||
 | 
						var bend = this.createHandleShape(0);
 | 
				
			||||||
 | 
						this.initBend(bend);
 | 
				
			||||||
 | 
						bend.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);
 | 
				
			||||||
 | 
						bends.push(bend);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Virtual
 | 
				
			||||||
 | 
						bends.push(this.createVirtualBend(mxUtils.bind(this, function(evt)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (!mxEvent.isConsumed(evt) && this.flipEnabled)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								this.graph.flipEdge(this.state.cell, evt);
 | 
				
			||||||
 | 
								mxEvent.consume(evt);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})));
 | 
				
			||||||
 | 
						this.points.push(new mxPoint(0,0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Target
 | 
				
			||||||
 | 
						bend = this.createHandleShape(2);
 | 
				
			||||||
 | 
						this.initBend(bend);
 | 
				
			||||||
 | 
						bend.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);
 | 
				
			||||||
 | 
						bends.push(bend);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return bends;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: createVirtualBend
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Creates a virtual bend that supports double clicking and calls
 | 
				
			||||||
 | 
					 * <mxGraph.flipEdge>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.createVirtualBend = function(dblClickHandler)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						var bend = this.createHandleShape();
 | 
				
			||||||
 | 
						this.initBend(bend, dblClickHandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bend.setCursor(this.getCursorForBend());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!this.graph.isCellBendable(this.state.cell))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							bend.node.style.display = 'none';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bend;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: getCursorForBend
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Returns the cursor to be used for the bend.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.getCursorForBend = function()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (this.state.style[mxConstants.STYLE_EDGE] == mxEdgeStyle.TopToBottom ||
 | 
				
			||||||
 | 
							this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_TOPTOBOTTOM ||
 | 
				
			||||||
 | 
							((this.state.style[mxConstants.STYLE_EDGE] == mxEdgeStyle.ElbowConnector ||
 | 
				
			||||||
 | 
							this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_ELBOW)&&
 | 
				
			||||||
 | 
							this.state.style[mxConstants.STYLE_ELBOW] == mxConstants.ELBOW_VERTICAL)) ? 
 | 
				
			||||||
 | 
							'row-resize' : 'col-resize';
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: getTooltipForNode
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Returns the tooltip for the given node.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.getTooltipForNode = function(node)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						var tip = null;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (this.bends != null && this.bends[1] != null && (node == this.bends[1].node ||
 | 
				
			||||||
 | 
							node.parentNode == this.bends[1].node))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							tip = this.doubleClickOrientationResource;
 | 
				
			||||||
 | 
							tip = mxResources.get(tip) || tip; // translate
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return tip;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: convertPoint
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Converts the given point in-place from screen to unscaled, untranslated
 | 
				
			||||||
 | 
					 * graph coordinates and applies the grid.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Parameters:
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * point - <mxPoint> to be converted.
 | 
				
			||||||
 | 
					 * gridEnabled - Boolean that specifies if the grid should be applied.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.convertPoint = function(point, gridEnabled)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						var scale = this.graph.getView().getScale();
 | 
				
			||||||
 | 
						var tr = this.graph.getView().getTranslate();
 | 
				
			||||||
 | 
						var origin = this.state.origin;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (gridEnabled)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							point.x = this.graph.snap(point.x);
 | 
				
			||||||
 | 
							point.y = this.graph.snap(point.y);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						point.x = Math.round(point.x / scale - tr.x - origin.x);
 | 
				
			||||||
 | 
						point.y = Math.round(point.y / scale - tr.y - origin.y);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return point;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Function: redrawInnerBends
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Updates and redraws the inner bends.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Parameters:
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * p0 - <mxPoint> that represents the location of the first point.
 | 
				
			||||||
 | 
					 * pe - <mxPoint> that represents the location of the last point.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					mxElbowEdgeHandler.prototype.redrawInnerBends = function(p0, pe)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						var g = this.graph.getModel().getGeometry(this.state.cell);
 | 
				
			||||||
 | 
						var pts = this.state.absolutePoints;
 | 
				
			||||||
 | 
						var pt = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Keeps the virtual bend on the edge shape
 | 
				
			||||||
 | 
						if (pts.length > 1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							p0 = pts[1];
 | 
				
			||||||
 | 
							pe = pts[pts.length - 2];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (g.points != null && g.points.length > 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pt = pts[0];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (pt == null)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pt = new mxPoint(p0.x + (pe.x - p0.x) / 2, p0.y + (pe.y - p0.y) / 2);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pt = new mxPoint(this.graph.getView().scale * (pt.x + this.graph.getView().translate.x + this.state.origin.x),
 | 
				
			||||||
 | 
									this.graph.getView().scale * (pt.y + this.graph.getView().translate.y + this.state.origin.y));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Makes handle slightly bigger if the yellow  label handle
 | 
				
			||||||
 | 
						// exists and intersects this green handle
 | 
				
			||||||
 | 
						var b = this.bends[1].bounds;
 | 
				
			||||||
 | 
						var w = b.width;
 | 
				
			||||||
 | 
						var h = b.height;
 | 
				
			||||||
 | 
						var bounds = new mxRectangle(Math.round(pt.x - w / 2), Math.round(pt.y - h / 2), w, h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (this.manageLabelHandle)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							this.checkLabelHandle(bounds);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (this.handleImage == null && this.labelShape.visible && mxUtils.intersects(bounds, this.labelShape.bounds))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							w = mxConstants.HANDLE_SIZE + 3;
 | 
				
			||||||
 | 
							h = mxConstants.HANDLE_SIZE + 3;
 | 
				
			||||||
 | 
							bounds = new mxRectangle(Math.floor(pt.x - w / 2), Math.floor(pt.y - h / 2), w, h);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.bends[1].bounds = bounds;
 | 
				
			||||||
 | 
						this.bends[1].redraw();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (this.manageLabelHandle)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							this.checkLabelHandle(this.bends[1].bounds);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user