kopia lustrzana https://github.com/c9/core
Merge pull request +7491 from c9/fix/undo
fix tabs with empty undo history appearing as changedpull/117/merge
commit
81e60d8e82
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Ładowanie…
Reference in New Issue