source: subversion/applications/editors/potlatch/node.as @ 34542

Last change on this file since 34542 was 19967, checked in by avar, 10 years ago

Don't begin/end messages with whitespace, Translatewiki can't grok it.

  • Property svn:executable set to *
File size: 6.2 KB
Line 
1
2        // Originally 0=x, 1=y, 2=id, 4=tags;
3        // now .x, .y, .id, .attr
4
5        function Node(id,x,y,attr,version) {
6                this.id=id;
7                this.x=x;
8                this.y=y;
9                this.attr=attr;
10                this.tagged=hasTags(attr);
11                this.ways=new Object();
12                this.version=version;
13                this.clean=false;               // set to true if just loaded from server
14                this.uploading=false;
15                this.setPosition();
16        };
17
18        Node.prototype.markDirty=function() {
19                // doesn't really need to be a discrete function,
20                // but keeping it in for now
21                this.clean=false;
22        };
23
24        Node.prototype.removeFromAllWays=function() {
25                var qway,qs,x,y,attr;
26                var waylist=new Array(); var poslist=new Array();
27                var undopoint=false;
28                var z=this.ways; for (qway in z) {      // was in _root.map.ways
29                        for (qs=0; qs<_root.map.ways[qway].path.length; qs+=1) {
30                                if (_root.map.ways[qway].path[qs]==this) {
31                                        waylist.push(qway); poslist.push(qs);
32                                        _root.map.ways[qway].path.splice(qs,1);
33                                        if (this.id>0) { _root.map.ways[qway].deletednodes[this.id]=this.version; }
34                                        // needs to be in every way's .deletednodes - if it's just one, the API will refuse
35                                        // to delete it, because it's still in the other (not yet rewritten) way
36                                }
37                        }
38                        this.unsetPosition();
39                        _root.map.ways[qway].clean=false;
40                        _root.map.ways[qway].removeDuplicates();
41                        if (_root.map.ways[qway].path.length<2) {
42                                _root.map.ways[qway].saveDeleteUndo(iText('deleting'));
43                                _root.map.ways[qway].remove();
44                        } else {
45                                _root.map.ways[qway].redraw();
46                                undopoint=true;
47                        }
48                }
49                if (_root.wayselected) { _root.ws.select(); }
50                if (undopoint) { _root.undo.append(UndoStack.prototype.undo_deletepoint,
51                                                                                   new Array(deepCopy(this),waylist,poslist),
52                                                                                   iText('action_deletepoint')); }
53        };
54
55        Node.prototype.moveTo=function(newx,newy,ignoreway,ignore_oneway) {
56                this.unsetPosition();
57                this.x=newx; this.y=newy; this.markDirty();
58                this.setPosition();
59                var qchanged;
60                var z=this.ways; for (var qway in z) {
61                        if (qway!=ignoreway) { _root.map.ways[qway].redraw(false,ignore_oneway); qchanged=qway; }
62                }
63                return qchanged;        // return ID of last changed way
64        };
65
66        Node.prototype.renumberTo=function(id) {
67                var old=this.id;
68                this.unsetPosition();
69                noderels[id]=noderels[old]; delete noderels[old];
70                nodes[id]=new Node(id,this.x,this.y,this.attr,this.version);
71                nodes[id].clean=this.clean;
72                var z=this.ways; for (var qway in z) {
73                        nodes[id].addWay(qway);
74                        for (var qs=0; qs<_root.map.ways[qway].path.length; qs+=1) {
75                                if (_root.map.ways[qway].path[qs].id==old) {
76                                        _root.map.ways[qway].path[qs]=nodes[id];
77                                }
78                        }
79                }
80                var z=_root.map.anchors; for (var a in z) {
81                        if (_root.map.anchors[a].node==old) { _root.map.anchors[a].node=id; }
82                }
83                var z=_root.map.anchorhints; for (var a in z) {
84                        if (_root.map.anchorhints[a].node==old) { _root.map.anchorhints[a].node=id; }
85                }
86                nodes[id].setPosition();
87        };
88
89        Node.prototype.unsetPosition=function() {
90                var a=this.x+","+this.y;
91                var z=_root.pos[a]; for (var i in z) {
92                        if (_root.pos[a][i]==this) {
93                                _root.pos[a].splice(i,1); 
94                                if (_root.pos[a].length==0) { delete _root.pos[a]; }
95                                return;
96                        }
97                }
98        };
99        Node.prototype.setPosition=function() {
100                var a=this.x+","+this.y;
101                var b;
102                if (_root.pos[a]) {
103                        b=_root.pos[a]; for (var i in b) {
104                                if (_root.pos[a][i]==this) { return; }
105                        }
106                        _root.pos[a].push(this);
107                } else {
108                        _root.pos[a]=[this];
109                }
110        };
111        Node.prototype.isDupe=function() {
112                if (_root.pos[this.x+","+this.y].length>1) { return true; }
113                return false;
114        };
115        Node.prototype.removeDupes=function(joinedways) {
116                var n=_root.pos[this.x+","+this.y];
117                var i,j;
118                for (i=0; i<n.length; i++) {
119                        if (n[i]==this) { continue; }
120                        for (j in n[i].ways) { joinedways[j]=true; }
121                        n[i].replaceWith(this);
122                }
123                _root.pos[this.x+","+this.y]=[this];
124                return joinedways;
125        };
126       
127        Node.prototype.replaceWith=function(r) {
128                // replace all occurrences of one node with another
129                var w,n,a,b;
130                a=this.ways; for (w in a) {
131                        b=_root.map.ways[w].path; for (n in b) {
132                                if (_root.map.ways[w].path[n].id==this.id) { _root.map.ways[w].path[n]=r; }
133                        }
134                        r.addWay(w);
135                        if (this.id>0) { _root.map.ways[w].deletednodes[this.id]=this.version; }
136                        _root.map.ways[w].clean=false;
137                        _root.map.ways[w].removeDuplicates();
138                }
139                this.ways=new Object();
140                this.unsetPosition();
141        };
142
143        Node.prototype.inspect=function() {
144                var str = iText('inspector_latlon', Math.floor(coord2lat (this.y)*10000)/10000, Math.floor(coord2long(this.x)*10000)/10000)+"\n";
145
146                // Status
147                if (!this.clean) { str+=iText('inspector_unsaved'); }
148                if (this.uploading) { str+=' ' + iText('inspector_uploading'); }
149                if (!this.clean) { str+="\n"; }
150       
151                // Duplicate?
152                if (this.isDupe()) {
153                        str+=iText('inspector_duplicate') + ' ';
154                        var a=_root.pos[this.x+","+this.y];
155                        for (i in a) { if (a[i].id!=this.id) { str+=a[i].id+", "; } }
156                        str=str.substr(0,str.length-2)+"\n";
157                }
158
159                // Which ways is this in?
160                if (this.numberOfWays()==0) { 
161                        str+=iText('inspector_not_in_any_ways') + "\n";
162                } else {
163                        str+=iText('inspector_in_ways') + ' ';
164                        var w=this.ways; for (var i in w) {
165                                var n=getName(_root.map.ways[i].attr,waynames);
166                if (n) {
167                    str += iText('inspector_way_name', i, n);
168                } else {
169                    str += iText('inspector_way', i);
170                }
171                                var c=0;
172                                for (j=0; j<_root.map.ways[i].path.length; j++) {
173                                        if (_root.map.ways[i].path[j]==this) { c++; }
174                                }
175                                if (c>1) { str += ' <b>'+iText('inspector_node_count', c)+'</b>'; }
176                                str += ", ";
177                        }
178                        str=str.substr(0,str.length-2);
179                }
180
181                return "<p>"+str+"</p>";
182        };
183
184        // ------------------------------------------------------------------------
185        // Node->way mapping
186       
187        Node.prototype.addWay=function(id) { this.ways[id]=true; };
188        Node.prototype.removeWay=function(id) { delete this.ways[id]; };
189        Node.prototype.numberOfWays=function() { var z=this.ways; var c=0; for (var i in z) { c++; } return c; };
190        Node.prototype.redrawWays=function() { var z=this.ways; for (var i in z) { _root.map.ways[i].redraw(); } };
191
192        // ------------------------------------------------------------------------
193        // Support functions
194       
195        // hasTags - does a tag hash contain any significant tags?
196
197        function hasTags(a) {
198                var c=false;
199                for (var j in a) {
200                        if (a[j] != '' && j != 'attribution' && 
201                                j != 'created_by' && j!='source' &&     
202                                j.indexOf('tiger:')!=0) { c=true; }
203                }
204                return c;
205        }
Note: See TracBrowser for help on using the repository browser.