update command manager for cloud9

This commit is contained in:
nightwing 2012-04-21 21:28:59 +04:00
commit 54b1f3f9ac
5 changed files with 42 additions and 41 deletions

View file

@ -84,16 +84,17 @@ exports.defaultCommands = [{
exec: function(editor) { editor.multiSelect.splitIntoLines(); },
bindKey: {win: "Ctrl-Shift-L", mac: "Ctrl-Shift-L"},
readonly: true
}];
// commands active in multiselect mode
exports.multiEditCommands = [{
}, {
name: "singleSelection",
bindKey: "esc",
exec: function(editor) { editor.exitMultiSelectMode(); },
readonly: true
readonly: true,
isAvailable: function(editor) {return editor.inMultiSelectMode}
}];
// commands active in multiselect mode
exports.multiEditCommands = {"singleSelection": "esc"};
var HashHandler = require("../keyboard/hash_handler").HashHandler;
exports.keyboardHandler = new HashHandler(exports.multiEditCommands);

View file

@ -58,12 +58,13 @@ var EventEmitter = require("./lib/event_emitter").EventEmitter;
var CommandManager = require("./commands/command_manager").CommandManager;
var defaultCommands = require("./commands/default_commands").commands;
var Editor = function(renderer, session, listenElement) {
var Editor = function(renderer, session) {
var container = renderer.getContainerElement();
this.container = container;
this.renderer = renderer;
this.textInput = new TextInput(renderer.getTextAreaContainer(), this, listenElement);
this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands);
this.textInput = new TextInput(renderer.getTextAreaContainer(), this);
this.keyBinding = new KeyBinding(this);
// TODO detect touch event support
@ -78,8 +79,7 @@ var Editor = function(renderer, session, listenElement) {
this.$search = new Search().set({
wrap: true
});
this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands);
this.setSession(session || new EditSession(""));
};

View file

@ -78,6 +78,18 @@ function HashHandler(config, platform) {
}
};
this.bindKey = function(key, command) {
if(!key)
return;
var ckb = this.commmandKeyBinding;
key.split("|").forEach(function(keyPart) {
var binding = parseKeys(keyPart, command);
var hashId = binding.hashId;
(ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command;
});
};
this.addCommands = function(commands) {
commands && Object.keys(commands).forEach(function(name) {
var command = commands[name];
@ -100,18 +112,6 @@ function HashHandler(config, platform) {
}, this);
};
this.bindKey = function(key, command) {
if(!key)
return;
var ckb = this.commmandKeyBinding;
key.split("|").forEach(function(keyPart) {
var binding = parseKeys(keyPart, command);
var hashId = binding.hashId;
(ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command;
});
};
this.bindKeys = function(keyList) {
Object.keys(keyList).forEach(function(key) {
this.bindKey(key, keyList[key]);
@ -127,10 +127,10 @@ function HashHandler(config, platform) {
this.bindKey(key, command);
};
function parseKeys(keys, val, ret) {
function parseKeys(keys, val) {
var key;
var hashId = 0;
var parts = splitSafe(keys.toLowerCase());
var parts = keys.toLowerCase().trim().split(/\s*\-\s*/);
for (var i = 0, l = parts.length; i < l; i++) {
if (keyUtil.KEY_MODS[parts[i]])
@ -143,17 +143,12 @@ function HashHandler(config, platform) {
key: key,
hashId: hashId
};
}
function splitSafe(s) {
return (s.trim()
.split(new RegExp("[\\s ]*\\-[\\s ]*", "g"), 999));
}
};
this.findKeyCommand = function findKeyCommand(hashId, keyString) {
var ckbr = this.commmandKeyBinding;
return ckbr[hashId] && ckbr[hashId][keyString.toLowerCase()];
}
};
this.handleKeyboard = function(data, hashId, keyString, keyCode) {
return {

View file

@ -47,15 +47,27 @@ require("../commands/default_commands");
var KeyBinding = function(editor) {
this.$editor = editor;
this.$data = { };
this.$handlers = [this];
this.$handlers = [];
this.setDefaultHandler(editor.commands);
};
(function() {
this.setDefaultHandler = function(keyboardHandler) {
this.removeKeyboardHandler(this.$defaultHandler);
this.$defaultHandler = keyboardHandler;
if (keyboardHandler)
this.$handlers.unshift(keyboardHandler);
this.$data = { };
};
this.setKeyboardHandler = function(keyboardHandler) {
if (this.$handlers[this.$handlers.length - 1] == keyboardHandler)
return;
this.$data = { };
this.$handlers = keyboardHandler ? [this, keyboardHandler] : [this];
this.$handlers = [];
this.setDefaultHandler(this.$defaultHandler);
if (keyboardHandler)
this.$handlers.push(keyboardHandler);
};
this.addKeyboardHandler = function(keyboardHandler) {
@ -103,12 +115,6 @@ var KeyBinding = function(editor) {
return success;
};
this.handleKeyboard = function(data, hashId, keyString) {
return {
command: this.$editor.commands.findKeyCommand(hashId, keyString)
};
};
this.onCommandKey = function(e, hashId, keyCode) {
var keyString = keyUtil.keyCodeToString(keyCode);
this.$callKeyboardHandlers(hashId, keyString, keyCode, e);

View file

@ -44,7 +44,7 @@ var event = require("../lib/event");
var useragent = require("../lib/useragent");
var dom = require("../lib/dom");
var TextInput = function(parentNode, host, listenElement) {
var TextInput = function(parentNode, host) {
var text = dom.createElement("textarea");
if (useragent.isTouchPad)
@ -159,8 +159,7 @@ var TextInput = function(parentNode, host, listenElement) {
}, 0);
};
if (listenElement != false)
event.addCommandKeyListener(listenElement || text, host.onCommandKey.bind(host));
event.addCommandKeyListener(text, host.onCommandKey.bind(host));
if (useragent.isOldIE) {
var keytable = { 13:1, 27:1 };