fix problem with the row cache

This commit is contained in:
Fabian Jakobs 2011-07-28 16:52:00 +02:00
commit b8c0563d62
6 changed files with 61 additions and 20 deletions

View file

@ -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.

View file

@ -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()
} }

View file

@ -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);
}; };

View file

@ -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

View file

@ -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);
} }
}); });

View file

@ -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");