Rewrite of session.documentToScreen code
This commit is contained in:
parent
cc795cd0e5
commit
1726444b96
1 changed files with 128 additions and 6 deletions
|
|
@ -1045,15 +1045,16 @@ var EditSession = function(text, mode) {
|
||||||
return screenColumn;
|
return screenColumn;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getRowHeight = function(config, row) {
|
this.getRowLength = function(row) {
|
||||||
var rows;
|
|
||||||
if (!this.$useWrapMode || !this.$wrapData[row]) {
|
if (!this.$useWrapMode || !this.$wrapData[row]) {
|
||||||
rows = 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
rows = this.$wrapData[row].length + 1;
|
return this.$wrapData[row].length + 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return rows * config.lineHeight;
|
this.getRowHeight = function(config, row) {
|
||||||
|
return this.getRowLength(row) * config.lineHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getScreenLastRowColumn = function(screenRow, returnDocPosition) {
|
this.getScreenLastRowColumn = function(screenRow, returnDocPosition) {
|
||||||
|
|
@ -1291,9 +1292,130 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.documentToScreenRow = function(docRow, docColumn) {
|
this.documentToScreenRow = function(docRow, docColumn) {
|
||||||
return this.$documentToScreenRow(docRow, docColumn)[0];
|
// NEW CODE PATH:
|
||||||
|
var res = this.doc2Screen(docRow, docColumn);
|
||||||
|
return res[0];
|
||||||
|
// return this.$documentToScreenRow(docRow, docColumn)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.$buildWrappedTextLine = function(row, endRow, endColumn) {
|
||||||
|
var textLine = "";
|
||||||
|
|
||||||
|
// Build a one line string for the current fold sequence that starts
|
||||||
|
// at foldStartRow.
|
||||||
|
|
||||||
|
while_loop:
|
||||||
|
while (true) {
|
||||||
|
var folds = this.getFoldData(row);
|
||||||
|
var line = this.getLine(row);
|
||||||
|
|
||||||
|
var lastEnd = 0;
|
||||||
|
var startIdx = 0;
|
||||||
|
if (folds[0].start.row != row) {
|
||||||
|
startIdx = 1;
|
||||||
|
lastEnd = folds[0].end.column;
|
||||||
|
}
|
||||||
|
fold = null;
|
||||||
|
for (var i = startIdx; i < folds.length; i++) {
|
||||||
|
fold = folds[i];
|
||||||
|
// STOP
|
||||||
|
if (row == endRow) {
|
||||||
|
if (endColumn <= fold.start.column) {
|
||||||
|
textLine += line.substring(lastEnd, endColumn);
|
||||||
|
break while_loop;
|
||||||
|
} else if (!fold.sameLine || endColumn < fold.end.column) {
|
||||||
|
textLine += line.substring(lastEnd, fold.start.column);
|
||||||
|
break while_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textLine += line.substring(lastEnd, fold.start.column);
|
||||||
|
textLine += fold.placeholder;
|
||||||
|
if (fold.sameLine) {
|
||||||
|
lastEnd = fold.end.column;
|
||||||
|
} else {
|
||||||
|
row = fold.end.row;
|
||||||
|
// STOP
|
||||||
|
if (row == endRow && endColumn <= fold.end.column) {
|
||||||
|
break while_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (row > endRow) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (row == endRow && (!fold || fold.sameLine)) {
|
||||||
|
if (fold) {
|
||||||
|
textLine += line.substring(lastEnd, endColumn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return textLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.doc2Screen = function(docRow, docColumn) {
|
||||||
|
var screenRow = 0,
|
||||||
|
screenColumn = 0,
|
||||||
|
foldStartRow = null,
|
||||||
|
fold = null;
|
||||||
|
|
||||||
|
// Clamp the docRow position in case it's inside of a folded block.
|
||||||
|
if (!this.isRowVisible(docRow)) {
|
||||||
|
// As the line is not visible, getFoldData will return only a
|
||||||
|
// single fold and also not an array.
|
||||||
|
fold = this.getFoldData(docRow);
|
||||||
|
docRow = fold.start.row;
|
||||||
|
docColumn = fold.start.column;
|
||||||
|
fold = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var row = 0; row < docRow; row++) {
|
||||||
|
var fold = this.getRowLastFold(row);
|
||||||
|
if (fold && !fold.sameLine) {
|
||||||
|
if (foldStartRow == null) {
|
||||||
|
foldStartRow = row;
|
||||||
|
}
|
||||||
|
row = fold.end.row - 1;
|
||||||
|
} else {
|
||||||
|
screenRow += this.getRowLength(row);
|
||||||
|
foldStartRow = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var textLine = "";
|
||||||
|
|
||||||
|
// Check if the final row we want to reach is inside of some folds.
|
||||||
|
if (!this.isRowFolded(docRow)) {
|
||||||
|
foldStartRow = null;
|
||||||
|
} else if (!foldStartRow) {
|
||||||
|
foldStartRow = docRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapDataRow;
|
||||||
|
if (foldStartRow) {
|
||||||
|
textLine = this.$buildWrappedTextLine(
|
||||||
|
foldStartRow, docRow, docColumn);
|
||||||
|
} else {
|
||||||
|
textLine = this.getLine(docRow).substring(0, docColumn);
|
||||||
|
foldStartRow = docRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.$useWrapMode) {
|
||||||
|
var wrapData = this.$wrapData[wrapDataRow];
|
||||||
|
var screenRowOffset = 0;
|
||||||
|
while (docColumn >= wrapData[screenRowOffset]) {
|
||||||
|
screenRow ++;
|
||||||
|
screenRowOffset++;
|
||||||
|
}
|
||||||
|
textLine = textLine.substring(
|
||||||
|
wrapData[screenRowOffset - 1] || 0, textLine.length);
|
||||||
|
}
|
||||||
|
return [screenRow, this.$getStringScreenWidth(textLine), textLine];
|
||||||
|
// return {
|
||||||
|
// row: screenRow,
|
||||||
|
// column: screenColumn
|
||||||
|
// }
|
||||||
|
|
||||||
this.documentToScreenPosition = function(pos, column) {
|
this.documentToScreenPosition = function(pos, column) {
|
||||||
var str;
|
var str;
|
||||||
var tabSize = this.getTabSize();
|
var tabSize = this.getTabSize();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue