package open.dolphin.impl.scheam.schemastate; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Shape; import java.awt.event.MouseEvent; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.util.ArrayList; import open.dolphin.impl.scheam.SchemaCanvas; import open.dolphin.impl.scheam.SchemaEditorImpl; import open.dolphin.impl.scheam.SchemaEditorProperties; import open.dolphin.impl.scheam.UndoMgr; import open.dolphin.impl.scheam.holder.*; /** * stateMgr から指定された state に応じて描画する * @author pns */ public abstract class AbstractState { protected SchemaEditorImpl context; protected SchemaEditorProperties properties; protected SchemaCanvas canvas; protected ArrayList<DrawingHolder> drawingList; protected UndoMgr undoMgr; protected Shape shape; protected boolean first; protected Point start; protected Point end; public AbstractState() {} public AbstractState(SchemaEditorImpl context) { this(); this.context = context; this.canvas = context.getCanvas(); this.drawingList = context.getDrawingList(); this.properties = context.getProperties(); this.undoMgr = context.getUndoMgr(); } public abstract void mouseDown(Point p); public abstract void mouseDragged(Point p); // mouseUp で必ず shape = null すること! public abstract void mouseUp(Point p); // 必要に応じて override する public void mouseClicked(MouseEvent e) {} public void setMouseEvent(MouseEvent e) {} /** * mouseDown から mouseUp まで,drag されている間の途中経過を描く  * SchemaCanvas の paintComponent から StateMgr 経由で呼ばれる * @param g2d */ public void draw(Graphics2D g2d) { if (shape != null) { if (properties.isFill()) g2d.fill(shape); else g2d.draw(shape); } } /** * DrawingHolder を drawingList に加える * @param s */ public void addShape(DrawingHolder s) { drawingList.add(s); } /** * Shape を AreaHolder に入れて drawingList に加える * @param shape */ public void addAreaShape(Shape shape) { AreaHolder sh = new AreaHolder(new Area(shape), properties.getStroke(), properties.getFillColor(), properties.getAlphaComposite(), properties.isFill()); addShape(sh); } /** * Shape を Line2DHolder に入れて drawingList に加える * @param shape */ public void addLineShape(Line2D.Double shape) { Line2DHolder sh = new Line2DHolder(shape, properties.getStroke(), properties.getFillColor(), properties.getAlphaComposite()); addShape(sh); } /** * Shape を PathHolder に入れて drawingList に加える * @param shape */ public void addPathShape(Shape shape) { PathHolder sh = new PathHolder(new GeneralPath(shape), properties.getStroke(), properties.getFillColor(), properties.getAlphaComposite()); addShape(sh); } /** * Shape を TextHolder に入れて drawingList に加える * @param shape */ public void addTextShape(Shape shape) { AreaHolder sh = new TextHolder(new Area(shape), properties.getTextStroke(), properties.getTextColor(), properties.getTextComposite(), true); addShape(sh); } /** * 最後に追加した絵を list から除去する */ public void removeLastShape() { if (!drawingList.isEmpty()) drawingList.remove(drawingList.size()-1); } }