Remove Fold.compare/contains functions. Rename Fold.sameLine to Fold.sameRow. Add new functions to Range that repalce the Fold.compare/contains functions but are more explicit on where to drop the start/end.
This commit is contained in:
parent
15d2c50117
commit
56f74f1368
3 changed files with 85 additions and 53 deletions
|
|
@ -935,7 +935,7 @@ var EditSession = function(text, mode) {
|
||||||
var folds = foldLine.folds;
|
var folds = foldLine.folds;
|
||||||
for (var i = folds.indexOf(ret.fold); i < folds.length; i++) {
|
for (var i = folds.indexOf(ret.fold); i < folds.length; i++) {
|
||||||
folds[i].start.column += len;
|
folds[i].start.column += len;
|
||||||
if (!folds[i].sameLine) {
|
if (!folds[i].sameRow) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
folds[i].end.column += len;
|
folds[i].end.column += len;
|
||||||
|
|
@ -1274,21 +1274,10 @@ var EditSession = function(text, mode) {
|
||||||
foldLine = null, lastFoldLine = null;
|
foldLine = null, lastFoldLine = null;
|
||||||
|
|
||||||
// Clamp the docRow position in case it's inside of a folded block.
|
// Clamp the docRow position in case it's inside of a folded block.
|
||||||
foldLine = this.getFoldLine(docRow);
|
fold = this.getFoldAt(docRow, docColumn, -1);
|
||||||
if (foldLine) {
|
if (fold) {
|
||||||
folds = foldLine.folds;
|
|
||||||
for (var i = 0; i < folds.length; i++) {
|
|
||||||
fold = folds[i];
|
|
||||||
comp = fold.compare(docRow, docColumn);
|
|
||||||
if (comp == 0) {
|
|
||||||
docRow = fold.start.row;
|
docRow = fold.start.row;
|
||||||
docColumn = fold.start.column;
|
docColumn = fold.start.column;
|
||||||
break;
|
|
||||||
} else if (comp == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foldLine = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var row = 0; row < docRow; row++) {
|
for (var row = 0; row < docRow; row++) {
|
||||||
|
|
@ -1437,21 +1426,7 @@ var EditSession = function(text, mode) {
|
||||||
this.start = range.start;
|
this.start = range.start;
|
||||||
this.end = range.end;
|
this.end = range.end;
|
||||||
|
|
||||||
this.sameLine = range.start.row == range.end.row;
|
this.sameRow = range.start.row == range.end.row;
|
||||||
}
|
|
||||||
|
|
||||||
Fold.prototype.contains = function(row, column) {
|
|
||||||
if (this.end.row == row && this.end.column == column) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return this.range.contains(row, column);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fold.prototype.compare = function(row, column) {
|
|
||||||
if (this.end.row == row && this.end.column == column) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return this.range.compare(row, column);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function FoldLine(fold) {
|
function FoldLine(fold) {
|
||||||
|
|
@ -1472,13 +1447,13 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addFold = function(fold) {
|
this.addFold = function(fold) {
|
||||||
if (fold.sameLine) {
|
if (fold.sameRow) {
|
||||||
if (fold.start.row < this.startRow || fold.endRow > this.endRow) {
|
if (fold.start.row < this.startRow || fold.endRow > this.endRow) {
|
||||||
throw "Can't add a fold to this FoldLine as it has no connection";
|
throw "Can't add a fold to this FoldLine as it has no connection";
|
||||||
}
|
}
|
||||||
this.folds.push(fold);
|
this.folds.push(fold);
|
||||||
this.folds.sort(function(a, b) {
|
this.folds.sort(function(a, b) {
|
||||||
return -a.compare(b.start.row, b.start.column);
|
return -a.range.compareEnd(b.start.row, b.start.column);
|
||||||
});
|
});
|
||||||
} else if (fold.start.row == this.end.row) {
|
} else if (fold.start.row == this.end.row) {
|
||||||
this.folds.push(fold);
|
this.folds.push(fold);
|
||||||
|
|
@ -1521,7 +1496,7 @@ var EditSession = function(text, mode) {
|
||||||
for (var i = 0; i < folds.length; i++) {
|
for (var i = 0; i < folds.length; i++) {
|
||||||
fold = folds[i];
|
fold = folds[i];
|
||||||
|
|
||||||
comp = fold.compare(endRow, endColumn);
|
comp = fold.range.compareEnd(endRow, endColumn);
|
||||||
// This fold is after the endRow/Column.
|
// This fold is after the endRow/Column.
|
||||||
if (comp == -1) {
|
if (comp == -1) {
|
||||||
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
||||||
|
|
@ -1542,7 +1517,7 @@ var EditSession = function(text, mode) {
|
||||||
|
|
||||||
// Note the new lastEnd might not be on the same line. However,
|
// Note the new lastEnd might not be on the same line. However,
|
||||||
// it's the callback's job to recognize this.
|
// it's the callback's job to recognize this.
|
||||||
isNewRow = !fold.sameLine;
|
isNewRow = !fold.sameRow;
|
||||||
lastEnd = fold.end.column;
|
lastEnd = fold.end.column;
|
||||||
}
|
}
|
||||||
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
||||||
|
|
@ -1552,7 +1527,7 @@ var EditSession = function(text, mode) {
|
||||||
var fold;
|
var fold;
|
||||||
for (var i = 0; i < this.folds.length; i++) {
|
for (var i = 0; i < this.folds.length; i++) {
|
||||||
fold = this.folds[i];
|
fold = this.folds[i];
|
||||||
cmp = fold.compare(row, column);
|
cmp = fold.range.compareEnd(row, column);
|
||||||
if (cmp == -1) {
|
if (cmp == -1) {
|
||||||
return {
|
return {
|
||||||
fold: fold,
|
fold: fold,
|
||||||
|
|
@ -1576,7 +1551,7 @@ var EditSession = function(text, mode) {
|
||||||
// TODO: Refactor to use getNextFoldTo function.
|
// TODO: Refactor to use getNextFoldTo function.
|
||||||
for (var i = 0; i < this.folds.length; i++) {
|
for (var i = 0; i < this.folds.length; i++) {
|
||||||
fold = this.folds[i];
|
fold = this.folds[i];
|
||||||
cmp = fold.compare(row, column);
|
cmp = fold.range.compareEnd(row, column);
|
||||||
if (cmp == -1) {
|
if (cmp == -1) {
|
||||||
str = session.getLine(fold.start.row).
|
str = session.getLine(fold.start.row).
|
||||||
substring(lastFold.end.column, fold.start.column);
|
substring(lastFold.end.column, fold.start.column);
|
||||||
|
|
@ -1609,18 +1584,12 @@ var EditSession = function(text, mode) {
|
||||||
for (var i = 0; i < folds.length; i++) {
|
for (var i = 0; i < folds.length; i++) {
|
||||||
fold = folds[i];
|
fold = folds[i];
|
||||||
if (fold.range.contains(row, column)) {
|
if (fold.range.contains(row, column)) {
|
||||||
if (side == -1) {
|
if (side == -1 && fold.range.isEnd(row, column)) {
|
||||||
if (fold.start.row != row || fold.start.column != column) {
|
|
||||||
return fold;
|
|
||||||
}
|
|
||||||
} else if (side == 1) {
|
|
||||||
if (fold.end.row != row || fold.end.column != column) {
|
|
||||||
return fold;
|
|
||||||
}
|
|
||||||
} else if (side == 0) {
|
|
||||||
return fold;
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
|
} else if (side == 1 && fold.range.isStart(row, column)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return fold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1690,7 +1659,7 @@ var EditSession = function(text, mode) {
|
||||||
} else if (startRow == foldLine.end.row) {
|
} else if (startRow == foldLine.end.row) {
|
||||||
foldLine.addFold(fold);
|
foldLine.addFold(fold);
|
||||||
added = true;
|
added = true;
|
||||||
if (!fold.sameLine) {
|
if (!fold.sameRow) {
|
||||||
// Check if we might have to merge two FoldLines.
|
// Check if we might have to merge two FoldLines.
|
||||||
foldLineNext = foldData[i + 1];
|
foldLineNext = foldData[i + 1];
|
||||||
if (foldLineNext && foldLineNext.start.row == endRow) {
|
if (foldLineNext && foldLineNext.start.row == endRow) {
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,47 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
||||||
return this.compare(row, column) == 0;
|
return this.compare(row, column) == 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.isEnd = function(row, column) {
|
||||||
|
return this.end.row == row && this.end.column == column;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isStart = function(row, column) {
|
||||||
|
return this.start.row == row && this.start.column == column;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inside = function(row, column) {
|
||||||
|
if (this.compare(row, column) == 0) {
|
||||||
|
if (this.isEnd(row, column) || this.isStart(row, column)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.insideStart = function(row, column) {
|
||||||
|
if (this.compare(row, column) == 0) {
|
||||||
|
if (this.isEnd(row, column)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.insideEnd = function(row, column) {
|
||||||
|
if (this.compare(row, column) == 0) {
|
||||||
|
if (this.isStart(row, column)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
this.compare = function(row, column) {
|
this.compare = function(row, column) {
|
||||||
if (!this.isMultiLine()) {
|
if (!this.isMultiLine()) {
|
||||||
if (row === this.start.row) {
|
if (row === this.start.row) {
|
||||||
|
|
@ -82,6 +123,28 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like .compare(), but if isStart is true, return -1;
|
||||||
|
*/
|
||||||
|
this.compareStart = function(row, column) {
|
||||||
|
if (this.start.row == row && this.start.column == column) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return this.compare(row, column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like .compare(), but if isEnd is true, return 1;
|
||||||
|
*/
|
||||||
|
this.compareEnd = function(row, column) {
|
||||||
|
if (this.end.row == row && this.end.column == column) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return this.compare(row, column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.clipRows = function(firstRow, lastRow) {
|
this.clipRows = function(firstRow, lastRow) {
|
||||||
if (this.end.row > lastRow) {
|
if (this.end.row > lastRow) {
|
||||||
var end = {
|
var end = {
|
||||||
|
|
|
||||||
|
|
@ -265,7 +265,7 @@ var Selection = function(session) {
|
||||||
var cursor = this.selectionLead.getPosition(),
|
var cursor = this.selectionLead.getPosition(),
|
||||||
fold;
|
fold;
|
||||||
|
|
||||||
if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {
|
if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {
|
||||||
this.moveCursorTo(fold.start.row, fold.start.column);
|
this.moveCursorTo(fold.start.row, fold.start.column);
|
||||||
} else if (cursor.column == 0) {
|
} else if (cursor.column == 0) {
|
||||||
// cursor is a line (start
|
// cursor is a line (start
|
||||||
|
|
@ -285,7 +285,7 @@ var Selection = function(session) {
|
||||||
this.moveCursorRight = function() {
|
this.moveCursorRight = function() {
|
||||||
var cursor = this.selectionLead.getPosition(),
|
var cursor = this.selectionLead.getPosition(),
|
||||||
fold;
|
fold;
|
||||||
if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {
|
if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {
|
||||||
this.moveCursorTo(fold.end.row, fold.end.column);
|
this.moveCursorTo(fold.end.row, fold.end.column);
|
||||||
} else if (this.selectionLead.column == this.doc.getLine(this.selectionLead.row).length) {
|
} else if (this.selectionLead.column == this.doc.getLine(this.selectionLead.row).length) {
|
||||||
if (this.selectionLead.row < this.doc.getLength() - 1) {
|
if (this.selectionLead.row < this.doc.getLength() - 1) {
|
||||||
|
|
@ -348,7 +348,7 @@ var Selection = function(session) {
|
||||||
this.session.tokenRe.lastIndex = 0;
|
this.session.tokenRe.lastIndex = 0;
|
||||||
|
|
||||||
var fold;
|
var fold;
|
||||||
if (fold = this.session.getFoldAt(row, column, 1)) {
|
if (fold = this.session.getFoldAt(row, column, -1)) {
|
||||||
this.moveCursorTo(fold.end.row, fold.end.column);
|
this.moveCursorTo(fold.end.row, fold.end.column);
|
||||||
return;
|
return;
|
||||||
} else if (column == line.length) {
|
} else if (column == line.length) {
|
||||||
|
|
@ -372,7 +372,7 @@ var Selection = function(session) {
|
||||||
var column = this.selectionLead.column;
|
var column = this.selectionLead.column;
|
||||||
|
|
||||||
var fold;
|
var fold;
|
||||||
if (fold = this.session.getFoldAt(row, column, -1)) {
|
if (fold = this.session.getFoldAt(row, column, 1)) {
|
||||||
this.moveCursorTo(fold.start.row, fold.start.column);
|
this.moveCursorTo(fold.start.row, fold.start.column);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue