diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js b/Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js new file mode 100644 index 000000000..43e8a7423 --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Models/KeyboardShortcut.js @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2013, 2015 Apple Inc. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``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 APPLE INC. OR ITS 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. + */ + +WebInspector.KeyboardShortcut = class KeyboardShortcut extends WebInspector.Object +{ + constructor(modifiers, key, callback, targetElement) + { + super(); + + console.assert(key); + console.assert(!callback || typeof callback === "function"); + console.assert(!targetElement || targetElement instanceof Element); + + if (typeof key === "string") { + key = key[0].toUpperCase(); + key = new WebInspector.Key(key.charCodeAt(0), key); + } + + if (callback && !targetElement) + targetElement = document; + + this._modifiers = modifiers || WebInspector.KeyboardShortcut.Modifier.None; + this._key = key; + this._targetElement = targetElement; + this._callback = callback; + this._disabled = false; + this._implicitlyPreventsDefault = true; + + if (targetElement) { + var targetKeyboardShortcuts = targetElement._keyboardShortcuts; + if (!targetKeyboardShortcuts) + targetKeyboardShortcuts = targetElement._keyboardShortcuts = []; + + targetKeyboardShortcuts.push(this); + + if (!WebInspector.KeyboardShortcut._registeredKeyDownListener) { + WebInspector.KeyboardShortcut._registeredKeyDownListener = true; + window.addEventListener("keydown", WebInspector.KeyboardShortcut._handleKeyDown); + } + } + } + + // Static + + static _handleKeyDown(event) + { + if (event.defaultPrevented) + return; + + for (var targetElement = event.target; targetElement; targetElement = targetElement.parentNode) { + if (!targetElement._keyboardShortcuts) + continue; + + for (var i = 0; i < targetElement._keyboardShortcuts.length; ++i) { + var keyboardShortcut = targetElement._keyboardShortcuts[i]; + if (!keyboardShortcut.matchesEvent(event)) + continue; + + if (!keyboardShortcut.callback) + continue; + + keyboardShortcut.callback(event, keyboardShortcut); + + if (keyboardShortcut.implicitlyPreventsDefault) + event.preventDefault(); + + return; + } + } + } + + // Public + + get modifiers() + { + return this._modifiers; + } + + get key() + { + return this._key; + } + + get displayName() + { + var result = ""; + + if (this._modifiers & WebInspector.KeyboardShortcut.Modifier.Control) + result += "\u2303"; + if (this._modifiers & WebInspector.KeyboardShortcut.Modifier.Option) + result += WebInspector.Platform.name === "mac" ? "\u2325" : "\u2387"; + if (this._modifiers & WebInspector.KeyboardShortcut.Modifier.Shift) + result += "\u21e7"; + if (this._modifiers & WebInspector.KeyboardShortcut.Modifier.Command) + result += "\u2318"; + + result += this._key.toString(); + + return result; + } + + get callback() + { + return this._callback; + } + + set callback(callback) + { + console.assert(!callback || typeof callback === "function"); + + this._callback = callback || null; + } + + get disabled() + { + return this._disabled; + } + + set disabled(disabled) + { + this._disabled = disabled || false; + } + + get implicitlyPreventsDefault() + { + return this._implicitlyPreventsDefault; + } + + set implicitlyPreventsDefault(implicitly) + { + this._implicitlyPreventsDefault = implicitly; + } + + unbind() + { + this._disabled = true; + + if (!this._targetElement) + return; + + var targetKeyboardShortcuts = this._targetElement._keyboardShortcuts; + if (!targetKeyboardShortcuts) + return; + + targetKeyboardShortcuts.remove(this); + } + + matchesEvent(event) + { + if (this._disabled) + return false; + + if (this._key.keyCode !== event.keyCode) + return false; + + var eventModifiers = WebInspector.KeyboardShortcut.Modifier.None; + if (event.shiftKey) + eventModifiers |= WebInspector.KeyboardShortcut.Modifier.Shift; + if (event.ctrlKey) + eventModifiers |= WebInspector.KeyboardShortcut.Modifier.Control; + if (event.altKey) + eventModifiers |= WebInspector.KeyboardShortcut.Modifier.Option; + if (event.metaKey) + eventModifiers |= WebInspector.KeyboardShortcut.Modifier.Command; + return this._modifiers === eventModifiers; + } +}; + +WebInspector.Key = class Key +{ + constructor(keyCode, displayName) + { + this._keyCode = keyCode; + this._displayName = displayName; + } + + // Public + + get keyCode() + { + return this._keyCode; + } + + get displayName() + { + return this._displayName; + } + + toString() + { + return this._displayName; + } +}; + +WebInspector.KeyboardShortcut.Modifier = { + None: 0, + Shift: 1, + Control: 2, + Option: 4, + Command: 8, + + get CommandOrControl() + { + return WebInspector.Platform.name === "mac" ? this.Command : this.Control; + } +}; + +WebInspector.KeyboardShortcut.Key = { + Backspace: new WebInspector.Key(8, "\u232b"), + Tab: new WebInspector.Key(9, "\u21e5"), + Enter: new WebInspector.Key(13, "\u21a9"), + Escape: new WebInspector.Key(27, "\u238b"), + Space: new WebInspector.Key(32, "Space"), + PageUp: new WebInspector.Key(33, "\u21de"), + PageDown: new WebInspector.Key(34, "\u21df"), + End: new WebInspector.Key(35, "\u2198"), + Home: new WebInspector.Key(36, "\u2196"), + Left: new WebInspector.Key(37, "\u2190"), + Up: new WebInspector.Key(38, "\u2191"), + Right: new WebInspector.Key(39, "\u2192"), + Down: new WebInspector.Key(40, "\u2193"), + Delete: new WebInspector.Key(46, "\u2326"), + Zero: new WebInspector.Key(48, "0"), + F1: new WebInspector.Key(112, "F1"), + F2: new WebInspector.Key(113, "F2"), + F3: new WebInspector.Key(114, "F3"), + F4: new WebInspector.Key(115, "F4"), + F5: new WebInspector.Key(116, "F5"), + F6: new WebInspector.Key(117, "F6"), + F7: new WebInspector.Key(118, "F7"), + F8: new WebInspector.Key(119, "F8"), + F9: new WebInspector.Key(120, "F9"), + F10: new WebInspector.Key(121, "F10"), + F11: new WebInspector.Key(122, "F11"), + F12: new WebInspector.Key(123, "F12"), + Semicolon: new WebInspector.Key(186, ";"), + Plus: new WebInspector.Key(187, "+"), + Comma: new WebInspector.Key(188, ","), + Minus: new WebInspector.Key(189, "-"), + Period: new WebInspector.Key(190, "."), + Slash: new WebInspector.Key(191, "/"), + Apostrophe: new WebInspector.Key(192, "`"), + LeftCurlyBrace: new WebInspector.Key(219, "{"), + Backslash: new WebInspector.Key(220, "\\"), + RightCurlyBrace: new WebInspector.Key(221, "}"), + SingleQuote: new WebInspector.Key(222, "\'") +}; |