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",
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
exec: function(editor) { editor.copyLinesUp(); },
multiSelectAction: "forEachLine"
exec: function(editor) { editor.copyLinesUp(); }
}, {
name: "movelinesup",
bindKey: bindKey("Alt-Up", "Option-Up"),
exec: function(editor) { editor.moveLinesUp(); },
multiSelectAction: "forEachLine"
exec: function(editor) { editor.moveLinesUp(); }
}, {
name: "copylinesdown",
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
exec: function(editor) { editor.copyLinesDown(); },
multiSelectAction: "forEachLine"
exec: function(editor) { editor.copyLinesDown(); }
}, {
name: "movelinesdown",
bindKey: bindKey("Alt-Down", "Option-Down"),
exec: function(editor) { editor.moveLinesDown(); },
multiSelectAction: "forEachLine"
exec: function(editor) { editor.moveLinesDown(); }
}, {
name: "del",
bindKey: bindKey("Delete", "Delete|Ctrl-D"),

View file

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

View file

@ -482,7 +482,7 @@ var Editor = require("./editor").Editor;
this.inVirtualSelectionMode = true;
for (var i = rangeList.ranges.length; i--;) {
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--;
}
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);
/**