fix move lines with multiple cursors

This commit is contained in:
nightwing 2013-03-03 16:20:14 +04:00
commit f6d88bc10c
4 changed files with 159 additions and 144 deletions

View file

@ -359,23 +359,19 @@ exports.commands = [{
}, { }, {
name: "copylinesup", name: "copylinesup",
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
exec: function(editor) { editor.copyLinesUp(); }, exec: function(editor) { editor.copyLinesUp(); }
multiSelectAction: "forEachLine"
}, { }, {
name: "movelinesup", name: "movelinesup",
bindKey: bindKey("Alt-Up", "Option-Up"), bindKey: bindKey("Alt-Up", "Option-Up"),
exec: function(editor) { editor.moveLinesUp(); }, exec: function(editor) { editor.moveLinesUp(); }
multiSelectAction: "forEachLine"
}, { }, {
name: "copylinesdown", name: "copylinesdown",
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
exec: function(editor) { editor.copyLinesDown(); }, exec: function(editor) { editor.copyLinesDown(); }
multiSelectAction: "forEachLine"
}, { }, {
name: "movelinesdown", name: "movelinesdown",
bindKey: bindKey("Alt-Down", "Option-Down"), bindKey: bindKey("Alt-Down", "Option-Down"),
exec: function(editor) { editor.moveLinesDown(); }, exec: function(editor) { editor.moveLinesDown(); }
multiSelectAction: "forEachLine"
}, { }, {
name: "del", name: "del",
bindKey: bindKey("Delete", "Delete|Ctrl-D"), bindKey: bindKey("Delete", "Delete|Ctrl-D"),

View file

@ -1367,8 +1367,7 @@ var Editor = function(renderer, session) {
var row = range.start.row; var row = range.start.row;
doc.duplicateLines(row, row); doc.duplicateLines(row, row);
} else { } else {
var reverse = sel.isBackwards() var point = reverse ? range.start : range.end;
var point = sel.isBackwards() ? range.start : range.end;
var endPoint = doc.insert(point, doc.getTextRange(range), false); var endPoint = doc.insert(point, doc.getTextRange(range), false);
range.start = point; range.start = point;
range.end = endPoint; range.end = endPoint;
@ -1412,9 +1411,6 @@ var Editor = function(renderer, session) {
* @related EditSession.moveText * @related EditSession.moveText
**/ **/
this.moveText = function(range, toPosition) { this.moveText = function(range, toPosition) {
if (this.$readOnly)
return null;
return this.session.moveText(range, toPosition); return this.session.moveText(range, toPosition);
}; };
@ -1450,25 +1446,39 @@ var Editor = function(renderer, session) {
* *
**/ **/
this.$moveLines = function(mover) { this.$moveLines = function(mover) {
var rows = this.$getSelectedRows();
var selection = this.selection; var selection = this.selection;
if (!selection.isMultiLine()) { if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {
var range = selection.getRange(); var range = selection.toOrientedRange();
var reverse = selection.isBackwards(); var rows = this.$getSelectedRows(range);
} var linesMoved = mover.call(this, rows.first, rows.last);
range.moveBy(linesMoved, 0);
selection.fromOrientedRange(range);
} else {
var ranges = selection.rangeList.ranges;
selection.rangeList.detach(this.session);
var linesMoved = mover.call(this, rows.first, rows.last); for (var i = ranges.length; i--; ) {
var rangeIndex = i;
var rows = ranges[i].collapseRows();
var last = rows.end.row;
var first = rows.start.row;
while (i--) {
var rows = ranges[i].collapseRows();
if (first - rows.end.row <= 1)
first = rows.end.row;
else
break;
}
i++;
if (range) { var linesMoved = mover.call(this, first, last);
range.start.row += linesMoved; while (rangeIndex >= i) {
range.end.row += linesMoved; ranges[rangeIndex].moveBy(linesMoved, 0);
selection.setSelectionRange(range, reverse); rangeIndex--;
} }
else { }
selection.setSelectionAnchor(rows.last+linesMoved+1, 0); selection.fromOrientedRange(selection.ranges[0]);
selection.$moveSelection(function() { selection.rangeList.attach(this.session);
selection.moveCursorTo(rows.first+linesMoved, 0);
});
} }
}; };

View file

@ -482,7 +482,7 @@ var Editor = require("./editor").Editor;
this.inVirtualSelectionMode = true; this.inVirtualSelectionMode = true;
for (var i = rangeList.ranges.length; i--;) { for (var i = rangeList.ranges.length; i--;) {
if ($byLines) { if ($byLines) {
while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i].end.row) while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row)
i--; i--;
} }
tmpSel.fromOrientedRange(rangeList.ranges[i]); tmpSel.fromOrientedRange(rangeList.ranges[i]);

View file

@ -517,6 +517,15 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
); );
}; };
/* experimental */
this.moveBy = function(row, column) {
this.start.row += row;
this.start.column += column;
this.end.row += row;
this.end.column += column;
};
}).call(Range.prototype); }).call(Range.prototype);
/** /**