diff --git a/lib/ace/config.js b/lib/ace/config.js index 5a1b0e47..d2d2aea7 100644 --- a/lib/ace/config.js +++ b/lib/ace/config.js @@ -32,6 +32,8 @@ define(function(require, exports, module) { "no use strict"; var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; var global = (function() { return this; @@ -65,6 +67,9 @@ exports.all = function() { return lang.copyObject(options); }; +// module loading +oop.implement(exports, EventEmitter); + exports.moduleUrl = function(name, component) { if (options.$moduleUrls[name]) return options.$moduleUrls[name]; @@ -87,6 +92,32 @@ exports.setModuleUrl = function(name, subst) { return options.$moduleUrls[name] = subst; }; +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) + return onLoad(module); + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + onLoad(module); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); +}; + + +// initialization exports.init = function() { options.packaged = require.packaged || module.packaged || (global.define && define.packaged); diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index ae16984b..7efdcade 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -898,49 +898,27 @@ var EditSession = function(text, mode) { }; this.$modes = {}; - this._loadMode = function(mode, callback) { + this._loadMode = function(name, callback) { if (!this.$modes["null"]) this.$modes["null"] = this.$modes["ace/mode/text"] = new TextMode(); - if (this.$modes[mode]) - return callback(this.$modes[mode]); + if (this.$modes[name]) + return callback(this.$modes[name]); var _self = this; - var module; - try { - module = require(mode); - } catch (e) {}; - // sometimes require returns empty object (this bug is present in requirejs 2 as well) - if (module && module.Mode) - return done(module); + config.loadModule(["mode", name], function(module) { + if (_self.$modes[name]) + return callback(_self.$modes[name]); + if (module && module.Mode) { + _self.$modes[name] = new module.Mode(); + _self.$modes[name].$id = name; + callback(_self.$modes[name]); + } + }); // set mode to text until loading is finished if (!this.$mode) this.$setModePlaceholder(); - - fetch(mode, function() { - require([mode], done); - }); - - function done(module) { - if (_self.$modes[mode]) - return callback(_self.$modes[mode]); - - _self.$modes[mode] = new module.Mode(); - _self.$modes[mode].$id = mode; - _self._emit("loadmode", { - name: mode, - mode: _self.$modes[mode] - }); - callback(_self.$modes[mode]); - } - - function fetch(name, callback) { - if (!config.get("packaged")) - return callback(); - - net.loadScript(config.moduleUrl(name, "mode"), callback); - } }; this.$setModePlaceholder = function() { @@ -982,11 +960,13 @@ var EditSession = function(text, mode) { if (_self.$modeId !== mode) return; - _self.setMode(module); + _self.$onChangeMode(module); }); - return; - } - + } else + _self.$onChangeMode(module); + } + + this.$onChangeMode = function(mode) { if (this.$mode === mode) return; this.$mode = mode; this.$modeId = mode.$id; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 4661768b..ef70133a 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -1278,10 +1278,7 @@ var VirtualRenderer = function(container, theme) { }; this._loadTheme = function(name, callback) { - if (!config.get("packaged")) - return callback(); - - net.loadScript(config.moduleUrl(name, "theme"), callback); + }; /** @@ -1292,28 +1289,12 @@ var VirtualRenderer = function(container, theme) { **/ this.setTheme = function(theme) { var _self = this; - this.$themeValue = theme; _self._dispatchEvent('themeChange',{theme:theme}); if (!theme || typeof theme == "string") { var moduleName = theme || "ace/theme/textmate"; - - var module; - try { - module = require(moduleName); - } catch (e) {}; - if (module) - return afterLoad(module); - - _self._loadTheme(moduleName, function() { - require([moduleName], function(module) { - if (_self.$themeValue !== theme) - return; - - afterLoad(module); - }); - }); + config.loadModule(["theme", moduleName], afterLoad); } else { afterLoad(theme); }