// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.datatransfer;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.gui.datatransfer.importers.AbstractOsmDataPaster;
import org.openstreetmap.josm.gui.datatransfer.importers.FilePaster;
import org.openstreetmap.josm.gui.datatransfer.importers.OsmLinkPaster;
import org.openstreetmap.josm.gui.datatransfer.importers.PrimitiveDataPaster;
import org.openstreetmap.josm.gui.datatransfer.importers.PrimitiveTagTransferPaster;
import org.openstreetmap.josm.gui.datatransfer.importers.TagTransferPaster;
import org.openstreetmap.josm.gui.datatransfer.importers.TextTagPaster;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
/**
* This transfer hanlder provides the ability to transfer OSM data. It allows you to receive files, primitives or tags.
* @author Michael Zangl
* @since 10604
*/
public class OsmTransferHandler extends AbstractStackTransferHandler {
private static final Collection<AbstractOsmDataPaster> SUPPORTED = Arrays.asList(
new FilePaster(), new PrimitiveDataPaster(),
new PrimitiveTagTransferPaster(),
new TagTransferPaster(), new OsmLinkPaster(), new TextTagPaster());
@Override
protected Collection<AbstractOsmDataPaster> getSupportedPasters() {
return Collections.unmodifiableCollection(SUPPORTED);
}
private boolean importTags(TransferSupport support, Collection<? extends OsmPrimitive> primitives) {
for (AbstractOsmDataPaster df : SUPPORTED) {
if (df.supports(support)) {
try {
if (df.importTagsOn(support, primitives)) {
return true;
}
} catch (UnsupportedFlavorException | IOException e) {
Main.warn(e);
}
}
}
return super.importData(support);
}
/**
* Paste the current clipboard current at the given position
* @param editLayer The layer to paste on.
* @param mPosition The position to paste at. If it is <code>null</code>, the original position will be used.
*/
public void pasteOn(OsmDataLayer editLayer, EastNorth mPosition) {
Transferable transferable = ClipboardUtils.getClipboardContent();
pasteOn(editLayer, mPosition, transferable);
}
/**
* Paste the given clipboard current at the given position
* @param editLayer The layer to paste on.
* @param mPosition The position to paste at. If it is <code>null</code>, the original position will be used.
* @param transferable The transferable to use.
*/
public void pasteOn(OsmDataLayer editLayer, EastNorth mPosition, Transferable transferable) {
importData(new TransferSupport(Main.panel, transferable), editLayer, mPosition);
}
/**
* Paste the given tags on the primitives.
* @param primitives The primitives to paste on.
*/
public void pasteTags(Collection<? extends OsmPrimitive> primitives) {
Transferable transferable = ClipboardUtils.getClipboardContent();
importTags(new TransferSupport(Main.panel, transferable), primitives);
}
/**
* Check if any primitive data or any other supported data is available in the clipboard.
* @return <code>true</code> if any flavor is supported.
*/
public boolean isDataAvailable() {
try {
Collection<DataFlavor> available = Arrays.asList(ClipboardUtils.getClipboard().getAvailableDataFlavors());
for (AbstractOsmDataPaster s : SUPPORTED) {
if (s.supports(available)) {
return true;
}
}
} catch (IllegalStateException e) {
Main.debug(e);
} catch (NullPointerException e) { // NOPMD
// JDK-6322854: On Linux/X11, NPE can happen for unknown reasons, on all versions of Java
Main.error(e);
}
return false;
}
}