package com.kreative.paint.tool;
import java.awt.Cursor;
import java.awt.Graphics2D;
import com.kreative.paint.document.draw.ShadowSettings;
import com.kreative.paint.document.draw.ShapeDrawObject;
public abstract class CircularShapeTool extends AbstractPaintDrawTool
implements ToolOptions.DrawPerpendicular, ToolOptions.DrawFromCenter, ToolOptions.DrawMultiple, ToolOptions.QuickShadow {
private static final Cursor curs = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
public abstract ShapeDrawObject makeShape(ToolEvent e, float centerX, float centerY, float endpointX, float endpointY);
private ShapeDrawObject makeShape1(ToolEvent e) {
float sx = e.getPreviousClickedX();
float sy = e.getPreviousClickedY();
float x = e.getX();
float y = e.getY();
if (e.isShiftDown() != e.tc().drawPerpendicular()) {
float w = Math.abs(x-sx);
float h = Math.abs(y-sy);
if (w > h*2) y = sy;
else if (h > w*2) x = sx;
else {
float s = Math.max(w, h);
if (y > sy) y = sy+s;
else y = sy-s;
if (x > sx) x = sx+s;
else x = sx-s;
}
}
float cx, cy, ex, ey;
if (e.isAltDown() != e.tc().drawFromCenter()) {
cx = sx; cy = sy;
ex = x; ey = y;
} else {
cx = (sx+x)/2f; cy = (sy+y)/2f;
ex = x; ey = y;
}
return makeShape(e, cx, cy, ex, ey);
}
private ShapeDrawObject makeObject(ToolEvent e) {
ShapeDrawObject sh = makeShape1(e);
if (e.tc().useShadow()) {
sh.setShadowSettings(new ShadowSettings(
e.tc().getShadowType(),
e.tc().getShadowOpacity(),
e.tc().getShadowXOffset(),
e.tc().getShadowYOffset()
));
}
return sh;
}
public boolean mousePressed(ToolEvent e) {
e.beginTransaction(getName());
if (e.isCtrlDown() != e.tc().drawMultiple()) {
ShapeDrawObject wsh = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(wsh);
else wsh.paint(e.getPaintGraphics());
return true;
}
else return false;
}
public boolean mouseDragged(ToolEvent e) {
if (e.isCtrlDown() != e.tc().drawMultiple()) {
ShapeDrawObject wsh = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(wsh);
else wsh.paint(e.getPaintGraphics());
return true;
}
else return false;
}
public boolean mouseReleased(ToolEvent e) {
ShapeDrawObject wsh = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(wsh);
else wsh.paint(e.getPaintGraphics());
e.commitTransaction();
return true;
}
public boolean keyPressed(ToolEvent e) {
if (e.isMouseDown() && e.isCtrlDown() != e.tc().drawMultiple()) {
ShapeDrawObject wsh = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(wsh);
else wsh.paint(e.getPaintGraphics());
return true;
}
else return false;
}
public boolean keyReleased(ToolEvent e) {
if (e.isMouseDown() && e.isCtrlDown() != e.tc().drawMultiple()) {
ShapeDrawObject wsh = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(wsh);
else wsh.paint(e.getPaintGraphics());
return true;
}
else return false;
}
public boolean paintIntermediate(ToolEvent e, Graphics2D g) {
if (e.isMouseDown()) {
ShapeDrawObject wsh = makeObject(e);
wsh.paint(g);
return true;
}
else return false;
}
public boolean doubleClickForOptions() {
return true;
}
public Cursor getCursor(ToolEvent e) {
return curs;
}
}