From 40472b71fc67c56ae8dc5602960093d4421775a1 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Tue, 11 Jan 2011 13:34:34 +0100 Subject: [PATCH] Implement Document.getScreenRowLength and fix bug if full line seleciton is turned off --- lib/ace/document.js | 43 +++++++++++++++++++++++++++++------------ lib/ace/layer/marker.js | 5 +++-- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/lib/ace/document.js b/lib/ace/document.js index 22b5cb4e..c4ca4290 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -1008,6 +1008,23 @@ var Document = function(text, mode) { return rows * config.lineHeight; }; + this.getScreenRowLength = function(screenRow) { + if (!this.$useWrapMode) { + return this.getLine(screenRow).length; + } + + var rowData = this.$screenToDocumentRow(screenRow); + var docRow = rowData[0], + row = rowData[1]; + + if (this.$wrapData[docRow][row]) { + return this.$wrapData[docRow][row] - (this.$wrapData[docRow][row - 1] || 0); + } else { + return this.lines[docRow].length - + (this.$wrapData[docRow][row - 1] || 0) ; + } + }; + this.getRowSplitData = function(row) { if (!this.$useWrapMode) { return undefined; @@ -1016,13 +1033,9 @@ var Document = function(text, mode) { } }; - this.screenToDocumentColumn = function(row, screenColumn) { - return this.screenToDocumentPosition(row, screenColumn).column; - }; - - this.screenToDocumentRow = function(row) { + this.$screenToDocumentRow = function(row) { if (!this.$useWrapMode) { - return row; + return [row, 0]; } var wrapData = this.$wrapData, linesCount = this.lines.length; @@ -1032,7 +1045,15 @@ var Document = function(text, mode) { docRow ++; } - return docRow; + return [docRow, row]; + }; + + this.screenToDocumentRow = function(screenRow) { + return this.$screenToDocumentRow(screenRow)[0]; + }; + + this.screenToDocumentColumn = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; }; this.screenToDocumentPosition = function(row, column) { @@ -1047,11 +1068,9 @@ var Document = function(text, mode) { } else { var wrapData = this.$wrapData, linesCount = this.lines.length; - docRow = 0; - while (docRow < linesCount && row >= wrapData[docRow].length + 1) { - row -= wrapData[docRow].length + 1; - docRow ++; - } + var rowData = this.$screenToDocumentRow(row); + var row = rowData[1]; + docRow = rowData[0]; if (docRow >= this.lines.length) { return { diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js index a48ef9c8..0182f71e 100644 --- a/lib/ace/layer/marker.js +++ b/lib/ace/layer/marker.js @@ -110,7 +110,8 @@ var Marker = function(parentEl) { this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig) { // selection start var row = range.start.row; - var lineRange = new Range(row, range.start.column, row, this.doc.getLine(row).length); + var lineRange = new Range(row, range.start.column, + row, this.doc.getScreenRowLength(row)); this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig); // selection end @@ -121,7 +122,7 @@ var Marker = function(parentEl) { for (var row = range.start.row + 1; row < range.end.row; row++) { lineRange.start.row = row; lineRange.end.row = row; - lineRange.end.column = this.doc.getLine(row).length; + lineRange.end.column = this.doc.getScreenRowLength(row); this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig); } };