keep folds while dragging text inside the editor
This commit is contained in:
parent
63ce45752c
commit
a9dbdaebb4
1 changed files with 33 additions and 21 deletions
|
|
@ -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);
|
||||||
|
var folds = this.getFoldsInRange(fromRange);
|
||||||
|
|
||||||
|
var toRange = Range.fromPoints(toPosition, toPosition);
|
||||||
|
if (!copy) {
|
||||||
this.remove(fromRange);
|
this.remove(fromRange);
|
||||||
|
var rowDiff = fromRange.start.row - fromRange.end.row;
|
||||||
var toRow = toPosition.row;
|
var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;
|
||||||
var toColumn = toPosition.column;
|
if (collDiff) {
|
||||||
|
if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)
|
||||||
// Make sure to update the insert location, when text is removed in
|
toRange.start.column += collDiff;
|
||||||
// front of the chosen point of insertion.
|
if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)
|
||||||
if (!fromRange.isMultiLine() && fromRange.start.row == toRow &&
|
toRange.end.column += collDiff;
|
||||||
fromRange.end.column < toColumn)
|
}
|
||||||
toColumn -= text.length;
|
if (rowDiff && toRange.start.row >= fromRange.end.row) {
|
||||||
|
toRange.start.row += rowDiff;
|
||||||
if (fromRange.isMultiLine() && fromRange.end.row < toRow) {
|
toRange.end.row += rowDiff;
|
||||||
var lines = this.doc.$split(text);
|
}
|
||||||
toRow -= lines.length - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue