package open.dolphin.impl.scheam.schemastate; import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import open.dolphin.impl.scheam.SchemaEditorImpl; import open.dolphin.impl.scheam.holder.DrawingHolder; /** * 一部を選択して切り抜く * @author pns */ public class ClippingState extends AbstractState { public ClippingState(SchemaEditorImpl context) { super(context); } @Override public void mouseDown(Point p) { shape = new Rectangle2D.Double(); start = p; end = null; first = true; } @Override public void mouseDragged(Point p) { end = p; ((Rectangle2D) shape).setFrameFromDiagonal(start, end); canvas.repaint(); } @Override public void mouseUp(Point p) { if (end == null) return; BufferedImage src = canvas.getBaseImage(); int x; int y; int width; int height; // はみ出した場合の対応 start.x = rounding(start.x, src.getWidth()); end.x = rounding(end.x, src.getWidth()); start.y = rounding(start.y, src.getHeight()); end.y = rounding(end.y, src.getHeight()); // 反対からドラッグした場合対応 x = (start.x < end.x)? start.x : end.x; y = (start.y < end.y)? start.y : end.y; width = Math.abs(start.x - end.x); height = Math.abs(start.y - end.y); // 切り抜きの大きさがなければ abort if (width == 0 || height == 0) { shape = null; canvas.repaint(); return; } undoMgr.storeClipping(-x, -y); //DrawingHolder for (DrawingHolder h : drawingList) h.translate( -x, -y) ; BufferedImage dist = src.getSubimage(x, y, width, height); canvas.setBaseImage(dist); context.recomputeViewBounds(dist); shape = null; } /** * はみ出した分の修正 * @param num * @param limit * @return */ private int rounding(int num, int limit) { int n = num; if (n < 0) n = 0; else if (n >= limit) n = limit - 1; return n; } @Override public void draw(Graphics2D g2d) { if (shape == null) return; g2d.setStroke(properties.getOutlineStroke()); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g2d.setPaint(Color.gray); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.draw(shape); } }