diff --git a/lib/ace/document.js b/lib/ace/document.js index 67b16daa..d16c769e 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -772,10 +772,14 @@ var Document = function(text, mode) { this.$useWrapMode = false; this.setUseWrapMode = function(useWrapMode) { var _self = this; + function computeWrapData(e) { var lines = _self.lines, wrapData = _self.$wrapData; var wrapLimit = _self.$wrapLimit; + // Remove lines that are no longer there. + wrapData.splice(lines.length, wrapData.length - lines.length); + if (!e.data.lastRow) { e.data.lastRow = _self.lines.length - 1; } @@ -857,6 +861,21 @@ var Document = function(text, mode) { return docColumn; }; + this.screenToDocumentRow = function(row) { + if (!this.$useWrapMode) { + return row; + } + + var wrapData = this.$wrapData, linesCount = this.lines.length; + var docRow = 0; + while (docRow < linesCount && row >= wrapData[docRow].length + 1) { + row -= wrapData[docRow].length + 1; + docRow ++; + } + + return docRow; + }; + this.screenToDocumentPosition = function(row, column) { if (!this.$useWrapMode) { return { @@ -903,7 +922,7 @@ var Document = function(text, mode) { return screenColumn; }; - this.documentToScreenPosition = function(row, column) { + this.documentToScreenRow = function(row) { if (!this.$useWrapMode) { return { row: row, @@ -919,19 +938,27 @@ var Document = function(text, mode) { for (row = 0; row < wrapData.length; row ++) { screenRow += wrapData[row].length + 1; } - return { - row: screenRow, - column: 0 - } + return screenRow; } for (var i = 0; i < row; i++) { screenRow += wrapData[i].length + 1; } + return screenRow; + } + + this.documentToScreenPosition = function(row, column) { + if (!this.$useWrapMode) { + return { + row: row, + column: this.documentToScreenColumn(row, column) + } + } + var screenRow = this.documentToScreenRow(row); var screenColumn = column; - var wrapRowData = wrapData[row]; - for (var split = 0; split < wrapRowData.length; split++) { + var wrapRowData = this.$wrapData[row]; + for (var split = 0; wrapRowData && split < wrapRowData.length; split++) { if (column > wrapRowData[split]) { screenColumn = column - wrapRowData[split]; screenRow ++; @@ -946,6 +973,18 @@ var Document = function(text, mode) { }; }; + this.getScreenLength = function() { + if (!this.$useWrapMode) { + return this.getLength(); + } + + var screenRows = 0; + for (var row = 0; row < this.$wrapData.length; row++) { + screenRows += this.$wrapData[row].length + 1; + } + return screenRows; + } + }).call(Document.prototype) exports.Document = Document; diff --git a/lib/ace/layer/cursor.js b/lib/ace/layer/cursor.js index 8fcbb1c1..f614ca89 100644 --- a/lib/ace/layer/cursor.js +++ b/lib/ace/layer/cursor.js @@ -100,7 +100,7 @@ var Cursor = function(parentEl) { }, 1000); }; - this.getPixelPosition = function() { + this.getPixelPosition = function(onScreen) { if (!this.config || !this.position) { return { left : 0, @@ -111,7 +111,8 @@ var Cursor = function(parentEl) { var pos = this.doc.documentToScreenPosition(this.position.row, this.position.column); var cursorLeft = Math.round(pos.column * this.config.characterWidth); - var cursorTop = pos.row * this.config.lineHeight; + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; return { left : cursorLeft, @@ -125,7 +126,7 @@ var Cursor = function(parentEl) { this.config = config; - this.pixelPos = this.getPixelPosition(); + this.pixelPos = this.getPixelPosition(true); this.cursor.style.left = this.pixelPos.left + "px"; this.cursor.style.top = this.pixelPos.top + "px"; diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js index 517f1775..2ef477ab 100644 --- a/lib/ace/layer/marker.js +++ b/lib/ace/layer/marker.js @@ -102,6 +102,10 @@ var Marker = function(parentEl) { this.element.innerHTML = html.join(""); }; + this.$getTop = function(row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig) { // selection start var row = range.start.row; @@ -125,7 +129,7 @@ var Marker = function(parentEl) { // from selection start to the end of the line var height = layerConfig.lineHeight; var width = Math.round(layerConfig.width - (range.start.column * layerConfig.characterWidth)); - var top = (range.start.row - layerConfig.firstRow) * layerConfig.lineHeight; + var top = this.$getTop(range.start.row, layerConfig); var left = Math.round(range.start.column * layerConfig.characterWidth); stringBuilder.push( @@ -137,7 +141,7 @@ var Marker = function(parentEl) { ); // from start of the last line to the selection end - var top = (range.end.row - layerConfig.firstRow) * layerConfig.lineHeight; + var top = this.$getTop(range.start.end, layerConfig); var width = Math.round(range.end.column * layerConfig.characterWidth); stringBuilder.push( @@ -151,7 +155,7 @@ var Marker = function(parentEl) { var height = (range.end.row - range.start.row - 1) * layerConfig.lineHeight; if (height < 0) return; - var top = (range.start.row + 1 - layerConfig.firstRow) * layerConfig.lineHeight; + var top = this.$getTop(range.start.row + 1, layerConfig); stringBuilder.push( "