package com.highdatas.mdm.process.canvas; import org.activiti.bpmn.model.AssociationDirection; import org.activiti.bpmn.model.GraphicInfo; import org.activiti.image.impl.DefaultProcessDiagramCanvas; import java.awt.*; import java.awt.geom.Line2D.Double; import java.awt.geom.RoundRectangle2D; public class ProcessDiagramCanvas extends DefaultProcessDiagramCanvas { protected static Color HIGHLIGHT_COLOR = new Color(62,173,252); private static Color RUNNING_COLOR = Color.RED; private static Color HISTORY_COLOR = Color.GREEN; protected static int ICON_PADDING = 3; private String annotationFontName; public ProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { super(width, height, minX, minY, imageType); this.activityFontName = "宋体"; this.labelFontName = "宋体"; this.annotationFontName = "宋体"; initialize(imageType); } @Override public void drawHighLight(int x, int y, int width, int height) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(HIGHLIGHT_COLOR); g.setStroke(THICK_TASK_BORDER_STROKE); RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); g.draw(rect); g.setPaint(originalPaint); g.setStroke(originalStroke); } @Override public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { Paint originalPaint = this.g.getPaint(); Stroke originalStroke = this.g.getStroke(); this.g.setPaint(CONNECTION_COLOR); if (connectionType.equals("association")) { this.g.setStroke(ASSOCIATION_STROKE); } else if (highLighted) { this.g.setPaint(HIGHLIGHT_COLOR); this.g.setStroke(HIGHLIGHT_FLOW_STROKE); } for (int i = 1; i < xPoints.length; ++i) { Integer sourceX = Integer.valueOf(xPoints[(i - 1)]); Integer sourceY = Integer.valueOf(yPoints[(i - 1)]); Integer targetX = Integer.valueOf(xPoints[i]); Integer targetY = Integer.valueOf(yPoints[i]); // e.g.(0,0) ---> (10,20) (0,20) (10,20) Double line1 = new Double(sourceX.intValue(), sourceY.intValue(), sourceX.intValue(), targetY.intValue()); Double line2 = new Double(sourceX.intValue(), targetY.intValue(), targetX.intValue(), targetY.intValue()); //Line2D.Double line = new Line2D.Double(sourceX.intValue(), sourceY.intValue(), targetX.intValue(), targetY.intValue()); this.g.draw(line1); this.g.draw(line2); } Double line; if (isDefault) { line = new Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawDefaultSequenceFlowIndicator(line, scaleFactor); } if (conditional) { line = new Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawConditionalSequenceFlowIndicator(line, scaleFactor); } if ((associationDirection.equals(AssociationDirection.ONE)) || (associationDirection.equals(AssociationDirection.BOTH))) { line = new Double(xPoints[(xPoints.length - 2)], yPoints[(xPoints.length - 2)], xPoints[(xPoints.length - 1)], yPoints[(xPoints.length - 1)]); drawArrowHead(line, scaleFactor); } if (associationDirection.equals(AssociationDirection.BOTH)) { line = new Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); drawArrowHead(line, scaleFactor); } this.g.setPaint(originalPaint); this.g.setStroke(originalStroke); } @Override protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder){ Paint originalPaint = this.g.getPaint(); int x = (int)graphicInfo.getX(); int y = (int)graphicInfo.getY(); int width = (int)graphicInfo.getWidth(); int height = (int)graphicInfo.getHeight(); this.g.setPaint(TASK_BOX_COLOR); int arcR = 6; if (thickBorder) { arcR = 3; } RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 10, 10); this.g.fill(rect); this.g.setPaint(TASK_BORDER_COLOR); if (thickBorder) { Stroke originalStroke = this.g.getStroke(); this.g.setStroke(THICK_TASK_BORDER_STROKE); this.g.draw(rect); this.g.setStroke(originalStroke); } else { this.g.draw(rect); } this.g.setPaint(originalPaint); if ((name != null) && (name.length() > 0)) { int boxWidth = width - 6; int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - 12 - 2 - 2; int boxX = x + width / 2 - (boxWidth / 2); int boxY = y + height / 2 - (boxHeight / 2) + ICON_PADDING + ICON_PADDING - 2 - 2; drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); } } }