package com.jgraph.example.mycellview; import java.awt.BasicStroke; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import org.jgraph.graph.CellViewRenderer; import org.jgraph.graph.GraphConstants; import org.jgraph.graph.VertexRenderer; import org.jgraph.graph.VertexView; public class JGraphRoundRectView extends VertexView { public static transient ActivityRenderer renderer = new ActivityRenderer(); public JGraphRoundRectView() { super(); } public JGraphRoundRectView(Object cell) { super(cell); } /** * Returns the intersection of the bounding rectangle and the straight line * between the source and the specified point p. The specified point is * expected not to intersect the bounds. */ // todo public Point2D getPerimeterPoint(Point source, Point p) { /** * getArcSize calculates an appropriate arc for the corners of the rectangle * for boundary size cases of width and height */ public static int getArcSize(int width, int height) { int arcSize; // The arc width of a activity rectangle is 1/5th of the larger // of the two of the dimensions passed in, but at most 1/2 // of the smaller of the two. 1/5 because it looks nice and 1/2 // so the arc can complete in the given dimension if (width <= height) { arcSize = height / 5; if (arcSize > (width / 2)) { arcSize = width / 2; } } else { arcSize = width / 5; if (arcSize > (height / 2)) { arcSize = height / 2; } } return arcSize; } public CellViewRenderer getRenderer() { return renderer; } public static class ActivityRenderer extends VertexRenderer { /** * Return a slightly larger preferred size than for a rectangle. */ public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.width += d.height / 5; return d; } public void paint(Graphics g) { int b = borderWidth; Graphics2D g2 = (Graphics2D) g; Dimension d = getSize(); boolean tmp = selected; int roundRectArc = JGraphRoundRectView.getArcSize(d.width - b, d.height - b); if (super.isOpaque()) { g.setColor(super.getBackground()); if (gradientColor != null && !preview) { setOpaque(false); g2.setPaint(new GradientPaint(0, 0, getBackground(), getWidth(), getHeight(), gradientColor, true)); } g.fillRoundRect(b / 2, b / 2, d.width - (int) (b * 1.5), d.height - (int) (b * 1.5), roundRectArc, roundRectArc); } try { setBorder(null); setOpaque(false); selected = false; super.paint(g); } finally { selected = tmp; } if (bordercolor != null) { g.setColor(bordercolor); g2.setStroke(new BasicStroke(b)); g.drawRoundRect(b / 2, b / 2, d.width - (int) (b * 1.5), d.height - (int) (b * 1.5), roundRectArc, roundRectArc); } if (selected) { g2.setStroke(GraphConstants.SELECTION_STROKE); g.setColor(highlightColor); g.drawRoundRect(b / 2, b / 2, d.width - (int) (b * 1.5), d.height - (int) (b * 1.5), roundRectArc, roundRectArc); } } } }