Add Range.compareRange function used by EditSession.getFoldsInRange.
This commit is contained in:
parent
dac1b38064
commit
a1497c097d
3 changed files with 70 additions and 19 deletions
|
|
@ -1714,6 +1714,7 @@ var EditSession = function(text, mode) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
this.getFoldsInRange = function(range) {
|
this.getFoldsInRange = function(range) {
|
||||||
|
range = range.clone();
|
||||||
var start = range.start,
|
var start = range.start,
|
||||||
end = range.end;
|
end = range.end;
|
||||||
var foldLines = this.$foldData,
|
var foldLines = this.$foldData,
|
||||||
|
|
@ -1721,33 +1722,35 @@ var EditSession = function(text, mode) {
|
||||||
fold;
|
fold;
|
||||||
var cmp,
|
var cmp,
|
||||||
foundFolds = [];
|
foundFolds = [];
|
||||||
|
|
||||||
|
start.column += 1;
|
||||||
|
end.column -= 1;
|
||||||
|
|
||||||
for (var i = 0; i < foldLines.length; i++) {
|
for (var i = 0; i < foldLines.length; i++) {
|
||||||
cmp = foldLines[i].range.compare(start.row, start.column + 1);
|
cmp = foldLines[i].range.compareRange(range);
|
||||||
if (cmp == 1) {
|
// Range is before foldLine. No intersection. This means,
|
||||||
|
// there might be other foldLines that intersect.
|
||||||
|
if (cmp == 2) {
|
||||||
continue;
|
continue;
|
||||||
} else if (cmp == -1) {
|
} else
|
||||||
cmp = foldLines[i].range.compare(end.row, end.column - 1);
|
// Range is after foldLine. There can't be any other foldLines then,
|
||||||
if (cmp == -1) {
|
// so let's give up.
|
||||||
break;
|
if (cmp == -2) {
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
folds = foldLines[i].folds;
|
folds = foldLines[i].folds;
|
||||||
for (var j = 0; j < folds.length; j++) {
|
for (var j = 0; j < folds.length; j++) {
|
||||||
fold = folds[j];
|
fold = folds[j];
|
||||||
cmp = fold.range.compare(end.row, end.column - 1);
|
cmp = fold.range.compareRange(range);
|
||||||
if (cmp == 1) {
|
if (cmp == -2) {
|
||||||
cmp = fold.range.compare(start.row, start.column + 1);
|
break;
|
||||||
if (cmp == 1) {
|
} else if (cmp == 2) {
|
||||||
continue;
|
continue;
|
||||||
}
|
} else
|
||||||
} else if (cmp == -1) {
|
// WTF-state: Can happen due to -1/+1 to start/end column.
|
||||||
|
if (cmp == 42) {
|
||||||
break;
|
break;
|
||||||
} else {
|
|
||||||
cmp = fold.range.compare(start.row, start.column + 1);
|
|
||||||
if (cmp == 1) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
foundFolds.push(fold);
|
foundFolds.push(fold);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -476,6 +476,7 @@ module.exports = {
|
||||||
test(2, 0, 2, 13, [ folds[1] ]);
|
test(2, 0, 2, 13, [ folds[1] ]);
|
||||||
test(2, 10, 2, 20, [ ]);
|
test(2, 10, 2, 20, [ ]);
|
||||||
test(2, 10, 2, 11, [ ]);
|
test(2, 10, 2, 11, [ ]);
|
||||||
|
test(2, 19, 2, 20, [ ]);
|
||||||
},
|
},
|
||||||
|
|
||||||
"test fold one-line text insert": function() {
|
"test fold one-line text insert": function() {
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,53 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
||||||
return this.compare(row, column) == 0;
|
return this.compare(row, column) == 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares this range (A) with another range (B), where B is the passed in
|
||||||
|
* range.
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* -2: (B) is infront of (A) and doesn't intersect with (A)
|
||||||
|
* -1: (B) begins before (A) but ends inside of (A)
|
||||||
|
* 0: (B) is completly inside of (A) OR (A) is complety inside of (B)
|
||||||
|
* +1: (B) begins inside of (A) but ends outside of (A)
|
||||||
|
* +2: (B) is after (A) and doesn't intersect with (A)
|
||||||
|
*
|
||||||
|
* 42: FTW state: (B) ends in (A) but starts outside of (A)
|
||||||
|
*/
|
||||||
|
this.compareRange = function(range) {
|
||||||
|
var cmp,
|
||||||
|
end = range.end,
|
||||||
|
start = range.start;
|
||||||
|
|
||||||
|
cmp = this.compare(end.row, end.column);
|
||||||
|
if (cmp == 1) {
|
||||||
|
cmp = this.compare(start.row, start.column);
|
||||||
|
if (cmp == 1) {
|
||||||
|
return 2;
|
||||||
|
} else if (cmp == 0) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (cmp == -1) {
|
||||||
|
return -2;
|
||||||
|
} else {
|
||||||
|
cmp = this.compare(start.row, start.column);
|
||||||
|
if (cmp == -1) {
|
||||||
|
return -1;
|
||||||
|
} else if (cmp == 1) {
|
||||||
|
return 42;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.containsRange = function(range) {
|
||||||
|
var cmp = this.compareRange(range);
|
||||||
|
return (cmp == -1 || cmp == 0 || cmp == 1);
|
||||||
|
}
|
||||||
|
|
||||||
this.isEnd = function(row, column) {
|
this.isEnd = function(row, column) {
|
||||||
return this.end.row == row && this.end.column == column;
|
return this.end.row == row && this.end.column == column;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue