Fix issue 83: Wrap mode error on Document.insertLines/removeLines
This commit is contained in:
parent
034152e88c
commit
17578e42cb
2 changed files with 68 additions and 25 deletions
|
|
@ -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)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue