001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.datatransfer;
003
004import java.awt.datatransfer.DataFlavor;
005import java.awt.datatransfer.Transferable;
006import java.awt.datatransfer.UnsupportedFlavorException;
007import java.io.IOException;
008import java.util.Map.Entry;
009import java.util.stream.Stream;
010
011import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData;
012
013/**
014 * This is a transferable that only transfers the tags.
015 * @author Michael Zangl
016 * @since 10637
017 */
018public class TagTransferable implements Transferable {
019    private final TagTransferData data;
020
021    /**
022     * Transfer the tag transfer data.
023     * @param data The data.
024     */
025    public TagTransferable(TagTransferData data) {
026        this.data = data;
027    }
028
029    @Override
030    public DataFlavor[] getTransferDataFlavors() {
031        return new DataFlavor[] {TagTransferData.FLAVOR, DataFlavor.stringFlavor};
032    }
033
034    @Override
035    public boolean isDataFlavorSupported(DataFlavor flavor) {
036        return Stream.of(getTransferDataFlavors()).anyMatch(f -> f.equals(flavor));
037    }
038
039    @Override
040    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
041        if (DataFlavor.stringFlavor.equals(flavor)) {
042            return getStringData();
043        } else if (TagTransferData.FLAVOR.equals(flavor)) {
044            return data;
045        } else {
046            throw new UnsupportedFlavorException(flavor);
047        }
048    }
049
050    private String getStringData() {
051        StringBuilder string = new StringBuilder();
052        for (Entry<String, String> e : data.getTags().entrySet()) {
053            if (string.length() > 0) {
054                string.append('\n');
055            }
056            string.append(e.getKey());
057            string.append('=');
058            string.append(e.getValue());
059        }
060        return string.toString();
061    }
062}