diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index e00c8289..5b6d4c30 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -246,10 +246,7 @@ Autocomplete.startCommand = { // needed for firefox on mac editor.completer.cancelContextMenu(); }, - bindKey: "Ctrl-Space|Shift-Space|Alt-Space" -}; -Autocomplete.addTo = function(editor) { - editor.commands.addCommand(Autocomplete.startCommand); + bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; var FilteredList = function(array, mutateData) { diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 4f9ace1f..850804f6 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -865,11 +865,12 @@ var EditSession = function(text, mode) { /** * Sets a new text mode for the `EditSession`. This method also emits the `'changeMode'` event. If a [[BackgroundTokenizer `BackgroundTokenizer`]] is set, the `'tokenizerUpdate'` event is also emitted. * @param {TextMode} mode Set a new text mode + * @param {cb} optional callback * **/ this.$mode = null; this.$modeId = null; - this.setMode = function(mode) { + this.setMode = function(mode, cb) { if (mode && typeof mode === "object") { if (mode.getTokenizer) return this.$onChangeMode(mode); @@ -890,7 +891,7 @@ var EditSession = function(text, mode) { this.$modeId = path; config.loadModule(["mode", path], function(m) { if (this.$modeId !== path) - return; + return cb && cb(); if (this.$modes[path] && !options) return this.$onChangeMode(this.$modes[path]); if (m && m.Mode) { @@ -899,7 +900,8 @@ var EditSession = function(text, mode) { this.$modes[path] = m; m.$id = path; } - this.$onChangeMode(m) + this.$onChangeMode(m); + cb && cb(this.mode); } }.bind(this)); @@ -909,7 +911,11 @@ var EditSession = function(text, mode) { }; this.$onChangeMode = function(mode, $isPlaceholder) { - if (this.$mode === mode) return; + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + this.$mode = mode; this.$stopWorker(); @@ -941,7 +947,6 @@ var EditSession = function(text, mode) { if (!$isPlaceholder) { - this.$modeId = mode.$id; this.$setFolding(mode.foldingRules); this._emit("changeMode"); this.bgTokenizer.start(0); diff --git a/lib/ace/edit_session_test.js b/lib/ace/edit_session_test.js index fd1c0508..0ad3e6fe 100644 --- a/lib/ace/edit_session_test.js +++ b/lib/ace/edit_session_test.js @@ -1037,11 +1037,34 @@ module.exports = { assertArray(session.getAnnotations(), []); session.setAnnotations([annotation]); assertArray(session.getAnnotations(), [annotation]); + }, + + "test: mode loading" : function(next) { + if (!require.undef) { + console.log("Skipping test: This test only runs in the browser"); + next(); + return; + } + var session = new EditSession([]); + session.setMode("ace/mode/javascript"); + assert.equal(session.$modeid, "ace/mode/javascript"); + session.on("changeMode", function() { + assert.equal(session.$modeid, "ace/mode/javascript"); + }); + session.setMode("ace/mode/sh", function(mode) { + assert.ok(!mode); + }); + setTimeout(function() { + session.setMode("ace/mode/javascript", function(mode) { + session.setMode("ace/mode/javascript"); + assert.equal(session.$modeid, "ace/mode/javascript"); + next(); + }); + }, 0); } }; - }); if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec() + require("asyncjs").test.testcase(module.exports).exec(); } diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 1309c295..24e0ea05 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -40,7 +40,7 @@ var BROKEN_SETDATA = useragent.isChrome < 18; var TextInput = function(parentNode, host) { var text = dom.createElement("textarea"); text.className = "ace_text-input"; - // debug + /*/ debug text.style.cssText = "opacity:1;background:rgba(0, 250, 0, 0.3);outline:rgba(0, 250, 0, 0.8) solid 1px;outline-offset:3px;width:5em;z-pindex:500"; /**/ if (useragent.isTouchPad) @@ -436,7 +436,7 @@ var TextInput = function(parentNode, host) { tempStyle = text.style.cssText; text.style.cssText = "z-index:100000;" + (useragent.isIE ? "opacity:0.1;" : ""); - text.style.cssText += "background:rgba(250, 0, 0, 0.3); opacity:1;"; + //debug*/ text.style.cssText += "background:rgba(250, 0, 0, 0.3); opacity:1;"; resetSelection(host.selection.isEmpty()); host._emit("nativecontextmenu", {target: host, domEvent: e}); diff --git a/lib/ace/selection.js b/lib/ace/selection.js index dd5435f1..4208fe01 100644 --- a/lib/ace/selection.js +++ b/lib/ace/selection.js @@ -668,7 +668,7 @@ var Selection = function(session) { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) index ++; - if (index <= 1) { + if (index < 1) { tokenRe.lastIndex = 0; while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { tokenRe.lastIndex = 0; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 8449b958..e8aca1ff 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -1257,10 +1257,10 @@ var VirtualRenderer = function(container, theme) { /** * [Sets a new theme for the editor. `theme` should exist, and be a directory path, like `ace/theme/textmate`.]{: #VirtualRenderer.setTheme} * @param {String} theme The path to a theme - * + * @param {Function} cb optional callback * **/ - this.setTheme = function(theme) { + this.setTheme = function(theme, cb) { var _self = this; this.$themeValue = theme; _self._dispatchEvent('themeChange',{theme:theme}); @@ -1274,7 +1274,7 @@ var VirtualRenderer = function(container, theme) { function afterLoad(module) { if (_self.$themeValue != theme) - return; + return cb && cb(); if (!module.cssClass) return; dom.importCssString( @@ -1303,7 +1303,8 @@ var VirtualRenderer = function(container, theme) { _self.onResize(); } - _self._dispatchEvent('themeLoaded',{theme:module}); + _self._dispatchEvent('themeLoaded', {theme:module}); + cb && cb(); } };