package javax.microedition.lcdui; /** * * @author Andre Nijholt */ public class TextBox extends Screen { private final char[][] keyboard = { {'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'}, {'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 8}, {5, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', 13}, {' ', ' ', ' ', ' ', ' ', ' ', '-', '!', '.', ' '}, {'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'}, {'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 8}, {5, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ';', 13}, {' ', ' ', ' ', ' ', ' ', ' ', '-', '!', '.', ' '}, {'(', ')', '"', '+', '*', '1', '2', '3', '@', '_'}, {'<', '>', '\'', '-', '/', '4', '5', '6', '#', 8}, {'[', ']', '^', '|', '=', '7', '8', '9', '~', 13}, {' ', ' ', ' ', ' ', ' ', ' ', '0', '%', '&', '$'}, }; private final Image digits = new Image(8, 8, new byte[] { (byte) 0x02, (byte) 0x1f, (byte) 0x64, (byte) 0x52, (byte) 0x4c, (byte) 0xa8, (byte) 0xa8, (byte) 0x50}); private final Image chars = new Image(8, 8, new byte[] { (byte) 0x0e, (byte) 0x05, (byte) 0x0e, (byte) 0x7c, (byte) 0x54, (byte) 0x68, (byte) 0x90, (byte) 0x90}); private String text; private int maxSize; private int constraints; private char[] inputText = new char[16]; private int inputIdx = 0; private int kSel; private int xSel; private int ySel; public TextBox(String title, String text, int maxSize, int constraints) { this.title = title; this.text = text; this.maxSize = maxSize; this.constraints = constraints; } public void setText(String text) { this.text = text; char[] caText = text.toCharArray(); for (int i = 0; (i < caText.length) && (i < inputText.length); i++) { inputText[i] = caText[i]; } inputIdx = caText.length; } public String getText() { return text; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } public void setConstraints(int constraints) { this.constraints = constraints; } protected void keyPressed(int keyCode) { if (keyCode == KEY_RIGHT) { xSel = (xSel + 1) % 10; repaint(); } else if (keyCode == KEY_LEFT) { xSel = (xSel == 0) ? 9 : (xSel - 1); repaint(); } else if (keyCode == KEY_BACK) { ySel = (ySel + 1) % 4; repaint(); } else if (keyCode == KEY_ENTER) { if ((xSel == 0) && (ySel == 2) && ((kSel == 0) || (kSel == 4))) { kSel = (kSel == 4) ? 0 : 4; } else if ((xSel == 0) && (ySel == 3)) { kSel = (kSel == 8) ? 0 : 8; } else if ((xSel == 9) && (ySel == 1)) { // Backspace pressed if (inputIdx > 0) { inputText[--inputIdx] = '\0'; } } else if ((xSel == 9) && (ySel == 2)) { // Enter pressed: store string and return text = new String(inputText, 0, inputIdx); // Reset input text for (int i = 0; i < inputText.length; i++) { inputText[i] = '\0'; } inputIdx = 0; for (int i = 0; i < commands.size(); i++) { callCommandListener(); } } else if (inputIdx < maxSize) { inputText[inputIdx++] = keyboard[kSel + ySel][xSel]; if (!checkConstraints()) { // Text does not match constraints: remove new char inputText[--inputIdx] = '\0'; } } repaint(); } } public void paint(Graphics g) { int line = Display.CHAR_HEIGHT; int ch = Display.CHAR_WIDTH; if (title != null) { g.drawString(title, 0, 1*line); } // Draw input string per character for (int i = 0; (i < inputIdx) && (inputText[i] > '\0'); i++) { g.drawChar(inputText[i], (i * ch), 2*line, false); } // Draw keyboard frame g.drawRect(0, 31, 99, 32); g.drawLine(0, 39, 100, 39); g.drawLine(0, 47, 100, 47); g.drawLine(0, 55, 100, 55); g.drawLine(9, 32, 10, 99); g.drawLine(20, 32, 20, 99); g.drawLine(30, 32, 30, 99); g.drawLine(40, 32, 40, 99); g.drawLine(50, 32, 50, 99); g.drawLine(60, 32, 60, 99); g.drawLine(70, 32, 70, 99); g.drawLine(80, 32, 80, 99); g.drawLine(90, 32, 90, 99); // Draw keyboard selection for (int x = 0; x < 10; x++) { for (int y = 0; y < 4; y++) { g.drawChar(keyboard[kSel + y][x], (x * 10) + 2, (y + 4)*line, ((x == xSel) && (y == ySel))); } } // Draw character / digit switch image g.drawImage((kSel == 8) ? chars : digits, 1, 56, (xSel == 0) && (ySel == 3)); } private boolean checkConstraints() { // TODO: Check constraints of current input if (constraints == TextField.ANY) { return true; } return false; } }