source: josm/trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java@ 1434

Last change on this file since 1434 was 1434, checked in by stoecker, 15 years ago

close #999. patch by xeen

File size: 3.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.awt.geom.Area;
9import java.awt.geom.Rectangle2D;
10import java.util.ArrayList;
11import java.util.List;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
15import org.openstreetmap.josm.data.osm.DataSource;
16import org.openstreetmap.josm.gui.ExtendedDialog;
17import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
18import org.openstreetmap.josm.tools.Shortcut;
19
20public class UpdateDataAction extends JosmAction {
21 public UpdateDataAction() {
22 super(tr("Update Data"),
23 "updatedata",
24 tr("Updates the current data layer from the server (re-downloads data)"),
25 Shortcut.registerShortcut("file:updatedata",
26 tr("Update Data"),
27 KeyEvent.VK_U,
28 Shortcut.GROUP_NONE),
29 true);
30 }
31
32 @Override
33 public void actionPerformed(ActionEvent e) {
34 int bboxCount = 0;
35 List<Area> areas = new ArrayList<Area>();
36 for(DataSource ds : Main.main.editLayer().data.dataSources)
37 areas.add(new Area(ds.bounds.asRect()));
38
39 // This would loop over all DataLayers but download all data to the currently
40 // selected one
41 /*for(Layer l : Main.map.mapView.getAllLayers()) {
42 if(!(l instanceof OsmDataLayer)) continue;
43
44 for(DataSource ds : ((OsmDataLayer)l).data.dataSources)
45 areas.add(new Area(ds.bounds.asRect()));
46 }*/
47
48 // The next two blocks removes every intersection from every DataSource Area
49 // This prevents downloading the same data numerous times at intersections
50 // and also skips smaller bounding boxes that are contained within larger ones
51 // entirely.
52 for(int i = 0; i < areas.size(); i++) {
53 for(int j = i+1; j < areas.size(); j++) {
54 areas.get(i).subtract(areas.get(j));
55 }
56 }
57
58 for(int i = areas.size()-1; i > 0 ; i--) {
59 for(int j = i-1; j > 0; j--) {
60 areas.get(i).subtract(areas.get(j));
61 }
62 }
63
64 for(Area a : areas) {
65 if(a.isEmpty())
66 continue;
67 bboxCount++;
68 }
69
70 int result = new ExtendedDialog(Main.parent,
71 tr("Update Data"),
72 tr("This action will require {0} individual download requests. "
73 + "Do you wish to continue?", bboxCount),
74 new String[] { "Update Data", "Cancel" },
75 new String[] { "updatedata.png", "cancel.png" }).getValue();
76
77 if(result != 1)
78 return;
79
80 DownloadTask osmTask = new DownloadOsmTask();
81 for(Area a : areas) {
82 Rectangle2D td = a.getBounds2D();
83 osmTask.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX());
84 }
85 }
86
87}
Note: See TracBrowser for help on using the repository browser.