source: [view]
dojo.provide("dojox.sketch.UndoStack");
dojo.require("dojox.xml.DomParser");
(function(){
var ta=dojox.sketch;
ta.CommandTypes={ Create:"Create", Move:"Move", Modify:"Modify", Delete:"Delete", Convert:"Convert"};
dojo.declare("dojox.sketch.UndoStack",null,{
constructor: function(figure){
this.figure=figure;
this._steps=[];
this._undoedSteps=[];
},
apply: function(state, from, to){
// the key here is to neutrally move from one state to another.
// we let the individual functions (i.e. undo and redo) actually
// determine the from and to; all we do here is implement it.
// check whether this is a fullText step
if(!from && !to && state.fullText){
this.figure.setValue(state.fullText);
return;
}
var fromText=from.shapeText;
var toText=to.shapeText;
if(fromText.length==0&&toText.length==0){
// nothing to reapply?
return;
}
if(fromText.length==0){
// We are creating.
var o=dojox.xml.DomParser.parse(toText).documentElement;
var a=this.figure._loadAnnotation(o);
if(a) this.figure._add(a);
return;
}
if(toText.length==0){
// we are deleting.
var ann=this.figure.getAnnotator(from.shapeId);
this.figure._delete([ann],true);
return;
}
// we can simply reinit and draw from the shape itself,
// regardless of the actual command.
var nann=this.figure.getAnnotator(to.shapeId);
var no=dojox.xml.DomParser.parse(toText).documentElement;
nann.draw(no);
this.figure.select(nann);
return;