Make EditSession.getScreenLength work with folded lines.
This commit is contained in:
parent
6579a99530
commit
cc795cd0e5
2 changed files with 126 additions and 16 deletions
|
|
@ -1116,13 +1116,18 @@ var EditSession = function(text, mode) {
|
||||||
* - array[0]: The documentRow equivalent.
|
* - array[0]: The documentRow equivalent.
|
||||||
* - array[1]: The screenRowOffset to the first documentRow on the screen.
|
* - array[1]: The screenRowOffset to the first documentRow on the screen.
|
||||||
*/
|
*/
|
||||||
this.$screenToDocumentRow = function(row) {
|
this.$screenToDocumentRow = function(screenRow, column) {
|
||||||
if (!this.$useWrapMode) {
|
if (!this.$useWrapMode) {
|
||||||
return [row, 0];
|
// for (var row = 0; row < screenRow; i++) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
return [screenRow, 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: WrapMode + Code Folding.
|
||||||
var wrapData = this.$wrapData, linesCount = this.getLength();
|
var wrapData = this.$wrapData, linesCount = this.getLength();
|
||||||
var docRow = 0;
|
var docRow = 0,
|
||||||
|
row = screenRow;
|
||||||
while (docRow < linesCount && row >= wrapData[docRow].length + 1) {
|
while (docRow < linesCount && row >= wrapData[docRow].length + 1) {
|
||||||
row -= wrapData[docRow].length + 1;
|
row -= wrapData[docRow].length + 1;
|
||||||
docRow ++;
|
docRow ++;
|
||||||
|
|
@ -1241,9 +1246,26 @@ var EditSession = function(text, mode) {
|
||||||
*/
|
*/
|
||||||
this.$documentToScreenRow = function(docRow, docColumn) {
|
this.$documentToScreenRow = function(docRow, docColumn) {
|
||||||
if (!this.$useWrapMode) {
|
if (!this.$useWrapMode) {
|
||||||
return [docRow, 0];
|
var row = docRow;
|
||||||
|
row -= this.getFoldedRowLength(0, docRow - 1);
|
||||||
|
|
||||||
|
if (this.isRowFolded(docRow)) {
|
||||||
|
var folds = this.getFoldData(docRow),
|
||||||
|
idx = 0;
|
||||||
|
|
||||||
|
if (folds[0].end.row == docRow) {
|
||||||
|
idx += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (idx; idx < folds.length; idx++) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [row, 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: WrapMode + Folding
|
||||||
|
|
||||||
var wrapData = this.$wrapData;
|
var wrapData = this.$wrapData;
|
||||||
var screenRow = 0;
|
var screenRow = 0;
|
||||||
|
|
||||||
|
|
@ -1285,6 +1307,13 @@ var EditSession = function(text, mode) {
|
||||||
column = pos.column;
|
column = pos.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NEW CODE PATH:
|
||||||
|
var res = this.doc2Screen(row, column);
|
||||||
|
return {
|
||||||
|
row: res[0],
|
||||||
|
column: res[1]
|
||||||
|
};
|
||||||
|
|
||||||
if (!this.$useWrapMode) {
|
if (!this.$useWrapMode) {
|
||||||
str = this.getLine(row).substring(0, column);
|
str = this.getLine(row).substring(0, column);
|
||||||
column = this.$getStringScreenWidth(str);
|
column = this.$getStringScreenWidth(str);
|
||||||
|
|
@ -1309,6 +1338,7 @@ var EditSession = function(text, mode) {
|
||||||
var screenColumn;
|
var screenColumn;
|
||||||
var screenRowOffset = rowData[1];
|
var screenRowOffset = rowData[1];
|
||||||
|
|
||||||
|
// TODO: WrapMode + Code Folding.
|
||||||
str = this.getLine(row).substring(
|
str = this.getLine(row).substring(
|
||||||
wrapRowData[screenRowOffset - 1] || 0, column);
|
wrapRowData[screenRowOffset - 1] || 0, column);
|
||||||
screenColumn = this.$getStringScreenWidth(str);
|
screenColumn = this.$getStringScreenWidth(str);
|
||||||
|
|
@ -1320,14 +1350,17 @@ var EditSession = function(text, mode) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getScreenLength = function() {
|
this.getScreenLength = function() {
|
||||||
|
var length = this.getLength();
|
||||||
if (!this.$useWrapMode) {
|
if (!this.$useWrapMode) {
|
||||||
return this.getLength();
|
screenRows = length;
|
||||||
}
|
} else {
|
||||||
|
|
||||||
var screenRows = 0;
|
var screenRows = 0;
|
||||||
for (var row = 0; row < this.$wrapData.length; row++) {
|
for (var row = 0; row < this.$wrapData.length; row++) {
|
||||||
screenRows += this.$wrapData[row].length + 1;
|
screenRows += this.$wrapData[row].length + 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
screenRows -= this.getFoldedRowLength(0, length - 1);
|
||||||
return screenRows;
|
return screenRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1370,7 +1403,6 @@ var EditSession = function(text, mode) {
|
||||||
c >= 0xFFE0 && c <= 0xFFE6;
|
c >= 0xFFE0 && c <= 0xFFE6;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// == Folding Code ========================================================
|
// == Folding Code ========================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1381,6 +1413,8 @@ var EditSession = function(text, mode) {
|
||||||
this.range = range;
|
this.range = range;
|
||||||
this.start = range.start;
|
this.start = range.start;
|
||||||
this.end = range.end;
|
this.end = range.end;
|
||||||
|
|
||||||
|
this.sameLine = range.start.row == range.end.row;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1401,10 +1435,19 @@ var EditSession = function(text, mode) {
|
||||||
foldData[startRow].push(fold);
|
foldData[startRow].push(fold);
|
||||||
|
|
||||||
// Mark all lines folded by this fold as folded.
|
// Mark all lines folded by this fold as folded.
|
||||||
for (var row = startRow + 1; row <= endRow; row++) {
|
for (var row = startRow + 1; row < endRow; row++) {
|
||||||
foldData[row] = fold;
|
foldData[row] = fold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this fold folds more then one line, then add the fold at the
|
||||||
|
// beginning of the foldData[endRow] as well.
|
||||||
|
if (!fold.sameLine) {
|
||||||
|
if (!Array.isArray(foldData[endRow])) {
|
||||||
|
foldData[endRow] = [];
|
||||||
|
}
|
||||||
|
foldData[endRow].splice(0, 0, fold);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Recalculate wrapData
|
// TODO: Recalculate wrapData
|
||||||
// TODO: Recalculate width etc.
|
// TODO: Recalculate width etc.
|
||||||
// TODO: Mark as dirty etc.
|
// TODO: Mark as dirty etc.
|
||||||
|
|
@ -1424,7 +1467,7 @@ var EditSession = function(text, mode) {
|
||||||
this.getRowLastFold = function(docRow) {
|
this.getRowLastFold = function(docRow) {
|
||||||
var fold = this.$foldData[docRow];
|
var fold = this.$foldData[docRow];
|
||||||
if (!fold) {
|
if (!fold) {
|
||||||
return false;
|
return null;
|
||||||
} else if (Array.isArray(fold)) {
|
} else if (Array.isArray(fold)) {
|
||||||
return fold[fold.length - 1];
|
return fold[fold.length - 1];
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1432,6 +1475,22 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getRowFirstFold = function(docRow, skipLastWrap) {
|
||||||
|
var fold = this.$foldData[docRow];
|
||||||
|
if (!fold) {
|
||||||
|
return null;
|
||||||
|
} else if (Array.isArray(fold)) {
|
||||||
|
if (skipLastWrap) {
|
||||||
|
if (fold[0].row.start != docRow) {
|
||||||
|
return fold[1] || null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fold[0];
|
||||||
|
} else {
|
||||||
|
return fold;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
this.getRowFoldEnd = function(docRow) {
|
this.getRowFoldEnd = function(docRow) {
|
||||||
return (this.$foldData[docRow]
|
return (this.$foldData[docRow]
|
||||||
? this.getRowLastFold(docRow).end.row
|
? this.getRowLastFold(docRow).end.row
|
||||||
|
|
@ -1447,10 +1506,59 @@ var EditSession = function(text, mode) {
|
||||||
return !fold || Array.isArray(fold);
|
return !fold || Array.isArray(fold);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getRowFoldData = function(docRow) {
|
this.getFoldData = function(docRow) {
|
||||||
return this.$foldData[docRow];
|
return this.$foldData[docRow];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of folded lines between start and end row.
|
||||||
|
*/
|
||||||
|
this.getFoldedRowLength = function(start, end) {
|
||||||
|
var row = start;
|
||||||
|
var count = 0;
|
||||||
|
while (row <= end) {
|
||||||
|
row = this.findRowFoldedForward(row, end);
|
||||||
|
if (row != null) {
|
||||||
|
var fold = this.getRowLastFold(row);
|
||||||
|
if (!fold.sameLine) {
|
||||||
|
if (row == start) {
|
||||||
|
count += fold.end.row - start;
|
||||||
|
} else {
|
||||||
|
count += fold.end.row - fold.start.row;
|
||||||
|
}
|
||||||
|
row = fold.end.row + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.findRowFoldedForward = function(start, limit) {
|
||||||
|
if (limit == null) {
|
||||||
|
limit = this.getLength();
|
||||||
|
}
|
||||||
|
for (var row = start; row != limit; row++) {
|
||||||
|
if (this.isRowFolded(row)) {
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.findRowFoldedBackwards = function(start, limit) {
|
||||||
|
if (limit == null) {
|
||||||
|
limit = -1;
|
||||||
|
}
|
||||||
|
for (var row = start; row != limit; row--) {
|
||||||
|
if (this.isRowFolded(row)) {
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}).call(EditSession.prototype);
|
}).call(EditSession.prototype);
|
||||||
|
|
||||||
exports.EditSession = EditSession;
|
exports.EditSession = EditSession;
|
||||||
|
|
|
||||||
|
|
@ -417,7 +417,7 @@ var Text = function(parentEl) {
|
||||||
|
|
||||||
this.$renderFoldLine = function(stringBuilder, row, tokens) {
|
this.$renderFoldLine = function(stringBuilder, row, tokens) {
|
||||||
var session = this.session,
|
var session = this.session,
|
||||||
folds = session.getRowFoldData(row);
|
folds = session.getFoldData(row);
|
||||||
|
|
||||||
var renderTokens = [];
|
var renderTokens = [];
|
||||||
|
|
||||||
|
|
@ -473,8 +473,10 @@ var Text = function(parentEl) {
|
||||||
if (fold.start.row != fold.end.row) {
|
if (fold.start.row != fold.end.row) {
|
||||||
row = fold.end.row;
|
row = fold.end.row;
|
||||||
tokens = this.tokenizer.getTokens(row, row)[0].tokens;
|
tokens = this.tokenizer.getTokens(row, row)[0].tokens;
|
||||||
folds = session.getRowFoldData(row);
|
folds = session.getFoldData(row);
|
||||||
i = -1;
|
// Skip the first fold as it's only referencing to the current
|
||||||
|
// fold that is already rendered.
|
||||||
|
i = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lastCol = fold.end.column;
|
lastCol = fold.end.column;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue