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.Serializable;
008import java.util.ArrayList;
009import java.util.Collection;
010
011import org.openstreetmap.josm.data.osm.RelationMember;
012import org.openstreetmap.josm.data.osm.RelationMemberData;
013import org.openstreetmap.josm.gui.DefaultNameFormatter;
014import org.openstreetmap.josm.tools.CheckParameterUtil;
015
016/**
017 * Transferable objects for {@link RelationMemberData}.
018 * @since 9368
019 */
020public class RelationMemberTransferable implements Transferable {
021
022    /**
023     * A wrapper for a collection of {@link RelationMemberData}.
024     */
025    public static final class Data implements Serializable {
026        private static final long serialVersionUID = -8432393711635811029L;
027        private final Collection<RelationMemberData> relationMemberDatas;
028
029        private Data(Collection<RelationMemberData> primitiveData) {
030            CheckParameterUtil.ensureThat(primitiveData instanceof Serializable, "primitiveData must be instanceof Serializable");
031            this.relationMemberDatas = primitiveData;
032        }
033
034        /**
035         * Returns the contained {@link RelationMemberData}
036         * @return the contained {@link RelationMemberData}
037         */
038        public Collection<RelationMemberData> getRelationMemberData() {
039            return relationMemberDatas;
040        }
041    }
042
043    /**
044     * Data flavor for {@link RelationMemberData} which is wrapped in {@link Data}.
045     */
046    public static final DataFlavor RELATION_MEMBER_DATA = new DataFlavor(Data.class, Data.class.getName());
047    private final Collection<RelationMember> members;
048
049    /**
050     * Constructs a new {@code RelationMemberTransferable}.
051     * @param members list of relation members
052     */
053    public RelationMemberTransferable(Collection<RelationMember> members) {
054        this.members = members;
055    }
056
057    @Override
058    public DataFlavor[] getTransferDataFlavors() {
059        return new DataFlavor[]{RELATION_MEMBER_DATA, DataFlavor.stringFlavor};
060    }
061
062    @Override
063    public boolean isDataFlavorSupported(DataFlavor flavor) {
064        return flavor == RELATION_MEMBER_DATA;
065    }
066
067    @Override
068    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
069        if (DataFlavor.stringFlavor.equals(flavor)) {
070            return getStringData();
071        } else if (RELATION_MEMBER_DATA.equals(flavor)) {
072            return getRelationMemberData();
073        }
074        throw new UnsupportedFlavorException(flavor);
075    }
076
077    protected String getStringData() {
078        final StringBuilder sb = new StringBuilder();
079        for (RelationMember member : members) {
080            sb.append(member.getType())
081              .append(' ').append(member.getUniqueId())
082              .append(' ').append(member.getRole())
083              .append(" # ").append(member.getMember().getDisplayName(DefaultNameFormatter.getInstance()))
084              .append('\n');
085        }
086        return sb.toString().replace("\u200E", "").replace("\u200F", "");
087    }
088
089    protected Data getRelationMemberData() {
090        final Collection<RelationMemberData> r = new ArrayList<>(members.size());
091        for (RelationMember member : members) {
092            r.add(new RelationMemberData(member.getRole(), member.getType(), member.getUniqueId()));
093        }
094        return new Data(r);
095    }
096}