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        Map<String, String> tags = getTagsImpl(support);
043        return tags != null && !tags.isEmpty();
044    }
045
046    @Override
047    protected Map<String, String> getTags(TransferSupport support) throws UnsupportedFlavorException, IOException {
048        Map<String, String> tags = getTagsImpl(support);
049        if (tags == null || tags.isEmpty()) {
050            TextTagParser.showBadBufferMessage(help);
051            throw new IOException("Invalid tags to paste.");
052        }
053        if (!TextTagParser.validateTags(tags)) {
054            throw new IOException("Tags to paste are not valid.");
055        }
056        return tags;
057    }
058
059    private Map<String, String> getTagsImpl(TransferSupport support) throws UnsupportedFlavorException, IOException {
060        return TextTagParser.readTagsFromText((String) support.getTransferable().getTransferData(df));
061    }
062}