]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/sketch/UndoStack.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / sketch / UndoStack.js
diff --git a/static/dojo-release-1.1.1/dojox/sketch/UndoStack.js b/static/dojo-release-1.1.1/dojox/sketch/UndoStack.js
new file mode 100644 (file)
index 0000000..e711557
--- /dev/null
@@ -0,0 +1,104 @@
+if(!dojo._hasResource["dojox.sketch.UndoStack"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.sketch.UndoStack"] = true;
+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.get(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.get(to.shapeId);
+                       var no=dojox.xml.DomParser.parse(toText).documentElement;
+                       nann.draw(no);
+                       this.figure.select(nann);
+                       return;
+               },
+               //      stack methods.
+               add: function(/*String*/cmd, /*ta.Annotation?*/ann, /*String?*/before){
+                       var id=ann?ann.id:'';
+                       //var bbox=ann?ann.getBBox():{};
+                       var after=ann?ann.serialize():"";
+                       if(cmd==ta.CommandTypes.Delete) after="";
+                       
+                       /*if(ann){
+                               //      fix the bbox x/y coords
+                               var t=ann.transform;
+                               bbox.x+=t.dx;
+                               bbox.y+=t.dy;
+                       }*/
+                       var state={
+                               cmdname:cmd,
+                               //bbox:bbox,
+//                                     fullText:fullText,
+                               before:{
+                                       shapeId: id,
+                                       shapeText:before||''
+                               },
+                               after:{
+                                       shapeId: id,
+                                       shapeText:after
+                               }
+                       };
+                       //console.log('dojox.sketch history add',state);
+                       this._steps.push(state);
+                       this._undoedSteps = [];
+               },
+               destroy: function(){},
+               undo: function(){
+                       var state=this._steps.pop();
+                       if(state){
+                               this._undoedSteps.push(state);
+                               this.apply(state,state.after,state.before);
+                       }
+               },
+               redo: function(){
+                       var state=this._undoedSteps.pop();
+                       if(state){
+                               this._steps.push(state);
+                               this.apply(state,state.before,state.after);
+                       }
+               }
+       });
+})();
+
+}