From 54b1f3f9ac7ba55c90abbcf6e75363c5be2ff39a Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 21 Apr 2012 21:28:59 +0400 Subject: [PATCH] update command manager for cloud9 --- lib/ace/commands/multi_select_commands.js | 11 ++++--- lib/ace/editor.js | 8 ++--- lib/ace/keyboard/hash_handler.js | 37 ++++++++++------------- lib/ace/keyboard/keybinding.js | 22 +++++++++----- lib/ace/keyboard/textinput.js | 5 ++- 5 files changed, 42 insertions(+), 41 deletions(-) diff --git a/lib/ace/commands/multi_select_commands.js b/lib/ace/commands/multi_select_commands.js index 71f0a3e5..cce05705 100644 --- a/lib/ace/commands/multi_select_commands.js +++ b/lib/ace/commands/multi_select_commands.js @@ -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); diff --git a/lib/ace/editor.js b/lib/ace/editor.js index d5206a1d..2af7837d 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -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("")); }; diff --git a/lib/ace/keyboard/hash_handler.js b/lib/ace/keyboard/hash_handler.js index 9a8f2899..5fb021d3 100644 --- a/lib/ace/keyboard/hash_handler.js +++ b/lib/ace/keyboard/hash_handler.js @@ -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 { diff --git a/lib/ace/keyboard/keybinding.js b/lib/ace/keyboard/keybinding.js index d3c9b5b3..79fb7aa9 100644 --- a/lib/ace/keyboard/keybinding.js +++ b/lib/ace/keyboard/keybinding.js @@ -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); diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index dbb17c34..07e2db74 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -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 };