/*
* Copyright © 2009-2011 Rebecca G. Bettencourt / Kreative Software
* <p>
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* <a href="http://www.mozilla.org/MPL/">http://www.mozilla.org/MPL/</a>
* <p>
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
* <p>
* Alternatively, the contents of this file may be used under the terms
* of the GNU Lesser General Public License (the "LGPL License"), in which
* case the provisions of LGPL License are applicable instead of those
* above. If you wish to allow use of your version of this file only
* under the terms of the LGPL License and not to allow others to use
* your version of this file under the MPL, indicate your decision by
* deleting the provisions above and replace them with the notice and
* other provisions required by the LGPL License. If you do not delete
* the provisions above, a recipient may use your version of this file
* under either the MPL or the LGPL License.
* @since PowerPaint 1.0
* @author Rebecca G. Bettencourt, Kreative Software
*/
package com.kreative.paint.tool;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import com.kreative.paint.ToolContext;
import com.kreative.paint.document.tile.PaintSurface;
import com.kreative.paint.form.Form;
import com.kreative.paint.form.IntegerOption;
import com.kreative.paint.util.CursorUtils;
public class EraserTool extends AbstractPaintTool implements 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,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,K,K,K,
0,0,0,0,0,0,0,K,0,0,0,0,0,0,K,K,
0,0,0,0,0,0,K,0,0,0,0,0,0,K,0,K,
0,0,0,0,0,K,0,0,0,0,0,0,K,0,K,K,
0,0,0,0,K,0,0,0,0,0,0,K,0,K,K,0,
0,0,0,K,0,0,0,0,0,0,K,0,K,K,0,0,
0,0,K,0,0,0,0,0,0,K,0,K,K,0,0,0,
0,K,0,0,0,0,0,0,K,0,K,K,0,0,0,0,
K,K,K,K,K,K,K,K,0,K,K,0,0,0,0,0,
K,0,0,0,0,0,0,K,K,K,0,0,0,0,0,0,
K,0,0,0,0,0,0,K,K,0,0,0,0,0,0,0,
K,K,K,K,K,K,K,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,
}
);
public ToolCategory getCategory() {
return ToolCategory.PAINT;
}
protected Image getBWIcon() {
return icon;
}
private int eraserSize;
private Cursor eraserCursor;
public boolean toolSelected(ToolEvent e) {
setEraserSize(e.tc().getCustom(EraserTool.class, "size", Integer.class, 16));
return false;
}
public boolean toolSettingsChanged(ToolEvent e) {
setEraserSize(e.tc().getCustom(EraserTool.class, "size", Integer.class, 16));
return false;
}
private void setEraserSize(int size) {
eraserSize = size;
if (size < 3) size = 3;
BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, size, size);
g.setColor(Color.white);
g.fillRect(1, 1, size-2, size-2);
g.dispose();
eraserCursor = CursorUtils.makeCursor(img, size/2, size/2, "Eraser");
}
public boolean toolDoubleClicked(ToolEvent e) {
e.beginTransaction(getName());
e.getPaintSurface().clearAll();
e.commitTransaction();
return true;
}
public boolean mousePressed(ToolEvent e) {
e.beginTransaction(getName());
e.getPaintSurface().clear((int)e.getX()-eraserSize/2, (int)e.getY()-eraserSize/2, eraserSize, eraserSize);
return true;
}
private void drag(PaintSurface p, int sx, int sy, int dx, int dy) {
int m = (int)Math.ceil(Math.max(Math.abs(dx-sx),Math.abs(dy-sy)));
for (int i = 1; i <= m; i++) {
int x = sx + ((dx-sx)*i)/m;
int y = sy + ((dy-sy)*i)/m;
p.clear(x-eraserSize/2, y-eraserSize/2, eraserSize, eraserSize);
}
}
public boolean mouseDragged(ToolEvent e) {
drag(e.getPaintSurface(), (int)e.getPreviousX(), (int)e.getPreviousY(), (int)e.getX(), (int)e.getY());
return true;
}
public boolean mouseReleased(ToolEvent e) {
drag(e.getPaintSurface(), (int)e.getPreviousX(), (int)e.getPreviousY(), (int)e.getX(), (int)e.getY());
e.commitTransaction();
return true;
}
public boolean keyPressed(ToolEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
case KeyEvent.VK_DOWN:
e.tc().decrementCustom(EraserTool.class, "size", Integer.class, 16, 1);
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_UP:
e.tc().incrementCustom(EraserTool.class, "size", Integer.class, 16);
break;
case KeyEvent.VK_ALT:
if (eraserSize > 1) e.tc().setCustom(EraserTool.class, "size", eraserSize/2);
break;
case KeyEvent.VK_BACK_QUOTE:
e.tc().setCustom(EraserTool.class, "size", 1);
break;
case KeyEvent.VK_1:
e.tc().setCustom(EraserTool.class, "size", 2);
break;
case KeyEvent.VK_2:
e.tc().setCustom(EraserTool.class, "size", 4);
break;
case KeyEvent.VK_3:
e.tc().setCustom(EraserTool.class, "size", 8);
break;
case KeyEvent.VK_4:
e.tc().setCustom(EraserTool.class, "size", 16);
break;
case KeyEvent.VK_5:
e.tc().setCustom(EraserTool.class, "size", 32);
break;
case KeyEvent.VK_6:
e.tc().setCustom(EraserTool.class, "size", 3);
break;
case KeyEvent.VK_7:
e.tc().setCustom(EraserTool.class, "size", 6);
break;
case KeyEvent.VK_8:
e.tc().setCustom(EraserTool.class, "size", 12);
break;
case KeyEvent.VK_9:
e.tc().setCustom(EraserTool.class, "size", 24);
break;
case KeyEvent.VK_0:
e.tc().setCustom(EraserTool.class, "size", 5);
break;
case KeyEvent.VK_MINUS:
case KeyEvent.VK_SUBTRACT:
e.tc().setCustom(EraserTool.class, "size", 10);
break;
case KeyEvent.VK_EQUALS:
case KeyEvent.VK_ADD:
case KeyEvent.VK_PLUS:
e.tc().setCustom(EraserTool.class, "size", 20);
break;
}
return false;
}
public boolean keyReleased(ToolEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_ALT:
e.tc().setCustom(EraserTool.class, "size", eraserSize*2);
break;
}
return false;
}
public Cursor getCursor(ToolEvent e) {
return eraserCursor;
}
public boolean shiftConstrainsCoordinates() {
return true;
}
public Form getCustomOptionsForm(final ToolContext tc) {
Form f = new Form();
f.add(new IntegerOption() {
public String getName() { return ToolUtilities.messages.getString("eraser.options.EraserSize"); }
public int getMaximum() { return Integer.MAX_VALUE; }
public int getMinimum() { return 1; }
public int getStep() { return 1; }
public int getValue() { return tc.getCustom(EraserTool.class, "size", Integer.class, 16); }
public void setValue(int v) { tc.setCustom(EraserTool.class, "size", v); }
public boolean useSlider() { return false; }
});
return f;
}
}