package open.dolphin.impl.scheam.schemastate;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import open.dolphin.impl.scheam.SchemaEditorImpl;
import open.dolphin.impl.scheam.holder.DrawingHolder;
/**
*
* @author pns
*/
public class RotationState extends AbstractState {
public RotationState(SchemaEditorImpl context) {
super(context);
}
public void rotate() {
undoMgr.storeRotate(properties.isRightRotation()? Math.PI/2: -Math.PI/2);
// baseImage の rotate
BufferedImage src = canvas.getBaseImage();
// 90度回転なので height-width を入れ替える
BufferedImage dist = new BufferedImage(src.getHeight(), src.getWidth(), src.getType());
//DrawingHolder の回転
for (DrawingHolder h : drawingList) {
if (properties.isRightRotation()) {
// 原点中心に 90度右回転 → 右方向に幅の分移動
h.rotate(Math.PI/2);
h.translate(dist.getWidth(), 0);
} else {
// 原点中心に 90度左回転 → 下方向に高さ分移動
h.rotate(-Math.PI/2);
h.translate(0, dist.getHeight());
}
}
AffineTransform rotate;
// baseImage の transform は src の立場で考える orz
if (properties.isRightRotation()) {
// 原点中心に 90度右回転 → 上方向(src から見て)に高さ分移動
rotate = AffineTransform.getQuadrantRotateInstance(1);
rotate.concatenate(AffineTransform.getTranslateInstance(0, -src.getHeight()));
} else {
// 原点中心に 90度左回転 → 左方向(src から見て)に幅の分移動
rotate = AffineTransform.getQuadrantRotateInstance(-1);
rotate.concatenate(AffineTransform.getTranslateInstance(-src.getWidth(), 0));
}
Graphics2D g = dist.createGraphics();
g.setTransform(rotate);
g.drawImage(src, null, 0, 0);
g.dispose();
// 回転したイメージを canvas にセットし直す
canvas.setBaseImage(dist);
// 縦横が変わるので,canvas の大きさ変更が必要
context.recomputeViewBounds(dist);
}
@Override
public void mouseDown(Point p) {}
@Override
public void mouseDragged(Point p) {}
@Override
public void mouseUp(Point p) {}
}