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

org.yaoqiang.graph.shape.ActivityShape Maven / Gradle / Ivy

package org.yaoqiang.graph.shape;

import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Map;

import org.yaoqiang.bpmn.model.BPMNModelUtils;
import org.yaoqiang.bpmn.model.elements.XMLElement;
import org.yaoqiang.bpmn.model.elements.activities.Activity;
import org.yaoqiang.bpmn.model.elements.activities.CallActivity;
import org.yaoqiang.bpmn.model.elements.activities.LoopCharacteristics;
import org.yaoqiang.bpmn.model.elements.activities.MultiInstanceLoopCharacteristics;
import org.yaoqiang.bpmn.model.elements.activities.ReceiveTask;
import org.yaoqiang.bpmn.model.elements.activities.StandardLoopCharacteristics;
import org.yaoqiang.bpmn.model.elements.activities.Task;
import org.yaoqiang.bpmn.model.elements.choreographyactivities.ChoreographyActivity;
import org.yaoqiang.bpmn.model.elements.core.common.FlowNode;
import org.yaoqiang.util.Constants;

import com.mxgraph.canvas.mxGraphics2DCanvas;
import com.mxgraph.model.mxICell;
import com.mxgraph.shape.mxRectangleShape;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxUtils;
import com.mxgraph.view.mxCellState;

/**
 * TaskShape
 * 
 * @author Shi Yaoqiang([email protected])
 */
public class ActivityShape extends mxRectangleShape {

	/**
	 * 
	 */
	public void paintShape(mxGraphics2DCanvas canvas, mxCellState state) {
		super.paintShape(canvas, state);

		Map style = state.getStyle();
		if (!(((mxICell) state.getCell()).getValue() instanceof FlowNode)) {
			return;
		}
		FlowNode flowNode = (FlowNode) ((mxICell) state.getCell()).getValue();

		double scale = canvas.getScale();
		double imgWidth = 16 * scale;
		double imgHeight = 16 * scale;
		int spacing = 5;
		Rectangle imageBounds = state.getRectangle();
		imageBounds.setRect(imageBounds.getX() + spacing, imageBounds.getY() + spacing - 2, imgWidth, imgHeight);

		if (flowNode instanceof CallActivity) {
			String image = "";
			String calledElement = ((CallActivity) flowNode).getCalledElement();
			if (flowNode.getParent() == null) {
				if (calledElement.startsWith("global") && !calledElement.equals("globalTask")) {
					image = Constants.SHAPE_MARKER + "task_" + calledElement.substring(6, calledElement.indexOf("Task")) + ".png";
				}
			} else {
				XMLElement globalTask = BPMNModelUtils.getDefinitions(flowNode).getRootElement(calledElement);
				if (globalTask != null && !globalTask.toName().equals("globalTask")) {
					image = Constants.SHAPE_MARKER + "task_" + globalTask.toName().substring(6, globalTask.toName().indexOf("Task")) + ".png";
				}
			}
			canvas.drawImage(imageBounds, image.toLowerCase());
		} else if (flowNode instanceof Task) {
			if (!flowNode.toName().equals("task")) {
				String image = Constants.SHAPE_MARKER + "task_" + flowNode.toName().substring(0, flowNode.toName().indexOf("Task")) + ".png";
				canvas.drawImage(imageBounds, image.toLowerCase());
			}
			if (flowNode.toName().equals("receiveTask")) {
				if (((ReceiveTask) flowNode).isInstantiate()) {
					Graphics2D g = canvas.getGraphics();
					float pw = (float) (mxUtils.getFloat(style, mxConstants.STYLE_STROKEWIDTH, 1) * scale);
					g.setStroke(new BasicStroke(pw));
					g.drawOval((int) imageBounds.getX() - 3, (int) imageBounds.getY() - 2, (int) (imgWidth * 1.39), (int) (imgHeight * 1.39));
				}
			}
		}

		String loopMarker = null;
		String compensationMarker = null;
		if (flowNode instanceof Activity) {
			Activity activity = (Activity) flowNode;
			LoopCharacteristics loopType = activity.getLoopCharacteristics();
			if (loopType instanceof StandardLoopCharacteristics) {
				loopMarker = Constants.SHAPE_MARKER + "loop_standard.png";
			} else if (loopType instanceof MultiInstanceLoopCharacteristics) {
				if (((MultiInstanceLoopCharacteristics) loopType).isSequential()) {
					loopMarker = Constants.SHAPE_MARKER + "loop_multiple_sequential.png";
				} else {
					loopMarker = Constants.SHAPE_MARKER + "loop_multiple.png";
				}
			}
			compensationMarker = activity.isForCompensation() ? Constants.SHAPE_MARKER + "compensation.png" : null;
		} else if (flowNode instanceof ChoreographyActivity) {
			ChoreographyActivity activity = (ChoreographyActivity) flowNode;
			if (activity.getLoopType().equals("Standard")) {
				loopMarker = Constants.SHAPE_MARKER + "loop_standard.png";
			} else if (activity.getLoopType().equals("MultiInstanceSequential")) {
				loopMarker = Constants.SHAPE_MARKER + "loop_multiple_sequential.png";
			} else if (activity.getLoopType().equals("MultiInstanceParallel")) {
				loopMarker = Constants.SHAPE_MARKER + "loop_multiple.png";
			}
		}

		if (loopMarker != null || compensationMarker != null) {
			Rectangle markerImageBounds = state.getRectangle();
			if (loopMarker != null && compensationMarker != null) {
				markerImageBounds.setRect(markerImageBounds.getX() + (markerImageBounds.getWidth() / 2 - imgWidth), markerImageBounds.getY()
						+ markerImageBounds.getHeight() - imgHeight, imgWidth, imgHeight);
				canvas.drawImage(markerImageBounds, loopMarker);
				markerImageBounds.setRect(markerImageBounds.getX() + (markerImageBounds.getWidth() + imgWidth) / 2, markerImageBounds.getY()
						+ markerImageBounds.getHeight() - imgHeight, imgWidth, imgHeight);
				canvas.drawImage(markerImageBounds, compensationMarker);
			} else {
				markerImageBounds.setRect(markerImageBounds.getX() + (markerImageBounds.getWidth() - imgWidth) / 2, markerImageBounds.getY()
						+ markerImageBounds.getHeight() - imgHeight, imgWidth, imgHeight);
				if (loopMarker != null) {
					canvas.drawImage(markerImageBounds, loopMarker);
				} else {
					canvas.drawImage(markerImageBounds, compensationMarker);
				}
			}
		}
	}

	public int getArcSize(int w, int h) {
		return Constants.RECTANGLE_ARCSIZE;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy