Fix issue 83: Wrap mode error on Document.insertLines/removeLines

This commit is contained in:
Julian Viereck 2011-02-06 05:32:41 +08:00 • committed by Fabian Jakobs
commit 17578e42cb
2 changed files with 68 additions and 25 deletions

View file

@ -646,8 +646,18 @@ var EditSession = function(text, mode) {
this.setUseWrapMode = function(useWrapMode) { this.setUseWrapMode = function(useWrapMode) {
if (useWrapMode != this.$useWrapMode) { if (useWrapMode != this.$useWrapMode) {
this.$useWrapMode = useWrapMode; this.$useWrapMode = useWrapMode;
this.$updateWrapData(0, this.getLength() - 1);
this.$modified = true; 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"); this._dispatchEvent("changeWrapMode");
} }
}; };
@ -659,7 +669,9 @@ var EditSession = function(text, mode) {
this.setWrapLimit = function(wrapLimit) { this.setWrapLimit = function(wrapLimit) {
if (wrapLimit != this.$wrapLimit) { if (wrapLimit != this.$wrapLimit) {
this.$wrapLimit = wrapLimit; this.$wrapLimit = wrapLimit;
this.$updateWrapData(0, this.getLength() - 1); if (this.$useWrapMode) {
this.$updateWrapData(0, this.getLength() - 1);
}
this._dispatchEvent("changeWrapMode"); this._dispatchEvent("changeWrapMode");
} }
}; };
@ -673,20 +685,23 @@ var EditSession = function(text, mode) {
return; return;
} }
var len;
var action = e.data.action; var action = e.data.action;
var firstRow = e.data.range.start.row, var firstRow = e.data.range.start.row,
lastRow = e.data.range.end.row; lastRow = e.data.range.end.row;
if (action.indexOf("Lines") != -1) { if (action.indexOf("Lines") != -1) {
if (action == "insertLines") { if (action == "insertLines") {
lastRow = firstRow + e.data.lines.length; lastRow = firstRow + (e.data.lines.length);
} else { } else {
firstRow = lastRow - e.data.lines.length; lastRow = firstRow;
} }
len = e.data.lines.length;
} else {
len = lastRow - firstRow;
} }
if (firstRow != lastRow) { if (len != 0) {
var len = lastRow - firstRow;
if (action.indexOf("remove") != -1) { if (action.indexOf("remove") != -1) {
this.$wrapData.splice(firstRow, len); this.$wrapData.splice(firstRow, len);
lastRow = firstRow; 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); this.$updateWrapData(firstRow, lastRow);
}; };
@ -706,9 +725,6 @@ var EditSession = function(text, mode) {
var wrapData = this.$wrapData; var wrapData = this.$wrapData;
var wrapLimit = this.$wrapLimit; 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++) { for (var row = firstRow; row <= lastRow; row++) {
wrapData[row] = wrapData[row] =
this.$computeWrapSplits(lines[row], wrapLimit, tabSize); this.$computeWrapSplits(lines[row], wrapLimit, tabSize);
@ -1055,7 +1071,7 @@ var EditSession = function(text, mode) {
if (docRow > wrapData.length - 1) { if (docRow > wrapData.length - 1) {
return [ return [
this.getScreenLength(), this.getScreenLength(),
wrapData[wrapData.length - 1].length - 1 wrapData.length == 0 ? 0 : (wrapData[wrapData.length - 1].length - 1)
]; ];
} }

View file

@ -38,6 +38,7 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var EditSession = require("ace/edit_session").EditSession, var EditSession = require("ace/edit_session").EditSession,
Editor = require("../editor").Editor,
UndoManager = require("ace/undomanager").UndoManager, UndoManager = require("ace/undomanager").UndoManager,
MockRenderer = require("./mockrenderer"), MockRenderer = require("./mockrenderer"),
Range = require("ace/range").Range, Range = require("ace/range").Range,
@ -357,6 +358,32 @@ var Test = {
assert.equal(session.$getDisplayTokens("\t").length, 4); assert.equal(session.$getDisplayTokens("\t").length, 4);
assert.equal(session.$getDisplayTokens("abc").length, 3); assert.equal(session.$getDisplayTokens("abc").length, 3);
assert.equal(session.$getDisplayTokens("abc\t").length, 7); 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);
} }
}; };