// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.datatransfer;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.data.osm.RelationMemberData;
import org.openstreetmap.josm.gui.DefaultNameFormatter;
import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
import org.openstreetmap.josm.tools.CheckParameterUtil;
/**
* Transferable objects for {@link RelationMemberData}.
* @since 9368
*/
public class RelationMemberTransferable implements Transferable {
/**
* A wrapper for a collection of {@link RelationMemberData}.
*/
public static final class Data implements Serializable {
private static final long serialVersionUID = -8432393711635811029L;
private final Collection<RelationMemberData> relationMemberDatas;
private Data(Collection<RelationMemberData> primitiveData) {
CheckParameterUtil.ensureThat(primitiveData instanceof Serializable, "primitiveData must be instanceof Serializable");
this.relationMemberDatas = primitiveData;
}
/**
* Returns the contained {@link RelationMemberData}
* @return the contained {@link RelationMemberData}
*/
public Collection<RelationMemberData> getRelationMemberData() {
return Collections.unmodifiableCollection(relationMemberDatas);
}
/**
* Gets the Data for the given list of members.
* @param members The collection. The order is preserved.
* @return The data.
*/
public static Data getData(Collection<RelationMember> members) {
final Collection<RelationMemberData> r = new ArrayList<>(members.size());
for (RelationMember member : members) {
r.add(new RelationMemberData(member.getRole(), member.getType(), member.getUniqueId()));
}
return new Data(r);
}
}
/**
* Data flavor for {@link RelationMemberData} which is wrapped in {@link Data}.
*/
public static final DataFlavor RELATION_MEMBER_DATA = new DataFlavor(Data.class, "Relation member");
private final Collection<RelationMember> members;
/**
* Constructs a new {@code RelationMemberTransferable}.
* @param members list of relation members
*/
public RelationMemberTransferable(Collection<RelationMember> members) {
this.members = new ArrayList<>(members);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{RELATION_MEMBER_DATA, PrimitiveTransferData.DATA_FLAVOR, DataFlavor.stringFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return Arrays.asList(getTransferDataFlavors()).contains(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (DataFlavor.stringFlavor.equals(flavor)) {
return getStringData();
} else if (RELATION_MEMBER_DATA.equals(flavor)) {
return getRelationMemberData();
} else if (PrimitiveTransferData.DATA_FLAVOR.equals(flavor)) {
return getPrimitiveData();
}
throw new UnsupportedFlavorException(flavor);
}
private PrimitiveTransferData getPrimitiveData() {
Collection<OsmPrimitive> primitives = new HashSet<>();
for (RelationMember member : members) {
primitives.add(member.getMember());
}
return PrimitiveTransferData.getData(primitives);
}
protected String getStringData() {
final StringBuilder sb = new StringBuilder();
for (RelationMember member : members) {
sb.append(member.getType())
.append(' ').append(member.getUniqueId())
.append(' ').append(member.getRole())
.append(" # ").append(member.getMember().getDisplayName(DefaultNameFormatter.getInstance()))
.append('\n');
}
return sb.toString().replace("\u200E", "").replace("\u200F", "");
}
protected Data getRelationMemberData() {
return Data.getData(members);
}
}