in lib/ace/range_list.js [184:293]
this.$onChange = function(delta) {
var start = delta.start;
var end = delta.end;
var startRow = start.row;
var endRow = end.row;
var ranges = this.ranges;
for (var i = 0, n = ranges.length; i < n; i++) {
var r = ranges[i];
if (r.end.row >= startRow)
break;
}
if (delta.action == "insert") {
var lineDif = endRow - startRow;
var colDiff = -start.column + end.column;
for (; i < n; i++) {
var r = ranges[i];
if (r.start.row > startRow)
break;
if (r.start.row == startRow && r.start.column >= start.column) {
if (r.start.column == start.column && this.$bias <= 0) {
// do nothing
} else {
r.start.column += colDiff;
r.start.row += lineDif;
}
}
if (r.end.row == startRow && r.end.column >= start.column) {
if (r.end.column == start.column && this.$bias < 0) {
continue;
}
// special handling for the case when two ranges share an edge
if (r.end.column == start.column && colDiff > 0 && i < n - 1) {
if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)
r.end.column -= colDiff;
}
r.end.column += colDiff;
r.end.row += lineDif;
}
}
} else {
var lineDif = startRow - endRow;
var colDiff = start.column - end.column;
for (; i < n; i++) {
var r = ranges[i];
if (r.start.row > endRow)
break;
if (r.end.row < endRow
&& (
startRow < r.end.row
|| startRow == r.end.row && start.column < r.end.column
)
) {
r.end.row = startRow;
r.end.column = start.column;
}
else if (r.end.row == endRow) {
if (r.end.column <= end.column) {
if (lineDif || r.end.column > start.column) {
r.end.column = start.column;
r.end.row = start.row;
}
}
else {
r.end.column += colDiff;
r.end.row += lineDif;
}
}
else if (r.end.row > endRow) {
r.end.row += lineDif;
}
if (r.start.row < endRow
&& (
startRow < r.start.row
|| startRow == r.start.row && start.column < r.start.column
)
) {
r.start.row = startRow;
r.start.column = start.column;
}
else if (r.start.row == endRow) {
if (r.start.column <= end.column) {
if (lineDif || r.start.column > start.column) {
r.start.column = start.column;
r.start.row = start.row;
}
}
else {
r.start.column += colDiff;
r.start.row += lineDif;
}
}
else if (r.start.row > endRow) {
r.start.row += lineDif;
}
}
}
if (lineDif != 0 && i < n) {
for (; i < n; i++) {
var r = ranges[i];
r.start.row += lineDif;
r.end.row += lineDif;
}
}
};