package open.dolphin.impl.scheam;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import open.dolphin.impl.scheam.holder.DrawingHolder;
import open.dolphin.impl.scheam.schemastate.*;
/**
*
* @author pns
*/
public class StateMgr {
private final SchemaEditorImpl context;
private final SchemaEditorProperties properties;
private final ArrayList<DrawingHolder> drawingList;
private final UndoMgr undoMgr;
private final AbstractState selectState;
private final AbstractState lineState;
private final AbstractState rectState;
private final AbstractState ellipseState;
private final AbstractState polygonState;
private final AbstractState pencilState;
private final AbstractState eraserState;
private final AbstractState textState;
private final RotationState rotationState;
private AbstractState curState;
private final AbstractState clippingState;
private final DotsState dotsState;
private final ExpandState expandState;
public StateMgr(SchemaEditorImpl context) {
this.context = context;
this.drawingList = context.getDrawingList();
this.properties = context.getProperties();
this.undoMgr = context.getUndoMgr();
selectState = new SelectState(context);
lineState = new LineState(context);
rectState = new RectState(context);
ellipseState = new EllipseState(context);
polygonState = new PolygonState(context);
pencilState = new PencilState(context);
eraserState = new EraserState(context);
textState = new TextState(context);
rotationState = new RotationState(context);
expandState = new ExpandState(context);
clippingState = new ClippingState(context);
dotsState = new DotsState(context);
curState = rectState;
}
// ツールボタンから呼ばれる methods
public void startSelect() {
curState = selectState;
}
public void startLine() {
curState = lineState;
properties.setIsFill(false);
}
public void startRect() {
curState = rectState;
properties.setIsFill(false);
}
public void startEllipse() {
curState = ellipseState;
properties.setIsFill(false);
}
public void startPolygon() {
curState = polygonState;
properties.setIsFill(false);
}
public void startRectFill() {
curState = rectState;
properties.setIsFill(true);
}
public void startEllipseFill() {
curState = ellipseState;
properties.setIsFill(true);
}
public void startPolygonFill() {
curState = polygonState;
properties.setIsFill(true);
}
public void startPencil() {
curState = pencilState;
properties.setIsFill(false);
}
public void startEraser() {
curState = eraserState;
properties.setIsFill(false);
}
public void startText() {
curState = textState;
properties.setIsFill(false);
}
public void startClipping() {
curState = clippingState;
}
public void startNetSparse() {
curState = dotsState;
dotsState.setDots(DotsState.NET_SPARSE);
}
public void startNetMedium() {
curState = dotsState;
dotsState.setDots(DotsState.NET_MEDIUM);
}
public void startNetDense() {
curState = dotsState;
dotsState.setDots(DotsState.NET_DENSE);
}
public void startDotsSparse() {
curState = dotsState;
dotsState.setDots(DotsState.DOTS_SPARSE);
}
public void startDotsMedium() {
curState = dotsState;
dotsState.setDots(DotsState.DOTS_MEDIUM);
}
public void startDotsDense() {
curState = dotsState;
dotsState.setDots(DotsState.DOTS_DENSE);
}
// mouseListener から呼ばれる methods
public void mouseDown(Point p) { curState.mouseDown(p); }
public void mouseDragged(Point p) { curState.mouseDragged(p); }
public void mouseUp(Point p) { curState.mouseUp(p); }
public void mouseClicked(MouseEvent e) { curState.mouseClicked(e); }
public void setMouseEvent(MouseEvent e) { curState.setMouseEvent(e); }
/**
* SchemaCanvas から呼ばれる
* @param g2d
*/
public void draw(Graphics2D g2d) {
// canvas を全部書き直す
for (DrawingHolder d : drawingList) d.draw(g2d);
// 現在の色,ストロークなどを設定
properties.setGraphicsState(g2d);
curState.draw(g2d);
}
// 押すだけの State (マウス drag したりしない処理)
// curState.draw が呼ばれるので,その前の state は mouseUp で必ず shape = null しておく必要がある
public void undo() {
undoMgr.undo();
context.getCanvas().repaint();
}
public void redo() {
undoMgr.redo();
context.getCanvas().repaint();
}
public void clear() {
undoMgr.storeDraw();
drawingList.clear();
context.getCanvas().repaint();
}
public void rotateRight() {
properties.setIsRightRotation(true);
rotationState.rotate();
}
public void rotateLeft() {
properties.setIsRightRotation(false);
rotationState.rotate();
}
public void expand() {
expandState.expand();
}
}