Merge pull request +7491 from c9/fix/undo

fix tabs with empty undo history appearing as changed
pull/117/merge
Lennart Kats 2015-05-29 11:34:20 +02:00
commit 81e60d8e82
3 zmienionych plików z 46 dodań i 15 usunięć

Wyświetl plik

@ -348,23 +348,33 @@ define(function(require, exports, module) {
}, },
getState: function() { getState: function() {
var aceUndo = this.$aceUndo; var aceUndo = this.$aceUndo;
var mark = -1; var mark = -2;
var aceMark = aceUndo.mark; var aceMark = aceUndo.mark;
var stack = []; var stack = [];
function transform(deltaSet) { function transform(deltaSet) {
var newDelta = deltaSet.filter(function (d) { if (!deltaSet || !deltaSet.filter) {
errorHandler.reportError("Misformed ace delta", {
delta: deltaSet
});
return;
}
var newDelta = deltaSet.filter(function(d) {
if (d.id == aceMark) mark = stack.length; if (d.id == aceMark) mark = stack.length;
return d.action == "insert" || d.action == "remove"; return d.action == "insert" || d.action == "remove";
}); });
stack.push(newDelta); if (newDelta.length)
stack.push(newDelta);
} }
aceUndo.$undoStack.forEach(transform); aceUndo.$undoStack.forEach(transform);
var pos = stack.length - 1;
if (pos == -1 && aceUndo.isAtBookmark())
mark = pos;
if (aceUndo.$redoStackBaseRev == aceUndo.$rev) if (aceUndo.$redoStackBaseRev == aceUndo.$rev)
aceUndo.$redoStack.forEach(transform); aceUndo.$redoStack.forEach(transform);
return { return {
stack: stack,
mark: mark, mark: mark,
position: aceUndo.$undoStack.length - 1 position: pos,
stack: stack
}; };
}, },
setState: function(e, silent) { setState: function(e, silent) {
@ -374,18 +384,24 @@ define(function(require, exports, module) {
var pos = e.position + 1; var pos = e.position + 1;
var undo = stack.slice(0, pos); var undo = stack.slice(0, pos);
var redo = stack.slice(pos); var redo = stack.slice(pos);
aceUndo.$undoStack = undo.filter(function(x) { var maxRev = aceUndo.$maxRev;
return x.length; function check(x) {
}).map(updateDeltas); if (!x.length) return false;
aceUndo.$redoStack = redo.filter(function(x) { if (!x[0].id || x[0].id < maxRev) {
return x.length; x[0].id = maxRev++;
}).map(updateDeltas); } else {
stack = aceUndo.$undoStack; maxRev = x[0].id;
}
return true;
}
aceUndo.$undoStack = undo.map(updateDeltas).filter(check);
aceUndo.$redoStack = redo.map(updateDeltas).filter(check);
var lastDeltaGroup = stack[stack.length - 1]; var lastDeltaGroup = stack[stack.length - 1];
var lastRev = lastDeltaGroup && lastDeltaGroup[0].id || 0; var lastRev = lastDeltaGroup && lastDeltaGroup[0] && lastDeltaGroup[0].id || 0;
aceUndo.$rev = lastRev; aceUndo.$rev = lastRev;
aceUndo.$redoStackBaseRev = aceUndo.$rev; aceUndo.$redoStackBaseRev = aceUndo.$rev;
aceUndo.$maxRev = Math.max(aceUndo.$maxRev, lastRev); aceUndo.$maxRev = Math.max(maxRev, lastRev);
var markedRev = marked && marked.id; var markedRev = marked && marked.id;
if (markedRev != null) if (markedRev != null)
this.$aceUndo.bookmark(markedRev); this.$aceUndo.bookmark(markedRev);

Wyświetl plik

@ -526,6 +526,21 @@ require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai)
expect.html(doc.tab).text("50"); expect.html(doc.tab).text("50");
done(); done();
}); });
it('should not loose undomanager state', function(done) {
var u = editor.activeDocument.undoManager;
u.setState({mark: -1, position: -1, stack: []});
var state = u.getState();
expect(state.mark).to.equal(-1);
expect(state.position).to.equal(-1);
expect(state.stack.length).to.equal(0);
u.setState({mark: -2, position: -1, stack: []});
state = u.getState();
expect(state.mark).to.equal(-2);
expect(state.position).to.equal(-1);
expect(state.stack.length).to.equal(0);
done();
});
}); });
// @todo test split api and menu // @todo test split api and menu

Wyświetl plik

@ -10,7 +10,7 @@ define(function(require, module, exports) {
var plugin = new Plugin("Ajax.org", main.consumes); var plugin = new Plugin("Ajax.org", main.consumes);
var emit = plugin.getEmitter(); var emit = plugin.getEmitter();
var position = -1, mark = -2, stack = []; var position = -1, mark = -1, stack = [];
if (options) if (options)
setState(options); setState(options);