fix problem with the row cache
This commit is contained in:
parent
aa03a915f7
commit
b8c0563d62
6 changed files with 61 additions and 20 deletions
|
|
@ -890,6 +890,28 @@ var EditSession = function(text, mode) {
|
||||||
this.$clipRowToDocument = function(row) {
|
this.$clipRowToDocument = function(row) {
|
||||||
return Math.max(0, Math.min(row, this.doc.getLength()-1));
|
return Math.max(0, Math.min(row, this.doc.getLength()-1));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.$clipPositionToDocument = function(row, column) {
|
||||||
|
column = Math.max(0, column);
|
||||||
|
|
||||||
|
if (row < 0) {
|
||||||
|
row = 0;
|
||||||
|
column = 0;
|
||||||
|
} else {
|
||||||
|
var len = this.doc.getLength();
|
||||||
|
if (row >= len) {
|
||||||
|
row = len - 1;
|
||||||
|
column = this.doc.getLine(len-1).length;
|
||||||
|
} else {
|
||||||
|
column = Math.min(this.doc.getLine(row).length, column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
row: row,
|
||||||
|
column: column
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// WRAPMODE
|
// WRAPMODE
|
||||||
this.$wrapLimit = 80;
|
this.$wrapLimit = 80;
|
||||||
|
|
@ -1476,7 +1498,7 @@ var EditSession = function(text, mode) {
|
||||||
|
|
||||||
docColumn += this.$getStringScreenWidth(line, screenColumn)[1];
|
docColumn += this.$getStringScreenWidth(line, screenColumn)[1];
|
||||||
|
|
||||||
// clip row at the end of the documen
|
// clip row at the end of the document
|
||||||
if (row + splits.length < screenRow)
|
if (row + splits.length < screenRow)
|
||||||
docColumn = Number.MAX_VALUE;
|
docColumn = Number.MAX_VALUE;
|
||||||
|
|
||||||
|
|
@ -1495,7 +1517,7 @@ var EditSession = function(text, mode) {
|
||||||
if (foldLine) {
|
if (foldLine) {
|
||||||
return foldLine.idxToPosition(docColumn);
|
return foldLine.idxToPosition(docColumn);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
row: docRow,
|
row: docRow,
|
||||||
column: docColumn
|
column: docColumn
|
||||||
|
|
@ -1504,10 +1526,15 @@ var EditSession = function(text, mode) {
|
||||||
|
|
||||||
this.documentToScreenPosition = function(docRow, docColumn) {
|
this.documentToScreenPosition = function(docRow, docColumn) {
|
||||||
// Normalize the passed in arguments.
|
// Normalize the passed in arguments.
|
||||||
if (docColumn == null) {
|
if (typeof docColumn === "undefined")
|
||||||
docColumn = docRow.column;
|
var pos = this.$clipPositionToDocument(docRow.row, docRow.column);
|
||||||
docRow = docRow.row;
|
else
|
||||||
}
|
pos = this.$clipPositionToDocument(docRow, docColumn);
|
||||||
|
|
||||||
|
docRow = pos.row;
|
||||||
|
docColumn = pos.column;
|
||||||
|
|
||||||
|
var LL = this.$rowCache.length;
|
||||||
|
|
||||||
var wrapData;
|
var wrapData;
|
||||||
// Special case in wrapMode if the doc is at the end of the document.
|
// Special case in wrapMode if the doc is at the end of the document.
|
||||||
|
|
|
||||||
|
|
@ -234,6 +234,13 @@ module.exports = {
|
||||||
assert.position(session.documentToScreenPosition(0, 4), 2, 1);
|
assert.position(session.documentToScreenPosition(0, 4), 2, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"test: documentToScreen should clip position to the document boundaries": function() {
|
||||||
|
var session = new EditSession("foo bar\njuhu kinners");
|
||||||
|
|
||||||
|
assert.position(session.documentToScreenPosition(-1, 4), 0, 0);
|
||||||
|
assert.position(session.documentToScreenPosition(3, 0), 1, 12);
|
||||||
|
},
|
||||||
|
|
||||||
"test: convert screen to document coordinates" : function() {
|
"test: convert screen to document coordinates" : function() {
|
||||||
var session = new EditSession("01234\t567890\t1234");
|
var session = new EditSession("01234\t567890\t1234");
|
||||||
session.setTabSize(4);
|
session.setTabSize(4);
|
||||||
|
|
@ -292,6 +299,8 @@ module.exports = {
|
||||||
assert.position(session.screenToDocumentPosition(0, 30), 0, 7);
|
assert.position(session.screenToDocumentPosition(0, 30), 0, 7);
|
||||||
assert.position(session.screenToDocumentPosition(2, 4), 1, 12);
|
assert.position(session.screenToDocumentPosition(2, 4), 1, 12);
|
||||||
assert.position(session.screenToDocumentPosition(1, 30), 1, 12);
|
assert.position(session.screenToDocumentPosition(1, 30), 1, 12);
|
||||||
|
assert.position(session.screenToDocumentPosition(20, 50), 1, 12);
|
||||||
|
assert.position(session.screenToDocumentPosition(20, 5), 1, 12);
|
||||||
},
|
},
|
||||||
|
|
||||||
"test: wrapLine split function" : function() {
|
"test: wrapLine split function" : function() {
|
||||||
|
|
@ -894,5 +903,5 @@ module.exports = {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (typeof module !== "undefined" && module === require.main) {
|
if (typeof module !== "undefined" && module === require.main) {
|
||||||
require("asyncjs/test").testcase(module.exports).exec()
|
require("asyncjs").test.testcase(module.exports).exec()
|
||||||
}
|
}
|
||||||
|
|
@ -254,7 +254,7 @@ var Editor =function(renderer, session) {
|
||||||
var pos = self.session.findMatchingBracket(self.getCursorPosition());
|
var pos = self.session.findMatchingBracket(self.getCursorPosition());
|
||||||
if (pos) {
|
if (pos) {
|
||||||
var range = new Range(pos.row, pos.column, pos.row, pos.column+1);
|
var range = new Range(pos.row, pos.column, pos.row, pos.column+1);
|
||||||
self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket");
|
self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text");
|
||||||
}
|
}
|
||||||
}, 10);
|
}, 10);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -92,14 +92,14 @@ var Marker = function(parentEl) {
|
||||||
} else {
|
} else {
|
||||||
this.drawMultiLineMarker(
|
this.drawMultiLineMarker(
|
||||||
html, range, marker.clazz, config,
|
html, range, marker.clazz, config,
|
||||||
marker.type === "background"
|
marker.type
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.drawSingleLineMarker(
|
this.drawSingleLineMarker(
|
||||||
html, range, marker.clazz, config,
|
html, range, marker.clazz, config,
|
||||||
null, marker.type === "background"
|
null, marker.type
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -121,27 +121,27 @@ var Marker = function(parentEl) {
|
||||||
row, range.start.column,
|
row, range.start.column,
|
||||||
row, this.session.getScreenLastRowColumn(row)
|
row, this.session.getScreenLastRowColumn(row)
|
||||||
);
|
);
|
||||||
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1);
|
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, "text");
|
||||||
|
|
||||||
// selection end
|
// selection end
|
||||||
row = range.end.row;
|
row = range.end.row;
|
||||||
lineRange = new Range(row, 0, row, range.end.column);
|
lineRange = new Range(row, 0, row, range.end.column);
|
||||||
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig);
|
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, "text");
|
||||||
|
|
||||||
for (row = range.start.row + 1; row < range.end.row; row++) {
|
for (row = range.start.row + 1; row < range.end.row; row++) {
|
||||||
lineRange.start.row = row;
|
lineRange.start.row = row;
|
||||||
lineRange.end.row = row;
|
lineRange.end.row = row;
|
||||||
lineRange.end.column = this.session.getScreenLastRowColumn(row);
|
lineRange.end.column = this.session.getScreenLastRowColumn(row);
|
||||||
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1);
|
this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, "text");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws a multi line marker, where lines span the full width
|
* Draws a multi line marker, where lines span the full width
|
||||||
*/
|
*/
|
||||||
this.drawMultiLineMarker = function(stringBuilder, range, clazz, layerConfig, ignorePadding) {
|
this.drawMultiLineMarker = function(stringBuilder, range, clazz, layerConfig, type) {
|
||||||
// from selection start to the end of the line
|
// from selection start to the end of the line
|
||||||
var padding = ignorePadding ? 0 : this.$padding;
|
var padding = type === "background" ? 0 : this.$padding;
|
||||||
var height = layerConfig.lineHeight;
|
var height = layerConfig.lineHeight;
|
||||||
var width = Math.round(layerConfig.width - (range.start.column * layerConfig.characterWidth));
|
var width = Math.round(layerConfig.width - (range.start.column * layerConfig.characterWidth));
|
||||||
var top = this.$getTop(range.start.row, layerConfig);
|
var top = this.$getTop(range.start.row, layerConfig);
|
||||||
|
|
@ -188,10 +188,15 @@ var Marker = function(parentEl) {
|
||||||
/**
|
/**
|
||||||
* Draws a marker which covers one single full line
|
* Draws a marker which covers one single full line
|
||||||
*/
|
*/
|
||||||
this.drawSingleLineMarker = function(stringBuilder, range, clazz, layerConfig, extraLength, ignorePadding) {
|
this.drawSingleLineMarker = function(stringBuilder, range, clazz, layerConfig, extraLength, type) {
|
||||||
var padding = ignorePadding ? 0 : this.$padding;
|
var padding = type === "background" ? 0 : this.$padding;
|
||||||
var height = layerConfig.lineHeight;
|
var height = layerConfig.lineHeight;
|
||||||
var width = Math.round((range.end.column + (extraLength || 0) - range.start.column) * layerConfig.characterWidth);
|
|
||||||
|
if (type === "background")
|
||||||
|
var width = layerConfig.width;
|
||||||
|
else
|
||||||
|
width = Math.round((range.end.column + (extraLength || 0) - range.start.column) * layerConfig.characterWidth);
|
||||||
|
|
||||||
var top = this.$getTop(range.start.row, layerConfig);
|
var top = this.$getTop(range.start.row, layerConfig);
|
||||||
var left = Math.round(
|
var left = Math.round(
|
||||||
padding + range.start.column * layerConfig.characterWidth
|
padding + range.start.column * layerConfig.characterWidth
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ var Mode = function() {
|
||||||
var ranges = editor.$search.findAll(session);
|
var ranges = editor.$search.findAll(session);
|
||||||
ranges.forEach(function(range) {
|
ranges.forEach(function(range) {
|
||||||
if (!range.contains(cursor.row, cursor.column)) {
|
if (!range.contains(cursor.row, cursor.column)) {
|
||||||
var marker = session.addMarker(range, "ace_selected_word");
|
var marker = session.addMarker(range, "ace_selected_word", "text");
|
||||||
session.$selectionOccurrences.push(marker);
|
session.$selectionOccurrences.push(marker);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
define(function(require, exports, module) {
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
require("pilot/fixoldbrowsers");
|
require("pilot/fixoldbrowsers");
|
||||||
var AsyncTest = require("asyncjs/test");
|
var AsyncTest = require("asyncjs").test;
|
||||||
var async = require("asyncjs");
|
var async = require("asyncjs");
|
||||||
var dom = require("pilot/dom");
|
var dom = require("pilot/dom");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue