From 4084931f1961921bab986ab7c37c484d5c27bada Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Fri, 6 Apr 2012 14:10:40 +0200 Subject: [PATCH] fix: find doesn't change horizontal scroll fixes #638 --- lib/ace/editor.js | 18 +++++++++++------- lib/ace/virtual_renderer.js | 32 +++++++++++++++++++------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 1d2e493c..544506ef 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -62,7 +62,7 @@ var Editor = function(renderer, session) { var container = renderer.getContainerElement(); this.container = container; this.renderer = renderer; - + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); this.keyBinding = new KeyBinding(this); @@ -311,12 +311,16 @@ var Editor = function(renderer, session) { this.onScrollLeftChange = function() { this.renderer.scrollToX(this.session.getScrollLeft()); }; - + this.onCursorChange = function() { this.renderer.updateCursor(); if (!this.$blockScrolling) { - this.renderer.scrollCursorIntoView(); + var selection = this.getSelection(); + if (selection.isEmpty()) + this.renderer.scrollCursorIntoView(selection.getCursor()); + else + this.renderer.scrollSelectionIntoView(selection.getSelectionLead(), selection.getSelectionAnchor()); } // move text input over the cursor @@ -652,7 +656,7 @@ var Editor = function(renderer, session) { this.$showFoldWidgets = show; this.renderer.updateFull(); }; - + this.getShowFoldWidgets = function() { return this.renderer.$gutterLayer.getShowFoldWidgets(); }; @@ -869,7 +873,7 @@ var Editor = function(renderer, session) { range.start.row += linesMoved; range.end.row += linesMoved; selection.setSelectionRange(range, reverse); - } + } else { selection.setSelectionAnchor(rows.last+linesMoved+1, 0); selection.$moveSelection(function() { @@ -1033,13 +1037,13 @@ var Editor = function(renderer, session) { cursor.column -= 2; pos = this.session.findMatchingBracket(cursor); } - + if (pos) { this.clearSelection(); this.moveCursorTo(pos.row, pos.column); } }; - + this.gotoLine = function(lineNumber, column) { this.selection.clearSelection(); this.session.unfold({row: lineNumber - 1, column: column || 0}); diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 0ac360f5..4a373530 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -60,13 +60,13 @@ dom.importCssString(editorCss, "ace_editor"); var VirtualRenderer = function(container, theme) { var _self = this; - + this.container = container; // TODO: this breaks rendering in Cloud9 with multiple ace instances // // Imports CSS once per DOM document ('ace_editor' serves as an identifier). // dom.importCssString(editorCss, "ace_editor", container.ownerDocument); - + dom.addCssClass(container, "ace_editor"); this.setTheme(theme); @@ -84,8 +84,8 @@ var VirtualRenderer = function(container, theme) { this.scroller.appendChild(this.content); this.$gutterLayer = new GutterLayer(this.$gutter); - this.$gutterLayer.on("changeGutterWidth", this.onResize.bind(this, true)); - + this.$gutterLayer.on("changeGutterWidth", this.onResize.bind(this, true)); + this.$markerBack = new MarkerLayer(this.content); var textLayer = this.$textLayer = new TextLayer(this.content); @@ -110,7 +110,7 @@ var VirtualRenderer = function(container, theme) { this.scrollTop = 0; this.scrollLeft = 0; - + event.addListener(this.scroller, "scroll", function() { var scrollLeft = _self.scroller.scrollLeft; _self.scrollLeft = scrollLeft; @@ -352,7 +352,7 @@ var VirtualRenderer = function(container, theme) { // this persists in IE9 if (useragent.isIE) return; - + if (this.layerConfig.lastRow === 0) return; @@ -428,13 +428,13 @@ var VirtualRenderer = function(container, theme) { // horizontal scrolling if (changes & this.CHANGE_H_SCROLL) { this.scroller.scrollLeft = this.scrollLeft; - + // read the value after writing it since the value might get clipped var scrollLeft = this.scroller.scrollLeft; this.scrollLeft = scrollLeft; this.session.setScrollLeft(scrollLeft); } - + // full if (changes & this.CHANGE_FULL) { this.$textLayer.checkForSizeChanges(); @@ -647,12 +647,18 @@ var VirtualRenderer = function(container, theme) { this.$cursorLayer.showCursor(); }; - this.scrollCursorIntoView = function() { + this.scrollSelectionIntoView = function(anchor, lead) { + // first scroll anchor into view then scroll lead into view + this.scrollCursorIntoView(anchor); + this.scrollCursorIntoView(lead); + }; + + this.scrollCursorIntoView = function(cursor) { // the editor is not visible if (this.$size.scrollerHeight === 0) return; - var pos = this.$cursorLayer.getPixelPosition(); + var pos = this.$cursorLayer.getPixelPosition(cursor); var left = pos.left; var top = pos.top; @@ -808,7 +814,7 @@ var VirtualRenderer = function(container, theme) { this._loadTheme = function(name, callback) { if (!config.get("packaged")) return callback(); - + var base = name.split("/").pop(); var filename = config.get("themePath") + "/theme-" + base + config.get("suffix"); net.loadScript(filename, callback); @@ -820,14 +826,14 @@ var VirtualRenderer = function(container, theme) { this.$themeValue = theme; if (!theme || typeof theme == "string") { var moduleName = theme || "ace/theme/textmate"; - + var module; try { module = require(moduleName); } catch (e) {}; if (module) return afterLoad(module); - + _self._loadTheme(moduleName, function() { require([theme], function(module) { if (_self.$themeValue !== theme)