diff --git a/lib/ace/config.js b/lib/ace/config.js index 4a7dc286..97a18954 100644 --- a/lib/ace/config.js +++ b/lib/ace/config.js @@ -93,22 +93,37 @@ exports.setModuleUrl = function(name, subst) { return options.$moduleUrls[name] = subst; }; +exports.$loading = {}; exports.loadModule = function(moduleName, onLoad) { var module, moduleType; if (Array.isArray(moduleName)) { moduleType = moduleName[0]; moduleName = moduleName[1]; } + try { module = require(moduleName); } catch (e) {}; - if (module) + // require(moduleName) can return empty object if called after require([moduleName], callback) + if (module && !exports.$loading[moduleName]) return onLoad && onLoad(module); + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + var afterLoad = function() { require([moduleName], function(module) { exports._emit("load.module", {name: moduleName, module: module}); - onLoad && onLoad(module); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); }); }; diff --git a/lib/ace/lib/event_emitter.js b/lib/ace/lib/event_emitter.js index a359a9a7..5e4f6ec1 100644 --- a/lib/ace/lib/event_emitter.js +++ b/lib/ace/lib/event_emitter.js @@ -79,11 +79,10 @@ EventEmitter._signal = function(eventName, e) { EventEmitter.once = function(eventName, callback) { var _self = this; - var newCallback = function() { - fun && fun.apply(null, arguments); - _self.removeEventListener(event, newCallback); - }; - this.addEventListener(event, newCallback); + callback && this.addEventListener(eventName, function newCallback() { + _self.removeEventListener(eventName, newCallback); + callback.apply(null, arguments); + }); }; diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index 74fc4872..4ff31b2f 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -121,6 +121,7 @@ var MouseHandler = function(editor) { renderer.$moveTextAreaToCursor(); } self.isMousePressed = false; + self.onMouseEvent("mouseup", e) }; var onCaptureInterval = function() { diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index 8a6e2a11..2e0cda7b 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -106,7 +106,7 @@ function onMouseDown(e) { var oldRange = selection.rangeList.rangeAtPoint(pos); - event.capture(editor.container, function(){}, function() { + editor.once("mouseup", function() { var tmpSel = selection.toOrientedRange(); if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index ee41f98a..fc07bd76 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -831,14 +831,10 @@ exports.onSessionChange = function(e) { var oldSession = e.oldSession; if (oldSession) { - // todo use events - if (oldSession.multiSelect && oldSession.multiSelect.editor == this) - oldSession.multiSelect.editor = null; - - session.multiSelect.removeEventListener("addRange", this.$onAddRange); - session.multiSelect.removeEventListener("removeRange", this.$onRemoveRange); - session.multiSelect.removeEventListener("multiSelect", this.$onMultiSelect); - session.multiSelect.removeEventListener("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.removeEventListener("addRange", this.$onAddRange); + oldSession.multiSelect.removeEventListener("removeRange", this.$onRemoveRange); + oldSession.multiSelect.removeEventListener("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.removeEventListener("singleSelect", this.$onSingleSelect); } session.multiSelect.on("addRange", this.$onAddRange); diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 775d16e6..a76ec222 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -326,6 +326,9 @@ var VirtualRenderer = function(container, theme) { changes = changes | this.CHANGE_FULL; } + if (!this.$size.scrollerHeight) + return; + if (force) this.$renderChanges(changes, true); else @@ -1265,6 +1268,8 @@ var VirtualRenderer = function(container, theme) { } function afterLoad(theme) { + if (!theme.cssClass) + return; dom.importCssString( theme.cssText, theme.cssClass,