Fix bug in undo/redo + folds: The folds have to get onto the undo queue after the changeStack is empty. New events changeStart/End added.

This commit is contained in:
Julian Viereck 2011-04-29 11:08:19 +02:00
commit e871700e2e
3 changed files with 83 additions and 18 deletions

View file

@ -183,12 +183,14 @@ var Document = function(text) {
var firstLine = lines.splice(0, 1)[0];
var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];
this._dispatchEvent("changeStart");
position = this.insertInLine(position, firstLine);
if (lastLine !== null) {
position = this.insertNewLine(position); // terminate first line
position = this.insertLines(position.row, lines);
position = this.insertInLine(position, lastLine || "");
}
this._dispatchEvent("changeEnd");
return position;
};
@ -200,6 +202,7 @@ var Document = function(text) {
args.push.apply(args, lines);
this.$lines.splice.apply(this.$lines, args);
this._dispatchEvent("changeStart");
var range = new Range(row, 0, row + lines.length, 0);
var delta = {
action: "insertLines",
@ -207,12 +210,15 @@ var Document = function(text) {
lines: lines
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
return range.end;
},
this.insertNewLine = function(position) {
position = this.$clipPosition(position);
var line = this.$lines[position.row] || "";
this._dispatchEvent("changeStart");
this.$lines[position.row] = line.substring(0, position.column);
this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
@ -227,6 +233,7 @@ var Document = function(text) {
text: this.getNewLineCharacter()
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
return end;
};
@ -236,6 +243,8 @@ var Document = function(text) {
return position;
var line = this.$lines[position.row] || "";
this._dispatchEvent("changeStart");
this.$lines[position.row] = line.substring(0, position.column) + text
+ line.substring(position.column);
@ -250,6 +259,7 @@ var Document = function(text) {
text: text
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
return end;
};
@ -265,6 +275,7 @@ var Document = function(text) {
var firstRow = range.start.row;
var lastRow = range.end.row;
this._dispatchEvent("changeStart");
if (range.isMultiLine()) {
var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;
var lastFullRow = lastRow - 1;
@ -283,6 +294,7 @@ var Document = function(text) {
else {
this.removeInLine(firstRow, range.start.column, range.end.column);
}
this._dispatchEvent("changeEnd");
return range.start;
};
@ -294,6 +306,7 @@ var Document = function(text) {
var line = this.getLine(row);
var removed = line.substring(startColumn, endColumn);
var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
this._dispatchEvent("changeStart");
this.$lines.splice(row, 1, newLine);
var delta = {
@ -302,6 +315,7 @@ var Document = function(text) {
text: removed
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
return range.start;
};
@ -313,6 +327,7 @@ var Document = function(text) {
* @return {String[]} The removed lines
*/
this.removeLines = function(firstRow, lastRow) {
this._dispatchEvent("changeStart");
var range = new Range(firstRow, 0, lastRow + 1, 0);
var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
@ -323,6 +338,7 @@ var Document = function(text) {
lines: removed
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
return removed;
};
@ -333,6 +349,7 @@ var Document = function(text) {
var range = new Range(row, firstLine.length, row+1, 0);
var line = firstLine + secondLine;
this._dispatchEvent("changeStart");
this.$lines.splice(row, 2, line);
var delta = {
@ -341,6 +358,7 @@ var Document = function(text) {
text: this.getNewLineCharacter()
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("changeEnd");
};
this.replace = function(range, text) {
@ -352,6 +370,7 @@ var Document = function(text) {
if (text == this.getTextRange(range))
return range.end;
this._dispatchEvent("changeStart");
this.remove(range);
if (text) {
var end = this.insert(range.start, text);
@ -359,6 +378,7 @@ var Document = function(text) {
else {
end = range.start;
}
this._dispatchEvent("changeEnd");
return end;
};