diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 9689ea5c..1de03147 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -268,7 +268,7 @@ var EditSession = function(text, mode) { this.$informUndoManager.schedule(); } - this.bgTokenizer.$updateOnChange(delta); + this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta); this._signal("change", e); }; @@ -276,8 +276,6 @@ var EditSession = function(text, mode) { * Sets the session text. * @param {String} text The new text to place * - * - * **/ this.setValue = function(text) { this.doc.setValue(text); @@ -957,12 +955,11 @@ var EditSession = function(text, mode) { } }; - this.$stopWorker = function() { - if (this.$worker) + if (this.$worker) { this.$worker.terminate(); - - this.$worker = null; + this.$worker = null; + } }; this.$startWorker = function() { @@ -2400,7 +2397,15 @@ var EditSession = function(text, mode) { */ this.$setFontMetrics = function(fm) { // todo - } + }; + + this.destroy = function() { + if (this.bgTokenizer) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer = null; + } + this.$stopWorker(); + }; // For every keystroke this gets called once per char in the whole doc!! // Wouldn't hurt to make it a bit faster for c >= 0x1100 diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 83782f06..a62f1527 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -94,7 +94,8 @@ var Editor = function(renderer, session) { this._$emitInputEvent = lang.delayedCall(function() { this._signal("input", {}); - this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart(); + if (this.session && this.session.bgTokenizer) + this.session.bgTokenizer.scheduleStart(); }.bind(this)); this.on("change", function(_, _self) { @@ -384,6 +385,9 @@ var Editor = function(renderer, session) { this.onChangeAnnotation(); this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); this.renderer.updateFull(); + } else { + this.selection = null; + this.renderer.setSession(session); } this._signal("changeSession", { @@ -2519,6 +2523,9 @@ var Editor = function(renderer, session) { this.destroy = function() { this.renderer.destroy(); this._signal("destroy", this); + if (this.session) { + this.session.destroy(); + } }; /** diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index 7b206f61..13ee8a25 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -58,7 +58,8 @@ var Gutter = function(parentEl) { if (this.session) this.session.removeEventListener("change", this.$updateAnnotations); this.session = session; - session.on("change", this.$updateAnnotations); + if (session) + session.on("change", this.$updateAnnotations); }; this.addGutterDecoration = function(row, className){ diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 748d2231..7c3aa053 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -95,7 +95,8 @@ var Text = function(parentEl) { }; this.setSession = function(session) { this.session = session; - this.$computeTabString(); + if (session) + this.$computeTabString(); }; this.showInvisibles = false; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index ef0f7a2e..afe36620 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -890,12 +890,12 @@ function isSamePoint(p1, p2) { // adds multicursor support to a session exports.onSessionChange = function(e) { var session = e.session; - if (!session.multiSelect) { + if (session && !session.multiSelect) { session.$selectionMarkers = []; session.selection.$initRangeList(); session.multiSelect = session.selection; } - this.multiSelect = session.multiSelect; + this.multiSelect = session && session.multiSelect; var oldSession = e.oldSession; if (oldSession) { @@ -907,16 +907,16 @@ exports.onSessionChange = function(e) { oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); } - session.multiSelect.on("addRange", this.$onAddRange); - session.multiSelect.on("removeRange", this.$onRemoveRange); - session.multiSelect.on("multiSelect", this.$onMultiSelect); - session.multiSelect.on("singleSelect", this.$onSingleSelect); - session.multiSelect.lead.on("change", this.$checkMultiselectChange); - session.multiSelect.anchor.on("change", this.$checkMultiselectChange); - - // this.$onSelectionChange = this.onSelectionChange.bind(this); + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } - if (this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { if (session.selection.inMultiSelectMode) this.$onMultiSelect(); else diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index d3e26758..4cb7af38 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -232,10 +232,7 @@ var VirtualRenderer = function(container, theme) { this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); this.session = session; - if (!session) - return; - - if (this.scrollMargin.top && session.getScrollTop() <= 0) + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) session.setScrollTop(-this.scrollMargin.top); this.$cursorLayer.setSession(session); @@ -243,6 +240,9 @@ var VirtualRenderer = function(container, theme) { this.$markerFront.setSession(session); this.$gutterLayer.setSession(session); this.$textLayer.setSession(session); + if (!session) + return; + this.$loop.schedule(this.CHANGE_FULL); this.session.$setFontMetrics(this.$fontMetrics);