
org.yaoqiang.graph.shape.ActivityShape Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of yaoqiang-bpmn-editor Show documentation
Show all versions of yaoqiang-bpmn-editor Show documentation
an Open Source BPMN 2.0 Modeler
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.graph.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