001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.datatransfer.importers;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005
006import java.awt.datatransfer.DataFlavor;
007import java.awt.datatransfer.UnsupportedFlavorException;
008import java.io.IOException;
009import java.util.Map;
010
011import javax.swing.TransferHandler.TransferSupport;
012
013import org.openstreetmap.josm.Main;
014import org.openstreetmap.josm.tools.TextTagParser;
015
016/**
017 * This transfer support allows us to import tags from the text that was copied to the clipboard.
018 * @author Michael Zangl
019 * @since 10604
020 */
021public final class TextTagPaster extends AbstractTagPaster {
022    private static final String help = ht("/Action/PasteTags");
023
024    /**
025     * Create a new {@link TextTagPaster}
026     */
027    public TextTagPaster() {
028        super(DataFlavor.stringFlavor);
029    }
030
031    @Override
032    public boolean supports(TransferSupport support) {
033        try {
034            return super.supports(support) && containsValidTags(support);
035        } catch (UnsupportedFlavorException | IOException e) {
036            Main.warn(e);
037            return false;
038        }
039    }
040
041    private boolean containsValidTags(TransferSupport support) throws UnsupportedFlavorException, IOException {
042        return !getTagsImpl(support).isEmpty();
043    }
044
045    @Override
046    protected Map<String, String> getTags(TransferSupport support) throws UnsupportedFlavorException, IOException {
047        Map<String, String> tags = getTagsImpl(support);
048        if (tags.isEmpty()) {
049            TextTagParser.showBadBufferMessage(help);
050            throw new IOException("Invalid tags to paste.");
051        }
052        if (!TextTagParser.validateTags(tags)) {
053            throw new IOException("Tags to paste are not valid.");
054        }
055        return tags;
056    }
057
058    private Map<String, String> getTagsImpl(TransferSupport support) throws UnsupportedFlavorException, IOException {
059        return TextTagParser.readTagsFromText((String) support.getTransferable().getTransferData(df));
060    }
061}