source: Dev/branches/rest-dojo-ui/client/dojox/sketch/UndoStack.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 2.6 KB
Line 
1define([
2        "dojo/_base/kernel",
3        "dojo/_base/lang",
4        "dojo/_base/declare",
5        "../xml/DomParser"
6], function(dojo){
7        dojo.getObject("sketch", true, dojox);
8        var ta=dojox.sketch;
9        ta.CommandTypes={ Create:"Create", Move:"Move", Modify:"Modify", Delete:"Delete", Convert:"Convert"};
10
11        dojo.declare("dojox.sketch.UndoStack",null,{
12                constructor: function(figure){
13                        this.figure=figure;
14                        this._steps=[];
15                        this._undoedSteps=[];
16                },
17                apply: function(state, from, to){
18                        //      the key here is to neutrally move from one state to another.
19                        //      we let the individual functions (i.e. undo and redo) actually
20                        //      determine the from and to; all we do here is implement it.
21
22                        //      check whether this is a fullText step
23                        if(!from && !to && state.fullText){
24                                this.figure.setValue(state.fullText);
25                                return;
26                        }
27
28                        var fromText=from.shapeText;
29                        var toText=to.shapeText;
30                       
31                        if(fromText.length==0&&toText.length==0){
32                                //      nothing to reapply?
33                                return;
34                        }
35                        if(fromText.length==0){
36                                //      We are creating.
37                                var o=dojox.xml.DomParser.parse(toText).documentElement;
38                                var a=this.figure._loadAnnotation(o);
39                                if(a) this.figure._add(a);
40                                return;
41                        }
42                        if(toText.length==0){
43                                //      we are deleting.
44                                var ann=this.figure.getAnnotator(from.shapeId);
45                                this.figure._delete([ann],true);
46                                return;
47                        }
48                       
49                        //      we can simply reinit and draw from the shape itself,
50                        //              regardless of the actual command.
51                        var nann=this.figure.getAnnotator(to.shapeId);
52                        var no=dojox.xml.DomParser.parse(toText).documentElement;
53                        nann.draw(no);
54                        this.figure.select(nann);
55                        return;
56                },
57                //      stack methods.
58                add: function(/*String*/cmd, /*ta.Annotation?*/ann, /*String?*/before){
59                        var id=ann?ann.id:'';
60                        //var bbox=ann?ann.getBBox():{};
61                        var after=ann?ann.serialize():"";
62                        if(cmd==ta.CommandTypes.Delete){ after=""; }
63                       
64                        /*if(ann){
65                                //      fix the bbox x/y coords
66                                var t=ann.transform;
67                                bbox.x+=t.dx;
68                                bbox.y+=t.dy;
69                        }*/
70                        var state={
71                                cmdname:cmd,
72                                //bbox:bbox,
73//                                      fullText:fullText,
74                                before:{
75                                        shapeId: id,
76                                        shapeText:before||''
77                                },
78                                after:{
79                                        shapeId: id,
80                                        shapeText:after
81                                }
82                        };
83                        //console.log('dojox.sketch history add',state);
84                        this._steps.push(state);
85                        this._undoedSteps = [];
86                },
87                destroy: function(){},
88                undo: function(){
89                        var state=this._steps.pop();
90                        if(state){
91                                this._undoedSteps.push(state);
92                                this.apply(state,state.after,state.before);
93                        }
94                },
95                redo: function(){
96                        var state=this._undoedSteps.pop();
97                        if(state){
98                                this._steps.push(state);
99                                this.apply(state,state.before,state.after);
100                        }
101                }
102        });
103
104        return dojox.sketch.UndoStack;
105});
Note: See TracBrowser for help on using the repository browser.