⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mxedgestyle.java

📁 经典的java图像处理程序源码
💻 JAVA
字号:
/** * $Id: mxEdgeStyle.java,v 1.27 2009/02/20 14:25:23 gaudenz Exp $ * Copyright (c) 2007, Gaudenz Alder */package com.mxgraph.view;import java.util.List;import com.mxgraph.model.mxGeometry;import com.mxgraph.model.mxIGraphModel;import com.mxgraph.util.mxConstants;import com.mxgraph.util.mxPoint;import com.mxgraph.util.mxUtils;/** * Provides various edge styles to be used as the values for * mxConstants.STYLE_EDGE in a cell style. Alternatevly, the mxConstants. * EDGESTYLE_* constants can be used to reference an edge style via the * mxStyleRegistry. */public class mxEdgeStyle{	/**	 * Defines the requirements for an edge style function.	 */	public interface mxEdgeStyleFunction	{		/**		 * Implements an edge style function. At the time the function is called, the result		 * array contains a placeholder (null) for the first absolute point,		 * that is, the point where the edge and source terminal are connected.		 * The implementation of the style then adds all intermediate waypoints		 * except for the last point, that is, the connection point between the		 * edge and the target terminal. The first ant the last point in the		 * result array are then replaced with mxPoints that take into account		 * the terminal's perimeter and next point on the edge.		 * 		 * @param state Cell state that represents the edge to be updated.		 * @param source Cell state that represents the source terminal.		 * @param target Cell state that represents the target terminal.		 * @param points List of relative control points.		 * @param result Array of points that represent the actual points of the		 * edge.		 */		void apply(mxCellState state, mxCellState source, mxCellState target,				List points, List result);	}	/**	 * Provides an entity relation style for edges (as used in database	 * schema diagrams).	 */	public static mxEdgeStyleFunction EntityRelation = new mxEdgeStyleFunction()	{		/* (non-Javadoc)		 * @see com.mxgraph.view.mxEdgeStyle.mxEdgeStyleFunction#apply(com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, java.util.List, java.util.List)		 */		public void apply(mxCellState state, mxCellState source,				mxCellState target, List points, List result)		{			mxGraphView view = state.getView();			mxIGraphModel model = view.getGraph().getModel();						int segment = (int) (mxUtils.getDouble(state.getStyle(),					mxConstants.STYLE_STARTSIZE, mxConstants.ENTITY_SEGMENT) * state.view					.getScale());			boolean isSourceLeft = false;			if (source != null)			{				mxGeometry sourceGeometry = model.getGeometry(source.cell);				if (sourceGeometry.isRelative())				{					isSourceLeft = sourceGeometry.getX() <= 0.5;				}				else if (target != null)				{					isSourceLeft = target.getX() + target.getWidth() < source							.getX();				}			}			else			{				mxPoint pt = (mxPoint) state.absolutePoints.get(0);				if (pt == null)				{					return;				}				source = new mxCellState();				source.setX(pt.getX());				source.setY(pt.getY());			}			boolean isTargetLeft = true;			if (target != null)			{				mxGeometry targetGeometry = model.getGeometry(target.cell);				if (targetGeometry.isRelative())				{					isTargetLeft = targetGeometry.getX() <= 0.5;				}				else if (source != null)				{					isTargetLeft = source.getX() + source.getWidth() < target							.getX();				}			}			else			{				List pts = state.absolutePoints;				mxPoint pt = (mxPoint) pts.get(pts.size() - 1);				if (pt == null)				{					return;				}				target = new mxCellState();				target.setX(pt.getX());				target.setY(pt.getY());			}			double x0 = (isSourceLeft) ? source.getX() : source.getX()					+ source.getWidth();			double y0 = view.getRoutingCenterY(source);			double xe = (isTargetLeft) ? target.getX() : target.getX()					+ target.getWidth();			double ye = view.getRoutingCenterY(target);			double seg = segment;			double dx = (isSourceLeft) ? -seg : seg;			mxPoint dep = new mxPoint(x0 + dx, y0);			result.add(dep);			dx = (isTargetLeft) ? -seg : seg;			mxPoint arr = new mxPoint(xe + dx, ye);			// Adds intermediate points if both go out on same side			if (isSourceLeft == isTargetLeft)			{				double x = (isSourceLeft) ? Math.min(x0, xe) - segment : Math						.max(x0, xe)						+ segment;				result.add(new mxPoint(x, y0));				result.add(new mxPoint(x, ye));			}			else if ((dep.getX() < arr.getX()) == isSourceLeft)			{				double midY = y0 + (ye - y0) / 2;				result.add(new mxPoint(dep.getX(), midY));				result.add(new mxPoint(arr.getX(), midY));			}			result.add(arr);		}	};	/**	 * Provides a self-reference, aka. loop.	 */	public static mxEdgeStyleFunction Loop = new mxEdgeStyleFunction()	{		/* (non-Javadoc)		 * @see com.mxgraph.view.mxEdgeStyle.mxEdgeStyleFunction#apply(com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, java.util.List, java.util.List)		 */		public void apply(mxCellState state, mxCellState source,				mxCellState target, List points, List result)		{			mxGraphView view = state.getView();			mxGraph graph = view.getGraph();			mxPoint pt = (points != null && points.size() > 0) ? (mxPoint) points.get(0) : null;			double s = view.getScale();			if (pt != null)			{				mxPoint t = view.getTranslate();				mxPoint o = state.getOrigin();				pt = new mxPoint(s * (t.getX() + pt.getX() + o.getX()), s						* (t.getY() + pt.getY() + o.getY()));				if (source.contains(pt.getX(), pt.getY()))				{					pt = null;				}			}			double x = 0;			double dx = 0;			double y = view.getRoutingCenterY(source);			double dy = s * graph.getGridSize();			if (pt == null || pt.getX() < source.getX()					|| pt.getX() > source.getX() + source.getWidth())			{				if (pt != null)				{					x = pt.getX();					dy = Math.max(Math.abs(y - pt.getY()), dy);				}				else				{					x = source.getX() + source.getWidth() + 2 * dy;				}			}			else if (pt != null)			{				x = view.getRoutingCenterX(source);				dx = Math.max(Math.abs(x - pt.getX()), dy);				y = pt.getY();				dy = 0;			}			result.add(new mxPoint(x - dx, y - dy));			result.add(new mxPoint(x + dx, y + dy));		}	};	/**	 * Uses either SideToSide or TopToBottom depending on the horizontal	 * flag in the cell style. SideToSide is used if horizontal is true or	 * unspecified.	 */	public static mxEdgeStyleFunction ElbowConnector = new mxEdgeStyleFunction()	{		/* (non-Javadoc)		 * @see com.mxgraph.view.mxEdgeStyle.mxEdgeStyleFunction#apply(com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, java.util.List, java.util.List)		 */		public void apply(mxCellState state, mxCellState source,				mxCellState target, List points, List result)		{			mxPoint pt = (points != null && points.size() > 0) ? (mxPoint) points.get(0) : null;			boolean vertical = false;			boolean horizontal = false;			if (source != null && target != null)			{				if (pt != null)				{					double left = Math.min(source.getX(), target.getX());					double right = Math.max(source.getX() + source.getWidth(),							target.getX() + target.getWidth());					double top = Math.min(source.getY(), target.getY());					double bottom = Math.max(							source.getY() + source.getHeight(), target.getY()									+ target.getHeight());					mxGraphView view = state.getView();					double s = view.getScale();					mxPoint t = view.getTranslate();					mxPoint o = state.getOrigin();					pt = new mxPoint(s * (t.getX() + pt.getX() + o.getX()), s							* (t.getY() + pt.getY() + o.getY()));					vertical = pt.getY() < top || pt.getY() > bottom;					horizontal = pt.getX() < left || pt.getX() > right;				}				else				{					double left = Math.max(source.getX(), target.getX());					double right = Math.min(source.getX() + source.getWidth(),							target.getX() + target.getWidth());					vertical = left == right;					if (!vertical)					{						double top = Math.max(source.getY(), target.getY());						double bottom = Math.min(source.getY()								+ source.getHeight(), target.getY()								+ target.getHeight());						horizontal = top == bottom;					}				}			}			if (!horizontal					&& (vertical || mxUtils.getString(state.getStyle(),							mxConstants.STYLE_ELBOW, "").equals(							mxConstants.ELBOW_VERTICAL)))			{				mxEdgeStyle.TopToBottom.apply(state, source, target, points,						result);			}			else			{				mxEdgeStyle.SideToSide.apply(state, source, target, points,						result);			}		}	};	/**	 * Provides a vertical elbow edge.	 */	public static mxEdgeStyleFunction SideToSide = new mxEdgeStyleFunction()	{		/* (non-Javadoc)		 * @see com.mxgraph.view.mxEdgeStyle.mxEdgeStyleFunction#apply(com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, java.util.List, java.util.List)		 */		public void apply(mxCellState state, mxCellState source,				mxCellState target, List points, List result)		{			mxGraphView view = state.getView();			mxPoint pt = (mxPoint) ((points != null && points.size() > 0) ? points.get(0) : null);						if (pt != null)			{				mxPoint tr = view.getTranslate();				mxPoint o = state.getOrigin();				pt = new mxPoint(view.getScale()						* (tr.getX() + pt.getX() + o.getX()), view.getScale()						* (tr.getY() + pt.getY() + o.getY()));			}			if (source == null)			{				mxPoint tmp = (mxPoint) state.absolutePoints.get(0);				if (tmp == null)				{					return;				}				source = new mxCellState();				source.setX(tmp.getX());				source.setY(tmp.getY());			}			if (target == null)			{				List pts = state.absolutePoints;				mxPoint tmp = (mxPoint) pts.get(pts.size() - 1);				if (tmp == null)				{					return;				}				target = new mxCellState();				target.setX(tmp.getX());				target.setY(tmp.getY());			}			double l = Math.max(source.getX(), target.getX());			double r = Math.min(source.getX() + source.getWidth(), target					.getX()					+ target.getWidth());			double x = (pt != null) ? pt.getX() : r + (l - r) / 2;			double y1 = view.getRoutingCenterY(source);			double y2 = view.getRoutingCenterY(target);			if (pt != null)			{				if (pt.getY() >= source.getY()						&& pt.getY() <= source.getY() + source.getHeight())				{					y1 = pt.getY();				}				if (pt.getY() >= target.getY()						&& pt.getY() <= target.getY() + target.getHeight())				{					y2 = pt.getY();				}			}			if (!target.contains(x, y1) && !source.contains(x, y1))			{				result.add(new mxPoint(x, y1)); // routed			}			if (!target.contains(x, y2) && !source.contains(x, y2))			{				result.add(new mxPoint(x, y2)); // routed			}			if (result.size() == 1)			{				if (pt != null)				{					result.add(new mxPoint(x, pt.getY())); // routed				}				else				{					double t = Math.max(source.getY(), target.getY());					double b = Math.min(source.getY() + source.getHeight(),							target.getY() + target.getHeight());					result.add(new mxPoint(x, t + (b - t) / 2));				}			}		}	};	/**	 * Provides a horizontal elbow edge.	 */	public static mxEdgeStyleFunction TopToBottom = new mxEdgeStyleFunction()	{		/* (non-Javadoc)		 * @see com.mxgraph.view.mxEdgeStyle.mxEdgeStyleFunction#apply(com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, com.mxgraph.view.mxCellState, java.util.List, java.util.List)		 */		public void apply(mxCellState state, mxCellState source,				mxCellState target, List points, List result)		{			mxGraphView view = state.getView();			mxPoint pt = (mxPoint) ((points != null && points.size() > 0) ? points.get(0) : null);			if (pt != null)			{				mxPoint tr = view.getTranslate();				mxPoint o = state.getOrigin();				pt = new mxPoint(view.getScale()						* (tr.getX() + pt.getX() + o.getX()), view.getScale()						* (tr.getY() + pt.getY() + o.getY()));			}			if (source == null)			{				mxPoint tmp = (mxPoint) state.absolutePoints.get(0);				if (tmp == null)				{					return;				}				source = new mxCellState();				source.setX(tmp.getX());				source.setY(tmp.getY());			}			if (target == null)			{				List pts = state.absolutePoints;				mxPoint tmp = (mxPoint) pts.get(pts.size() - 1);				if (tmp == null)				{					return;				}				target = new mxCellState();				target.setX(tmp.getX());				target.setY(tmp.getY());			}			double t = Math.max(source.getY(), target.getY());			double b = Math.min(source.getY() + source.getHeight(), target					.getY()					+ target.getHeight());			double x = view.getRoutingCenterX(source);			if (pt != null && pt.getX() >= source.getX()					&& pt.getX() <= source.getX() + source.getWidth())			{				x = pt.getX();			}			double y = (pt != null) ? pt.getY() : b + (t - b) / 2;			if (!target.contains(x, y) && !source.contains(x, y))			{				result.add(new mxPoint(x, y)); // routed			}			if (pt != null && pt.getX() >= target.getX()					&& pt.getX() <= target.getX() + target.getWidth())			{				x = pt.getX();			}			else			{				x = view.getRoutingCenterX(target);			}			if (!target.contains(x, y) && !source.contains(x, y))			{				result.add(new mxPoint(x, y)); // routed			}			if (result.size() == 1)			{				if (pt != null)				{					result.add(new mxPoint(pt.getX(), y)); // routed				}				else				{					double l = Math.max(source.getX(), target.getX());					double r = Math.min(source.getX() + source.getWidth(),							target.getX() + target.getWidth());					result.add(new mxPoint(l + (r - l) / 2, y));				}			}		}	};}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -