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}