source: josm/trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java@ 5085

Last change on this file since 5085 was 5085, checked in by simon04, 12 years ago

fix #5824 - remotecontrol: add command for opening local files + refactoring of permission preference

  • Property svn:eol-style set to native
File size: 9.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io.remotecontrol.handler;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.geom.Area;
7import java.awt.geom.Rectangle2D;
8import java.io.UnsupportedEncodingException;
9import java.net.URLDecoder;
10import java.util.HashSet;
11import java.util.concurrent.Future;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.AutoScaleAction;
15import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
16import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
17import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
18import org.openstreetmap.josm.data.Bounds;
19import org.openstreetmap.josm.data.coor.LatLon;
20import org.openstreetmap.josm.data.osm.DataSet;
21import org.openstreetmap.josm.data.osm.Node;
22import org.openstreetmap.josm.data.osm.OsmPrimitive;
23import org.openstreetmap.josm.data.osm.Relation;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
26import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
27import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
28import org.openstreetmap.josm.tools.Utils;
29
30/**
31 * Handler for load_and_zoom request.
32 */
33public class LoadAndZoomHandler extends RequestHandler
34{
35 public static final String command = "load_and_zoom";
36 public static final String command2 = "zoom";
37
38 @Override
39 public String getPermissionMessage()
40 {
41 return tr("Remote Control has been asked to load data from the API.") +
42 "<br>" + tr("Request details: {0}", request);
43 }
44
45 @Override
46 public String[] getMandatoryParams()
47 {
48 return new String[] { "bottom", "top", "left", "right" };
49 }
50
51 @Override
52 protected void handleRequest() throws RequestHandlerErrorException
53 {
54 DownloadTask osmTask = new DownloadOsmTask();
55 double minlat = 0;
56 double maxlat = 0;
57 double minlon = 0;
58 double maxlon = 0;
59 try {
60 minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
61 maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
62 minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
63 maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
64 boolean newLayer = isLoadInNewLayer();
65
66 if(command.equals(myCommand))
67 {
68 if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed())
69 {
70 System.out.println("RemoteControl: download forbidden by preferences");
71 }
72 else
73 {
74 Area toDownload = null;
75 if (!newLayer) {
76 // find out whether some data has already been downloaded
77 Area present = null;
78 DataSet ds = Main.main.getCurrentDataSet();
79 if (ds != null) {
80 present = ds.getDataSourceArea();
81 }
82 if (present != null && !present.isEmpty()) {
83 toDownload = new Area(new Rectangle2D.Double(minlon,minlat,maxlon-minlon,maxlat-minlat));
84 toDownload.subtract(present);
85 if (!toDownload.isEmpty())
86 {
87 // the result might not be a rectangle (L shaped etc)
88 Rectangle2D downloadBounds = toDownload.getBounds2D();
89 minlat = downloadBounds.getMinY();
90 minlon = downloadBounds.getMinX();
91 maxlat = downloadBounds.getMaxY();
92 maxlon = downloadBounds.getMaxX();
93 }
94 }
95 }
96 if (toDownload != null && toDownload.isEmpty())
97 {
98 System.out.println("RemoteControl: no download necessary");
99 }
100 else
101 {
102 Future<?> future = osmTask.download(newLayer, new Bounds(minlat,minlon,maxlat,maxlon), null /* let the task manage the progress monitor */);
103 Main.worker.submit(new PostDownloadHandler(osmTask, future));
104 }
105 }
106 }
107 } catch (Exception ex) {
108 System.out.println("RemoteControl: Error parsing load_and_zoom remote control request:");
109 ex.printStackTrace();
110 throw new RequestHandlerErrorException();
111 }
112
113 /**
114 * deselect objects if parameter addtags given
115 */
116 if (args.containsKey("addtags")) {
117 Main.worker.execute(new Runnable() {
118 public void run() {
119 DataSet ds = Main.main.getCurrentDataSet();
120 if(ds == null) // e.g. download failed
121 return;
122 ds.clearSelection();
123 }
124 });
125 }
126
127 if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
128 // select objects after downloading, zoom to selection.
129 final String selection = args.get("select");
130 Main.worker.execute(new Runnable() {
131 public void run() {
132 HashSet<Long> ways = new HashSet<Long>();
133 HashSet<Long> nodes = new HashSet<Long>();
134 HashSet<Long> relations = new HashSet<Long>();
135 HashSet<OsmPrimitive> newSel = new HashSet<OsmPrimitive>();
136 for (String item : selection.split(",")) {
137 if (item.startsWith("way")) {
138 ways.add(Long.parseLong(item.substring(3)));
139 } else if (item.startsWith("node")) {
140 nodes.add(Long.parseLong(item.substring(4)));
141 } else if (item.startsWith("relation")) {
142 relations.add(Long.parseLong(item.substring(8)));
143 } else if (item.startsWith("rel")) {
144 relations.add(Long.parseLong(item.substring(3)));
145 } else {
146 System.out.println("RemoteControl: invalid selection '"+item+"' ignored");
147 }
148 }
149 DataSet ds = Main.main.getCurrentDataSet();
150 if(ds == null) // e.g. download failed
151 return;
152 for (Way w : ds.getWays()) {
153 if (ways.contains(w.getId())) {
154 newSel.add(w);
155 }
156 }
157 for (Node n : ds.getNodes()) {
158 if (nodes.contains(n.getId())) {
159 newSel.add(n);
160 }
161 }
162 for (Relation r : ds.getRelations()) {
163 if (relations.contains(r.getId())) {
164 newSel.add(r);
165 }
166 }
167 ds.setSelected(newSel);
168 if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
169 AutoScaleAction.autoScale("selection");
170 }
171 if (Main.map != null && Main.map.relationListDialog != null) {
172 Main.map.relationListDialog.selectRelations(null); // unselect all relations to fix #7342
173 Main.map.relationListDialog.dataChanged(null);
174 Main.map.relationListDialog.selectRelations(Utils.filteredCollection(newSel, Relation.class));
175 }
176 }
177 });
178 } else if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
179 // after downloading, zoom to downloaded area.
180 zoom(minlat, maxlat, minlon, maxlon);
181 }
182
183 /*
184 * parse addtags parameters
185 * Example URL (part):
186 * addtags=wikipedia:de%3DResidenzschloss Dresden|name:en%3DDresden Castle
187 */
188 if (args.containsKey("addtags")) {
189 Main.worker.execute(new Runnable() {
190 public void run() {
191 String[] tags = null;
192 try {
193 tags = URLDecoder.decode(args.get("addtags"), "UTF-8").split("\\|");
194 } catch (UnsupportedEncodingException e) {
195 throw new RuntimeException();
196 }
197 String[][] keyValue = new String[tags.length][2];
198 for (int i = 0; i<tags.length; i++) {
199 keyValue[i] = tags[i].split("=");
200
201 keyValue[i][0] = keyValue[i][0];
202 keyValue[i][1] = keyValue[i][1];
203 }
204
205 new AddTagsDialog(keyValue);
206 }
207 });
208 }
209
210 }
211
212 protected void zoom(double minlat, double maxlat, double minlon, double maxlon) {
213 final Bounds bounds = new Bounds(new LatLon(minlat, minlon),
214 new LatLon(maxlat, maxlon));
215
216 // make sure this isn't called unless there *is* a MapView
217 //
218 if (Main.map != null && Main.map.mapView != null) {
219 Main.worker.execute(new Runnable() {
220 public void run() {
221 BoundingXYVisitor bbox = new BoundingXYVisitor();
222 bbox.visit(bounds);
223 Main.map.mapView.recalculateCenterScale(bbox);
224 }
225 });
226 }
227 }
228
229 @Override
230 public PermissionPrefWithDefault getPermissionPref() {
231 return null;
232 }
233}
Note: See TracBrowser for help on using the repository browser.