// 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.util.ArrayList; import java.util.Arrays; import java.util.List; import org.openstreetmap.josm.data.osm.OsmPrimitiveType; import org.openstreetmap.josm.data.osm.PrimitiveData; import org.openstreetmap.josm.gui.datatransfer.data.OsmLayerTransferData; import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTagTransferData; import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData; import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData; import org.openstreetmap.josm.gui.layer.OsmDataLayer; /** * Transferable objects for {@link PrimitiveTransferData} objects * @since 9369 * @since 10604 Complete rework */ public class PrimitiveTransferable implements Transferable { /** * The flavors that are available for normal primitives. */ private static final List<DataFlavor> PRIMITIVE_FLAVORS = Arrays.asList(PrimitiveTransferData.DATA_FLAVOR, TagTransferData.FLAVOR, DataFlavor.stringFlavor); private final PrimitiveTransferData primitives; private OsmDataLayer sourceLayer; /** * Constructs a new {@code PrimitiveTransferable}. * @param primitives collection of OSM primitives */ public PrimitiveTransferable(PrimitiveTransferData primitives) { this(primitives, null); } /** * Constructs a new {@code PrimitiveTransferable}. * @param primitives collection of OSM primitives * @param sourceLayer The layer the primitives are copied from */ public PrimitiveTransferable(PrimitiveTransferData primitives, OsmDataLayer sourceLayer) { this.primitives = primitives; this.sourceLayer = sourceLayer; } @Override public DataFlavor[] getTransferDataFlavors() { ArrayList<DataFlavor> flavors = new ArrayList<>(PRIMITIVE_FLAVORS); if (sourceLayer != null) { flavors.addAll(OsmLayerTransferData.FLAVORS); } return flavors.toArray(new DataFlavor[flavors.size()]); } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { DataFlavor[] flavors = getTransferDataFlavors(); for (DataFlavor f : flavors) { if (flavor.equals(f)) { return true; } } return false; } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if (DataFlavor.stringFlavor.equals(flavor)) { return getStringData(); } else if (PrimitiveTransferData.DATA_FLAVOR.equals(flavor)) { return primitives; } else if (PrimitiveTagTransferData.FLAVOR.equals(flavor)) { return new PrimitiveTagTransferData(primitives); } else if (TagTransferData.FLAVOR.equals(flavor)) { return new TagTransferData(primitives.getDirectlyAdded()); } else if (sourceLayer != null && OsmLayerTransferData.FLAVORS.contains(flavor)) { return new OsmLayerTransferData(null, sourceLayer); } else { throw new UnsupportedFlavorException(flavor); } } protected String getStringData() { final StringBuilder sb = new StringBuilder(); for (PrimitiveData primitive : primitives.getDirectlyAdded()) { if (sb.length() > 0) { sb.append('\n'); } sb.append(OsmPrimitiveType.from(primitive).getAPIName()).append(' ').append(primitive.getId()); } return sb.toString().replace("\u200E", "").replace("\u200F", ""); } }