diff --git a/lib/ace/editor.js b/lib/ace/editor.js index dbcb7c44..9d785ca7 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -769,6 +769,9 @@ var Editor =function(renderer, session) { this.renderer.scrollToRow(row); }; + this.scrollToLine = function(line, center) { + this.renderer.scrollToLine(line, center); + }; this.getCursorPosition = function() { return this.selection.getCursor(); @@ -806,7 +809,7 @@ var Editor =function(renderer, session) { this.$blockScrolling -= 1; if (!this.isRowVisible(this.getCursorPosition().row)) { - this.scrollToRow(lineNumber - 1 - Math.floor(this.getVisibleRowCount() / 2)); + this.scrollToLine(lineNumber, true); } }, diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 4175a741..f757e611 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -592,6 +592,19 @@ var VirtualRenderer = function(container, theme) { this.scrollToY(row * this.lineHeight); }; + this.scrollToLine = function(line, center) { + var lineHeight = { lineHeight: this.lineHeight }; + var offset = 0; + for (var l = 1; l < line; l++) { + offset += this.session.getRowHeight(lineHeight, l-1); + } + + if (center) { + offset -= this.$size.scrollerHeight / 2; + } + this.scrollToY(offset); + }; + this.scrollToY = function(scrollTop) { var maxHeight = this.session.getScreenLength() * this.lineHeight - this.$size.scrollerHeight; var scrollTop = Math.max(0, Math.min(maxHeight, scrollTop));