Add checks to addFold.
This commit is contained in:
parent
e356ea8cae
commit
d575f47ebc
2 changed files with 95 additions and 20 deletions
|
|
@ -212,9 +212,19 @@ function Folding() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new fold.
|
* Adds a new fold.
|
||||||
|
*
|
||||||
|
* @returns
|
||||||
|
* The new created Fold object or an existing fold object in case the
|
||||||
|
* passed in range fits an existing fold exactly.
|
||||||
*/
|
*/
|
||||||
this.addFold = function(placeholder, startRow, startColumn, endRow, endColumn) {
|
this.addFold = function(placeholder, startRow, startColumn, endRow, endColumn) {
|
||||||
var range;
|
var range;
|
||||||
|
var foldData = this.$foldData;
|
||||||
|
var foldRow = null;
|
||||||
|
var foldLine;
|
||||||
|
var fold;
|
||||||
|
var added = false;
|
||||||
|
|
||||||
// Normalize parameters.
|
// Normalize parameters.
|
||||||
if (!(startRow instanceof Range)) {
|
if (!(startRow instanceof Range)) {
|
||||||
range = new Range(startRow, startColumn, endRow, endColumn);
|
range = new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
|
@ -224,12 +234,41 @@ function Folding() {
|
||||||
endRow = range.end.row;
|
endRow = range.end.row;
|
||||||
}
|
}
|
||||||
|
|
||||||
var foldData = this.$foldData;
|
// --- Some checking ---
|
||||||
var foldRow = null;
|
if (placeholder.length < 2) {
|
||||||
var foldLine;
|
throw "Placeholder has to be at least 2 characters";
|
||||||
|
}
|
||||||
|
|
||||||
var fold = new Fold(range, placeholder);
|
if (startRow == endRow && endColumn - startColumn < 2) {
|
||||||
var added = false;
|
throw "The range has to be at least 2 characters width";
|
||||||
|
}
|
||||||
|
|
||||||
|
fold = this.getFoldAt(startRow, startColumn, 1);
|
||||||
|
if (fold
|
||||||
|
&& fold.range.isEnd(endRow, endColumn)
|
||||||
|
&& fold.range.isStart(startRow, startColumn))
|
||||||
|
{
|
||||||
|
return fold;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.getFoldAt(startRow, startColumn, 1)
|
||||||
|
|| this.getFoldAt(endRow, endColumn, -1))
|
||||||
|
{
|
||||||
|
throw "A fold can't start or end inside of an already existing fold";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow >= this.doc.$lines.length) {
|
||||||
|
throw "End of fold is outside of the document.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endColumn > this.getLine(endRow).length
|
||||||
|
|| startColumn > this.getLine(startRow).length)
|
||||||
|
{
|
||||||
|
throw "End of fold is outside of the document.";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Start adding the fold ---
|
||||||
|
fold = new Fold(range, placeholder);
|
||||||
|
|
||||||
// For now we assume that no two folds are created for the same range!
|
// For now we assume that no two folds are created for the same range!
|
||||||
for (var i = 0; i < foldData.length; i++) {
|
for (var i = 0; i < foldData.length; i++) {
|
||||||
|
|
@ -260,7 +299,6 @@ function Folding() {
|
||||||
foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));
|
foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Recalculate wrapData
|
|
||||||
if (this.$useWrapMode) {
|
if (this.$useWrapMode) {
|
||||||
this.$updateWrapData(foldLine.start.row, foldLine.start.row);
|
this.$updateWrapData(foldLine.start.row, foldLine.start.row);
|
||||||
}
|
}
|
||||||
|
|
@ -268,6 +306,8 @@ function Folding() {
|
||||||
// Notify that fold data has changed.
|
// Notify that fold data has changed.
|
||||||
this.$modified = true;
|
this.$modified = true;
|
||||||
this._dispatchEvent("changeFold");
|
this._dispatchEvent("changeFold");
|
||||||
|
|
||||||
|
return fold;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.removeFold = function(fold) {
|
this.removeFold = function(fold) {
|
||||||
|
|
|
||||||
|
|
@ -731,7 +731,7 @@ module.exports = {
|
||||||
|
|
||||||
// Adding a fold. The split position is inside of the fold. As placeholder
|
// Adding a fold. The split position is inside of the fold. As placeholder
|
||||||
// are not splitable, the split should be before the split.
|
// are not splitable, the split should be before the split.
|
||||||
session.addFold("woot", 0, 4, 0, 16);
|
session.addFold("woot", 0, 4, 0, 15);
|
||||||
assertWrap([4], [8], [8]);
|
assertWrap([4], [8], [8]);
|
||||||
|
|
||||||
// Remove the fold again which should reset the wrapData.
|
// Remove the fold again which should reset the wrapData.
|
||||||
|
|
@ -742,35 +742,35 @@ module.exports = {
|
||||||
removeFoldAssertWrap(0, 6, [8], [8], [8]);
|
removeFoldAssertWrap(0, 6, [8], [8], [8]);
|
||||||
|
|
||||||
// The fold fits into the wrap limit - no split expected.
|
// The fold fits into the wrap limit - no split expected.
|
||||||
session.addFold("woot", 0, 3, 0, 16);
|
session.addFold("woot", 0, 3, 0, 15);
|
||||||
assertWrap([], [8], [8]);
|
assertWrap([], [8], [8]);
|
||||||
removeFoldAssertWrap(0, 4, [8], [8], [8]);
|
removeFoldAssertWrap(0, 4, [8], [8], [8]);
|
||||||
|
|
||||||
// Fold after split position should be all fine.
|
// Fold after split position should be all fine.
|
||||||
session.addFold("woot", 0, 8, 0, 16);
|
session.addFold("woot", 0, 8, 0, 15);
|
||||||
assertWrap([8], [8], [8]);
|
assertWrap([8], [8], [8]);
|
||||||
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
||||||
|
|
||||||
// Fold's placeholder is far too long for wrapSplit.
|
// Fold's placeholder is far too long for wrapSplit.
|
||||||
session.addFold("woot0123456789", 0, 8, 0, 16);
|
session.addFold("woot0123456789", 0, 8, 0, 15);
|
||||||
assertWrap([8], [8], [8]);
|
assertWrap([8], [8], [8]);
|
||||||
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
||||||
|
|
||||||
// Fold's placeholder is far too long for wrapSplit
|
// Fold's placeholder is far too long for wrapSplit
|
||||||
// + content at the end of the line
|
// + content at the end of the line
|
||||||
session.addFold("woot0123456789", 0, 7, 0, 8);
|
session.addFold("woot0123456789", 0, 6, 0, 8);
|
||||||
assertWrap([7, 21], [8], [8]);
|
assertWrap([6, 20], [8], [8]);
|
||||||
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
||||||
|
|
||||||
session.addFold("woot0123456789", 0, 7, 0, 8);
|
session.addFold("woot0123456789", 0, 6, 0, 8);
|
||||||
session.addFold("woot0123456789", 0, 8, 0, 9);
|
session.addFold("woot0123456789", 0, 8, 0, 10);
|
||||||
assertWrap([7, 21, 35], [8], [8]);
|
assertWrap([6, 20, 34], [8], [8]);
|
||||||
session.removeFold(session.getFoldAt(0, 7));
|
session.removeFold(session.getFoldAt(0, 7));
|
||||||
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
||||||
|
|
||||||
session.addFold("woot0123456789", 0, 7, 0, 8);
|
session.addFold("woot0123456789", 0, 7, 0, 9);
|
||||||
session.addFold("woot0123456789", 0, 14, 0, 16);
|
session.addFold("woot0123456789", 0, 13, 0, 15);
|
||||||
assertWrap([7, 21, 27], [8], [8]);
|
assertWrap([7, 21, 25], [8], [8]);
|
||||||
session.removeFold(session.getFoldAt(0, 7));
|
session.removeFold(session.getFoldAt(0, 7));
|
||||||
removeFoldAssertWrap(0, 14, [8], [8], [8]);
|
removeFoldAssertWrap(0, 14, [8], [8], [8]);
|
||||||
|
|
||||||
|
|
@ -778,7 +778,7 @@ module.exports = {
|
||||||
|
|
||||||
// Add a fold over two lines. Note, that the wrapData[1] stays the
|
// Add a fold over two lines. Note, that the wrapData[1] stays the
|
||||||
// same. This is an implementation detail and expected behavior.
|
// same. This is an implementation detail and expected behavior.
|
||||||
session.addFold("woot", 0, 8, 1, 16);
|
session.addFold("woot", 0, 8, 1, 15);
|
||||||
assertWrap([8], [8 /* See comments */], [8]);
|
assertWrap([8], [8 /* See comments */], [8]);
|
||||||
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
removeFoldAssertWrap(0, 8, [8], [8], [8]);
|
||||||
|
|
||||||
|
|
@ -786,11 +786,46 @@ module.exports = {
|
||||||
assertWrap([8, 14], [8 /* See comments */], [8]);
|
assertWrap([8, 14], [8 /* See comments */], [8]);
|
||||||
removeFoldAssertWrap(0, 9, [8], [8], [8]);
|
removeFoldAssertWrap(0, 9, [8], [8], [8]);
|
||||||
|
|
||||||
session.addFold("woot", 0, 9, 1, 16);
|
session.addFold("woot", 0, 9, 1, 15);
|
||||||
assertWrap([8], [8 /* See comments */], [8]);
|
assertWrap([8], [8 /* See comments */], [8]);
|
||||||
removeFoldAssertWrap(0, 9, [8], [8], [8]);
|
removeFoldAssertWrap(0, 9, [8], [8], [8]);
|
||||||
|
|
||||||
return session;
|
return session;
|
||||||
|
},
|
||||||
|
|
||||||
|
"test add fold": function() {
|
||||||
|
var session = createFoldTestSession();
|
||||||
|
var fold;
|
||||||
|
|
||||||
|
function tryAddFold(
|
||||||
|
placeholder,
|
||||||
|
startRow, startColumn, endRow, endColumn, shouldFail)
|
||||||
|
{
|
||||||
|
var fail = false;
|
||||||
|
try {
|
||||||
|
fold = session.addFold(placeholder,
|
||||||
|
startRow, startColumn, endRow, endColumn);
|
||||||
|
} catch (e) {
|
||||||
|
fail = true;
|
||||||
|
}
|
||||||
|
if (fail != shouldFail) {
|
||||||
|
throw "Expected to get an exception";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tryAddFold("foo", 0, 13, 0, 17, true);
|
||||||
|
tryAddFold("foo", 0, 14, 0, 18, true);
|
||||||
|
tryAddFold("foo", 0, 13, 0, 18, false);
|
||||||
|
assert.equal(session.$foldData[0].folds.length, 1);
|
||||||
|
|
||||||
|
tryAddFold("f", 0, 13, 0, 18, true);
|
||||||
|
tryAddFold("foo", 0, 18, 0, 21, false);
|
||||||
|
assert.equal(session.$foldData[0].folds.length, 2);
|
||||||
|
session.removeFold(fold);
|
||||||
|
|
||||||
|
tryAddFold("foo", 0, 18, 0, 22, true);
|
||||||
|
tryAddFold("foo", 0, 18, 0, 19, true);
|
||||||
|
tryAddFold("foo", 0, 22, 1, 10, true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue