All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.yaoqiang.graph.view.YGraphView Maven / Gradle / Ivy

There is a newer version: 2.2.18
Show newest version
package org.yaoqiang.graph.view;

import java.util.Map;

import com.mxgraph.model.mxCell;
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;
import com.mxgraph.view.mxCellState;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraphView;

/**
 * YGraphView
 * 
 * @author Shi Yaoqiang([email protected])
 */
public class YGraphView extends mxGraphView {

	public YGraphView(mxGraph graph) {
		super(graph);
	}

	public YGraph getGraph() {
		return (YGraph) graph;
	}
	
	public double getWordWrapWidth(mxCellState state)
	{
		Map style = state.getStyle();
		String shape = mxUtils.getString(style, mxConstants.STYLE_SHAPE, "label");
		if (shape.equals("event") || shape.equals("gateway") || shape.equals("dataobject") || shape.equals("datastore") || shape.equals("conversation")) {
			return 80;
		}				
		return super.getWordWrapWidth(state);
	}
	
	public void validateBounds(mxCellState parentState, Object cell)
	{
		mxIGraphModel model = graph.getModel();
		mxCellState state = getState(cell, true);

		if (state != null && state.isInvalid())
		{
			if (!graph.isCellVisible(cell))
			{
				removeState(cell);
			}
			else if (cell != currentRoot && parentState != null)
			{
				state.getAbsoluteOffset().setX(0);
				state.getAbsoluteOffset().setY(0);
				state.setOrigin(new mxPoint(parentState.getOrigin()));
				mxGeometry geo = graph.getCellGeometry(cell);

				if (geo != null)
				{
					if (!model.isEdge(cell))
					{
						mxPoint origin = state.getOrigin();
						mxPoint offset = geo.getOffset();

						if (offset == null)
						{
							offset = EMPTY_POINT;
						}

						if (geo.isRelative())
						{
							origin.setX(origin.getX() + geo.getX()
									* parentState.getWidth() / scale
									+ offset.getX());
							origin.setY(origin.getY() + geo.getY()
									* parentState.getHeight() / scale
									+ offset.getY());
						}
						else
						{
							state.setAbsoluteOffset(new mxPoint(scale
									* offset.getX(), scale * offset.getY()));
							origin.setX(origin.getX() + geo.getX());
							origin.setY(origin.getY() + geo.getY());
						}
					}

					// Updates the cell state's bounds
					state.setX(scale
							* (translate.getX() + state.getOrigin().getX()));
					state.setY(scale
							* (translate.getY() + state.getOrigin().getY()));
					state.setWidth(scale * geo.getWidth());
					state.setHeight(scale * geo.getHeight());

					if (model.isVertex(cell))
					{
						updateVertexLabelOffset(state);
					}

					// Updates the cached label
					updateLabel(state);
				}
			}

			// Applies child offset to origin
			mxPoint offset = graph.getChildOffsetForCell(cell);

			if (offset != null)
			{
				state.getOrigin()
						.setX(state.getOrigin().getX() + offset.getX());
				state.getOrigin()
						.setY(state.getOrigin().getY() + offset.getY());
			}
		}

		// Recursively validates the child bounds
		if (state != null
				&& (!graph.isCellCollapsed(cell) || cell == currentRoot))
		{
			// ==============start==============
			if (cell != currentRoot && ((mxCell) cell).getGeometry() != null && (getGraph().isCallActivityProcess(cell) || getGraph().isCollapsedSubProcess(cell) || getGraph().isCollapsedSwimlane(cell))) {
				int childCount = model.getChildCount(cell);
				for (int i = 0; i < childCount; i++) {
					Object child = model.getChildAt(cell, i);
					if (getGraph().isAttachedEvent(child)) {
						validateBounds(state, child);
					}
				}
			}
			// ==============end================
			else {
				int childCount = model.getChildCount(cell);
				for (int i = 0; i < childCount; i++) {
					Object child = model.getChildAt(cell, i);
					if (cell == currentRoot && getGraph().isAttachedEvent(child)) {
						continue;
					}
					validateBounds(state, child);
				}
			}
		}
	}
	
	public Object getVisibleTerminal(Object edge, boolean source)
	{
		mxIGraphModel model = graph.getModel();
		Object result = model.getTerminal(edge, source);
		Object best = result;

		while (result != null && result != currentRoot)
		{
			if (!graph.isCellVisible(best) || graph.isCellCollapsed(result) || getGraph().isCollapsedSubProcess(result))
			{
				best = result;
			}

			result = model.getParent(result);
		}

		// Checks if the result is not a layer
		if (model.getParent(best) == model.getRoot())
		{
			best = null;
		}

		return best;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy