diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 207bc7a7..3d0731ef 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -295,7 +295,7 @@ var EditSession = function(text, mode) { if (window.Worker) this.$worker = mode.createWorker(this); - else + else this.$worker = null; this.$mode = mode; @@ -646,8 +646,18 @@ var EditSession = function(text, mode) { this.setUseWrapMode = function(useWrapMode) { if (useWrapMode != this.$useWrapMode) { this.$useWrapMode = useWrapMode; - this.$updateWrapData(0, this.getLength() - 1); this.$modified = true; + + // If wrapMode is activaed, the wrapData array has to be initialized. + if (useWrapMode) { + var len = this.getLength(); + this.$wrapMode = []; + for (i = 0; i < len; i++) { + this.$wrapData.push([]); + } + this.$updateWrapData(0, len - 1); + } + this._dispatchEvent("changeWrapMode"); } }; @@ -659,7 +669,9 @@ var EditSession = function(text, mode) { this.setWrapLimit = function(wrapLimit) { if (wrapLimit != this.$wrapLimit) { this.$wrapLimit = wrapLimit; - this.$updateWrapData(0, this.getLength() - 1); + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + } this._dispatchEvent("changeWrapMode"); } }; @@ -673,20 +685,23 @@ var EditSession = function(text, mode) { return; } + var len; var action = e.data.action; var firstRow = e.data.range.start.row, lastRow = e.data.range.end.row; if (action.indexOf("Lines") != -1) { if (action == "insertLines") { - lastRow = firstRow + e.data.lines.length; + lastRow = firstRow + (e.data.lines.length); } else { - firstRow = lastRow - e.data.lines.length; + lastRow = firstRow; } + len = e.data.lines.length; + } else { + len = lastRow - firstRow; } - if (firstRow != lastRow) { - var len = lastRow - firstRow; + if (len != 0) { if (action.indexOf("remove") != -1) { this.$wrapData.splice(firstRow, len); lastRow = firstRow; @@ -697,6 +712,10 @@ var EditSession = function(text, mode) { } } + if (this.$wrapData.length != this.doc.$lines.length) { + console.error("The length of doc.$lines and $wrapData have to be the same!"); + } + this.$updateWrapData(firstRow, lastRow); }; @@ -706,9 +725,6 @@ var EditSession = function(text, mode) { var wrapData = this.$wrapData; var wrapLimit = this.$wrapLimit; - // Remove lines that are no longer there. - wrapData.splice(lines.length, wrapData.length - lines.length); - for (var row = firstRow; row <= lastRow; row++) { wrapData[row] = this.$computeWrapSplits(lines[row], wrapLimit, tabSize); @@ -1055,7 +1071,7 @@ var EditSession = function(text, mode) { if (docRow > wrapData.length - 1) { return [ this.getScreenLength(), - wrapData[wrapData.length - 1].length - 1 + wrapData.length == 0 ? 0 : (wrapData[wrapData.length - 1].length - 1) ]; } diff --git a/lib/ace/test/edit_session_test.js b/lib/ace/test/edit_session_test.js index 8153fab2..de6d8f39 100644 --- a/lib/ace/test/edit_session_test.js +++ b/lib/ace/test/edit_session_test.js @@ -38,6 +38,7 @@ define(function(require, exports, module) { var EditSession = require("ace/edit_session").EditSession, + Editor = require("../editor").Editor, UndoManager = require("ace/undomanager").UndoManager, MockRenderer = require("./mockrenderer"), Range = require("ace/range").Range, @@ -162,17 +163,17 @@ var Test = { assert.equal(session.documentToScreenColumn(0, 2), 8); assert.equal(session.documentToScreenColumn(0, 3), 9); }, - + "test: documentToScreen with soft wrap and multibyte characters": function() { var tabSize = 4; var wrapLimit = 12; var session = new EditSession(["foo bar foo bar"]); session.setUseWrapMode(true); session.setWrapLimit(12); - + assert.position(session.documentToScreenPosition(0, 11), 0, 11); assert.position(session.documentToScreenPosition(0, 12), 1, 0); - + session = new EditSession(["ぁぁa"]); session.setUseWrapMode(true); session.setWrapLimit(2); @@ -195,20 +196,20 @@ var Test = { assert.equal(session.screenToDocumentColumn(0, 15), 12); assert.equal(session.screenToDocumentColumn(0, 19), 13); }, - + "test: screenToDocument with soft wrap and multi byte characters": function() { var tabSize = 4; var wrapLimit = 12; var session = new EditSession(["foo bar foo bar"]); session.setUseWrapMode(true); session.setWrapLimit(12); - + assert.position(session.screenToDocumentPosition(1, 0), 0, 12); assert.position(session.screenToDocumentPosition(0, 11), 0, 11); // Check if the position is clamped the right way. assert.position(session.screenToDocumentPosition(0, 12), 0, 11); assert.position(session.screenToDocumentPosition(0, 20), 0, 11); - + session = new EditSession(["ぁ a"]); session.setUseWrapMode(true); assert.position(session.screenToDocumentPosition(0, 1), 0, 0); @@ -217,12 +218,12 @@ var Test = { assert.position(session.screenToDocumentPosition(0, 4), 0, 3); assert.position(session.screenToDocumentPosition(0, 5), 0, 3); }, - + "test: wrapLine split function" : function() { var splits; var computeWrapSplits = EditSession.prototype.$computeWrapSplits; var c = 0; - + function computeAndAssert(line, assertEqual, wrapLimit, tabSize) { wrapLimit = wrapLimit || 12; tabSize = tabSize || 4; @@ -233,28 +234,28 @@ var Test = { assert.ok(splits[i] == assertEqual[i]); } } - + // Basic splitting. computeAndAssert("foo bar foo bar", [ 12 ]); computeAndAssert("foo bar f bar", [ 12 ]); computeAndAssert("foo bar f r", [ 14 ]); computeAndAssert("foo bar foo bar foo bara foo", [12, 25]); - + // Don't split if there is only whitespaces/tabs at the end of the line. computeAndAssert("foo foo foo \t \t", [ ]); - + // If there is no space to split, force split. computeAndAssert("foooooooooooooo", [ 12 ]); computeAndAssert("fooooooooooooooooooooooooooo", [12, 24]); computeAndAssert("foo bar fooooooooooobooooooo", [8, 20]); - + // Basic splitting + tabs. computeAndAssert("foo \t\tbar", [ 6 ]); computeAndAssert("foo \t \tbar", [ 7 ]); - + // Ignore spaces/tabs at beginning of split. computeAndAssert("foo \t \t \t \t bar", [ 14 ]); - + // Test wrapping for asian characters. computeAndAssert("ぁぁ", [1], 2); computeAndAssert(" ぁぁ", [1, 2], 2); @@ -357,6 +358,32 @@ var Test = { assert.equal(session.$getDisplayTokens("\t").length, 4); assert.equal(session.$getDisplayTokens("abc").length, 3); assert.equal(session.$getDisplayTokens("abc\t").length, 7); + }, + + "test issue 83": function() { + var session = new EditSession(""); + var editor = new Editor(new MockRenderer(), session); + var document = session.getDocument(); + + session.setUseWrapMode(true); + + document.insertLines(0, ["a", "b"]); + document.insertLines(2, ["c", "d"]); + document.removeLines(1, 2); + }, + + "test wrapMode init has to create wrapData array": function() { + var session = new EditSession("foo bar\nfoo bar"); + var editor = new Editor(new MockRenderer(), session); + var document = session.getDocument(); + + session.setUseWrapMode(true); + session.setWrapLimit(3); + + // Test if wrapData is there and was computed. + assert.equal(session.$wrapData.length, 2); + assert.equal(session.$wrapData[0].length, 1); + assert.equal(session.$wrapData[1].length, 1); } };