001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import java.awt.datatransfer.FlavorEvent;
005import java.awt.datatransfer.FlavorListener;
006import java.awt.event.ActionEvent;
007import java.util.Optional;
008
009import javax.swing.TransferHandler.TransferSupport;
010
011import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
012import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
013import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
014import org.openstreetmap.josm.gui.dialogs.relation.MemberTransferHandler;
015import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016import org.openstreetmap.josm.tools.Logging;
017
018/**
019 * Paste members.
020 * @since 9496
021 */
022public class PasteMembersAction extends AddFromSelectionAction implements FlavorListener {
023
024    /**
025     * Constructs a new {@code PasteMembersAction}.
026     * @param memberTable member table
027     * @param layer OSM data layer
028     * @param editor relation editor
029     */
030    public PasteMembersAction(MemberTable memberTable, OsmDataLayer layer, IRelationEditor editor) {
031        super(memberTable, null, null, null, null, layer, editor);
032        updateEnabledState();
033    }
034
035    @Override
036    public void actionPerformed(ActionEvent e) {
037        try {
038            new MemberTransferHandler().importData(getSupport());
039        } catch (IllegalStateException ex) {
040            Logging.error(ex);
041        }
042    }
043
044    private TransferSupport getSupport() {
045        return new TransferSupport(memberTable, Optional.ofNullable(ClipboardUtils.getClipboardContent())
046                .orElseThrow(() -> new IllegalStateException("Failed to retrieve clipboard content")));
047    }
048
049    @Override
050    protected void updateEnabledState() {
051        try {
052            setEnabled(new MemberTransferHandler().canImport(getSupport()));
053        } catch (IllegalStateException ex) {
054            Logging.error(ex);
055        }
056    }
057
058    @Override
059    public void flavorsChanged(FlavorEvent e) {
060        updateEnabledState();
061    }
062}