package com.kreative.paint.tool; import java.awt.Cursor; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.KeyEvent; import com.kreative.paint.document.draw.PaintSettings; public class AlphabetStampTool extends AbstractPaintDrawTool implements ToolOptions.Alphabets { 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,K,K,0,0,0,0,0,0, 0,0,0,0,0,0,K,0,0,0,K,0,0,0,0,0, 0,0,0,0,0,K,0,K,K,K,0,K,0,0,0,0, 0,0,0,0,0,K,0,0,0,0,0,K,0,0,0,0, 0,0,0,0,0,K,0,0,0,0,0,K,0,0,0,0, 0,0,0,0,0,0,K,0,0,0,K,0,0,0,0,0, 0,0,0,0,0,0,0,K,K,K,0,0,0,0,0,0, 0,0,0,0,0,0,0,K,0,K,0,0,0,0,0,0, 0,0,0,K,K,K,K,K,0,K,K,K,K,K,0,0, 0,0,K,0,0,0,0,K,K,K,0,0,0,0,K,0, 0,K,0,0,0,0,0,0,K,0,0,0,0,0,0,K, 0,K,K,K,K,0,0,K,0,K,0,0,K,K,K,K, 0,K,0,0,0,0,0,K,K,K,0,0,0,0,0,K, 0,K,0,0,0,0,K,0,0,0,K,0,0,0,0,K, 0,K,0,0,0,0,K,0,0,0,K,0,0,0,0,K, 0,0,K,K,K,K,K,K,K,K,K,K,K,K,K,0, } ); public ToolCategory getCategory() { return ToolCategory.MISC; } protected Image getBWIcon() { return icon; } public boolean mousePressed(ToolEvent e) { e.beginTransaction(getName()); PaintSettings ps = e.getPaintSettings(); Graphics2D g = e.isInDrawMode() ? e.getDrawGraphics() : e.getPaintGraphics(); ps.applyFill(g); g.setFont(e.tc().getLetterFont()); FontMetrics fm = g.getFontMetrics(); int w = fm.charWidth(e.tc().getLetter()); g.drawString(String.valueOf(Character.toChars(e.tc().getLetter())), e.getX()-w/2.0f, e.getY()); return true; } public boolean mouseDragged(ToolEvent e) { if (e.isCtrlDown()) { PaintSettings ps = e.getPaintSettings(); Graphics2D g = e.isInDrawMode() ? e.getDrawGraphics() : e.getPaintGraphics(); ps.applyFill(g); g.setFont(e.tc().getLetterFont()); FontMetrics fm = g.getFontMetrics(); int w = fm.charWidth(e.tc().getLetter()); g.drawString(String.valueOf(Character.toChars(e.tc().getLetter())), e.getX()-w/2.0f, (int)e.getY()); return true; } return false; } public boolean mouseReleased(ToolEvent e) { e.commitTransaction(); return false; } public boolean keyTyped(ToolEvent e) { char ch = e.getChar(); if (isPrintable(ch)) { e.tc().setLetter(ch); } return false; } public boolean keyPressed(ToolEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: e.tc().prevLetter(); break; case KeyEvent.VK_RIGHT: e.tc().nextLetter(); break; case KeyEvent.VK_UP: e.tc().prevAlphabet(); break; case KeyEvent.VK_DOWN: e.tc().nextAlphabet(); break; } return false; } public Cursor getCursor(ToolEvent e) { return e.tc().getLetterCursor(); } public boolean shiftConstrainsCoordinates() { return true; } public boolean usesLetterKeys() { return true; } public boolean doubleClickForOptions() { return true; } private static boolean isPrintable(int ch) { // Low end filter. if (ch < 0x21) return false; if (ch < 0x7F) return true; if (ch < 0xA1) return false; // High end filter. if (ch >= 0x10FFFE) return false; if ((ch & 0xFFFF) >= 0xFFFE) return false; if (ch == 0xFFEF) return false; // The rest. if (Character.isWhitespace(ch)) return false; if (Character.isSpaceChar(ch)) return false; return true; } }