summaryrefslogtreecommitdiff
path: root/includes/js/dojox/sketch/UndoStack.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/sketch/UndoStack.js')
-rw-r--r--includes/js/dojox/sketch/UndoStack.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/includes/js/dojox/sketch/UndoStack.js b/includes/js/dojox/sketch/UndoStack.js
new file mode 100644
index 0000000..e711557
--- /dev/null
+++ b/includes/js/dojox/sketch/UndoStack.js
@@ -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);
+ }
+ }
+ });
+})();
+
+}