1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 /** 18 * @author Michael Danilov 19 * @version $Revision$ 20 */ 21 package java.awt.event; 22 23 import java.awt.Component; 24 import java.awt.Toolkit; 25 import java.lang.reflect.Field; 26 import java.lang.reflect.Modifier; 27 28 import org.apache.harmony.awt.internal.nls.Messages; 29 30 /** 31 * This class is not supported in Android 1.0. It is merely provided to maintain 32 * interface compatibility with desktop Java implementations. 33 * 34 * @since Android 1.0 35 */ 36 public class KeyEvent extends InputEvent { 37 38 private static final long serialVersionUID = -2352130953028126954L; 39 40 public static final int KEY_FIRST = 400; 41 42 public static final int KEY_LAST = 402; 43 44 public static final int KEY_TYPED = 400; 45 46 public static final int KEY_PRESSED = 401; 47 48 public static final int KEY_RELEASED = 402; 49 50 public static final int VK_ENTER = 10; 51 52 public static final int VK_BACK_SPACE = 8; 53 54 public static final int VK_TAB = 9; 55 56 public static final int VK_CANCEL = 3; 57 58 public static final int VK_CLEAR = 12; 59 60 public static final int VK_SHIFT = 16; 61 62 public static final int VK_CONTROL = 17; 63 64 public static final int VK_ALT = 18; 65 66 public static final int VK_PAUSE = 19; 67 68 public static final int VK_CAPS_LOCK = 20; 69 70 public static final int VK_ESCAPE = 27; 71 72 public static final int VK_SPACE = 32; 73 74 public static final int VK_PAGE_UP = 33; 75 76 public static final int VK_PAGE_DOWN = 34; 77 78 public static final int VK_END = 35; 79 80 public static final int VK_HOME = 36; 81 82 public static final int VK_LEFT = 37; 83 84 public static final int VK_UP = 38; 85 86 public static final int VK_RIGHT = 39; 87 88 public static final int VK_DOWN = 40; 89 90 public static final int VK_COMMA = 44; 91 92 public static final int VK_MINUS = 45; 93 94 public static final int VK_PERIOD = 46; 95 96 public static final int VK_SLASH = 47; 97 98 public static final int VK_0 = 48; 99 100 public static final int VK_1 = 49; 101 102 public static final int VK_2 = 50; 103 104 public static final int VK_3 = 51; 105 106 public static final int VK_4 = 52; 107 108 public static final int VK_5 = 53; 109 110 public static final int VK_6 = 54; 111 112 public static final int VK_7 = 55; 113 114 public static final int VK_8 = 56; 115 116 public static final int VK_9 = 57; 117 118 public static final int VK_SEMICOLON = 59; 119 120 public static final int VK_EQUALS = 61; 121 122 public static final int VK_A = 65; 123 124 public static final int VK_B = 66; 125 126 public static final int VK_C = 67; 127 128 public static final int VK_D = 68; 129 130 public static final int VK_E = 69; 131 132 public static final int VK_F = 70; 133 134 public static final int VK_G = 71; 135 136 public static final int VK_H = 72; 137 138 public static final int VK_I = 73; 139 140 public static final int VK_J = 74; 141 142 public static final int VK_K = 75; 143 144 public static final int VK_L = 76; 145 146 public static final int VK_M = 77; 147 148 public static final int VK_N = 78; 149 150 public static final int VK_O = 79; 151 152 public static final int VK_P = 80; 153 154 public static final int VK_Q = 81; 155 156 public static final int VK_R = 82; 157 158 public static final int VK_S = 83; 159 160 public static final int VK_T = 84; 161 162 public static final int VK_U = 85; 163 164 public static final int VK_V = 86; 165 166 public static final int VK_W = 87; 167 168 public static final int VK_X = 88; 169 170 public static final int VK_Y = 89; 171 172 public static final int VK_Z = 90; 173 174 public static final int VK_OPEN_BRACKET = 91; 175 176 public static final int VK_BACK_SLASH = 92; 177 178 public static final int VK_CLOSE_BRACKET = 93; 179 180 public static final int VK_NUMPAD0 = 96; 181 182 public static final int VK_NUMPAD1 = 97; 183 184 public static final int VK_NUMPAD2 = 98; 185 186 public static final int VK_NUMPAD3 = 99; 187 188 public static final int VK_NUMPAD4 = 100; 189 190 public static final int VK_NUMPAD5 = 101; 191 192 public static final int VK_NUMPAD6 = 102; 193 194 public static final int VK_NUMPAD7 = 103; 195 196 public static final int VK_NUMPAD8 = 104; 197 198 public static final int VK_NUMPAD9 = 105; 199 200 public static final int VK_MULTIPLY = 106; 201 202 public static final int VK_ADD = 107; 203 204 public static final int VK_SEPARATER = 108; 205 206 public static final int VK_SEPARATOR = 108; 207 208 public static final int VK_SUBTRACT = 109; 209 210 public static final int VK_DECIMAL = 110; 211 212 public static final int VK_DIVIDE = 111; 213 214 public static final int VK_DELETE = 127; 215 216 public static final int VK_NUM_LOCK = 144; 217 218 public static final int VK_SCROLL_LOCK = 145; 219 220 public static final int VK_F1 = 112; 221 222 public static final int VK_F2 = 113; 223 224 public static final int VK_F3 = 114; 225 226 public static final int VK_F4 = 115; 227 228 public static final int VK_F5 = 116; 229 230 public static final int VK_F6 = 117; 231 232 public static final int VK_F7 = 118; 233 234 public static final int VK_F8 = 119; 235 236 public static final int VK_F9 = 120; 237 238 public static final int VK_F10 = 121; 239 240 public static final int VK_F11 = 122; 241 242 public static final int VK_F12 = 123; 243 244 public static final int VK_F13 = 61440; 245 246 public static final int VK_F14 = 61441; 247 248 public static final int VK_F15 = 61442; 249 250 public static final int VK_F16 = 61443; 251 252 public static final int VK_F17 = 61444; 253 254 public static final int VK_F18 = 61445; 255 256 public static final int VK_F19 = 61446; 257 258 public static final int VK_F20 = 61447; 259 260 public static final int VK_F21 = 61448; 261 262 public static final int VK_F22 = 61449; 263 264 public static final int VK_F23 = 61450; 265 266 public static final int VK_F24 = 61451; 267 268 public static final int VK_PRINTSCREEN = 154; 269 270 public static final int VK_INSERT = 155; 271 272 public static final int VK_HELP = 156; 273 274 public static final int VK_META = 157; 275 276 public static final int VK_BACK_QUOTE = 192; 277 278 public static final int VK_QUOTE = 222; 279 280 public static final int VK_KP_UP = 224; 281 282 public static final int VK_KP_DOWN = 225; 283 284 public static final int VK_KP_LEFT = 226; 285 286 public static final int VK_KP_RIGHT = 227; 287 288 public static final int VK_DEAD_GRAVE = 128; 289 290 public static final int VK_DEAD_ACUTE = 129; 291 292 public static final int VK_DEAD_CIRCUMFLEX = 130; 293 294 public static final int VK_DEAD_TILDE = 131; 295 296 public static final int VK_DEAD_MACRON = 132; 297 298 public static final int VK_DEAD_BREVE = 133; 299 300 public static final int VK_DEAD_ABOVEDOT = 134; 301 302 public static final int VK_DEAD_DIAERESIS = 135; 303 304 public static final int VK_DEAD_ABOVERING = 136; 305 306 public static final int VK_DEAD_DOUBLEACUTE = 137; 307 308 public static final int VK_DEAD_CARON = 138; 309 310 public static final int VK_DEAD_CEDILLA = 139; 311 312 public static final int VK_DEAD_OGONEK = 140; 313 314 public static final int VK_DEAD_IOTA = 141; 315 316 public static final int VK_DEAD_VOICED_SOUND = 142; 317 318 public static final int VK_DEAD_SEMIVOICED_SOUND = 143; 319 320 public static final int VK_AMPERSAND = 150; 321 322 public static final int VK_ASTERISK = 151; 323 324 public static final int VK_QUOTEDBL = 152; 325 326 public static final int VK_LESS = 153; 327 328 public static final int VK_GREATER = 160; 329 330 public static final int VK_BRACELEFT = 161; 331 332 public static final int VK_BRACERIGHT = 162; 333 334 public static final int VK_AT = 512; 335 336 public static final int VK_COLON = 513; 337 338 public static final int VK_CIRCUMFLEX = 514; 339 340 public static final int VK_DOLLAR = 515; 341 342 public static final int VK_EURO_SIGN = 516; 343 344 public static final int VK_EXCLAMATION_MARK = 517; 345 346 public static final int VK_INVERTED_EXCLAMATION_MARK = 518; 347 348 public static final int VK_LEFT_PARENTHESIS = 519; 349 350 public static final int VK_NUMBER_SIGN = 520; 351 352 public static final int VK_PLUS = 521; 353 354 public static final int VK_RIGHT_PARENTHESIS = 522; 355 356 public static final int VK_UNDERSCORE = 523; 357 358 public static final int VK_FINAL = 24; 359 360 public static final int VK_WINDOWS = 524; 361 362 public static final int VK_CONTEXT_MENU = 525; 363 364 public static final int VK_CONVERT = 28; 365 366 public static final int VK_NONCONVERT = 29; 367 368 public static final int VK_ACCEPT = 30; 369 370 public static final int VK_MODECHANGE = 31; 371 372 public static final int VK_KANA = 21; 373 374 public static final int VK_KANJI = 25; 375 376 public static final int VK_ALPHANUMERIC = 240; 377 378 public static final int VK_KATAKANA = 241; 379 380 public static final int VK_HIRAGANA = 242; 381 382 public static final int VK_FULL_WIDTH = 243; 383 384 public static final int VK_HALF_WIDTH = 244; 385 386 public static final int VK_ROMAN_CHARACTERS = 245; 387 388 public static final int VK_ALL_CANDIDATES = 256; 389 390 public static final int VK_PREVIOUS_CANDIDATE = 257; 391 392 public static final int VK_CODE_INPUT = 258; 393 394 public static final int VK_JAPANESE_KATAKANA = 259; 395 396 public static final int VK_JAPANESE_HIRAGANA = 260; 397 398 public static final int VK_JAPANESE_ROMAN = 261; 399 400 public static final int VK_KANA_LOCK = 262; 401 402 public static final int VK_INPUT_METHOD_ON_OFF = 263; 403 404 public static final int VK_CUT = 65489; 405 406 public static final int VK_COPY = 65485; 407 408 public static final int VK_PASTE = 65487; 409 410 public static final int VK_UNDO = 65483; 411 412 public static final int VK_AGAIN = 65481; 413 414 public static final int VK_FIND = 65488; 415 416 public static final int VK_PROPS = 65482; 417 418 public static final int VK_STOP = 65480; 419 420 public static final int VK_COMPOSE = 65312; 421 422 public static final int VK_ALT_GRAPH = 65406; 423 424 public static final int VK_BEGIN = 65368; 425 426 public static final int VK_UNDEFINED = 0; 427 428 public static final char CHAR_UNDEFINED = (char)(-1); 429 430 public static final int KEY_LOCATION_UNKNOWN = 0; 431 432 public static final int KEY_LOCATION_STANDARD = 1; 433 434 public static final int KEY_LOCATION_LEFT = 2; 435 436 public static final int KEY_LOCATION_RIGHT = 3; 437 438 public static final int KEY_LOCATION_NUMPAD = 4; 439 440 private int keyCode; 441 private char keyChar; 442 private int keyLocation; 443 444 public static String getKeyModifiersText(int modifiers) { 445 return getKeyModifiersExText(extractExFlags(modifiers)); 446 } 447 448 static String getKeyModifiersExText(int modifiersEx) { 449 String text = ""; //$NON-NLS-1$ 450 451 if ((modifiersEx & InputEvent.META_DOWN_MASK) != 0) { 452 text += Toolkit.getProperty("AWT.meta", "Meta"); //$NON-NLS-1$ //$NON-NLS-2$ 453 } 454 if ((modifiersEx & InputEvent.CTRL_DOWN_MASK) != 0) { 455 text += ((text.length() > 0) ? "+" : "") + //$NON-NLS-1$ //$NON-NLS-2$ 456 Toolkit.getProperty("AWT.control", "Ctrl"); //$NON-NLS-1$ //$NON-NLS-2$ 457 } 458 if ((modifiersEx & InputEvent.ALT_DOWN_MASK) != 0) { 459 text += ((text.length() > 0) ? "+" : "") + //$NON-NLS-1$ //$NON-NLS-2$ 460 Toolkit.getProperty("AWT.alt", "Alt"); //$NON-NLS-1$ //$NON-NLS-2$ 461 } 462 if ((modifiersEx & InputEvent.SHIFT_DOWN_MASK) != 0) { 463 text += ((text.length() > 0) ? "+" : "") + //$NON-NLS-1$ //$NON-NLS-2$ 464 Toolkit.getProperty("AWT.shift", "Shift"); //$NON-NLS-1$ //$NON-NLS-2$ 465 } 466 if ((modifiersEx & InputEvent.ALT_GRAPH_DOWN_MASK) != 0) { 467 text += ((text.length() > 0) ? "+" : "") + //$NON-NLS-1$ //$NON-NLS-2$ 468 Toolkit.getProperty("AWT.altGraph", "Alt Graph"); //$NON-NLS-1$ //$NON-NLS-2$ 469 } 470 471 return text; 472 } 473 474 public static String getKeyText(int keyCode) { 475 String[] rawName = getPublicStaticFinalIntFieldName(keyCode); //$NON-NLS-1$ 476 477 if ((rawName == null) || (rawName.length == 0)) { 478 return ("Unknown keyCode: " + (keyCode >= 0 ? "0x" : "-0x") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 479 Integer.toHexString(Math.abs(keyCode))); 480 } 481 482 String propertyName = getPropertyName(rawName); 483 String defaultName = getDefaultName(rawName); 484 485 return Toolkit.getProperty(propertyName, defaultName); 486 } 487 488 private static String getDefaultName(String[] rawName) { 489 String name = ""; //$NON-NLS-1$ 490 491 for (int i = 0; true; i++) { 492 String part = rawName[i]; 493 494 name += new String(new char[] {part.charAt(0)}).toUpperCase() + 495 part.substring(1).toLowerCase(); 496 497 if (i == (rawName.length - 1)) { 498 break; 499 } 500 name += " "; //$NON-NLS-1$ 501 } 502 503 return name; 504 } 505 506 private static String getPropertyName(String[] rawName) { 507 String name = rawName[0].toLowerCase(); 508 509 for (int i = 1; i < rawName.length; i++) { 510 String part = rawName[i]; 511 512 name += new String(new char[] {part.charAt(0)}).toUpperCase() + 513 part.substring(1).toLowerCase(); 514 } 515 516 return ("AWT." + name); //$NON-NLS-1$ 517 } 518 519 private static String[] getPublicStaticFinalIntFieldName(int value) { 520 Field[] allFields = KeyEvent.class.getDeclaredFields(); 521 522 try { 523 for (Field field : allFields) { 524 Class<?> ssalc = field.getType(); 525 int modifiers = field.getModifiers(); 526 527 if (ssalc.isPrimitive() && ssalc.getName().equals("int") && //$NON-NLS-1$ 528 Modifier.isFinal(modifiers) && Modifier.isPublic(modifiers) && 529 Modifier.isStatic(modifiers)) 530 { 531 if (field.getInt(null) == value){ 532 final String name = field.getName(); 533 final int prefixLength = name.indexOf("_") + 1; 534 return name.substring(prefixLength).split("_"); //$NON-NLS-1$ 535 } 536 } 537 } 538 } catch (Exception e) { 539 throw new RuntimeException(e); 540 } 541 542 return null; 543 } 544 545 @Deprecated 546 public KeyEvent(Component src, int id, 547 long when, int modifiers, 548 int keyCode) { 549 this(src, id, when, modifiers, keyCode, 550 (keyCode > (2 << 7) - 1) ? CHAR_UNDEFINED : (char) keyCode); 551 } 552 553 public KeyEvent(Component src, int id, 554 long when, int modifiers, 555 int keyCode, char keyChar) { 556 this(src, id, when, modifiers, keyCode, keyChar, KEY_LOCATION_UNKNOWN); 557 } 558 559 public KeyEvent(Component src, int id, 560 long when, int modifiers, 561 int keyCode, char keyChar, 562 int keyLocation) { 563 super(src, id, when, modifiers); 564 565 if (id == KEY_TYPED) { 566 if (keyCode != VK_UNDEFINED) { 567 // awt.191=Invalid keyCode for KEY_TYPED event, must be VK_UNDEFINED 568 throw new IllegalArgumentException(Messages.getString("awt.191")); //$NON-NLS-1$ 569 } 570 if (keyChar == CHAR_UNDEFINED) { 571 // awt.192=Invalid keyChar for KEY_TYPED event, can't be CHAR_UNDEFINED 572 throw new IllegalArgumentException(Messages.getString("awt.192")); //$NON-NLS-1$ 573 } 574 } 575 576 if ((keyLocation < KEY_LOCATION_UNKNOWN) 577 || (keyLocation > KEY_LOCATION_NUMPAD)) { 578 // awt.297=Invalid keyLocation 579 throw new IllegalArgumentException(Messages.getString("awt.297")); //$NON-NLS-1$ 580 } 581 582 this.keyChar = keyChar; 583 this.keyLocation = keyLocation; 584 this.keyCode = keyCode; 585 } 586 587 public int getKeyCode() { 588 return keyCode; 589 } 590 591 public void setKeyCode(int keyCode) { 592 this.keyCode = keyCode; 593 } 594 595 public char getKeyChar() { 596 return keyChar; 597 } 598 599 public void setKeyChar(char keyChar) { 600 this.keyChar = keyChar; 601 } 602 603 public int getKeyLocation() { 604 return keyLocation; 605 } 606 607 @Override 608 @Deprecated 609 public void setModifiers(int modifiers) { 610 super.setModifiers(modifiers); 611 } 612 613 public boolean isActionKey() { 614 return ((keyChar == CHAR_UNDEFINED) && (keyCode != VK_UNDEFINED) && 615 !((keyCode == VK_ALT) || (keyCode == VK_ALT_GRAPH) || 616 (keyCode == VK_CONTROL) || (keyCode == VK_META) || (keyCode == VK_SHIFT))); 617 } 618 619 @Override 620 public String paramString() { 621 /* 622 * The format is based on 1.5 release behavior 623 * which can be revealed by the following code: 624 * 625 * KeyEvent e = new KeyEvent(new Component() {}, 626 * KeyEvent.KEY_PRESSED, 0, 627 * KeyEvent.CTRL_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK, 628 * KeyEvent.VK_A, 'A', KeyEvent.KEY_LOCATION_STANDARD); 629 * System.out.println(e); 630 */ 631 632 String idString = null; 633 String locString = null; 634 String paramString = null; 635 String keyCharString = (keyChar == '\n') ? 636 keyCharString = getKeyText(VK_ENTER) : "'" + keyChar + "'"; //$NON-NLS-1$ //$NON-NLS-2$ 637 638 switch (id) { 639 case KEY_PRESSED: 640 idString = "KEY_PRESSED"; //$NON-NLS-1$ 641 break; 642 case KEY_RELEASED: 643 idString = "KEY_RELEASED"; //$NON-NLS-1$ 644 break; 645 case KEY_TYPED: 646 idString = "KEY_TYPED"; //$NON-NLS-1$ 647 break; 648 default: 649 idString = "unknown type"; //$NON-NLS-1$ 650 } 651 652 switch(keyLocation){ 653 case KEY_LOCATION_STANDARD: 654 locString = "KEY_LOCATION_STANDARD"; //$NON-NLS-1$ 655 break; 656 case KEY_LOCATION_LEFT: 657 locString = "KEY_LOCATION_LEFT"; //$NON-NLS-1$ 658 break; 659 case KEY_LOCATION_RIGHT: 660 locString = "KEY_LOCATION_RIGHT"; //$NON-NLS-1$ 661 break; 662 case KEY_LOCATION_NUMPAD: 663 locString = "KEY_LOCATION_NUMPAD"; //$NON-NLS-1$ 664 break; 665 case KEY_LOCATION_UNKNOWN: 666 locString = "KEY_LOCATION_UNKNOWN"; //$NON-NLS-1$ 667 break; 668 default: 669 locString = "unknown type"; //$NON-NLS-1$ 670 } 671 672 paramString = idString + ",keyCode=" + keyCode; //$NON-NLS-1$ 673 if (isActionKey()) { 674 paramString += "," + getKeyText(keyCode); //$NON-NLS-1$ 675 } else { 676 paramString += ",keyChar=" + keyCharString; //$NON-NLS-1$ 677 } 678 if (getModifiersEx() > 0) { 679 paramString += ",modifiers=" + getModifiersExText(getModifiersEx()) + //$NON-NLS-1$ 680 ",extModifiers=" + getModifiersExText(getModifiersEx()); //$NON-NLS-1$ 681 } 682 paramString += ",keyLocation=" + locString; //$NON-NLS-1$ 683 684 return paramString; 685 } 686 687 } 688