/**************************************************************************
* Copyright (c) 2003 by Punch Telematix. All rights reserved. *
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* 1. Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* 3. Neither the name of Punch Telematix nor the names of *
* other contributors may be used to endorse or promote products *
* derived from this software without specific prior written permission.*
* *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED *
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. *
* IN NO EVENT SHALL PUNCH TELEMATIX OR OTHER CONTRIBUTORS BE LIABLE *
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF *
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, *
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE *
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
**************************************************************************/
package com.acunia.wonka.rudolph.popupkeyboard;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Keyboard extends Window implements MouseListener {
public static final boolean POPUPKEYBOARD = false;
private KeyboardButton keys_low[];
private KeyboardButton keys_cap[];
private KeyboardButton keys_nrs[];
private KeyboardButton current_keys[];
private Vector pressed_keys;
private Image keys_low_img;
private Image keys_cap_img;
private Image keys_nrs_img;
private KeyboardButton k_123_1;
private KeyboardButton k_123_2;
private KeyboardButton k_shift;
private KeyboardButton k_caps;
private KeyboardButton k_ctrl;
private KeyboardButton k_enter;
private KeyboardButton k_enter_num;
private KeyboardButton lastPressed = null;
private boolean f_caps = false;
private boolean f_shift = false;
private boolean f_num = false;
private boolean f_ctrl = false;
private int kbdWidth = 360;
private int kbdHeight = 200;
private int textfieldheight = 40;
private TextField textfield;
private TextComponent target;
public Keyboard(Frame owner) {
super(owner);
buildKbd();
addMouseListener(this);
current_keys = keys_low;
}
private void buildKbd() {
keys_low = new KeyboardButton[60];
keys_cap = new KeyboardButton[60];
keys_nrs = new KeyboardButton[47];
pressed_keys = new Vector();
k_123_1 = new KeyboardButtonText("123", new int[]{ 0, 19, 19, 0}, new int[]{ 0, 0, 16, 16}, 0, '\0');
k_123_2 = new KeyboardButtonText("123", new int[]{ 0, 19, 19, 0}, new int[]{ 0, 0, 20, 20}, 0, '\0');
k_shift = new KeyboardButtonText("Shift", new int[]{ 0, 33, 33, 0}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_SHIFT, '\0');
k_caps = new KeyboardButtonText("CAP", new int[]{ 0, 29, 29, 0}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_CAPS_LOCK, '\0');
k_ctrl = new KeyboardButtonText("Ctrl", new int[]{ 0, 22, 22, 0}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_CONTROL, '\0');
k_enter = new KeyboardButtonPoly(new int[]{-6, -2, -3, 4, 4, 6, 6, -3, -2}, new int[]{24, 20, 23, 23, 21, 21, 25, 25, 28},
new int[]{227, 239, 239, 213, 213, 227}, new int[]{ 32, 32, 64, 64, 48, 48}, KeyEvent.VK_ENTER, '\n');
k_enter_num = new KeyboardButtonPoly(new int[]{2, 6, 5, 12, 12, 14, 14, 5, 6}, new int[]{10, 6, 9, 9, 7, 7, 11, 11, 14},
new int[]{ 221, 239, 239, 221}, new int[]{60, 60, 80, 80}, KeyEvent.VK_ENTER, '\n');
/*
** Normal keyboard.
*/
keys_low[ 0] = k_123_1;
keys_low[ 1] = new KeyboardButtonText("1", new int[]{ 19, 36, 36, 19}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_1, '1');
keys_low[ 2] = new KeyboardButtonText("2", new int[]{ 36, 53, 53, 36}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_2, '2');
keys_low[ 3] = new KeyboardButtonText("3", new int[]{ 53, 70, 70, 53}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_3, '3');
keys_low[ 4] = new KeyboardButtonText("4", new int[]{ 70, 87, 87, 70}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_4, '4');
keys_low[ 5] = new KeyboardButtonText("5", new int[]{ 87, 104, 104, 87}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_5, '5');
keys_low[ 6] = new KeyboardButtonText("6", new int[]{104, 121, 121, 104}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_6, '6');
keys_low[ 7] = new KeyboardButtonText("7", new int[]{121, 138, 138, 121}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_7, '7');
keys_low[ 8] = new KeyboardButtonText("8", new int[]{138, 155, 155, 138}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_8, '8');
keys_low[ 9] = new KeyboardButtonText("9", new int[]{155, 172, 172, 155}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_9, '9');
keys_low[10] = new KeyboardButtonText("0", new int[]{172, 189, 189, 172}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_0, '0');
keys_low[11] = new KeyboardButtonText("-", new int[]{189, 205, 205, 189}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '-');
keys_low[12] = new KeyboardButtonText("=", new int[]{205, 221, 221, 205}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '=');
keys_low[13] = new KeyboardButtonPoly(new int[]{4, 9, 9, 14, 14, 9, 9}, new int[]{8, 3, 6, 6, 10, 10, 13},
new int[]{221, 239, 239, 221}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_BACK_SPACE, '\0');
keys_low[14] = new KeyboardButtonText("Tab", new int[]{ 0, 25, 25, 0}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_TAB, '\0');
keys_low[15] = new KeyboardButtonText("q", new int[]{ 25, 43, 43, 25}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_Q, 'q');
keys_low[16] = new KeyboardButtonText("w", new int[]{ 43, 61, 61, 43}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_W, 'w');
keys_low[17] = new KeyboardButtonText("e", new int[]{ 61, 79, 79, 61}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_E, 'e');
keys_low[18] = new KeyboardButtonText("r", new int[]{ 79, 97, 97, 79}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_R, 'r');
keys_low[19] = new KeyboardButtonText("t", new int[]{ 97, 115, 115, 97}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_T, 't');
keys_low[20] = new KeyboardButtonText("y", new int[]{115, 133, 133, 115}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_Y, 'y');
keys_low[21] = new KeyboardButtonText("u", new int[]{133, 151, 151, 133}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_U, 'u');
keys_low[22] = new KeyboardButtonText("i", new int[]{151, 169, 169, 151}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_I, 'i');
keys_low[23] = new KeyboardButtonText("o", new int[]{169, 187, 187, 169}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_O, 'o');
keys_low[24] = new KeyboardButtonText("p", new int[]{187, 205, 205, 187}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_P, 'p');
keys_low[25] = new KeyboardButtonText("[", new int[]{205, 222, 222, 205}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_OPEN_BRACKET, '[');
keys_low[26] = new KeyboardButtonText("]", new int[]{222, 239, 239, 222}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_CLOSE_BRACKET, ']');
keys_low[27] = k_caps;
keys_low[28] = new KeyboardButtonText("a", new int[]{ 29, 47, 47, 29}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_A, 'a');
keys_low[29] = new KeyboardButtonText("s", new int[]{ 47, 65, 65, 47}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_S, 's');
keys_low[30] = new KeyboardButtonText("d", new int[]{ 65, 83, 83, 65}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_D, 'd');
keys_low[31] = new KeyboardButtonText("f", new int[]{ 83, 101, 101, 83}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_F, 'f');
keys_low[32] = new KeyboardButtonText("g", new int[]{101, 119, 119, 101}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_G, 'g');
keys_low[33] = new KeyboardButtonText("h", new int[]{119, 137, 137, 119}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_H, 'h');
keys_low[34] = new KeyboardButtonText("j", new int[]{137, 155, 155, 137}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_J, 'j');
keys_low[35] = new KeyboardButtonText("k", new int[]{155, 173, 173, 155}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_K, 'k');
keys_low[36] = new KeyboardButtonText("l", new int[]{173, 191, 191, 173}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_L, 'l');
keys_low[37] = new KeyboardButtonText(";", new int[]{191, 209, 209, 191}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_SEMICOLON, ';');
keys_low[38] = new KeyboardButtonText("'", new int[]{209, 227, 227, 209}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_QUOTE, '\'');
keys_low[39] = k_enter;
keys_low[40] = k_shift;
keys_low[41] = new KeyboardButtonText("z", new int[]{ 33, 51, 51, 33}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_Z, 'z');
keys_low[42] = new KeyboardButtonText("x", new int[]{ 51, 69, 69, 51}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_X, 'x');
keys_low[43] = new KeyboardButtonText("c", new int[]{ 69, 87, 87, 69}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_C, 'c');
keys_low[44] = new KeyboardButtonText("v", new int[]{ 87, 105, 105, 87}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_V, 'v');
keys_low[45] = new KeyboardButtonText("b", new int[]{105, 123, 123, 105}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_B, 'b');
keys_low[46] = new KeyboardButtonText("n", new int[]{123, 141, 141, 123}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_N, 'n');
keys_low[47] = new KeyboardButtonText("m", new int[]{141, 159, 159, 141}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_M, 'm');
keys_low[48] = new KeyboardButtonText(",", new int[]{159, 177, 177, 159}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_COMMA, ',');
keys_low[49] = new KeyboardButtonText(".", new int[]{177, 195, 195, 177}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_PERIOD, '.');
keys_low[50] = new KeyboardButtonText("/", new int[]{195, 213, 213, 195}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_SLASH, '/');
keys_low[51] = k_ctrl;
keys_low[52] = new KeyboardButtonText("au", new int[]{ 22, 44, 44, 22}, new int[]{ 64, 64, 80, 80}, 0, '\0');
keys_low[53] = new KeyboardButtonText("`", new int[]{ 44, 62, 62, 44}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_BACK_QUOTE, '`');
keys_low[54] = new KeyboardButtonText("\\", new int[]{ 62, 80, 80, 62}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_BACK_SLASH, '\\');
keys_low[55] = new KeyboardButtonText(" ", new int[]{ 80, 167, 167, 80}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_SPACE, ' ');
keys_low[56] = new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{4, 8, 7, 12, 12, 7, 8},
new int[]{167, 185, 185, 167}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UP, '\0');
keys_low[57] = new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{12, 8, 9, 4, 4, 9, 8},
new int[]{185, 203, 203, 185}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_DOWN, '\0');
keys_low[58] = new KeyboardButtonPoly(new int[]{5, 9, 8, 13, 13, 8, 9}, new int[]{8, 4, 7, 7, 9, 9, 12},
new int[]{203, 221, 221, 203}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_LEFT, '\0');
keys_low[59] = new KeyboardButtonPoly(new int[]{13, 9, 10, 5, 5, 10, 9}, new int[]{8, 4, 7, 7, 9, 9, 12},
new int[]{221, 239, 239, 221}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_RIGHT, '\0');
/*
** Keyboard with shift pressed in.
*/
keys_cap[ 0] = k_123_1;
keys_cap[ 1] = new KeyboardButtonText("!", new int[]{ 19, 36, 36, 19}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '!');
keys_cap[ 2] = new KeyboardButtonText("@", new int[]{ 36, 53, 53, 36}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '@');
keys_cap[ 3] = new KeyboardButtonText("#", new int[]{ 53, 70, 70, 53}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '#');
keys_cap[ 4] = new KeyboardButtonText("$", new int[]{ 70, 87, 87, 70}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '$');
keys_cap[ 5] = new KeyboardButtonText("%", new int[]{ 87, 104, 104, 87}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '%');
keys_cap[ 6] = new KeyboardButtonText("^", new int[]{104, 121, 121, 104}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '^');
keys_cap[ 7] = new KeyboardButtonText("&", new int[]{121, 138, 138, 121}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '&');
keys_cap[ 8] = new KeyboardButtonText("*", new int[]{138, 155, 155, 138}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '*');
keys_cap[ 9] = new KeyboardButtonText("(", new int[]{155, 172, 172, 155}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '(');
keys_cap[10] = new KeyboardButtonText(")", new int[]{172, 189, 189, 172}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, ')');
keys_cap[11] = new KeyboardButtonText("_", new int[]{189, 205, 205, 189}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '_');
keys_cap[12] = new KeyboardButtonText("+", new int[]{205, 221, 221, 205}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '+');
keys_cap[13] = new KeyboardButtonText("Del", new int[]{221, 239, 239, 221}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_DELETE, '\0');
keys_cap[14] = new KeyboardButtonText("Tab", new int[]{ 0, 25, 25, 0}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_TAB, '\0');
keys_cap[15] = new KeyboardButtonText("Q", new int[]{ 25, 43, 43, 25}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_Q, 'Q');
keys_cap[16] = new KeyboardButtonText("W", new int[]{ 43, 61, 61, 43}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_W, 'W');
keys_cap[17] = new KeyboardButtonText("E", new int[]{ 61, 79, 79, 61}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_E, 'E');
keys_cap[18] = new KeyboardButtonText("R", new int[]{ 79, 97, 97, 79}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_R, 'R');
keys_cap[19] = new KeyboardButtonText("T", new int[]{ 97, 115, 115, 97}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_T, 'T');
keys_cap[20] = new KeyboardButtonText("Y", new int[]{115, 133, 133, 115}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_Y, 'Y');
keys_cap[21] = new KeyboardButtonText("U", new int[]{133, 151, 151, 133}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_U, 'U');
keys_cap[22] = new KeyboardButtonText("I", new int[]{151, 169, 169, 151}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_I, 'I');
keys_cap[23] = new KeyboardButtonText("O", new int[]{169, 187, 187, 169}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_O, 'O');
keys_cap[24] = new KeyboardButtonText("P", new int[]{187, 205, 205, 187}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_P, 'P');
keys_cap[25] = new KeyboardButtonText("{", new int[]{205, 222, 222, 205}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '{');
keys_cap[26] = new KeyboardButtonText("}", new int[]{222, 239, 239, 222}, new int[]{ 16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '}');
keys_cap[27] = k_caps;
keys_cap[28] = new KeyboardButtonText("A", new int[]{ 29, 47, 47, 29}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_A, 'A');
keys_cap[29] = new KeyboardButtonText("S", new int[]{ 47, 65, 65, 47}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_S, 'S');
keys_cap[30] = new KeyboardButtonText("D", new int[]{ 65, 83, 83, 65}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_D, 'D');
keys_cap[31] = new KeyboardButtonText("F", new int[]{ 83, 101, 101, 83}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_F, 'F');
keys_cap[32] = new KeyboardButtonText("G", new int[]{101, 119, 119, 101}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_G, 'G');
keys_cap[33] = new KeyboardButtonText("H", new int[]{119, 137, 137, 119}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_H, 'H');
keys_cap[34] = new KeyboardButtonText("J", new int[]{137, 155, 155, 137}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_J, 'J');
keys_cap[35] = new KeyboardButtonText("K", new int[]{155, 173, 173, 155}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_K, 'K');
keys_cap[36] = new KeyboardButtonText("L", new int[]{173, 191, 191, 173}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_L, 'L');
keys_cap[37] = new KeyboardButtonText(":", new int[]{191, 209, 209, 191}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, ':');
keys_cap[38] = new KeyboardButtonText("\"", new int[]{209, 227, 227, 209}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\\');
keys_cap[39] = k_enter;
keys_cap[40] = k_shift;
keys_cap[41] = new KeyboardButtonText("Z", new int[]{ 33, 51, 51, 33}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_Z, 'Z');
keys_cap[42] = new KeyboardButtonText("X", new int[]{ 51, 69, 69, 51}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_X, 'X');
keys_cap[43] = new KeyboardButtonText("C", new int[]{ 69, 87, 87, 69}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_C, 'C');
keys_cap[44] = new KeyboardButtonText("V", new int[]{ 87, 105, 105, 87}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_V, 'V');
keys_cap[45] = new KeyboardButtonText("B", new int[]{105, 123, 123, 105}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_B, 'B');
keys_cap[46] = new KeyboardButtonText("N", new int[]{123, 141, 141, 123}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_N, 'N');
keys_cap[47] = new KeyboardButtonText("M", new int[]{141, 159, 159, 141}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_M, 'M');
keys_cap[48] = new KeyboardButtonText("<", new int[]{159, 177, 177, 159}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '<');
keys_cap[49] = new KeyboardButtonText(">", new int[]{177, 195, 195, 177}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '>');
keys_cap[50] = new KeyboardButtonText("?", new int[]{195, 213, 213, 195}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '?');
keys_cap[51] = k_ctrl;
keys_cap[52] = new KeyboardButtonText("au", new int[]{ 22, 44, 44, 22}, new int[]{ 64, 64, 80, 80}, 0, '\0');
keys_cap[53] = new KeyboardButtonText("~", new int[]{ 44, 62, 62, 44}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '~');
keys_cap[54] = new KeyboardButtonText("|", new int[]{ 62, 80, 80, 62}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '|');
keys_cap[55] = new KeyboardButtonText(" ", new int[]{ 80, 167, 167, 80}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_SPACE, ' ');
keys_cap[56] = new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{4, 8, 7, 12, 12, 7, 8},
new int[]{167, 185, 185, 167}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UP, '\0');
keys_cap[57] = new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{12, 8, 9, 4, 4, 9, 8},
new int[]{185, 203, 203, 185}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_DOWN, '\0');
keys_cap[58] = new KeyboardButtonPoly(new int[]{5, 9, 8, 13, 13, 8, 9}, new int[]{8, 4, 7, 7, 9, 9, 12},
new int[]{203, 221, 221, 203}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_LEFT, '\0');
keys_cap[59] = new KeyboardButtonPoly(new int[]{13, 9, 10, 5, 5, 10, 9}, new int[]{8, 4, 7, 7, 9, 9, 12},
new int[]{221, 239, 239, 221}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_RIGHT, '\0');
/*
** Numerical Keyboard.
*/
keys_nrs[ 0] = k_123_2;
keys_nrs[ 1] = new KeyboardButtonText("[", new int[]{ 19, 36, 36, 19}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_OPEN_BRACKET, '\0');
keys_nrs[ 2] = new KeyboardButtonText("]", new int[]{ 36, 53, 53, 36}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_CLOSE_BRACKET, '\0');
keys_nrs[ 3] = new KeyboardButtonText("{", new int[]{ 53, 70, 70, 53}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '{');
keys_nrs[ 4] = new KeyboardButtonText("}", new int[]{ 70, 87, 87, 70}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '}');
keys_nrs[ 5] = new KeyboardButtonText("7", new int[]{ 93, 113, 113, 93}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD7, '7');
keys_nrs[ 6] = new KeyboardButtonText("8", new int[]{ 113, 133, 133, 113}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD8, '8');
keys_nrs[ 7] = new KeyboardButtonText("9", new int[]{ 133, 153, 153, 133}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD9, '9');
keys_nrs[ 8] = new KeyboardButtonText("#", new int[]{ 159, 179, 179, 159}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '#');
keys_nrs[ 9] = new KeyboardButtonText("%", new int[]{ 179, 199, 199, 179}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '%');
keys_nrs[10] = new KeyboardButtonText("=", new int[]{ 199, 219, 219, 199}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '=');
keys_nrs[11] = new KeyboardButtonPoly(new int[]{5, 10, 10, 15, 15, 10, 10}, new int[]{10, 5, 8, 8, 12, 12, 15},
new int[]{ 219, 239, 239, 219}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_BACK_SPACE, '\0');
keys_nrs[12] = new KeyboardButtonText("^", new int[]{ 0, 19, 19, 0}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '^');
keys_nrs[13] = new KeyboardButtonText(",", new int[]{ 19, 36, 36, 19}, new int[]{20, 20, 40, 40}, KeyEvent.VK_SEPARATER, ',');
keys_nrs[14] = new KeyboardButtonText(".", new int[]{ 36, 53, 53, 36}, new int[]{20, 20, 40, 40}, KeyEvent.VK_DECIMAL, '.');
keys_nrs[15] = new KeyboardButtonText("<", new int[]{ 53, 70, 70, 53}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '<');
keys_nrs[16] = new KeyboardButtonText(">", new int[]{ 70, 87, 87, 70}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '>');
keys_nrs[17] = new KeyboardButtonText("4", new int[]{ 93, 113, 113, 93}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD4, '4');
keys_nrs[18] = new KeyboardButtonText("5", new int[]{ 113, 133, 133, 113}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD5, '5');
keys_nrs[19] = new KeyboardButtonText("6", new int[]{ 133, 153, 153, 133}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD6, '6');
keys_nrs[20] = new KeyboardButtonText("+", new int[]{ 159, 179, 179, 159}, new int[]{20, 20, 40, 40}, KeyEvent.VK_ADD, '+');
keys_nrs[21] = new KeyboardButtonText("-", new int[]{ 179, 199, 199, 179}, new int[]{20, 20, 40, 40}, KeyEvent.VK_SUBTRACT, '-');
keys_nrs[22] = new KeyboardButtonText("*", new int[]{ 199, 219, 219, 199}, new int[]{20, 20, 40, 40}, KeyEvent.VK_MULTIPLY, '*');
keys_nrs[23] = new KeyboardButtonText("/", new int[]{ 219, 239, 239, 219}, new int[]{20, 20, 40, 40}, KeyEvent.VK_DIVIDE, '/');
keys_nrs[24] = new KeyboardButtonText(" ", new int[]{ 0, 19, 19, 0}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[25] = new KeyboardButtonText(" ", new int[]{ 19, 36, 36, 19}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[26] = new KeyboardButtonText(":", new int[]{ 36, 53, 53, 36}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, ':');
keys_nrs[27] = new KeyboardButtonText("\\", new int[]{ 53, 70, 70, 53}, new int[]{40, 40, 60, 60}, KeyEvent.VK_BACK_SLASH, '\\');
keys_nrs[28] = new KeyboardButtonText("|", new int[]{ 70, 87, 87, 70}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '|');
keys_nrs[29] = new KeyboardButtonText("1", new int[]{ 93, 113, 113, 93}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD1, '1');
keys_nrs[30] = new KeyboardButtonText("2", new int[]{ 113, 133, 133, 113}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD2, '2');
keys_nrs[31] = new KeyboardButtonText("3", new int[]{ 133, 153, 153, 133}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD3, '3');
keys_nrs[32] = new KeyboardButtonPoly(new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{6, 10, 9, 14, 14, 9, 10},
new int[]{ 159, 179, 179, 159}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UP, '\0');
keys_nrs[33] = new KeyboardButtonPoly(new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{14, 10, 11, 6, 6, 11, 10},
new int[]{ 179, 199, 199, 179}, new int[]{40, 40, 60, 60}, KeyEvent.VK_DOWN, '\0');
keys_nrs[34] = new KeyboardButtonPoly(new int[]{6, 10, 9, 14, 14, 9, 10}, new int[]{10, 6, 9, 9, 11, 11, 14},
new int[]{ 199, 219, 219, 199}, new int[]{40, 40, 60, 60}, KeyEvent.VK_LEFT, '\0');
keys_nrs[35] = new KeyboardButtonPoly(new int[]{14, 10, 11, 6, 6, 11, 10}, new int[]{10, 6, 9, 9, 11, 11, 14},
new int[]{ 219, 239, 239, 219}, new int[]{40, 40, 60, 60}, KeyEvent.VK_RIGHT, '\0');
keys_nrs[36] = new KeyboardButtonText("$", new int[]{ 0, 19, 19, 0}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '$');
keys_nrs[37] = new KeyboardButtonText(" ", new int[]{ 19, 36, 36, 19}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[38] = new KeyboardButtonText("\u20AC", new int[]{ 36, 53, 53, 36}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[39] = new KeyboardButtonText("\u00A3", new int[]{ 53, 70, 70, 53}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[40] = new KeyboardButtonText("\u00A5", new int[]{ 70, 87, 87, 70}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0');
keys_nrs[41] = new KeyboardButtonText("(", new int[]{ 93, 113, 113, 93}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '(');
keys_nrs[42] = new KeyboardButtonText("0", new int[]{ 113, 133, 133, 113}, new int[]{60, 60, 80, 80}, KeyEvent.VK_NUMPAD0, '0');
keys_nrs[43] = new KeyboardButtonText(")", new int[]{ 133, 153, 153, 133}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, ')');
keys_nrs[44] = new KeyboardButtonText("Tab", new int[]{ 159, 183, 183, 159}, new int[]{60, 60, 80, 80}, KeyEvent.VK_TAB, '\0');
keys_nrs[45] = new KeyboardButtonText("Space", new int[]{ 183, 221, 221, 183}, new int[]{60, 60, 80, 80}, KeyEvent.VK_SPACE, ' ');
keys_nrs[46] = k_enter_num;
setLayout(null);
textfield = new TextField("");
textfield.setFont(new Font("Helvetica", Font.PLAIN, 12));
setFont(new Font("Helvetica", Font.PLAIN, 12));
kbdWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
kbdHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
add(textfield);
textfield.validate();
kbdHeight -= textfieldheight;
textfield.setBounds(2, 0, kbdWidth - 4, textfieldheight);
int size = keys_nrs.length;
for(int i=0; i < size; i++) {
keys_nrs[i].setScale(kbdWidth, kbdHeight, 240, 81);
keys_nrs[i].setTranslate(0, textfieldheight);
}
size = keys_low.length;
for(int i=0; i < size; i++) {
keys_low[i].setScale(kbdWidth, kbdHeight, 240, 81);
keys_low[i].setTranslate(0, textfieldheight);
}
size = keys_cap.length;
for(int i=0; i < size; i++) {
keys_cap[i].setScale(kbdWidth, kbdHeight, 240, 81);
keys_cap[i].setTranslate(0, textfieldheight);
}
}
public void update(Graphics g) {
paint(g);
}
private Image drawKeyboard() {
KeyboardButton local[] = current_keys;
Image result = createImage(getSize().width, getSize().height);
Graphics img = result.getGraphics();
int size = local.length;
for(int i=0; i < size; i++) {
local[i].paint_img(img);
}
return result;
}
public void paint(Graphics g) {
if(current_keys == keys_low) {
if(keys_low_img == null) keys_low_img = drawKeyboard();
g.drawImage(keys_low_img, 0, 0, null);
}
else if(current_keys == keys_cap) {
if(keys_cap_img == null) keys_cap_img = drawKeyboard();
g.drawImage(keys_cap_img, 0, 0, null);
}
else if(current_keys == keys_nrs) {
if(keys_nrs_img == null) keys_nrs_img = drawKeyboard();
g.drawImage(keys_nrs_img, 0, 0, null);
}
int size = pressed_keys.size();
KeyboardButton key;
for(int i=0; i < size; i++) {
((KeyboardButton)pressed_keys.elementAt(i)).paint(g);
}
}
private KeyboardButton getKey(int x, int y) {
KeyboardButton local[] = current_keys;
int size = local.length;
for(int i=0; i < size; i++) {
if(local[i].contains(x, y)) {
return local[i];
}
}
return null;
}
public void sendKeyEvent(int keyCode, char keyChar) {
if(target != null) {
target.setText(textfield.getText());
target.setCaretPosition(textfield.getCaretPosition());
target.select(textfield.getSelectionStart(), textfield.getSelectionEnd());
KeyEvent ke = new KeyEvent(target, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, keyCode, keyChar);
target.dispatchEvent(ke);
ke = new KeyEvent(target, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, keyCode, keyChar);
target.dispatchEvent(ke);
keyTyped(keyCode, keyChar);
textfield.setText(target.getText());
textfield.setCaretPosition(target.getCaretPosition());
textfield.select(target.getSelectionStart(), target.getSelectionEnd());
}
}
public Dimension getPreferredSize() {
return new Dimension(kbdWidth, kbdHeight + textfieldheight);
}
public Dimension getMinimumSize() {
return new Dimension(kbdWidth, kbdHeight + textfieldheight);
}
public Dimension getMaximumSize() {
return new Dimension(kbdWidth, kbdHeight + textfieldheight);
}
public void open(TextComponent component) {
if(component != textfield){
setBounds(0, 0, getPreferredSize().width, getPreferredSize().height);
toFront();
show();
target = component;
textfield.setText(target.getText());
textfield.setCaretPosition(target.getCaretPosition());
textfield.select(target.getSelectionStart(), target.getSelectionEnd());
text = target.getText();
}
}
public void close() {
toBack();
setVisible(false);
//dispose();
}
private void setPressed(KeyboardButton key, boolean state) {
key.setPressed(state);
if(state) {
pressed_keys.add(key);
}
else {
pressed_keys.remove(key);
}
}
/*
** Mouse events.
*/
public void mousePressed(MouseEvent event) {
KeyboardButton key = getKey(event.getX(), event.getY());
if(key != null) {
if(key == k_caps) {
if(key.getPressed()) {
f_caps = false;
current_keys = keys_low;
setPressed(key, false);
//System.out.println("k_caps = false");
}
else {
f_caps = true;
current_keys = keys_cap;
setPressed(key, true);
//System.out.println("k_caps = true");
}
lastPressed = null;
repaint();
}
else if(key == k_123_1) {
f_caps = false;
f_shift = false;
f_num = true;
current_keys = keys_nrs;
pressed_keys.clear();
setPressed(k_123_2, true);
repaint();
}
else if(key == k_123_2) {
setPressed(k_123_2, false);
current_keys = keys_low;
f_num = false;
repaint();
}
else if(key == k_shift) {
if(key.getPressed()) {
setPressed(key, false);
if(f_caps) current_keys = keys_cap; else current_keys = keys_low;
f_shift = false;
//System.out.println("k_shift = false");
}
else {
setPressed(key, true);
if(f_caps) current_keys = keys_low; else current_keys = keys_cap;
f_shift = true;
//System.out.println("k_shift = true");
}
repaint();
}
else if(key == k_enter || key == k_enter_num) {
close();
if(target != null) {
target.dispatchEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, ""));
}
}
else {
lastPressed = key;
setPressed(key, true);
repaint();
sendKeyEvent(key.getKeyEvent(), key.getKeyChar());
}
}
textfield.requestFocus();
}
public void mouseReleased(MouseEvent event) {
if(lastPressed != null) {
setPressed(lastPressed, false);
if(f_shift) {
f_shift = false;
setPressed(k_shift, false);
if(f_caps) current_keys = keys_cap; else current_keys = keys_low;
}
lastPressed = null;
repaint();
}
textfield.requestFocus();
}
public void mouseClicked(MouseEvent event) {
textfield.requestFocus();
}
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
/*
** Fake TextField.
*/
private String text = "";
private int position;
private int selectionStart;
private int selectionStop;
private int getCaretPosition() {
position = textfield.getCaretPosition();
return position;
}
private void setCaretPosition(int newposition) {
textfield.setCaretPosition(newposition);
position = textfield.getCaretPosition();
}
private int getSelectionStart() {
selectionStart = textfield.getSelectionStart();
return selectionStart;
}
private int getSelectionEnd() {
selectionStop = textfield.getSelectionEnd();
return selectionStop;
}
private void select(int start, int end) {
textfield.select(start, end);
getSelectionStart();
getSelectionEnd();
}
public void keyTyped(int keyCode, char keyChar) {
getSelectionStart();
getSelectionEnd();
getCaretPosition();
switch(keyCode) {
case KeyEvent.VK_LEFT:
moveCaret(getCaretPosition() - 1);
break;
case KeyEvent.VK_RIGHT:
moveCaret(getCaretPosition() + 1);
break;
case KeyEvent.VK_BACK_SPACE:
if(getSelectionStart() < getSelectionEnd()) {
deleteSelection();
}
else {
deleteCaret(getCaretPosition() -1);
}
break;
case KeyEvent.VK_DELETE:
if(getSelectionStart() < getSelectionEnd()) {
deleteSelection();
}
else {
deleteCaret(getCaretPosition());
}
break;
case KeyEvent.VK_SHIFT:
case KeyEvent.VK_CONTROL:
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
break;
default:
if(keyChar != '\0') {
if(getSelectionStart() < getSelectionEnd() ){
insertSelection(keyChar);
}
else {
insertCaret(getCaretPosition(), keyChar);
}
}
}
}
private boolean moveCaret(int newpos) {
if(newpos < 0 || newpos > text.length() || newpos == getCaretPosition()) {
return false ;
}
setCaretPosition(newpos);
select(newpos, newpos);
return true;
}
private boolean deleteCaret(int newpos){
if(newpos<0 || newpos>=text.length()) {
return false ;
}
text = new String(new StringBuffer(text).deleteCharAt(newpos));
textfield.setText(text);
setCaretPosition(newpos);
select(newpos, newpos);
return true;
}
private void deleteSelection(){
text = new String(new StringBuffer(text).delete(selectionStart, selectionStop));
textfield.setText(text);
setCaretPosition(selectionStart);
select(position, position);
}
private boolean insertCaret(int newpos, char c){
if(newpos<0 || newpos>text.length()) {
return false ;
}
text = new String(new StringBuffer(text).insert(newpos,c));
textfield.setText(text);
setCaretPosition(newpos+1);
select(position, position);
return true;
}
private void insertSelection(char c){
StringBuffer buf =new StringBuffer(text);
buf.delete(selectionStart, selectionStop);
buf.insert(selectionStart,c);
text = new String(buf);
textfield.setText(text);
setCaretPosition(selectionStart);
select(position, position);
}
}