add multi row document operations n preparation for

rectangular selections
This commit is contained in:
Fabian Jakobs 2010-12-21 16:34:52 +01:00
commit ece288b0c7
2 changed files with 126 additions and 1 deletions

View file

@ -107,7 +107,6 @@ var Document = function(text, mode) {
}
if (undoManager) {
//undoManager.setDocument(this);
var self = this;
this.$informUndoManager = lang.deferredCall(function() {
if (self.$deltas.length > 0)
@ -456,6 +455,45 @@ var Document = function(text, mode) {
: undefined);
return end;
};
/**
* @param rows Array[Integer] sorted list of rows
*/
this.multiRowInsert = function(rows, column, text) {
var lines = this.lines;
for (var i=rows.length-1; i>=0; i--) {
var row = rows[i];
if (row >= lines.length)
continue;
var diff = column - lines[row].length;
if ( diff > 0) {
var padded = lang.stringRepeat(" ", diff) + text;
var offset = -diff;
}
else {
padded = text;
offset = 0;
}
var end = this.$insert({row: row, column: column+offset}, padded, false);
}
if (end) {
this.fireChangeEvent(rows[0], rows[rows.length-1] + end.row - rows[0]);
return {
rows: end.row - rows[0],
columns: end.column - column
}
}
else {
return {
rows: 0,
columns: 0
}
}
};
this.$insertLines = function(row, lines, fromUndo) {
if (lines.length == 0)
@ -552,6 +590,27 @@ var Document = function(text, mode) {
return range.start;
};
this.multiRowRemove = function(rows, range) {
if (range.start.row !== rows[0])
throw new TypeError("range must start in the first row!");
var height = range.end.row - rows[0];
for (var i=rows.length-1; i>=0; i--) {
var row = rows[i];
if (row >= this.lines.length)
continue;
var end = this.$remove(new Range(row, range.start.column, row+height, range.end.column), false);
}
if (end) {
if (height < 0)
this.fireChangeEvent(rows[0]+height, undefined);
else
this.fireChangeEvent(rows[0], height == 0 ? rows[rows.length-1] : undefined);
}
};
this.$remove = function(range, fromUndo) {
if (range.isEmpty())
return;