/AppKit/Platform/DOM/CPPlatformWindow+DOMKeys.j
http://github.com/cacaodev/cappuccino · Unknown · 232 lines · 216 code · 16 blank · 0 comment · 0 complexity · 2ccf73537c2bbf0c75f636b49dd304e6 MD5 · raw file
- /*
- * CPPlatformWindow+DOMKeys.j
- * AppKit
- *
- * Created by Ross Boucher.
- * Copyright 2009, 280 North, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- // Keycodes taken and modified from Google Closure, available under Apache 2 License
- CPKeyCodes = {
- BACKSPACE: 8,
- TAB: 9,
- NUM_CENTER: 12,
- ENTER: 13,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- PAUSE: 19,
- CAPS_LOCK: 20,
- ESC: 27,
- SPACE: 32,
- PAGE_UP: 33, // also NUM_NORTH_EAST
- PAGE_DOWN: 34, // also NUM_SOUTH_EAST
- END: 35, // also NUM_SOUTH_WEST
- HOME: 36, // also NUM_NORTH_WEST
- LEFT: 37, // also NUM_WEST
- UP: 38, // also NUM_NORTH
- RIGHT: 39, // also NUM_EAST
- DOWN: 40, // also NUM_SOUTH
- PRINT_SCREEN: 44,
- INSERT: 45, // also NUM_INSERT
- DELETE: 46, // also NUM_DELETE
- ZERO: 48,
- ONE: 49,
- TWO: 50,
- THREE: 51,
- FOUR: 52,
- FIVE: 53,
- SIX: 54,
- SEVEN: 55,
- EIGHT: 56,
- NINE: 57,
- QUESTION_MARK: 63, // needs localization
- A: 65,
- B: 66,
- C: 67,
- D: 68,
- E: 69,
- F: 70,
- G: 71,
- H: 72,
- I: 73,
- J: 74,
- K: 75,
- L: 76,
- M: 77,
- N: 78,
- O: 79,
- P: 80,
- Q: 81,
- R: 82,
- S: 83,
- T: 84,
- U: 85,
- V: 86,
- W: 87,
- X: 88,
- Y: 89,
- Z: 90,
- META: 91,
- WEBKIT_RIGHT_META: 93, // WebKit (on Mac at least) fires this for the right Command key
- CONTEXT_MENU: 93,
- NUM_ZERO: 96,
- NUM_ONE: 97,
- NUM_TWO: 98,
- NUM_THREE: 99,
- NUM_FOUR: 100,
- NUM_FIVE: 101,
- NUM_SIX: 102,
- NUM_SEVEN: 103,
- NUM_EIGHT: 104,
- NUM_NINE: 105,
- NUM_MULTIPLY: 106,
- NUM_PLUS: 107,
- NUM_MINUS: 109,
- NUM_PERIOD: 110,
- NUM_DIVISION: 111,
- F1: 112,
- F2: 113,
- F3: 114,
- F4: 115,
- F5: 116,
- F6: 117,
- F7: 118,
- F8: 119,
- F9: 120,
- F10: 121,
- F11: 122,
- F12: 123,
- NUMLOCK: 144,
- SEMICOLON: 186, // needs localization
- DASH: 189, // needs localization
- EQUALS: 187, // needs localization
- COMMA: 188, // needs localization
- PERIOD: 190, // needs localization
- SLASH: 191, // needs localization
- APOSTROPHE: 192, // needs localization
- SINGLE_QUOTE: 222, // needs localization
- OPEN_SQUARE_BRACKET: 219, // needs localization
- BACKSLASH: 220, // needs localization
- CLOSE_SQUARE_BRACKET: 221, // needs localization
- WIN_KEY: 224,
- MAC_FF_META: 224, // Firefox (Gecko) fires this for the meta key instead of 91
- WIN_IME: 229
- };
- /*!
- * Returns true if the key fires a keypress event in the current browser.
- *
- * Accoridng to MSDN [1] IE only fires keypress events for the following keys:
- * - Letters: A - Z (uppercase and lowercase)
- * - Numerals: 0 - 9
- * - Symbols: ! @ # $ % ^ & * ( ) _ - + = < [ ] { } , . / ? \ | ' ` " ~
- * - System: ESC, SPACEBAR, ENTER
- *
- * That's not entirely correct though, for instance there's no distinction
- * between upper and lower case letters.
- *
- * [1] http://msdn2.microsoft.com/en-us/library/ms536939(VS.85).aspx)
- *
- * Safari is similar to IE, but does not fire keypress for ESC.
- *
- * Additionally, IE6 does not fire keydown or keypress events for letters when
- * the control or alt keys are held down and the shift key is not. IE7 does
- * fire keydown in these cases, though, but not keypress.
- *
- * @param keyCode A key code.
- * @param opt_heldKeyCode Key code of a currently-held key.
- * @param opt_shiftKey Whether the shift key is held down.
- * @param opt_ctrlKey Whether the control key is held down.
- * @param opt_altKey Whether the alt key is held down.
- * @return Returns YES if it's a key that fires a keypress event.
- */
- CPKeyCodes.firesKeyPressEvent = function(keyCode, opt_heldKeyCode, opt_shiftKey, opt_ctrlKey, opt_altKey)
- {
- if (!CPFeatureIsCompatible(CPJavaScriptRemedialKeySupport))
- return true;
- if (CPBrowserIsOperatingSystem(CPMacOperatingSystem) && opt_altKey)
- return CPKeyCodes.isCharacterKey(keyCode);
- // Alt but not AltGr which is represented as Alt+Ctrl.
- if (opt_altKey && !opt_ctrlKey)
- return false;
- // Saves Ctrl or Alt + key for IE7, which won't fire keypress.
- if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine) && !opt_shiftKey && (opt_ctrlKey || opt_altKey))
- return false;
- // When Ctrl+<somekey> is held in IE, it only fires a keypress once, but it
- // continues to fire keydown events as the event repeats.
- if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine) && opt_ctrlKey && opt_heldKeyCode == keyCode)
- return false;
- switch (keyCode)
- {
- case CPKeyCodes.ENTER: return true;
- case CPKeyCodes.ESC: return !CPBrowserIsEngine(CPWebKitBrowserEngine);
- }
- return CPKeyCodes.isCharacterKey(keyCode);
- };
- /*!
- * Test for whether or not a given keyCode represents a character key.
- *
- * @param keyCode A key code.
- * @return Returns YES if the keyCode is a character key.
- */
- CPKeyCodes.isCharacterKey = function(keyCode)
- {
- if (keyCode >= CPKeyCodes.ZERO && keyCode <= CPKeyCodes.NINE)
- return true;
- if (keyCode >= CPKeyCodes.NUM_ZERO && keyCode <= CPKeyCodes.NUM_MULTIPLY)
- return true;
- if (keyCode >= CPKeyCodes.A && keyCode <= CPKeyCodes.Z)
- return true;
- switch (keyCode)
- {
- case CPKeyCodes.SPACE:
- case CPKeyCodes.QUESTION_MARK:
- case CPKeyCodes.NUM_PLUS:
- case CPKeyCodes.NUM_MINUS:
- case CPKeyCodes.NUM_PERIOD:
- case CPKeyCodes.NUM_DIVISION:
- case CPKeyCodes.SEMICOLON:
- case CPKeyCodes.DASH:
- case CPKeyCodes.EQUALS:
- case CPKeyCodes.COMMA:
- case CPKeyCodes.PERIOD:
- case CPKeyCodes.SLASH:
- case CPKeyCodes.APOSTROPHE:
- case CPKeyCodes.SINGLE_QUOTE:
- case CPKeyCodes.OPEN_SQUARE_BRACKET:
- case CPKeyCodes.BACKSLASH:
- case CPKeyCodes.CLOSE_SQUARE_BRACKET:
- return true;
- default:
- return false;
- }
- };