// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.datatransfer.importers; import java.awt.Component; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.TransferHandler.TransferSupport; import org.openstreetmap.josm.actions.OpenLocationAction; import org.openstreetmap.josm.data.coor.EastNorth; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.layer.OsmDataLayer; /** * Handles the paste / drop of an OSM address. * <p> * e.g. http://www.openstreetmap.org/node/123 downloads node 123 * * @author Michael Zangl * @since 10881 */ public class OsmLinkPaster extends AbstractOsmDataPaster { static final class NoWarnOpenLocationAction extends OpenLocationAction { @Override protected void warnNoSuitableTasks(String url) { // ignore this. } } private static final String OSM_SERVER = "^https?\\://(\\w+\\.)?(osm|openstreetmap)\\.org/"; /** * Create a new Osm address paster */ public OsmLinkPaster() { super(DataFlavor.stringFlavor); } @Override public boolean importData(TransferSupport support, OsmDataLayer layer, EastNorth pasteAt) throws UnsupportedFlavorException, IOException { if (!supports(support)) { throw new UnsupportedFlavorException(df); } String transferData = (String) support.getTransferable().getTransferData(df); if (new NoWarnOpenLocationAction().openUrl(transferData)) { return true; } LatLon ll = parseLatLon(transferData); if (ll != null) { Component comp = support.getComponent(); if (comp instanceof MapView) { ((MapView) comp).zoomTo(ll); } } return false; } static LatLon parseLatLon(String transferData) { Matcher matcher = Pattern .compile(OSM_SERVER + "#map=(?<zoom>\\d+)/(?<lat>-?\\d+\\.\\d+)/(?<lon>-?\\d+\\.\\d+)$") .matcher(transferData); if (!matcher.matches()) { return null; } else { return new LatLon(Double.parseDouble(matcher.group("lat")), Double.parseDouble(matcher.group("lon"))); } } }