From 383b7989011041a81bf50ac6e7b99e9b689a2058 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 22 Jul 2014 03:27:51 +0400 Subject: [PATCH] disable automatic scroll into view --- lib/ace/autocomplete/popup.js | 1 + lib/ace/commands/default_commands.js | 17 +++++++-- lib/ace/commands/multi_select_commands.js | 13 ++++++- lib/ace/editor.js | 43 +++++++++++------------ lib/ace/keyboard/vim/commands.js | 2 ++ lib/ace/keyboard/vim/maps/operators.js | 2 -- lib/ace/mouse/dragdrop_handler.js | 4 --- lib/ace/mouse/multi_select_handler.js | 4 --- lib/ace/multi_select.js | 32 ----------------- 9 files changed, 50 insertions(+), 68 deletions(-) diff --git a/lib/ace/autocomplete/popup.js b/lib/ace/autocomplete/popup.js index a34ebf09..29a698bb 100644 --- a/lib/ace/autocomplete/popup.js +++ b/lib/ace/autocomplete/popup.js @@ -240,6 +240,7 @@ var AcePopup = function(parentNode) { popup.on("changeSelection", function() { if (popup.isOpen) popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); }); popup.hide = function() { diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index a150a76f..c5d34aae 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -205,12 +205,14 @@ exports.commands = [{ bindKey: bindKey("Shift-Up", "Shift-Up"), exec: function(editor) { editor.getSelection().selectUp(); }, multiSelectAction: "forEach", + scrollIntoView: "cursor", readOnly: true }, { name: "golineup", bindKey: bindKey("Up", "Up|Ctrl-P"), exec: function(editor, args) { editor.navigateUp(args.times); }, multiSelectAction: "forEach", + scrollIntoView: "cursor", readOnly: true }, { name: "selecttoend", @@ -395,12 +397,21 @@ exports.commands = [{ bindKey: bindKey("Ctrl-P", "Ctrl-P"), exec: function(editor) { editor.jumpToMatching(); }, multiSelectAction: "forEach", + scrollIntoView: "animate", readOnly: true }, { name: "selecttomatching", bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"), exec: function(editor) { editor.jumpToMatching(true); }, multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "expandToMatching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function(editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", readOnly: true }, { name: "passKeysToBrowser", @@ -458,11 +469,13 @@ exports.commands = [{ name: "modifyNumberUp", bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), exec: function(editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", multiSelectAction: "forEach" }, { name: "modifyNumberDown", bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), exec: function(editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", multiSelectAction: "forEach" }, { name: "replace", @@ -629,7 +642,7 @@ exports.commands = [{ var isBackwards = editor.selection.isBackwards(); var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); - var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); var selectedCount = selectedText.replace(/\n\s*/, " ").length; var insertLine = editor.session.doc.getLine(selectionStart.row); @@ -640,7 +653,7 @@ exports.commands = [{ curLine = " " + curLine; } insertLine += curLine; - }; + } if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { // Don't insert a newline at the end of the document diff --git a/lib/ace/commands/multi_select_commands.js b/lib/ace/commands/multi_select_commands.js index 347eb606..ba6392bc 100644 --- a/lib/ace/commands/multi_select_commands.js +++ b/lib/ace/commands/multi_select_commands.js @@ -35,41 +35,49 @@ exports.defaultCommands = [{ name: "addCursorAbove", exec: function(editor) { editor.selectMoreLines(-1); }, bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + scrollIntoView: "cursor", readonly: true }, { name: "addCursorBelow", exec: function(editor) { editor.selectMoreLines(1); }, bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + scrollIntoView: "cursor", readonly: true }, { name: "addCursorAboveSkipCurrent", exec: function(editor) { editor.selectMoreLines(-1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + scrollIntoView: "cursor", readonly: true }, { name: "addCursorBelowSkipCurrent", exec: function(editor) { editor.selectMoreLines(1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + scrollIntoView: "cursor", readonly: true }, { name: "selectMoreBefore", exec: function(editor) { editor.selectMore(-1); }, bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + scrollIntoView: "cursor", readonly: true }, { name: "selectMoreAfter", exec: function(editor) { editor.selectMore(1); }, bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + scrollIntoView: "cursor", readonly: true }, { name: "selectNextBefore", exec: function(editor) { editor.selectMore(-1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + scrollIntoView: "cursor", readonly: true }, { name: "selectNextAfter", exec: function(editor) { editor.selectMore(1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + scrollIntoView: "cursor", readonly: true }, { name: "splitIntoLines", @@ -79,11 +87,13 @@ exports.defaultCommands = [{ }, { name: "alignCursors", exec: function(editor) { editor.alignCursors(); }, - bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"} + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, + scrollIntoView: "cursor" }, { name: "findAll", exec: function(editor) { editor.findAll(); }, bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, + scrollIntoView: "cursor", readonly: true }]; @@ -92,6 +102,7 @@ exports.multiSelectCommands = [{ name: "singleSelection", bindKey: "esc", exec: function(editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", readonly: true, isAvailable: function(editor) {return editor && editor.inMultiSelectMode} }]; diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 83782f06..3424595c 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -82,7 +82,6 @@ var Editor = function(renderer, session) { this.$mouseHandler = new MouseHandler(this); new FoldHandler(this); - this.$blockScrolling = 0; this.$search = new Search().set({ wrap: true }); @@ -183,7 +182,6 @@ var Editor = function(renderer, session) { if (this.curOp) { var command = this.curOp.command; if (command && command.scrollIntoView) { - this.$blockScrolling--; switch (command.scrollIntoView) { case "center": this.renderer.scrollCursorIntoView(null, 0.5); @@ -371,9 +369,7 @@ var Editor = function(renderer, session) { this.onChangeMode(); - this.$blockScrolling += 1; this.onCursorChange(); - this.$blockScrolling -= 1; this.onScrollTopChange(); this.onScrollLeftChange(); @@ -732,10 +728,6 @@ var Editor = function(renderer, session) { this.onCursorChange = function() { this.$cursorChange(); - if (!this.$blockScrolling) { - this.renderer.scrollCursorIntoView(); - } - this.$highlightBrackets(); this.$highlightTags(); this.$updateHighlightActiveLine(); @@ -921,9 +913,28 @@ var Editor = function(renderer, session) { // todo this should change when paste becomes a command if (this.$readOnly) return; + var e = {text: text}; this._signal("paste", e); - this.insert(e.text, true); + text = e.text; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + this.insert(text); + } else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + if (lines.length > ranges.length || lines.length < 2 || !lines[1]) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + this.session.remove(range); + + this.session.insert(range.start, lines[i]); + } + } + this.renderer.scrollCursorIntoView(); }; @@ -1831,7 +1842,6 @@ var Editor = function(renderer, session) { var config = this.renderer.layerConfig; var rows = dir * Math.floor(config.height / config.lineHeight); - this.$blockScrolling++; if (select === true) { this.selection.$moveSelection(function(){ this.moveCursorBy(rows, 0); @@ -1840,7 +1850,6 @@ var Editor = function(renderer, session) { this.selection.moveCursorBy(rows, 0); this.selection.clearSelection(); } - this.$blockScrolling--; var scrollTop = renderer.scrollTop; @@ -1965,9 +1974,7 @@ var Editor = function(renderer, session) { * @related Selection.selectAll **/ this.selectAll = function() { - this.$blockScrolling += 1; this.selection.selectAll(); - this.$blockScrolling -= 1; }; /** @@ -2179,11 +2186,9 @@ var Editor = function(renderer, session) { this.selection.clearSelection(); this.session.unfold({row: lineNumber - 1, column: column || 0}); - this.$blockScrolling += 1; // todo: find a way to automatically exit multiselect mode this.exitMultiSelectMode && this.exitMultiSelectMode(); this.moveCursorTo(lineNumber - 1, column || 0); - this.$blockScrolling -= 1; if (!this.isRowFullyVisible(lineNumber - 1)) this.scrollToLine(lineNumber - 1, true, animate); @@ -2369,7 +2374,6 @@ var Editor = function(renderer, session) { if (!ranges.length) return replaced; - this.$blockScrolling += 1; var selection = this.getSelectionRange(); this.selection.moveTo(0, 0); @@ -2381,7 +2385,6 @@ var Editor = function(renderer, session) { } this.selection.setSelectionRange(selection); - this.$blockScrolling -= 1; return replaced; }; @@ -2479,10 +2482,8 @@ var Editor = function(renderer, session) { }; this.revealRange = function(range, animate) { - this.$blockScrolling += 1; this.session.unfold(range); this.selection.setSelectionRange(range); - this.$blockScrolling -= 1; var scrollTop = this.renderer.scrollTop; this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); @@ -2495,9 +2496,7 @@ var Editor = function(renderer, session) { * @related UndoManager.undo **/ this.undo = function() { - this.$blockScrolling++; this.session.getUndoManager().undo(); - this.$blockScrolling--; this.renderer.scrollCursorIntoView(null, 0.5); }; @@ -2506,9 +2505,7 @@ var Editor = function(renderer, session) { * @related UndoManager.redo **/ this.redo = function() { - this.$blockScrolling++; this.session.getUndoManager().redo(); - this.$blockScrolling--; this.renderer.scrollCursorIntoView(null, 0.5); }; diff --git a/lib/ace/keyboard/vim/commands.js b/lib/ace/keyboard/vim/commands.js index abf04ef9..1e307992 100644 --- a/lib/ace/keyboard/vim/commands.js +++ b/lib/ace/keyboard/vim/commands.js @@ -514,6 +514,8 @@ var inputBuffer = exports.inputBuffer = { this.reset(); } handleCursorMove(editor); + if (editor.curOp && editor.curOp.selectionChanged) + editor.renderer.scrollCursorIntoView(); }, isAccepting: function(type) { diff --git a/lib/ace/keyboard/vim/maps/operators.js b/lib/ace/keyboard/vim/maps/operators.js index 6df55b0f..b64ede1e 100644 --- a/lib/ace/keyboard/vim/maps/operators.js +++ b/lib/ace/keyboard/vim/maps/operators.js @@ -91,14 +91,12 @@ module.exports = { count = count || 1; switch (param) { case "c": - editor.$blockScrolling++; editor.selection.$moveSelection(function() { editor.selection.moveCursorBy(count - 1, 0); }); var rows = editor.$getSelectedRows(); range = new Range(rows.first, 0, rows.last, Infinity); editor.session.remove(range); - editor.$blockScrolling--; util.insertMode(editor); break; default: diff --git a/lib/ace/mouse/dragdrop_handler.js b/lib/ace/mouse/dragdrop_handler.js index b3b10608..199fd41d 100644 --- a/lib/ace/mouse/dragdrop_handler.js +++ b/lib/ace/mouse/dragdrop_handler.js @@ -197,9 +197,7 @@ function DragdropHandler(mouseHandler) { var vMovement = !prevCursor || cursor.row != prevCursor.row; var hMovement = !prevCursor || cursor.column != prevCursor.column; if (!cursorMovedTime || vMovement || hMovement) { - editor.$blockScrolling += 1; editor.moveCursorToPosition(cursor); - editor.$blockScrolling -= 1; cursorMovedTime = now; cursorPointOnCaretMoved = {x: x, y: y}; } else { @@ -273,9 +271,7 @@ function DragdropHandler(mouseHandler) { clearInterval(timerId); editor.session.removeMarker(dragSelectionMarker); dragSelectionMarker = null; - editor.$blockScrolling += 1; editor.selection.fromOrientedRange(range); - editor.$blockScrolling -= 1; if (editor.isFocused() && !isInternal) editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly()); range = null; diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index 8d6af6b5..52f91056 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -112,7 +112,6 @@ function onMouseDown(e) { var oldRange = selection.rangeList.rangeAtPoint(pos); - editor.$blockScrolling++; editor.inVirtualSelectionMode = true; if (shift) { @@ -134,7 +133,6 @@ function onMouseDown(e) { } selection.addRange(tmpSel); } - editor.$blockScrolling--; editor.inVirtualSelectionMode = false; }); @@ -181,7 +179,6 @@ function onMouseDown(e) { editor.removeSelectionMarkers(rectSel); if (!rectSel.length) rectSel = [selection.toOrientedRange()]; - editor.$blockScrolling++; if (initialRange) { editor.removeSelectionMarker(initialRange); selection.toSingleRange(initialRange); @@ -190,7 +187,6 @@ function onMouseDown(e) { selection.addRange(rectSel[i]); editor.inVirtualSelectionMode = false; editor.$mouseHandler.$clickSelection = null; - editor.$blockScrolling--; }; var onSelectionInterval = blockSelect; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index ef0f7a2e..792d91b2 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -557,33 +557,6 @@ var Editor = require("./editor").Editor; } }; - // todo this should change when paste becomes a command - this.onPaste = function(text) { - if (this.$readOnly) - return; - - - var e = {text: text}; - this._signal("paste", e); - text = e.text; - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) - return this.insert(text); - - var lines = text.split(/\r\n|\r|\n/); - var ranges = this.selection.rangeList.ranges; - - if (lines.length > ranges.length || lines.length < 2 || !lines[1]) - return this.commands.exec("insertstring", this, text); - - for (var i = ranges.length; i--;) { - var range = ranges[i]; - if (!range.isEmpty()) - this.session.remove(range); - - this.session.insert(range.start, lines[i]); - } - }; - /** * Finds and selects all the occurences of `needle`. * @param {String} The text to find @@ -608,7 +581,6 @@ var Editor = require("./editor").Editor; if (!ranges.length) return 0; - this.$blockScrolling += 1; var selection = this.multiSelect; if (!additive) @@ -621,8 +593,6 @@ var Editor = require("./editor").Editor; if (range && selection.rangeList.rangeAtPoint(range.start)) selection.addRange(range, true); - this.$blockScrolling -= 1; - return ranges.length; }; @@ -737,10 +707,8 @@ var Editor = require("./editor").Editor; var newRange = find(session, needle, dir); if (newRange) { newRange.cursor = dir == -1 ? newRange.start : newRange.end; - this.$blockScrolling += 1; this.session.unfold(newRange); this.multiSelect.addRange(newRange); - this.$blockScrolling -= 1; this.renderer.scrollCursorIntoView(null, 0.5); } if (skip)