source: subversion/applications/editors/potlatch/error.as @ 17493

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

fix annoying retry problem, and fine-tune relation drawing again

  • Property svn:executable set to *
File size: 7.4 KB
Line 
1
2        // =====================================================================
3        // Error handling
4
5        function handleError(code,msg,result) {
6                if (code==-2 && msg.indexOf('allocate memory')>-1) { code=-1; }
7                if (msg.indexOf('changeset')>-1) { _root.changeset=null; msg+=iText("\nPlease try again: Potlatch will start a new changeset.",'newchangeset'); }       // we really need a dedicated error code for this
8                switch (code) {
9                        case -1:        errorDialogue(msg,150); break;
10                        case -2:        errorDialogue(msg+iText("\n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time.",'emailauthor'),200); break;
11                        case -3:        resolveConflict(msg,result); break;             // version conflict
12                        case -4:        deleteObject(msg,result[0]); break;             // object not found
13                        case -5:        break;                                                                  // not executed due to previous error
14                }
15        }
16
17        function errorDialogue(t,h) {
18                abortUpload();
19                _root.windows.attachMovie("modal","error",++windowdepth);
20                _root.windows.error.init(350,h,new Array(iText('Ok','ok')),null);
21                _root.windows.error.box.createTextField("prompt",2,7,9,325,h-40);
22                writeText(_root.windows.error.box.prompt,t);
23                _root.windows.error.box.prompt.selectable=true;
24        }
25
26        function handleWarning() {
27                abortUpload();
28                _root.windows.attachMovie("modal","error",++windowdepth);
29                _root.windows.error.init(275,130,new Array(iText('Retry','retry'),iText('Cancel','cancel')),handleWarningAction);
30                _root.windows.error.box.createTextField("prompt",2,7,9,250,100);
31        _root.uploading=false;
32                if (writeError) {
33                        writeText(_root.windows.error.box.prompt,iText("Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?",'error_connectionfailed'));
34                } else {
35                        writeText(_root.windows.error.box.prompt,iText("Sorry - the OpenStreetMap server didn't respond when asked for data.\n\nWould you like to try again?",'error_readfailed'));
36                }
37        };
38
39        function handleWarningAction(choice) {
40                _root.panel.i_warning._visible=false;
41                _root.writesrequested=0;
42                _root.waysrequested=_root.waysreceived=_root.whichrequested=_root.whichreceived=0;
43        var retry=(choice==iText('Retry','retry'));
44                if (writeError) {
45                        // loop through all ways which are uploading, and reupload
46                        if (retry) { establishConnections(); }
47                        for (var q in _root.nodes) {
48                                if (_root.nodes[q].uploading) {
49                                        _root.nodes[q].uploading=false;
50                                        _root.nodes[q].clean=false;
51                                }
52                        }
53                        for (var q in _root.map.ways) {
54                                if (_root.map.ways[q].uploading) {
55                                        _root.map.ways[q].uploading=false;
56                                        _root.map.ways[q].clean=false;
57                                        if (!_root.sandbox && retry) { _root.map.ways[q].upload(); }
58                                }
59                        }
60                        for (var q in _root.map.relations) {
61                                if (_root.map.relations[q].uploading) {
62                                        _root.map.relations[q].uploading=false;
63                                        _root.map.relations[q].clean=false;
64                                        if (!_root.sandbox && retry) { _root.map.relations[q].upload(); }
65                                }
66                        }
67                        for (var q in _root.map.pois) {
68                                if (_root.map.pois[q].uploading) {
69                                        _root.map.pois[q].uploading=false;
70                                        _root.map.pois[q].clean=false;
71                                        if (!_root.sandbox && retry) { _root.map.pois[q].upload(); }
72                                }
73                        }
74                        if (_root.sandbox && retry) { prepareUpload(); }
75                }
76                if (readError) { 
77                        bigedge_l=bigedge_b= 999999;
78                        bigedge_r=bigedge_t=-999999;
79                        whichWays();
80                }
81                writeError=false; readError=false;
82        };
83
84        // Delete object from Potlatch if server reports it doesn't exist
85
86        function deleteObject(type,id) {
87                switch (type) {
88                        case 'way':
89                                if (_root.map.ways[id]) {
90                                        var w=_root.map.ways[id];
91                                        w.removeNodeIndex();
92                                        memberDeleted('Way', id);
93                                        if (id==wayselected) { stopDrawing(); deselectAll(); }
94                                        removeMovieClip(_root.map.areas[id]);
95                                        removeMovieClip(w);
96                                }
97                                break;
98                        case 'relation':
99                                if (_root.map.relations[id]) {
100                                        var mems=_root.map.relations[id].members;
101                                        for (var i in mems) { var r=findLinkedHash(mems[i][0],mems[i][1]); delete r[id]; }
102                                        removeMovieClip(_root.map.relations[id]);
103                                }
104                                break;
105                        case 'node':
106                                if (_root.map.pois[id]) {
107                                        if (id==_poiselected) { deselectAll(); }
108                                        removeMovieClip(_root.map.pois[id]);
109                                }
110                                break;
111                }
112        }
113
114        // =====================================================================
115        // Conflict management
116
117        function resolveConflict(rootobj,conflictobj) {
118                //  rootobj is     [root object, id]
119                //  conflictobj is [conflicting object, id, version]
120                _root.croot=rootobj; _root.cconflict=conflictobj;               // _root. so we can access them from the "Ok" function
121                var t1,t2; var id=rootobj[1];
122
123                abortUpload();
124                switch (rootobj[0]) {
125                        case 'way':             var n=getName(_root.map.ways[id].attr,waynames); if (n) { n=" ("+n+")"; }
126                                                        t1=iText("Since you started editing, someone else has changed way $1$2.","conflict_waychanged",id,n);
127                                                        t2=iText("Click 'Ok' to show the way.","conflict_visitway"); break;
128                        case 'node':    var n=getName(_root.map.pois[id].attr,nodenames); if (n) { n=" ("+n+")"; }
129                                                        t1=iText("Since you started editing, someone else has changed point $1$2.","conflict_poichanged",id,n);
130                                                        t2=iText("Click 'Ok' to show the point.","conflict_visitpoi"); break;
131                        case 'relation':var n=_root.map.relations[id].verboseText(); if (n) { n=" ("+n+")"; }
132                                                        t1=iText("Since you started editing, someone else has changed relation $1$2.","conflict_relchanged",id,n);
133                                                        t2=""; break;
134                }
135                _root.windows.attachMovie("modal","resolve",++windowdepth);
136                _root.windows.resolve.init(300,150,new Array('Ok'),function() { handleConflictAction(_root.windows.resolve.box.fixoption.selected); });
137                var box=_root.windows.resolve.box;
138
139                box.createTextField("prompt1",2,7,9,282,200);
140                writeText(box.prompt1,t1); var t=box.prompt1.textHeight;
141
142                box.attachMovie("radio","fixoption",3);
143                box.fixoption.addButton(10,t+22,iText("Download their version",'conflict_download'));
144                box.fixoption.addButton(10,t+40,iText("Overwrite their version",'conflict_overwrite'));
145                box.fixoption.select(1);
146
147                if (t2) {
148                        box.createTextField("prompt2",4,7,t+60,282,20);
149                        writeText(box.prompt2,t2);
150                }
151        }
152       
153        function handleConflictAction(choice) {
154                var tx,ty;
155                var ctype=_root.croot[0]; var cid=_root.croot[1];
156                if              (ctype=='way'  && _root.map.ways[cid]) { preway=cid;  tx=_root.map.ways[cid].path[0].x; ty=_root.map.ways[cid].path[0].y; }
157                else if (ctype=='node' && _root.map.pois[cid]) { prenode=cid; tx=_root.nodes[cid].x; ty=_root.nodes[cid].y; }
158
159                if (choice==1) { deselectAll(); deleteObject(ctype,cid); }      // downloading new version, so delete old one from Potlatch
160                if (tx && ty && (tx<long2coord(_root.edge_l) || tx>long2coord(_root.edge_r) || ty<lat2coord(_root.edge_t) || ty>lat2coord(_root.edge_b))) {
161                        updateCoords(tx,ty);
162                }
163
164                if (choice==1) {
165                        // download new (more up-to-date) version and select it
166                        whichWays(true);
167                } else {
168                        // select problem object
169                        if              (ctype=='way' ) { _root.map.ways[cid].select(); }
170                        else if (ctype=='node') { _root.map.pois[cid].select(); }
171                        // change version number
172                        var rtype=_root.cconflict[0];
173                        var rid  =_root.cconflict[1];
174                        var v    =_root.cconflict[2];
175                        switch (ctype+","+_root.cconflict[0]) {
176                                case 'way,way':                         _root.map.ways[cid].version=v; _root.map.ways[cid].clean=false; break;
177                                case 'way,node':                        _root.nodes[rid].version=v; _root.nodes[rid].markDirty(); _root.map.ways[cid].clean=false; break;
178                                case 'node,node':                       _root.nodes[cid].version=v; _root.nodes[cid].markDirty(); _root.map.pois[cid].clean=false; break;
179                                case 'relation,relation':       _root.map.relations[cid].version=v; _root.map.relations[cid].clean=false; break;
180                        }
181                }
182        }
Note: See TracBrowser for help on using the repository browser.