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

Last change on this file since 12005 was 11420, checked in by richard, 11 years ago

Potlatch 0.10f

File size: 6.8 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.clean=false;
116                        way.select(); _root.map.anchors[point].select();
117                }
118        };
119        UndoStack.prototype.undo_poitags=function(params) {
120                var poi=params[0]; if (!poi) {
121                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
122                        this.clear(); return;
123                } else {
124                        poi.attr=params[1];
125                        poi.clean=false;
126                        poi.select();
127                }
128        };
129       
130        //              Removed point from way(s) (at x,y,tags if it no longer exists)
131
132        UndoStack.prototype.undo_deletepoint=function(params) {
133                var last;
134                var nodecopy=params[0]; var id=nodecopy.id;
135                var waylist=params[1];
136                var poslist=params[2];
137
138                // create node if no longer in existence
139                if (_root.nodes(id)) { }
140                                                else { _root.nodes[id]=new Node(id,nodecopy.x,nodecopy.y,nodecopy.attr); }
141
142                // reinstate at each place
143                for (qway in waylist) {
144                        last=waylist[qway];     // select last one
145                        _root.nodes[id].addWay(last);
146                        _root.map.ways[last].path.splice(poslist[qway],0,_root.nodes[id]);
147                        _root.map.ways[last].clean=false;
148                        _root.map.ways[last].redraw();
149                }
150                stopDrawing();
151                _root.map.ways[last].select();
152        };
153
154        //              Moved POI
155
156        UndoStack.prototype.undo_movepoi=function(params) {
157                var poi=params[0]; if (!poi) {
158                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
159                        this.clear(); return;
160                } else {
161                        poi._x=params[1]; poi._y=params[2];
162                        poi.clean=false; poi.select();
163                }
164        };
165
166        //              Moved way (and any nodes used in other ways)
167
168        UndoStack.prototype.undo_movenodes=function(params) {
169                var way=params[0]; if (!way) {
170                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
171                        this.clear(); return;
172                } else {
173                        way.moveNodes(-params[1],-params[2]);
174                        way.redraw();
175                        way.select();
176                }
177        };
178
179        //              Reversed way
180
181        UndoStack.prototype.undo_reverse=function(params) {
182                var way=params[0]; if (!way) {
183                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
184                        this.clear(); return;
185                } else {
186                        way.reverseWay();
187                }
188        };
189
190        //              Deleted POI
191
192        UndoStack.prototype.undo_deletepoi=function(params) {
193                var poi=params[0];
194                stopDrawing();
195                if (_root.map.pois[poi]) {} else {
196                        _root.map.pois.attachMovie("poi",poi,++poidepth);
197                }
198                _root.map.pois[poi]._x=params[1];
199                _root.map.pois[poi]._y=params[2];
200                _root.map.pois[poi].attr=params[3];
201                _root.map.pois[poi].select();
202                _root.map.pois[poi].clean=false;
203                markClean(false);
204        };
205       
206        //              Deleted way
207
208        UndoStack.prototype.undo_deleteway=function(params) {
209                var way=params[0];
210                stopDrawing();
211                _root.map.ways.attachMovie("way",way,++waydepth);
212                _root.map.ways[way]._x=params[1];
213                _root.map.ways[way]._y=params[2];
214                _root.map.ways[way].attr=params[3];
215                _root.map.ways[way].path=params[4];
216                _root.map.ways[way].redraw();
217                _root.map.ways[way].select();
218                _root.map.ways[way].clean=false;
219                markClean(false);
220        };
221
222        //              Created POI
223
224        UndoStack.prototype.undo_createpoi=function(params) {
225                poi=params[0]; poi.remove();
226                markClean(false);
227        };
228       
229        //              Created ways (e.g. parallel)
230       
231        UndoStack.prototype.undo_makeways=function(params) {
232                for (i in params) { _root.map.ways[params[i]].remove(); }
233        };
234
235
236        // Trace stuff - not used
237        // from .append
238// _root.chat.text="Stack now "+l;
239// _root.chat.text+="\nAppended "+task+","+params;
240        // from .rollback
241// _root.chat.text="Stack was "+this.length+"\n";
242// _root.chat.text+="rollback\npopped: "+popped[0]+";"+popped[1]+";"+popped[2]+"\n";
243// _root.chat.text+="\nStack now "+this.length;
244
Note: See TracBrowser for help on using the repository browser.