package oripa.paint.core;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.Collection;
import java.util.LinkedList;
import oripa.ORIPA;
import oripa.geom.RectangleClipper;
import oripa.paint.creasepattern.CreasePattern;
import oripa.value.OriLine;
public abstract class RectangularSelectableAction extends GraphicMouseAction {
private Point2D.Double startPoint = null;
private Point2D.Double draggingPoint = null;
@Override
public void onPress(PaintContext context, AffineTransform affine,
boolean differentAction) {
startPoint = context.getLogicalMousePoint();
}
@Override
public void onDrag(PaintContext context, AffineTransform affine,
boolean differentAction) {
draggingPoint = context.getLogicalMousePoint();
}
@Override
public void onRelease(PaintContext context, AffineTransform affine, boolean differentAction) {
if(startPoint != null && draggingPoint != null){
selectByRectangularArea(context);
}
startPoint = null;
draggingPoint = null;
}
/**
* defines what to do for the selected lines.
* @param selectedLines lines selected by dragging
* @param context
*/
protected abstract void afterRectangularSelection(
Collection<OriLine> selectedLines, PaintContext context);
protected final void selectByRectangularArea(PaintContext context){
LinkedList<OriLine> selectedLines = new LinkedList<>();
try {
RectangleClipper clipper = new RectangleClipper(Math.min(startPoint.x, draggingPoint.x),
Math.min(startPoint.y, draggingPoint.y),
Math.max(startPoint.x, draggingPoint.x),
Math.max(startPoint.y, draggingPoint.y));
CreasePattern creasePattern = ORIPA.doc.getCreasePattern();
for (OriLine l : creasePattern) {
if (clipper.clipTest(l)) {
selectedLines.addLast(l);
}
}
} catch (Exception ex) {
}
afterRectangularSelection(selectedLines, context);
}
@Override
public void onDraw(Graphics2D g2d, PaintContext context) {
super.onDraw(g2d, context);
if(startPoint != null && draggingPoint != null){
g2d.setStroke(LineSetting.STROKE_SELECT_BY_AREA);
g2d.setColor(Color.BLACK);
double sx = Math.min(startPoint.x, draggingPoint.x);
double sy = Math.min(startPoint.y, draggingPoint.y);
double w = Math.abs(startPoint.x - draggingPoint.x);
double h = Math.abs(startPoint.y - draggingPoint.y);
g2d.draw(new Rectangle2D.Double(sx, sy, w, h));
}
}
}