diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 2de80925..09a5deea 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -117,7 +117,7 @@ var EditSession = require("./edit_session").EditSession; range && this.fromOrientedRange(range); }; - + /** * Selection.addRange(pos) -> Range * pos: {row, column} @@ -193,6 +193,37 @@ var EditSession = require("./edit_session").EditSession; }; this.splitIntoLines = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var range = this.getRange(); + var startRow = range.start.row; + var endRow = range.end.row; + if (startRow == endRow) + return; + + var rectSel = []; + var r = this.getLineRange(startRow, true); + r.start.column = range.start.column; + rectSel.push(r); + + for (var i = startRow + 1; i < endRow; i++) + rectSel.push(this.getLineRange(i, true)); + + r = this.getLineRange(endRow, true); + r.end.column = range.end.column; + rectSel.push(r); + + rectSel.forEach(this.addRange, this); + } + }; + + this.toggleBlockSelection = function () { if (this.rangeCount > 1) { var ranges = this.rangeList.ranges; var lastRange = ranges[ranges.length - 1]; @@ -346,13 +377,13 @@ var Editor = require("./editor").Editor; this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; - + this.$onRemoveRange = function(e) { this.removeSelectionMarkers(e.ranges); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; - + this.$onMultiSelect = function(e) { if (this.inMultiSelectMode) return; @@ -365,7 +396,7 @@ var Editor = require("./editor").Editor; this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; - + this.$onSingleSelect = function(e) { if (this.session.multiSelect.inVirtualMode) return; @@ -433,7 +464,7 @@ var Editor = require("./editor").Editor; this.onCursorChange(); this.onSelectionChange(); }; - + /** * Editor.exitMultiSelectMode() -> Void * @@ -465,29 +496,29 @@ var Editor = require("./editor").Editor; this._emit("paste", text); if (!this.inMultiSelectMode) return this.insert(text); - + var lines = text.split(this.session.getDocument().getNewLineCharacter()); var ranges = this.selection.rangeList.ranges; - + if (lines.length > ranges.length) { this.commands.exec("insertstring", this, text); return; } - + for (var i = ranges.length; i--; ) { var range = ranges[i]; if (!range.isEmpty()) this.session.remove(range); - + this.session.insert(range.start, lines[i]); } }; - + /** * Editor.findAll(dir, options) -> Number * - needle: text to find * - options: search options - * - additive: keeps + * - additive: keeps * * finds and selects all the occurencies of needle * returns number of found ranges @@ -503,10 +534,10 @@ var Editor = require("./editor").Editor; this.$blockScrolling += 1; var selection = this.multiSelect; - + if (!additive) selection.toSingleRange(ranges[0]); - + for (var i = ranges.length; i--; ) selection.addRange(ranges[i], true); @@ -565,7 +596,7 @@ var Editor = require("./editor").Editor; * Editor.transposeSelections(dir) -> Void * - dir: direction to rotate selections * - * contents + * contents * empty ranges are expanded to word **/ this.transposeSelections = function(dir) { @@ -584,7 +615,7 @@ var Editor = require("./editor").Editor; } } sel.mergeOverlappingRanges(); - + var words = []; for (var i = all.length; i--; ) { var range = all[i]; @@ -695,7 +726,7 @@ function MultiSelect(editor) { editor.on("mousedown", onMouseDown); editor.commands.addCommands(exports.commands.defaultCommands); - + addAltCursorListeners(editor); } @@ -713,7 +744,7 @@ function addAltCursorListeners(editor){ contentEl.style.cursor = ""; } }); - + el.addEventListener("keyup", reset); el.addEventListener("blur", reset); function reset() { diff --git a/lib/ace/selection.js b/lib/ace/selection.js index d54f768e..f0c51032 100644 --- a/lib/ace/selection.js +++ b/lib/ace/selection.js @@ -243,10 +243,17 @@ var Selection = function(session) { this.$moveSelection(this.moveCursorWordLeft); }; + this.getWordRange = function(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.selectionLead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { - var cursor = this.getCursor(); - var range = this.session.getWordRange(cursor.row, cursor.column); - this.setSelectionRange(range); + this.setSelectionRange(this.getWordRange()); }; // Selects a word including its right whitespace @@ -256,8 +263,8 @@ var Selection = function(session) { this.setSelectionRange(range); }; - this.selectLine = function() { - var rowStart = this.selectionLead.row; + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.selectionLead.row; var rowEnd; var foldLine = this.session.getFoldLine(rowStart); @@ -267,10 +274,14 @@ var Selection = function(session) { } else { rowEnd = rowStart; } - this.setSelectionAnchor(rowStart, 0); - this.$moveSelection(function() { - this.moveCursorTo(rowEnd + 1, 0); - }); + if (excludeLastChar) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + + this.selectLine = function() { + this.setSelectionRange(this.getLineRange()); }; this.moveCursorUp = function() { @@ -532,14 +543,14 @@ var Selection = function(session) { else this.moveCursorShortWordRight(); }; - + this.moveCursorWordLeft = function() { if (this.session.$selectLongWords) this.moveCursorLongWordLeft(); else this.moveCursorShortWordLeft(); }; - + this.moveCursorBy = function(rows, chars) { var screenPos = this.session.documentToScreenPosition( this.selectionLead.row,