UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

279 lines (239 loc) 7.95 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2012 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) * Fabian Jakobs (fjakobs) ************************************************************************ */ /** * Utilities for working with character codes and key identifiers */ qx.Bootstrap.define("qx.event.util.Keyboard", { statics: { /* --------------------------------------------------------------------------- KEY MAPS --------------------------------------------------------------------------- */ /** * @type {Map} maps the charcodes of special printable keys to key identifiers * * @lint ignoreReferenceField(specialCharCodeMap) */ specialCharCodeMap: { 8: "Backspace", // The Backspace (Back) key. 9: "Tab", // The Horizontal Tabulation (Tab) key. // Note: This key identifier is also used for the // Return (Macintosh numpad) key. 13: "Enter", // The Enter key. 27: "Escape", // The Escape (Esc) key. 32: "Space" // The Space (Spacebar) key. }, /** * @type {Map} maps the keycodes of the numpad keys to the right charcodes * * @lint ignoreReferenceField(numpadToCharCode) */ numpadToCharCode: { 96: "0".charCodeAt(0), 97: "1".charCodeAt(0), 98: "2".charCodeAt(0), 99: "3".charCodeAt(0), 100: "4".charCodeAt(0), 101: "5".charCodeAt(0), 102: "6".charCodeAt(0), 103: "7".charCodeAt(0), 104: "8".charCodeAt(0), 105: "9".charCodeAt(0), 106: "*".charCodeAt(0), 107: "+".charCodeAt(0), 109: "-".charCodeAt(0), 110: ",".charCodeAt(0), 111: "/".charCodeAt(0) }, /** * @type {Map} maps the keycodes of non printable keys to key identifiers * * @lint ignoreReferenceField(keyCodeToIdentifierMap) */ keyCodeToIdentifierMap: { 16: "Shift", // The Shift key. 17: "Control", // The Control (Ctrl) key. 18: "Alt", // The Alt (Menu) key. 20: "CapsLock", // The CapsLock key 224: "Meta", // The Meta key. (Apple Meta and Windows key) 37: "Left", // The Left Arrow key. 38: "Up", // The Up Arrow key. 39: "Right", // The Right Arrow key. 40: "Down", // The Down Arrow key. 33: "PageUp", // The Page Up key. 34: "PageDown", // The Page Down (Next) key. 35: "End", // The End key. 36: "Home", // The Home key. 45: "Insert", // The Insert (Ins) key. (Does not fire in Opera/Win) 46: "Delete", // The Delete (Del) Key. 112: "F1", // The F1 key. 113: "F2", // The F2 key. 114: "F3", // The F3 key. 115: "F4", // The F4 key. 116: "F5", // The F5 key. 117: "F6", // The F6 key. 118: "F7", // The F7 key. 119: "F8", // The F8 key. 120: "F9", // The F9 key. 121: "F10", // The F10 key. 122: "F11", // The F11 key. 123: "F12", // The F12 key. 144: "NumLock", // The Num Lock key. 44: "PrintScreen", // The Print Screen (PrintScrn, SnapShot) key. 145: "Scroll", // The scroll lock key 19: "Pause", // The pause/break key // The left Windows Logo key or left cmd key 91: qx.core.Environment.get("os.name") == "osx" ? "cmd" : "Win", 92: "Win", // The right Windows Logo key or left cmd key // The Application key (Windows Context Menu) or right cmd key 93: qx.core.Environment.get("os.name") == "osx" ? "cmd" : "Apps" }, /** char code for capital A */ charCodeA: "A".charCodeAt(0), /** char code for capital Z */ charCodeZ: "Z".charCodeAt(0), /** char code for 0 */ charCode0: "0".charCodeAt(0), /** char code for 9 */ charCode9: "9".charCodeAt(0), /** * converts a keyboard code to the corresponding identifier * * @param keyCode {Integer} key code * @return {String} key identifier */ keyCodeToIdentifier(keyCode) { if (this.isIdentifiableKeyCode(keyCode)) { var numPadKeyCode = this.numpadToCharCode[keyCode]; if (numPadKeyCode) { return String.fromCharCode(numPadKeyCode); } return ( this.keyCodeToIdentifierMap[keyCode] || this.specialCharCodeMap[keyCode] || String.fromCharCode(keyCode) ); } else { return "Unidentified"; } }, /** * converts a character code to the corresponding identifier * * @param charCode {String} character code * @return {String} key identifier */ charCodeToIdentifier(charCode) { return ( this.specialCharCodeMap[charCode] || String.fromCharCode(charCode).toUpperCase() ); }, /** * Check whether the keycode can be reliably detected in keyup/keydown events * * @param keyCode {String} key code to check. * @return {Boolean} Whether the keycode can be reliably detected in keyup/keydown events. */ isIdentifiableKeyCode(keyCode) { if (keyCode >= this.charCodeA && keyCode <= this.charCodeZ) { return true; } // 0-9 if (keyCode >= this.charCode0 && keyCode <= this.charCode9) { return true; } // Enter, Space, Tab, Backspace if (this.specialCharCodeMap[keyCode]) { return true; } // Numpad if (this.numpadToCharCode[keyCode]) { return true; } // non printable keys if (this.isNonPrintableKeyCode(keyCode)) { return true; } return false; }, /** * Checks whether the keyCode represents a non printable key * * @param keyCode {String} key code to check. * @return {Boolean} Whether the keyCode represents a non printable key. */ isNonPrintableKeyCode(keyCode) { return this.keyCodeToIdentifierMap[keyCode] ? true : false; }, /** * Checks whether a given string is a valid keyIdentifier * * @param keyIdentifier {String} The key identifier. * @return {Boolean} whether the given string is a valid keyIdentifier */ isValidKeyIdentifier(keyIdentifier) { if (this.identifierToKeyCodeMap[keyIdentifier]) { return true; } if (keyIdentifier.length != 1) { return false; } if (keyIdentifier >= "0" && keyIdentifier <= "9") { return true; } if (keyIdentifier >= "A" && keyIdentifier <= "Z") { return true; } switch (keyIdentifier) { case "+": case "-": case "*": case "/": case ",": return true; default: return false; } }, /** * Checks whether a given string is a printable keyIdentifier. * * @param keyIdentifier {String} The key identifier. * @return {Boolean} whether the given string is a printable keyIdentifier. */ isPrintableKeyIdentifier(keyIdentifier) { if (keyIdentifier === "Space") { return true; } else { return this.identifierToKeyCodeMap[keyIdentifier] ? false : true; } } }, defer(statics) { // construct inverse of keyCodeToIdentifierMap if (!statics.identifierToKeyCodeMap) { statics.identifierToKeyCodeMap = {}; for (var key in statics.keyCodeToIdentifierMap) { statics.identifierToKeyCodeMap[statics.keyCodeToIdentifierMap[key]] = parseInt(key, 10); } for (var key in statics.specialCharCodeMap) { statics.identifierToKeyCodeMap[statics.specialCharCodeMap[key]] = parseInt(key, 10); } } } });