Index: lib/keySelector.js |
diff --git a/lib/keySelector.js b/lib/keySelector.js |
deleted file mode 100644 |
index 151f50d2a3d95dde38431eb9e1d68e96a6aa2cf4..0000000000000000000000000000000000000000 |
--- a/lib/keySelector.js |
+++ /dev/null |
@@ -1,227 +0,0 @@ |
-/* This Source Code Form is subject to the terms of the Mozilla Public |
- * License, v. 2.0. If a copy of the MPL was not distributed with this |
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
- |
-Cu.import("resource://gre/modules/Services.jsm"); |
- |
-let validModifiers = Object.create(null); |
-validModifiers.ACCEL = null; |
-validModifiers.CTRL = "control"; |
-validModifiers.CONTROL = "control"; |
-validModifiers.SHIFT = "shift"; |
-validModifiers.ALT = "alt"; |
-validModifiers.META = "meta"; |
- |
-let bindingsKeys = null; |
-(function() |
-{ |
- let request = new XMLHttpRequest(); |
- request.open("GET", "chrome://global/content/platformHTMLBindings.xml"); |
- request.addEventListener("load", () => |
- { |
- bindingsKeys = request.responseXML.getElementsByTagName("handler"); |
- }); |
- request.send(); |
-})(); |
- |
- |
-/** |
- * Sets the correct value of validModifiers.ACCEL. |
- */ |
-function initAccelKey() |
-{ |
- validModifiers.ACCEL = "control"; |
- try |
- { |
- let accelKey = Services.prefs.getIntPref("ui.key.accelKey"); |
- if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_CONTROL) |
- validModifiers.ACCEL = "control"; |
- else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT) |
- validModifiers.ACCEL = "alt"; |
- else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META) |
- validModifiers.ACCEL = "meta"; |
- } |
- catch(e) |
- { |
- Cu.reportError(e); |
- } |
-} |
- |
-exports.KeySelector = KeySelector; |
- |
-/** |
- * This class provides capabilities to find and use available keyboard shortcut |
- * keys. |
- * @param {ChromeWindow} window the window where to look up existing shortcut |
- * keys |
- * @constructor |
- */ |
-function KeySelector(window) |
-{ |
- this._initExistingShortcuts(window); |
-} |
-KeySelector.prototype = |
-{ |
- /** |
- * Map listing existing shortcut keys as its keys. |
- * @type Object |
- */ |
- _existingShortcuts: null, |
- |
- /** |
- * Sets up _existingShortcuts property for a window. |
- */ |
- _initExistingShortcuts: function(/**ChromeWindow*/ window) |
- { |
- if (!validModifiers.ACCEL) |
- initAccelKey(); |
- |
- this._existingShortcuts = Object.create(null); |
- |
- let keys = Array.prototype.slice.apply(window.document.getElementsByTagName("key")); |
- if (bindingsKeys) |
- keys.push.apply(keys, bindingsKeys); |
- for (let i = 0; i < keys.length; i++) |
- { |
- let key = keys[i]; |
- let keyData = |
- { |
- shift: false, |
- meta: false, |
- alt: false, |
- control: false, |
- char: null, |
- code: null |
- }; |
- |
- let keyChar = key.getAttribute("key"); |
- if (keyChar && keyChar.length == 1) |
- keyData.char = keyChar.toUpperCase(); |
- |
- let keyCode = key.getAttribute("keycode"); |
- if (keyCode && "DOM_" + keyCode.toUpperCase() in Ci.nsIDOMKeyEvent) |
- keyData.code = Ci.nsIDOMKeyEvent["DOM_" + keyCode.toUpperCase()]; |
- |
- if (!keyData.char && !keyData.code) |
- continue; |
- |
- let keyModifiers = key.getAttribute("modifiers"); |
- if (keyModifiers) |
- for (let modifier of keyModifiers.toUpperCase().match(/\w+/g)) |
- if (modifier in validModifiers) |
- keyData[validModifiers[modifier]] = true; |
- |
- let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" "); |
- this._existingShortcuts[canonical] = true; |
- } |
- }, |
- |
- /** |
- * Selects a keyboard shortcut variant that isn't already taken, |
- * parses it into an object. |
- */ |
- selectKey: function(/**String*/ variants) /**Object*/ |
- { |
- for (let variant of variants.split(/\s*,\s*/)) |
- { |
- if (!variant) |
- continue; |
- |
- let keyData = |
- { |
- shift: false, |
- meta: false, |
- alt: false, |
- control: false, |
- char: null, |
- code: null, |
- codeName: null |
- }; |
- for (let part of variant.toUpperCase().split(/\s+/)) |
- { |
- if (part in validModifiers) |
- keyData[validModifiers[part]] = true; |
- else if (part.length == 1) |
- keyData.char = part; |
- else if ("DOM_VK_" + part in Ci.nsIDOMKeyEvent) |
- { |
- keyData.code = Ci.nsIDOMKeyEvent["DOM_VK_" + part]; |
- keyData.codeName = "VK_" + part; |
- } |
- } |
- |
- if (!keyData.char && !keyData.code) |
- continue; |
- |
- let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" "); |
- if (canonical in this._existingShortcuts) |
- continue; |
- |
- return keyData; |
- } |
- |
- return null; |
- } |
-}; |
- |
-/** |
- * Creates the text representation for a key. |
- * @static |
- */ |
-KeySelector.getTextForKey = function (/**Object*/ key) /**String*/ |
-{ |
- if (!key) |
- return null; |
- |
- if (!("text" in key)) |
- { |
- key.text = null; |
- try |
- { |
- let stringBundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties"); |
- let parts = []; |
- if (key.control) |
- parts.push(stringBundle.GetStringFromName("VK_CONTROL")); |
- if (key.alt) |
- parts.push(stringBundle.GetStringFromName("VK_ALT")); |
- if (key.meta) |
- parts.push(stringBundle.GetStringFromName("VK_META")); |
- if (key.shift) |
- parts.push(stringBundle.GetStringFromName("VK_SHIFT")); |
- if (key.char) |
- parts.push(key.char.toUpperCase()); |
- else |
- { |
- let stringBundle2 = Services.strings.createBundle("chrome://global/locale/keys.properties"); |
- parts.push(stringBundle2.GetStringFromName(key.codeName)); |
- } |
- key.text = parts.join(stringBundle.GetStringFromName("MODIFIER_SEPARATOR")); |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- return null; |
- } |
- } |
- return key.text; |
-}; |
- |
-/** |
- * Tests whether a keypress event matches the given key. |
- * @static |
- */ |
-KeySelector.matchesKey = function(/**Event*/ event, /**Object*/ key) /**Boolean*/ |
-{ |
- if (event.defaultPrevented || !key) |
- return false; |
- if (key.shift != event.shiftKey || key.alt != event.altKey) |
- return false; |
- if (key.meta != event.metaKey || key.control != event.ctrlKey) |
- return false; |
- |
- if (key.char && event.charCode && String.fromCharCode(event.charCode).toUpperCase() == key.char) |
- return true; |
- if (key.code && event.keyCode && event.keyCode == key.code) |
- return true; |
- return false; |
-}; |