source: subversion/applications/editors/potlatch/undo.as @ 15001

Last change on this file since 15001 was 14830, checked in by richard, 10 years ago

Potlatch 0.11a

File size: 6.9 KB
Line 
1
2        // =====================================================================================
3        // undo.as
4        // Potlatch undo stack code
5        // =====================================================================================
6
7        function UndoStack() {
8                this.sp=0;
9        };
10
11        UndoStack.prototype=new Array();
12
13        UndoStack.prototype.append=function(task,params,tooltip) {
14                // add to stack
15                if (_root.undoing) { return; }
16                this[this.sp]=new Array(task,params,tooltip); this.sp++;
17                this.setTooltip(tooltip);
18        };
19
20        UndoStack.prototype.rollback=function() {
21                if (_root.undoing) { return; }          // Stop any routines from adding to the
22                _root.undoing=true;                                     //  | undo stack
23                if (this.sp==0) { return; }
24                var popped=this[this.sp-1];                     // Same as this.pop, but works :)
25                this.sp--;                                                      //      |
26                popped[0].call(this,popped[1]);
27                if (this.sp)     { this.setTooltip(this[this.sp-1][2]); }
28                                        else { this.setTooltip(""); }
29                _root.undoing=false;                            // Permit adding to undo stack
30        };
31
32        UndoStack.prototype.setTooltip=function(str) {
33                if (str=='') {
34                        _root.panel.i_undo.onRollOver=function() { setFloater(iText("Nothing to undo",'tip_noundo')); };
35                        _root.panel.i_undo._alpha=50;
36                } else {
37                        _root.panel.i_undo.onRollOver=function() { setFloater(iText("Undo $1 (Z)",'tip_undo',str)); };
38                        _root.panel.i_undo._alpha=100;
39                }
40        };
41       
42        UndoStack.prototype.clear=function() { this.sp=0; };
43
44        // ---- Individual undo methods
45       
46        //              Added point into way
47
48        UndoStack.prototype.undo_addpoint=function(params) {
49                var waylist=params[0]; var poslist=params[1]; var w;
50                for (var i in waylist) {
51                        w=waylist[i];
52                        w.removeAnchorPoint(poslist[i]);
53                        w.clean=false;
54                }
55                w.select();
56                stopDrawing();
57        };
58
59        //              Moved node
60       
61        UndoStack.prototype.undo_movenode=function(params) {
62                var nodecopy=params[0];
63                var w=_root.nodes[nodecopy.id].moveTo(nodecopy.x,nodecopy.y,null);
64                if (w) { 
65                        _root.map.ways[w].clean=false;
66                        _root.map.ways[w].select();
67                }
68        };
69       
70        //              Merged ways
71
72        UndoStack.prototype.undo_mergeways=function(params) {
73                var way=params[0];
74                if (way) {
75                        way.attr=params[1];
76                        way.splitWay(params[3],params[2]);
77                } else {
78                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
79                        this.clear();
80                }
81        };
82
83        //              Split way
84
85        UndoStack.prototype.undo_splitway=function(params) {
86                var way1=params[0]; var way2=params[1];
87                if (way1.mergeAtCommonPoint(way2)) {
88                        way2.redraw(); way2.select();
89                } else {
90                        handleError(-1,new Array(iText("Ways $1 and $2 don't share a common point any more, so I can't undo the split.",'error_nosharedpoint',way1,way2)));
91                        this.clear();
92                }
93        };
94
95        //              Changed tags
96        //              ** to do - relations support
97       
98        UndoStack.prototype.undo_waytags=function(params) {
99                var way=params[0]; if (!way) {
100                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
101                        this.clear(); return;
102                } else {
103                        way.attr=params[1];
104                        way.clean=false;
105                        way.redraw();
106                        way.select();
107                }
108        };
109        UndoStack.prototype.undo_pointtags=function(params) {
110                var way=params[0]; var point=params[1]; if (!way) {
111                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
112                        this.clear(); return;
113                } else {
114                        way.path[point].attr=params[2];
115                        way.path[point].markDirty();
116                        way.clean=false;
117                        way.select(); _root.map.anchors[point].select();
118                }
119        };
120        UndoStack.prototype.undo_poitags=function(params) {
121                var poi=params[0]; if (!poi) {
122                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
123                        this.clear(); return;
124                } else {
125                        poi.attr=params[1];
126                        poi.clean=false;
127                        poi.select();
128                }
129        };
130       
131        //              Removed point from way(s) (at x,y,tags if it no longer exists)
132
133        UndoStack.prototype.undo_deletepoint=function(params) {
134                var last;
135                var nodecopy=params[0]; var id=nodecopy.id;
136                var waylist=params[1];
137                var poslist=params[2];
138
139                // create node if no longer in existence
140                if (_root.nodes(id)) { }
141                                                else { _root.nodes[id]=new Node(id,nodecopy.x,nodecopy.y,nodecopy.attr,nodecopy.version); }
142
143                // reinstate at each place
144                for (qway in waylist) {
145                        last=waylist[qway];     // select last one
146                        _root.nodes[id].addWay(last);
147                        _root.map.ways[last].path.splice(poslist[qway],0,_root.nodes[id]);
148                        _root.map.ways[last].clean=false;
149                        _root.map.ways[last].redraw();
150                        var z=_root.map.ways[last].deletednodes; delete z[id];
151                }
152                stopDrawing();
153                _root.map.ways[last].select();
154        };
155
156        //              Moved POI
157
158        UndoStack.prototype.undo_movepoi=function(params) {
159                var poi=params[0]; if (!poi) {
160                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
161                        this.clear(); return;
162                } else {
163                        poi._x=params[1]; poi._y=params[2];
164                        poi.clean=false; poi.select();
165                }
166        };
167
168        //              Moved way (and any nodes used in other ways)
169
170        UndoStack.prototype.undo_movenodes=function(params) {
171                var way=params[0]; if (!way) {
172                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
173                        this.clear(); return;
174                } else {
175                        way.moveNodes(-params[1],-params[2]);
176                        way.redraw();
177                        way.select();
178                }
179        };
180
181        //              Reversed way
182
183        UndoStack.prototype.undo_reverse=function(params) {
184                var way=params[0]; if (!way) {
185                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
186                        this.clear(); return;
187                } else {
188                        way.reverseWay();
189                }
190        };
191
192        //              Deleted POI
193
194        UndoStack.prototype.undo_deletepoi=function(params) {
195                var poi=params[0];
196                stopDrawing();
197                if (_root.map.pois[poi]) {} else {
198                        _root.map.pois.attachMovie("poi",poi,++poidepth);
199                }
200                _root.map.pois[poi]._x=params[1];
201                _root.map.pois[poi]._y=params[2];
202                _root.map.pois[poi].attr=params[3];
203                _root.map.pois[poi].select();
204                _root.map.pois[poi].clean=false;
205                markClean(false);
206        };
207       
208        //              Deleted way
209
210        UndoStack.prototype.undo_deleteway=function(params) {
211                var way=params[0];
212                stopDrawing();
213                _root.map.ways.attachMovie("way",way,++waydepth);
214                _root.map.ways[way]._x=params[1];
215                _root.map.ways[way]._y=params[2];
216                _root.map.ways[way].attr=params[3];
217                _root.map.ways[way].path=params[4];
218                _root.map.ways[way].redraw();
219                _root.map.ways[way].select();
220                _root.map.ways[way].clean=false;
221                markClean(false);
222        };
223
224        //              Created POI
225
226        UndoStack.prototype.undo_createpoi=function(params) {
227                poi=params[0]; poi.remove();
228                markClean(false);
229        };
230       
231        //              Created ways (e.g. parallel)
232       
233        UndoStack.prototype.undo_makeways=function(params) {
234                for (i in params) { _root.map.ways[params[i]].remove(); }
235        };
236
237
238        // Trace stuff - not used
239        // from .append
240// _root.chat.text="Stack now "+l;
241// _root.chat.text+="\nAppended "+task+","+params;
242        // from .rollback
243// _root.chat.text="Stack was "+this.length+"\n";
244// _root.chat.text+="rollback\npopped: "+popped[0]+";"+popped[1]+";"+popped[2]+"\n";
245// _root.chat.text+="\nStack now "+this.length;
246
Note: See TracBrowser for help on using the repository browser.