package com.c2kernel.lifecycle.instance.gui.view; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Paint; import com.c2kernel.graph.model.GraphPoint; import com.c2kernel.graph.model.Vertex; import com.c2kernel.graph.view.VertexRenderer; import com.c2kernel.lifecycle.instance.AndSplit; import com.c2kernel.lifecycle.instance.Join; import com.c2kernel.lifecycle.instance.Loop; import com.c2kernel.lifecycle.instance.OrSplit; import com.c2kernel.lifecycle.instance.WfVertex; import com.c2kernel.lifecycle.instance.XOrSplit; import com.c2kernel.utils.Language; public class SplitJoinRenderer implements VertexRenderer { private Paint mTextPaint = Color.black; private Paint mBoxPaint = new Color( 204, 204, 204 ); private Paint mErrorPaint = new Color( 255, 0, 0 ); private boolean mTextOffsetsNotInitialised = true; private int mTextYOffset = 0; private String mAndText = "And"; private int mAndTextXOffset = 0; private String mOrText = "Or"; private int mOrTextXOffset = 0; private String mLoopText = "Loop"; private int mLoopTextXOffset = 0; private String mXOrText = "XOr"; private int mXOrTextXOffset = 0; private String mJoinText = "Join"; private int mJoinTextXOffset = 0; private String mRouteText = ""; private int mRouteTextXOffset = 0; private String mXXXText = "XXX"; private int mXXXTextXOffset = 0; @Override public void draw( Graphics2D g2d, Vertex vertex) { GraphPoint centrePoint = vertex.getCentrePoint(); String text = null; int textXOffset = 0; int vertexHeight = vertex.getHeight(); int vertexWidth = vertex.getWidth(); if ( mTextOffsetsNotInitialised ) { initialiseTextOffsets( g2d ); mTextOffsetsNotInitialised = false; } if ( vertex instanceof AndSplit ) { text = Language.translate(mAndText); textXOffset = mAndTextXOffset; } else if ( vertex instanceof OrSplit ) { text = Language.translate(mOrText); textXOffset = mOrTextXOffset; } else if ( vertex instanceof Loop ) { text = Language.translate(mLoopText); textXOffset = mLoopTextXOffset; } else if ( vertex instanceof XOrSplit ) { text = Language.translate(mXOrText); textXOffset = mXOrTextXOffset; } else if ( vertex instanceof Join ) { text = Language.translate(mJoinText); textXOffset = mJoinTextXOffset; } else if ( vertex instanceof Join) { String type= (String)((Join)vertex).getProperties().get("Type"); if (type!=null && type.equals("Route")) { text = mRouteText; textXOffset = mRouteTextXOffset; } else { text = Language.translate(mJoinText); textXOffset = mJoinTextXOffset; } } else { text = mXXXText; textXOffset = mXXXTextXOffset; } boolean hasErrors = ((WfVertex)vertex).verify(); g2d.setPaint( hasErrors ? mBoxPaint : mErrorPaint ); g2d.fillRect ( centrePoint.x - vertexWidth / 2, centrePoint.y - vertexHeight / 2, vertexWidth, vertexHeight ); g2d.setPaint( mTextPaint ); g2d.drawRect ( centrePoint.x - vertexWidth / 2, centrePoint.y - vertexHeight / 2, vertexWidth, vertexHeight ); g2d.drawString( text, centrePoint.x - textXOffset, centrePoint.y + mTextYOffset ); if (!hasErrors) { g2d.setPaint( mErrorPaint ); String errors = Language.translate(((WfVertex)vertex).getErrors()); int errorWidth = g2d.getFontMetrics().stringWidth( errors ); g2d.drawString( errors, centrePoint.x - ( errorWidth / 2), centrePoint.y + vertexHeight ); } } private void initialiseTextOffsets( Graphics2D g2d ) { FontMetrics metrics = g2d.getFontMetrics(); mTextYOffset = metrics.getHeight() / 3; mAndTextXOffset = metrics.stringWidth( Language.translate(mAndText) ) / 2; mOrTextXOffset = metrics.stringWidth( Language.translate(mOrText) ) / 2; mXOrTextXOffset = metrics.stringWidth( Language.translate(mXOrText) ) / 2; mJoinTextXOffset = metrics.stringWidth( Language.translate(mJoinText) ) / 2; mLoopTextXOffset = metrics.stringWidth( Language.translate(mLoopText) ) / 2; } }