keep folds while dragging text inside the editor

This commit is contained in:
nightwing 2013-02-24 17:23:34 +04:00
commit a9dbdaebb4

View file

@ -1288,32 +1288,44 @@ var EditSession = function(text, mode) {
* *
* *
**/ **/
this.moveText = function(fromRange, toPosition) { this.moveText = function(fromRange, toPosition, copy) {
var text = this.getTextRange(fromRange); var text = this.getTextRange(fromRange);
this.remove(fromRange); var folds = this.getFoldsInRange(fromRange);
var toRow = toPosition.row; var toRange = Range.fromPoints(toPosition, toPosition);
var toColumn = toPosition.column; if (!copy) {
this.remove(fromRange);
// Make sure to update the insert location, when text is removed in var rowDiff = fromRange.start.row - fromRange.end.row;
// front of the chosen point of insertion. var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;
if (!fromRange.isMultiLine() && fromRange.start.row == toRow && if (collDiff) {
fromRange.end.column < toColumn) if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)
toColumn -= text.length; toRange.start.column += collDiff;
if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)
if (fromRange.isMultiLine() && fromRange.end.row < toRow) { toRange.end.column += collDiff;
var lines = this.doc.$split(text); }
toRow -= lines.length - 1; if (rowDiff && toRange.start.row >= fromRange.end.row) {
toRange.start.row += rowDiff;
toRange.end.row += rowDiff;
}
} }
var endRow = toRow + fromRange.end.row - fromRange.start.row;
var endColumn = fromRange.isMultiLine() ?
fromRange.end.column :
toColumn + fromRange.end.column - fromRange.start.column;
var toRange = new Range(toRow, toColumn, endRow, endColumn);
this.insert(toRange.start, text); this.insert(toRange.start, text);
if (folds.length) {
var oldStart = fromRange.start;
var newStart = toRange.start;
var rowDiff = newStart.row - oldStart.row;
var collDiff = newStart.column - oldStart.column;
this.addFolds(folds.map(function(x) {
x = x.clone();
if (x.start.row == oldStart.row)
x.start.column += collDiff;
if (x.end.row == oldStart.row)
x.end.column += collDiff;
x.start.row += rowDiff;
x.end.row += rowDiff;
return x;
}));
}
return toRange; return toRange;
}; };