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}