package com.kreative.paint.tool;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import com.kreative.paint.ToolContext;
import com.kreative.paint.document.draw.DrawObject;
import com.kreative.paint.document.draw.PaintSettings;
import com.kreative.paint.draw.CropMarkDrawObject;
import com.kreative.paint.form.Form;
import com.kreative.paint.form.IntegerOption;
public class CropMarksTool extends AbstractPaintDrawTool
implements ToolOptions.DrawSquare, ToolOptions.DrawFromCenter, ToolOptions.DrawFilled, ToolOptions.Custom {
private static final int K = 0xFF000000;
private static final Image icon = ToolUtilities.makeIcon(
16, 16,
new int[] {
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
K,K,K,K,K,0,0,K,0,K,0,K,0,K,0,K,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,0,0,
}
);
private static final Cursor curs = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
public ToolCategory getCategory() {
return ToolCategory.MISC;
}
protected Image getBWIcon() {
return icon;
}
private DrawObject makeObject(ToolEvent e) {
int divH = e.tc().getCustom(CropMarksTool.class, "divH", Integer.class, 1);
int divV = e.tc().getCustom(CropMarksTool.class, "divV", Integer.class, 1);
float sx = e.getPreviousClickedX();
float sy = e.getPreviousClickedY();
float x = e.getX();
float y = e.getY();
if (e.isShiftDown() != e.tc().drawSquare()) {
float w = Math.abs(x-sx);
float h = Math.abs(y-sy);
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;
}
if (e.isAltDown() != e.tc().drawFromCenter()) {
sx -= (x-sx);
sy -= (y-sy);
}
PaintSettings ps = e.getPaintSettings();
if (e.isCtrlDown() == e.tc().drawFilled()) {
ps = ps.deriveFillPaint(null);
}
return new CropMarkDrawObject(ps, sx, sy, x, y, divH, divV);
}
public boolean mouseReleased(ToolEvent e) {
e.beginTransaction(getName());
DrawObject o = makeObject(e);
if (e.isInDrawMode()) e.getDrawSurface().add(o);
else o.paint(e.getPaintGraphics());
e.commitTransaction();
return true;
}
public boolean paintIntermediate(ToolEvent e, Graphics2D g) {
if (e.isMouseDown()) {
DrawObject o = makeObject(e);
o.paint(g);
return true;
}
else return false;
}
public boolean keyPressed(ToolEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
e.tc().decrementCustom(CropMarksTool.class, "divH", Integer.class, 1, 1);
break;
case KeyEvent.VK_RIGHT:
e.tc().incrementCustom(CropMarksTool.class, "divH", Integer.class, 1);
break;
case KeyEvent.VK_DOWN:
e.tc().decrementCustom(CropMarksTool.class, "divV", Integer.class, 1, 1);
break;
case KeyEvent.VK_UP:
e.tc().incrementCustom(CropMarksTool.class, "divV", Integer.class, 1);
break;
}
return false;
}
public boolean doubleClickForOptions() {
return true;
}
public Cursor getCursor(ToolEvent e) {
return curs;
}
public Form getCustomOptionsForm(final ToolContext tc) {
Form f = new Form();
f.add(new IntegerOption() {
public String getName() { return ToolUtilities.messages.getString("cropmarks.options.HorizDiv"); }
public int getMaximum() { return Integer.MAX_VALUE; }
public int getMinimum() { return 1; }
public int getStep() { return 1; }
public int getValue() { return tc.getCustom(CropMarksTool.class, "divH", Integer.class, 1); }
public void setValue(int v) { tc.setCustom(CropMarksTool.class, "divH", v); }
public boolean useSlider() { return false; }
});
f.add(new IntegerOption() {
public String getName() { return ToolUtilities.messages.getString("cropmarks.options.VertDiv"); }
public int getMaximum() { return Integer.MAX_VALUE; }
public int getMinimum() { return 1; }
public int getStep() { return 1; }
public int getValue() { return tc.getCustom(CropMarksTool.class, "divV", Integer.class, 1); }
public void setValue(int v) { tc.setCustom(CropMarksTool.class, "divV", v); }
public boolean useSlider() { return false; }
});
return f;
}
}