001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io.remotecontrol.handler; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Point; 007import java.util.Map; 008 009import org.openstreetmap.josm.Main; 010import org.openstreetmap.josm.actions.AutoScaleAction; 011import org.openstreetmap.josm.command.AddCommand; 012import org.openstreetmap.josm.data.coor.LatLon; 013import org.openstreetmap.josm.data.osm.Node; 014import org.openstreetmap.josm.data.osm.OsmPrimitive; 015import org.openstreetmap.josm.gui.util.GuiHelper; 016import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog; 017import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; 018 019/** 020 * Handler for add_node request. 021 */ 022public class AddNodeHandler extends RequestHandler { 023 024 /** 025 * The remote control command name used to add a node. 026 */ 027 public static final String command = "add_node"; 028 029 private double lat; 030 private double lon; 031 032 @Override 033 protected void handleRequest() { 034 GuiHelper.runInEDTAndWait(new Runnable() { 035 @Override public void run() { 036 addNode(args); 037 } 038 }); 039 } 040 041 @Override 042 public String[] getMandatoryParams() 043 { 044 return new String[] { "lat", "lon" }; 045 } 046 047 @Override 048 public String[] getOptionalParams() 049 { 050 return new String[] { "addtags" }; 051 } 052 053 @Override 054 public String[] getUsageExamples() { 055 return new String[] { 056 "/add_node?lat=11&lon=22", 057 "/add_node?lon=13.3&lat=53.2&addtags=natural=tree|name=%20%20%20==Great%20Oak==" 058 }; 059 } 060 061 @Override 062 public String getPermissionMessage() { 063 return tr("Remote Control has been asked to create a new node.") + 064 "<br>" + tr("Coordinates: ") + args.get("lat") + ", " + args.get("lon"); 065 } 066 067 @Override 068 public PermissionPrefWithDefault getPermissionPref() { 069 return PermissionPrefWithDefault.CREATE_OBJECTS; 070 } 071 072 /** 073 * Adds a node, implements the GET /add_node?lon=...&lat=... request. 074 * @param args 075 */ 076 private void addNode(Map<String, String> args){ 077 078 // Parse the arguments 079 Main.info("Adding node at (" + lat + ", " + lon + ")"); 080 081 // Create a new node 082 LatLon ll = new LatLon(lat, lon); 083 084 Node nd = null; 085 086 if (Main.isDisplayingMapView()) { 087 Point p = Main.map.mapView.getPoint(ll); 088 nd = Main.map.mapView.getNearestNode(p, OsmPrimitive.isUsablePredicate); 089 if (nd!=null && nd.getCoor().greatCircleDistance(ll) > Main.pref.getDouble("remotecontrol.tolerance", 0.1)) { 090 nd = null; // node is too far 091 } 092 } 093 094 if (nd==null) { 095 nd = new Node(ll); 096 // Now execute the commands to add this node. 097 Main.main.undoRedo.add(new AddCommand(nd)); 098 } 099 100 Main.main.getCurrentDataSet().setSelected(nd); 101 if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) { 102 AutoScaleAction.autoScale("selection"); 103 } else { 104 Main.map.mapView.repaint(); 105 } 106 // parse parameter addtags=tag1=value1|tag2=vlaue2 107 AddTagsDialog.addTags(args, sender); 108 } 109 110 @Override 111 protected void validateRequest() throws RequestHandlerBadRequestException { 112 try { 113 lat = Double.parseDouble(args.get("lat")); 114 lon = Double.parseDouble(args.get("lon")); 115 } catch (NumberFormatException e) { 116 throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")"); 117 } 118 if (!Main.main.hasEditLayer()) { 119 throw new RequestHandlerBadRequestException(tr("There is no layer opened to add node")); 120 } 121 } 122}