diff --git a/lib/ace/autocomplete/popup.js b/lib/ace/autocomplete/popup.js index 4f31f01c..f580e391 100644 --- a/lib/ace/autocomplete/popup.js +++ b/lib/ace/autocomplete/popup.js @@ -241,7 +241,6 @@ 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 c5d34aae..a150a76f 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -205,14 +205,12 @@ 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", @@ -397,21 +395,12 @@ 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", @@ -469,13 +458,11 @@ 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", @@ -642,7 +629,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); @@ -653,7 +640,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 ba6392bc..347eb606 100644 --- a/lib/ace/commands/multi_select_commands.js +++ b/lib/ace/commands/multi_select_commands.js @@ -35,49 +35,41 @@ 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", @@ -87,13 +79,11 @@ exports.defaultCommands = [{ }, { name: "alignCursors", exec: function(editor) { editor.alignCursors(); }, - bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, - scrollIntoView: "cursor" + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"} }, { name: "findAll", exec: function(editor) { editor.findAll(); }, bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, - scrollIntoView: "cursor", readonly: true }]; @@ -102,7 +92,6 @@ 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 b0ad24ed..f2b9744c 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -82,6 +82,7 @@ var Editor = function(renderer, session) { this.$mouseHandler = new MouseHandler(this); new FoldHandler(this); + this.$blockScrolling = 0; this.$search = new Search().set({ wrap: true }); @@ -183,6 +184,7 @@ 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); @@ -370,7 +372,9 @@ var Editor = function(renderer, session) { this.onChangeMode(); + this.$blockScrolling += 1; this.onCursorChange(); + this.$blockScrolling -= 1; this.onScrollTopChange(); this.onScrollLeftChange(); @@ -733,6 +737,10 @@ var Editor = function(renderer, session) { this.onCursorChange = function() { this.$cursorChange(); + if (!this.$blockScrolling) { + this.renderer.scrollCursorIntoView(); + } + this.$highlightBrackets(); this.$highlightTags(); this.$updateHighlightActiveLine(); @@ -918,28 +926,9 @@ 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); - 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(); + this.insert(e.text, true); }; @@ -1847,6 +1836,7 @@ 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); @@ -1855,6 +1845,7 @@ var Editor = function(renderer, session) { this.selection.moveCursorBy(rows, 0); this.selection.clearSelection(); } + this.$blockScrolling--; var scrollTop = renderer.scrollTop; @@ -1979,7 +1970,9 @@ var Editor = function(renderer, session) { * @related Selection.selectAll **/ this.selectAll = function() { + this.$blockScrolling += 1; this.selection.selectAll(); + this.$blockScrolling -= 1; }; /** @@ -2191,9 +2184,11 @@ 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); @@ -2379,6 +2374,7 @@ var Editor = function(renderer, session) { if (!ranges.length) return replaced; + this.$blockScrolling += 1; var selection = this.getSelectionRange(); this.selection.moveTo(0, 0); @@ -2390,6 +2386,7 @@ var Editor = function(renderer, session) { } this.selection.setSelectionRange(selection); + this.$blockScrolling -= 1; return replaced; }; @@ -2487,8 +2484,10 @@ 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); @@ -2501,7 +2500,9 @@ 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); }; @@ -2510,7 +2511,9 @@ 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 1e307992..abf04ef9 100644 --- a/lib/ace/keyboard/vim/commands.js +++ b/lib/ace/keyboard/vim/commands.js @@ -514,8 +514,6 @@ 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 b64ede1e..6df55b0f 100644 --- a/lib/ace/keyboard/vim/maps/operators.js +++ b/lib/ace/keyboard/vim/maps/operators.js @@ -91,12 +91,14 @@ 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 199fd41d..b3b10608 100644 --- a/lib/ace/mouse/dragdrop_handler.js +++ b/lib/ace/mouse/dragdrop_handler.js @@ -197,7 +197,9 @@ 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 { @@ -271,7 +273,9 @@ 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 52f91056..8d6af6b5 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -112,6 +112,7 @@ function onMouseDown(e) { var oldRange = selection.rangeList.rangeAtPoint(pos); + editor.$blockScrolling++; editor.inVirtualSelectionMode = true; if (shift) { @@ -133,6 +134,7 @@ function onMouseDown(e) { } selection.addRange(tmpSel); } + editor.$blockScrolling--; editor.inVirtualSelectionMode = false; }); @@ -179,6 +181,7 @@ function onMouseDown(e) { editor.removeSelectionMarkers(rectSel); if (!rectSel.length) rectSel = [selection.toOrientedRange()]; + editor.$blockScrolling++; if (initialRange) { editor.removeSelectionMarker(initialRange); selection.toSingleRange(initialRange); @@ -187,6 +190,7 @@ 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 36fa4811..f393012e 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -557,6 +557,33 @@ 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 @@ -581,6 +608,7 @@ var Editor = require("./editor").Editor; if (!ranges.length) return 0; + this.$blockScrolling += 1; var selection = this.multiSelect; if (!additive) @@ -593,6 +621,8 @@ var Editor = require("./editor").Editor; if (range && selection.rangeList.rangeAtPoint(range.start)) selection.addRange(range, true); + this.$blockScrolling -= 1; + return ranges.length; }; @@ -707,8 +737,10 @@ 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)