splitSelectionIntolines was toggling block selection instead

This commit is contained in:
nightwing 2012-04-26 23:49:32 +04:00
commit e34fb3668a
2 changed files with 70 additions and 28 deletions

View file

@ -117,7 +117,7 @@ var EditSession = require("./edit_session").EditSession;
range && this.fromOrientedRange(range); range && this.fromOrientedRange(range);
}; };
/** /**
* Selection.addRange(pos) -> Range * Selection.addRange(pos) -> Range
* pos: {row, column} * pos: {row, column}
@ -193,6 +193,37 @@ var EditSession = require("./edit_session").EditSession;
}; };
this.splitIntoLines = function () { 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) { if (this.rangeCount > 1) {
var ranges = this.rangeList.ranges; var ranges = this.rangeList.ranges;
var lastRange = ranges[ranges.length - 1]; var lastRange = ranges[ranges.length - 1];
@ -346,13 +377,13 @@ var Editor = require("./editor").Editor;
this.renderer.updateCursor(); this.renderer.updateCursor();
this.renderer.updateBackMarkers(); this.renderer.updateBackMarkers();
}; };
this.$onRemoveRange = function(e) { this.$onRemoveRange = function(e) {
this.removeSelectionMarkers(e.ranges); this.removeSelectionMarkers(e.ranges);
this.renderer.updateCursor(); this.renderer.updateCursor();
this.renderer.updateBackMarkers(); this.renderer.updateBackMarkers();
}; };
this.$onMultiSelect = function(e) { this.$onMultiSelect = function(e) {
if (this.inMultiSelectMode) if (this.inMultiSelectMode)
return; return;
@ -365,7 +396,7 @@ var Editor = require("./editor").Editor;
this.renderer.updateCursor(); this.renderer.updateCursor();
this.renderer.updateBackMarkers(); this.renderer.updateBackMarkers();
}; };
this.$onSingleSelect = function(e) { this.$onSingleSelect = function(e) {
if (this.session.multiSelect.inVirtualMode) if (this.session.multiSelect.inVirtualMode)
return; return;
@ -433,7 +464,7 @@ var Editor = require("./editor").Editor;
this.onCursorChange(); this.onCursorChange();
this.onSelectionChange(); this.onSelectionChange();
}; };
/** /**
* Editor.exitMultiSelectMode() -> Void * Editor.exitMultiSelectMode() -> Void
* *
@ -465,29 +496,29 @@ var Editor = require("./editor").Editor;
this._emit("paste", text); this._emit("paste", text);
if (!this.inMultiSelectMode) if (!this.inMultiSelectMode)
return this.insert(text); return this.insert(text);
var lines = text.split(this.session.getDocument().getNewLineCharacter()); var lines = text.split(this.session.getDocument().getNewLineCharacter());
var ranges = this.selection.rangeList.ranges; var ranges = this.selection.rangeList.ranges;
if (lines.length > ranges.length) { if (lines.length > ranges.length) {
this.commands.exec("insertstring", this, text); this.commands.exec("insertstring", this, text);
return; return;
} }
for (var i = ranges.length; i--; ) { for (var i = ranges.length; i--; ) {
var range = ranges[i]; var range = ranges[i];
if (!range.isEmpty()) if (!range.isEmpty())
this.session.remove(range); this.session.remove(range);
this.session.insert(range.start, lines[i]); this.session.insert(range.start, lines[i]);
} }
}; };
/** /**
* Editor.findAll(dir, options) -> Number * Editor.findAll(dir, options) -> Number
* - needle: text to find * - needle: text to find
* - options: search options * - options: search options
* - additive: keeps * - additive: keeps
* *
* finds and selects all the occurencies of needle * finds and selects all the occurencies of needle
* returns number of found ranges * returns number of found ranges
@ -503,10 +534,10 @@ var Editor = require("./editor").Editor;
this.$blockScrolling += 1; this.$blockScrolling += 1;
var selection = this.multiSelect; var selection = this.multiSelect;
if (!additive) if (!additive)
selection.toSingleRange(ranges[0]); selection.toSingleRange(ranges[0]);
for (var i = ranges.length; i--; ) for (var i = ranges.length; i--; )
selection.addRange(ranges[i], true); selection.addRange(ranges[i], true);
@ -565,7 +596,7 @@ var Editor = require("./editor").Editor;
* Editor.transposeSelections(dir) -> Void * Editor.transposeSelections(dir) -> Void
* - dir: direction to rotate selections * - dir: direction to rotate selections
* *
* contents * contents
* empty ranges are expanded to word * empty ranges are expanded to word
**/ **/
this.transposeSelections = function(dir) { this.transposeSelections = function(dir) {
@ -584,7 +615,7 @@ var Editor = require("./editor").Editor;
} }
} }
sel.mergeOverlappingRanges(); sel.mergeOverlappingRanges();
var words = []; var words = [];
for (var i = all.length; i--; ) { for (var i = all.length; i--; ) {
var range = all[i]; var range = all[i];
@ -695,7 +726,7 @@ function MultiSelect(editor) {
editor.on("mousedown", onMouseDown); editor.on("mousedown", onMouseDown);
editor.commands.addCommands(exports.commands.defaultCommands); editor.commands.addCommands(exports.commands.defaultCommands);
addAltCursorListeners(editor); addAltCursorListeners(editor);
} }
@ -713,7 +744,7 @@ function addAltCursorListeners(editor){
contentEl.style.cursor = ""; contentEl.style.cursor = "";
} }
}); });
el.addEventListener("keyup", reset); el.addEventListener("keyup", reset);
el.addEventListener("blur", reset); el.addEventListener("blur", reset);
function reset() { function reset() {

View file

@ -243,10 +243,17 @@ var Selection = function(session) {
this.$moveSelection(this.moveCursorWordLeft); 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() { this.selectWord = function() {
var cursor = this.getCursor(); this.setSelectionRange(this.getWordRange());
var range = this.session.getWordRange(cursor.row, cursor.column);
this.setSelectionRange(range);
}; };
// Selects a word including its right whitespace // Selects a word including its right whitespace
@ -256,8 +263,8 @@ var Selection = function(session) {
this.setSelectionRange(range); this.setSelectionRange(range);
}; };
this.selectLine = function() { this.getLineRange = function(row, excludeLastChar) {
var rowStart = this.selectionLead.row; var rowStart = typeof row == "number" ? row : this.selectionLead.row;
var rowEnd; var rowEnd;
var foldLine = this.session.getFoldLine(rowStart); var foldLine = this.session.getFoldLine(rowStart);
@ -267,10 +274,14 @@ var Selection = function(session) {
} else { } else {
rowEnd = rowStart; rowEnd = rowStart;
} }
this.setSelectionAnchor(rowStart, 0); if (excludeLastChar)
this.$moveSelection(function() { return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);
this.moveCursorTo(rowEnd + 1, 0); else
}); return new Range(rowStart, 0, rowEnd + 1, 0);
};
this.selectLine = function() {
this.setSelectionRange(this.getLineRange());
}; };
this.moveCursorUp = function() { this.moveCursorUp = function() {
@ -532,14 +543,14 @@ var Selection = function(session) {
else else
this.moveCursorShortWordRight(); this.moveCursorShortWordRight();
}; };
this.moveCursorWordLeft = function() { this.moveCursorWordLeft = function() {
if (this.session.$selectLongWords) if (this.session.$selectLongWords)
this.moveCursorLongWordLeft(); this.moveCursorLongWordLeft();
else else
this.moveCursorShortWordLeft(); this.moveCursorShortWordLeft();
}; };
this.moveCursorBy = function(rows, chars) { this.moveCursorBy = function(rows, chars) {
var screenPos = this.session.documentToScreenPosition( var screenPos = this.session.documentToScreenPosition(
this.selectionLead.row, this.selectionLead.row,