PrefKeys: Now a module. Added prefs for repeat-last-command.

This commit is contained in:
satyr 2009-11-12 23:05:12 +09:00
Родитель faca891ef3
Коммит f97392dd95
7 изменённых файлов: 198 добавлений и 145 удалений

Просмотреть файл

@ -11,7 +11,6 @@
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&ubiquity.pagetitle.About;</title>
@ -20,13 +19,14 @@
<link rel="stylesheet" type="text/css" media="all" href="web-content.css" />
<link rel="icon" type="image/x-icon" id="favicon" href="chrome://ubiquity/skin/icons/favicon.ico" />
<script type="text/javascript" src="resource://ubiquity/scripts/jquery.js"></script>
<script type="application/javascript;version=1.8" src="chrome://ubiquity/content/header.js"></script>
<script type="application/javascript;version=1.8" src="chrome://ubiquity/content/tutorial.js"></script>
<script type="text/javascript" src="prefkeys.js"></script>
<script type="text/javascript"
src="resource://ubiquity/scripts/jquery.js"></script>
<script type="application/javascript;version=1.8"
src="chrome://ubiquity/content/header.js"></script>
<script type="application/javascript;version=1.8"
src="chrome://ubiquity/content/tutorial.js"></script>
</head>
<body dir="&locale.dir;">
<div class="head">&ubiquity.tagline.About;</div>
<div id="nav-container"></div>
@ -76,6 +76,5 @@
</div>
<br clear="all" />
</body>
</html>

Просмотреть файл

@ -53,6 +53,7 @@ addEventListener("load", function onload() {
Cu.import("resource://ubiquity/modules/setup.js", jsm);
Cu.import("resource://ubiquity/modules/cmdmanager.js", jsm);
Cu.import("resource://ubiquity/modules/msgservice.js", jsm);
Cu.import("resource://ubiquity/modules/prefkeys.js", jsm);
function ubiquitySetup() {
var services = jsm.UbiquitySetup.createServices();
@ -106,27 +107,14 @@ addEventListener("load", function onload() {
services.commandSource.onUbiquityLoad(window);
}
function ubiquityKey(aEvent) {
var keyCode = prefs.getValue("extensions.ubiquity.keycode",
KeyEvent.DOM_VK_SPACE);
// Toggle Ubiquity if the key pressed matches the shortcut key
if (aEvent.keyCode === keyCode && ubiquityEventMatchesModifier(aEvent)) {
gUbiquity.toggleWindow();
aEvent.preventDefault();
aEvent.stopPropagation();
}
}
const DEFAULT_KEY_MODIFIER = jsm.Utils.OS === "WINNT" ? "CTRL" : "ALT";
function ubiquityEventMatchesModifier(aEvent) {
var keyModifier = prefs.getValue("extensions.ubiquity.keymodifier",
DEFAULT_KEY_MODIFIER);
// Match only if the user is holding down the modifier key set for
// Ubiquity AND NO OTHER modifier keys.
return (aEvent.shiftKey === (keyModifier === "SHIFT") &&
aEvent.ctrlKey === (keyModifier === "CTRL" ) &&
aEvent.altKey === (keyModifier === "ALT" ) &&
aEvent.metaKey === (keyModifier === "META" ));
var toggleKeys = new jsm.PrefKeys(
"",
KeyEvent.DOM_VK_SPACE,
jsm.Utils.OS === "WINNT" ? "CTRL" : "ALT");
var repeatKeys = new jsm.PrefKeys("repeat");
function ubiquityKey(event) {
if (toggleKeys.match(event)) return gUbiquity.toggleWindow();
if (repeatKeys.match(event)) return gUbiquity.execute("");
}
jsm.UbiquitySetup.preload(function ubiquitySetupWrapper() {
@ -139,6 +127,8 @@ addEventListener("load", function onload() {
//errorToLocalize
new jsm.AlertMessageService().displayMessage("Setup failed.");
}
if (gUbiquity) addEventListener("keydown", ubiquityKey, true);
if (!gUbiquity) return;
addEventListener("keydown", ubiquityKey, true);
addEventListener("keypress", ubiquityKey, true);
});
}, false);

Просмотреть файл

@ -1,94 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Ubiquity.
*
* The Initial Developer of the Original Code is Mozilla.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Abimanyu Raja <abimanyuraja@gmail.com>
* Satoshi Murakami <murky.satyr@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var PrefKeys = {
KEYCODE_PREF : "extensions.ubiquity.keycode",
KEYMODIFIER_PREF : "extensions.ubiquity.keymodifier",
KEYCODE_DEFAULT: KeyEvent.DOM_VK_SPACE,
KEYMODIFIER_DEFAULT: Utils.OS === "WINNT" ? "CTRL" : "ALT",
CODE2TEXT: (function (dict) {
for (var key in KeyEvent)
dict[KeyEvent[key]] = key.slice(7); // strip DOM_VK_
return dict;
})({}),
MODIFIER2TEXT: {16: "SHIFT", 17: "CTRL", 18: "ALT", 224: "META"},
_convertToText: function PK__convertToText(keyCode)
this.CODE2TEXT[keyCode] || "[" + keyCode + "]",
isModifier: function PK_isModifier(keyCode) keyCode in this.MODIFIER2TEXT,
onLoad: function PK_onLoad() {
var [mod, key] = this.getKeyCombo();
$("#keyInputBox").val(
mod + "+" + key + " (" + L("ubiquity.prefkeys.clickhere") + ")");
},
onKeyChange: function PK_onKeyChange(aEvent) {
aEvent.preventDefault();
aEvent.stopPropagation();
var {keyCode} = aEvent;
var keyModifier = (aEvent.altKey ? "ALT" :
aEvent.ctrlKey ? "CTRL" :
aEvent.shiftKey ? "SHIFT" :
aEvent.metaKey ? "META" :
"");
if (!keyModifier) {
PrefKeys.isModifier(keyCode) ||
$("#keyNotify").text(L("ubiquity.prefkeys.notifybadmodifier"));
return;
}
Application.prefs.setValue(this.KEYCODE_PREF, keyCode);
Application.prefs.setValue(this.KEYMODIFIER_PREF, keyModifier);
var comboText = keyModifier + "+" + PrefKeys._convertToText(keyCode);
$("#keyInputBox").blur().val(
comboText + " (" + L("ubiquity.prefkeys.clickhere") + ")");
$("#keyNotify").html(
L("ubiquity.prefkeys.confirmchange", comboText.bold()));
},
getKeyCombo: function PK_getKeyCombo() {
var keyCode = Application.prefs.getValue(this.KEYCODE_PREF,
this.KEYCODE_DEFAULT);
var keyModifier = Application.prefs.getValue(this.KEYMODIFIER_PREF,
this.KEYMODIFIER_DEFAULT);
return [keyModifier, this._convertToText(keyCode)];
}
}

Просмотреть файл

@ -37,6 +37,7 @@
* ***** END LICENSE BLOCK ***** */
Cu.import("resource://ubiquity/modules/cmdmanager.js");
Cu.import("resource://ubiquity/modules/prefkeys.js")
const PREF_NFE = "extensions.ubiquity.doNounFirstExternals";
@ -78,6 +79,9 @@ function onDocumentLoad() {
CommandManager.maxSuggestions = this.value;
this.value = CommandManager.maxSuggestions;
}).val(CommandManager.maxSuggestions);
new PrefKeys().registerUI($("#keyInput")[0], $("#keyNotify")[0]);
new PrefKeys("repeat").registerUI($("#repeatKeyInput")[0], {});
}
function changeLanguageSettings() {

Просмотреть файл

@ -11,7 +11,6 @@
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&ubiquity.pagetitle.Settings;</title>
@ -24,13 +23,16 @@
<script type="application/javascript;version=1.8" src="chrome://ubiquity/content/header.js"></script>
<script type="application/javascript;version=1.8" src="settings.js"></script>
<script type="application/javascript;version=1.8" src="prefkeys.js"></script>
<style>.warning{ background-color: #FFFCBA; border: 1px solid #F09B9A; width: 740px; padding: 5px;}</style>
<style>
.warning {
width: 740px; padding: 5px; border: 1px solid #F09B9A;
background-color: #FFFCBA;
}
.prefkeys { width: 88%; cursor: pointer; padding: 1px 1ex }
</style>
</head>
<body dir="&locale.dir;">
<div class="head">&ubiquity.tagline.Settings;</div>
<div id="nav-container"></div>
@ -57,30 +59,29 @@
<legend>&ubiquity.settings.InvokingUbiquity;</legend>
<div style="margin-left:10px;">
<p>
<input id="keyInputBox" type="text" size="42"
style="cursor:pointer; padding:1px 1ex"
onkeydown="return false"
onkeyup="PrefKeys.onKeyChange(event)"
onfocus="this.value = L('ubiquity.prefkeys.pressyourcombo')"
onblur="PrefKeys.onLoad()"/>
<br />
<input type="text" id="keyInput" class="prefkeys"/><br />
&ubiquity.settings.ChangeShortcut;
<br />
</p>
<p id="keyNotify"></p>
<p>
<input type="text" id="repeatKeyInput" class="prefkeys"/><br />
Additionally, you can specify a combo to repeat the last command.
</p>
</div>
</fieldset>
<script> PrefKeys.onLoad() </script>
<h2>&ubiquity.settings.LangSettings;</h2>
<p>&ubiquity.settings.LangSettingsParagraph1;</p>
<p><label for="use-new-parser-checkbox"><input type="checkbox" id="use-new-parser-checkbox" onchange="changeLanguageSettings();" /><strong>&ubiquity.settings.UseParser2;</strong></label></p>
<p>&ubiquity.settings.SelectLanguage; <select id="language-select" onchange="changeLanguageSettings();"></select></p>
<h2>&ubiquity.settings.MiscSettings;</h2>
<p>&ubiquity.settings.MaxSuggestions; <input type="text" id="max-suggestions" size="3" style="text-align:center" /></p>
<p>
&ubiquity.settings.MaxSuggestions;
<input type="text" id="max-suggestions"
size="3" style="text-align:center"/>
</p>
<fieldset class="parser2" style="display:none">
<legend>&ubiquity.settings.Parser2Context;</legend>
@ -113,6 +114,5 @@
<li><textarea rows="30" style="width:92%" id="skin-editor"></textarea></li>
</ul>
</div>
</body>
</html>

Просмотреть файл

@ -34,9 +34,9 @@
*
* ***** END LICENSE BLOCK ***** */
Cu.import("resource://ubiquity/modules/setup.js");
Cu.import("resource://ubiquity/modules/utils.js");
Cu.import("resource://ubiquity/modules/prefkeys.js");
var gPrefKeys = new PrefKeys;
var T = LocalizationUtils.propertySelector(
"chrome://ubiquity/locale/aboutubiquitytutorial.properties");
@ -227,7 +227,7 @@ function startUbiqTutorial() {
}
function ubiqTutorialStage1() {
var keyCombo = PrefKeys.getKeyCombo();
var {keyCombo} = gPrefKeys;
fadeInHtml(
H2(T("tutorial.stage01h1")),
P(T("tutorial.stage01p1")),
@ -245,7 +245,7 @@ function ubiqTutorialStage2() {
}
function ubiqTutorialStage3() {
var keyCombo = PrefKeys.getKeyCombo();
var {keyCombo} = gPrefKeys;
fadeInHtml(
H2(T("tutorial.stage03h1")),
P(T("tutorial.stage03p1")),

Просмотреть файл

@ -0,0 +1,154 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Ubiquity.
*
* The Initial Developer of the Original Code is Mozilla.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Abimanyu Raja <abimanyuraja@gmail.com>
* Satoshi Murakami <murky.satyr@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
// = PrefKeys =
var EXPORTED_SYMBOLS = ["PrefKeys"];
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://ubiquity/modules/utils.js");
Cu.import("resource://ubiquity/modules/localization_utils.js");
var gPrefs = Utils.Application.prefs;
var L = LocalizationUtils.propertySelector(
"chrome://ubiquity/locale/aboutubiquity.properties");
function PrefKeys(path, defaultKey, defaultMod) {
var pref = "extensions.ubiquity." + (path ? path + "." : "");
return {
__proto__: PrefKeysProto,
KEYCODE_PREF: pref + "keycode",
KEYCODE_DEFAULT: defaultKey || "",
KEYMODIFIER_PREF: pref + "keymodifier",
KEYMODIFIER_DEFAULT: defaultMod || "",
};
}
Utils.defineLazyProperty(PrefKeys, function KeyEvent() {
return Utils.currentChromeWindow.KeyEvent;
});
Utils.defineLazyProperty(PrefKeys, function CODE2TEXT() {
var {KeyEvent} = this, dic = {__proto__: null};
for (var key in KeyEvent)
dic[KeyEvent[key]] = key.slice(7); // strip DOM_VK_
return dic;
});
PrefKeys.MODIFIER2TEXT = {16: "SHIFT", 17: "CTRL", 18: "ALT", 224: "META"};
var PrefKeysProto = {
constructor: PrefKeys,
registerUI: function PK_registerUI(textInput, notifier) {
var pk = this;
function prompt() {
textInput.value =
pk.keyComboText + " (" + L("ubiquity.prefkeys.clickhere") + ")";
}
prompt();
textInput.addEventListener("blur", prompt, false);
textInput.addEventListener("focus", onInputFocus, false);
textInput.addEventListener("keydown", haltEvent, true);
textInput.addEventListener("keyup", function onInputKeyUp(ev) {
haltEvent(ev);
var {keyCode} = ev;
var keyModifier = (
ev.altKey ? "ALT" :
ev.ctrlKey ? "CTRL" :
ev.shiftKey ? "SHIFT" :
ev.metaKey ? "META" :
"");
if (!keyModifier) {
isModifier(keyCode) ||
(notifier.textContent = L("ubiquity.prefkeys.notifybadmodifier"));
return;
}
gPrefs.setValue(pk.KEYCODE_PREF, keyCode);
gPrefs.setValue(pk.KEYMODIFIER_PREF, keyModifier);
textInput.blur();
notifier.innerHTML =
L("ubiquity.prefkeys.confirmchange", pk.keyComboText.bold());
}, true);
},
match: function PK_match(event) {
if (event.type !== "keydown") {
if (this._lastKeysOk) haltEvent(event);
return false;
}
this._lastKeysOk = false;
var code = gPrefs.getValue(this.KEYCODE_PREF,
this.KEYCODE_DEFAULT);
if (code !== event.keyCode) return false;
var mod = gPrefs.getValue(this.KEYMODIFIER_PREF,
this.KEYMODIFIER_DEFAULT);
// Match only if the user is holding down the modifier key set for
// Ubiquity AND NO OTHER modifier keys.
if (event.shiftKey !== (mod === "SHIFT") ||
event.ctrlKey !== (mod === "CTRL" ) ||
event.altKey !== (mod === "ALT" ) ||
event.metaKey !== (mod === "META" )) return false;
haltEvent(event);
return this._lastKeysOk = true;
},
get keyCombo PK_getKeyCombo() {
var keyCode = gPrefs.getValue(this.KEYCODE_PREF,
this.KEYCODE_DEFAULT);
return [
gPrefs.getValue(this.KEYMODIFIER_PREF,
this.KEYMODIFIER_DEFAULT),
PrefKeys.CODE2TEXT[keyCode] || "[" + keyCode + "]"];
},
get keyComboText PK_getKeyComboText() this.keyCombo.join("+"),
}
function isModifier(keyCode) keyCode in PrefKeys.MODIFIER2TEXT;
function onInputFocus() {
this.value = L("ubiquity.prefkeys.pressyourcombo");
}
function haltEvent(event) {
event.preventDefault();
event.stopPropagation();
}