package open.dolphin.impl.scheam.holder; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import open.dolphin.impl.scheam.schemahelper.SchemaUtils; /** * * @author kazm */ public class AreaHolder implements DrawingHolder { private Area area; private Stroke stroke; private Paint paint; private AlphaComposite ac; private boolean fill; public AreaHolder() { } public AreaHolder(Area area, Stroke stroke, Paint paint, AlphaComposite ac, boolean fill) { this.area = area; this.stroke = stroke; this.paint = paint; this.ac = ac; this.fill = fill; } public Shape getArea() { return area; } public void setArea(Area area) { this.area = area; } public Paint getPaint() { return paint; } public void setPaint(Paint color) { this.paint = color; } public boolean isFill() { return fill; } public void setFill(boolean fill) { this.fill = fill; } public Stroke getStroke() { return stroke; } public void setStroke(Stroke stroke) { this.stroke = stroke; } public AlphaComposite getAlphaComposite() { return ac; } public void setAlphaComposite(AlphaComposite ac) { this.ac = ac; } @Override public boolean contains(Point p) { // 細すぎるとつかめないので,近くだったらつかめるようにする if (area.getBounds().width < 5 || area.getBounds().height < 5) { return SchemaUtils.isNear(area, p, 5); } else { return area.contains(p); } } @Override public void draw(Graphics2D g2d) { g2d.setStroke(stroke); g2d.setComposite(ac); g2d.setPaint(paint); if (fill) g2d.fill(area); else g2d.draw(area); } @Override public void translate(double x, double y) { AffineTransform trans = AffineTransform.getTranslateInstance(x, y); area.transform(trans); } @Override public void rotate(double theta) { AffineTransform rotate = AffineTransform.getRotateInstance(theta); area.transform(rotate); } @Override public void expand(double sx, double sy) { // stroke の拡大 BasicStroke s = (BasicStroke) stroke; float w = (float) (s.getLineWidth() * sx); // 常に sx = sy なので stroke = new BasicStroke( w, s.getEndCap(), s.getLineJoin(), s.getMiterLimit(), s.getDashArray(), s.getDashPhase()); // 形状の拡大 AffineTransform expand = AffineTransform.getScaleInstance(sx, sy); area.transform(expand); } }