diff --git a/TextDocument.js b/TextDocument.js index 91b52c4b..96bf48f7 100644 --- a/TextDocument.js +++ b/TextDocument.js @@ -1,5 +1,7 @@ -function TextDocument(text) { +function TextDocument(text) +{ this.lines = this._split(text); + this.modified = true; } TextDocument.prototype = @@ -8,6 +10,22 @@ TextDocument.prototype = return text.split(/[\n\r]/) }, + getWidth : function() + { + if (this.modified) + { + this.modified = false; + + var lines = this.lines; + var longestLine = 0; + for (var i=0; i < lines.length; i++) { + longestLine = Math.max(longestLine, lines[i].length); + } + this.width = longestLine; + } + return this.width; + }, + getLine : function(row) { return this.lines[row] || ""; }, @@ -72,8 +90,24 @@ TextDocument.prototype = return this.lines.length; }, + getTextRange : function(range) + { + if (range.start.row == range.end.row) { + return this.lines[range.start.row].substring(range.start.column, range.end.column); + } else { + var lines = []; + lines.push(this.lines[range.start.row].substring(range.start.column)); + lines.push.apply(lines, this.lines.slice(range.start.row+1, range.end.row+1)); + lines.push(this.lines[range.end.row].substring(0, range.end.column)); + + return lines.join("\n"); + } + }, + insert : function(position, text) { + this.modified = true; + var newLines = this._split(text); if (text == "\n") @@ -117,23 +151,11 @@ TextDocument.prototype = }; } }, - - getTextRange : function(range) - { - if (range.start.row == range.end.row) { - return this.lines[range.start.row].substring(range.start.column, range.end.column); - } else { - var lines = []; - lines.push(this.lines[range.start.row].substring(range.start.column)); - lines.push.apply(lines, this.lines.slice(range.start.row+1, range.end.row+1)); - lines.push(this.lines[range.end.row].substring(0, range.end.column)); - - return lines.join("\n"); - } - }, remove : function(range) { + this.modified = true; + var firstRow = range.start.row; var lastRow = range.end.row; diff --git a/VirtualRenderer.js b/VirtualRenderer.js index 00682073..fb6d57a1 100644 --- a/VirtualRenderer.js +++ b/VirtualRenderer.js @@ -25,6 +25,7 @@ function VirtualRenderer(containerId) VirtualRenderer.prototype.setDocument = function(doc) { this.lines = doc.lines; + this.doc = doc; this.textLayer.setDocument(doc); }; @@ -32,23 +33,18 @@ VirtualRenderer.prototype.getContainerElement = function() { return this.container; }; -VirtualRenderer.prototype.getLongestLineWidth = function(lines) -{ - var longestLine = this.container.clientWidth; - for (var i=0; i < lines.length; i++) { - longestLine = Math.max(longestLine, (lines[i].length * this.characterWidth)); - } - return longestLine; -}; - VirtualRenderer.prototype.draw = function() { var lines = this.lines; var offset = this.scrollTop % this.lineHeight; - var minHeight = this.container.clientHeight + offset; + var minHeight = this.scroller.clientHeight + offset; + + var longestLine = Math.max( + this.scroller.clientWidth, + this.doc.getWidth() * this.characterWidth + ); - var longestLine = this.getLongestLineWidth(lines); var lineCount = Math.ceil(minHeight / this.lineHeight); var firstRow = Math.round((this.scrollTop - offset) / this.lineHeight); var lastRow = Math.min(lines.length, firstRow+lineCount);