source: josm/trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java@ 11015

Last change on this file since 11015 was 10812, checked in by Don-vip, 8 years ago

fix #13313 - Copy no longer only copies the selected object ID to clipboard (patch by michael2402) - gsoc-core

File size: 3.7 KB
RevLine 
[9369]1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.datatransfer;
3
4import java.awt.datatransfer.DataFlavor;
5import java.awt.datatransfer.Transferable;
6import java.awt.datatransfer.UnsupportedFlavorException;
7import java.util.ArrayList;
[10604]8import java.util.Arrays;
9import java.util.List;
[9369]10
[10604]11import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
[9369]12import org.openstreetmap.josm.data.osm.PrimitiveData;
[10605]13import org.openstreetmap.josm.gui.datatransfer.data.OsmLayerTransferData;
[10737]14import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTagTransferData;
[10604]15import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
16import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData;
[10605]17import org.openstreetmap.josm.gui.layer.OsmDataLayer;
[9369]18
[9563]19/**
[10604]20 * Transferable objects for {@link PrimitiveTransferData} objects
[9563]21 * @since 9369
[10604]22 * @since 10604 Complete rework
[9563]23 */
[9369]24public class PrimitiveTransferable implements Transferable {
25
[9563]26 /**
[10604]27 * The flavors that are available for normal primitives.
[9563]28 */
[10604]29 private static final List<DataFlavor> PRIMITIVE_FLAVORS = Arrays.asList(PrimitiveTransferData.DATA_FLAVOR,
30 TagTransferData.FLAVOR, DataFlavor.stringFlavor);
31 private final PrimitiveTransferData primitives;
[10605]32 private OsmDataLayer sourceLayer;
[9711]33
34 /**
[9563]35 * Constructs a new {@code PrimitiveTransferable}.
36 * @param primitives collection of OSM primitives
37 */
[10604]38 public PrimitiveTransferable(PrimitiveTransferData primitives) {
[10605]39 this(primitives, null);
40 }
41
42 /**
43 * Constructs a new {@code PrimitiveTransferable}.
44 * @param primitives collection of OSM primitives
45 * @param sourceLayer The layer the primitives are copied from
46 */
47 public PrimitiveTransferable(PrimitiveTransferData primitives, OsmDataLayer sourceLayer) {
[9563]48 this.primitives = primitives;
[10605]49 this.sourceLayer = sourceLayer;
[9369]50 }
51
52 @Override
53 public DataFlavor[] getTransferDataFlavors() {
[10604]54 ArrayList<DataFlavor> flavors = new ArrayList<>(PRIMITIVE_FLAVORS);
[10605]55 if (sourceLayer != null) {
56 flavors.addAll(OsmLayerTransferData.FLAVORS);
57 }
[10604]58 return flavors.toArray(new DataFlavor[flavors.size()]);
[9369]59 }
60
61 @Override
62 public boolean isDataFlavorSupported(DataFlavor flavor) {
[10604]63 DataFlavor[] flavors = getTransferDataFlavors();
64 for (DataFlavor f : flavors) {
65 if (flavor.equals(f)) {
66 return true;
67 }
68 }
69 return false;
[9369]70 }
71
72 @Override
73 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
74 if (DataFlavor.stringFlavor.equals(flavor)) {
75 return getStringData();
[10604]76 } else if (PrimitiveTransferData.DATA_FLAVOR.equals(flavor)) {
77 return primitives;
[10737]78 } else if (PrimitiveTagTransferData.FLAVOR.equals(flavor)) {
79 return new PrimitiveTagTransferData(primitives);
[10604]80 } else if (TagTransferData.FLAVOR.equals(flavor)) {
81 return new TagTransferData(primitives.getDirectlyAdded());
[10605]82 } else if (sourceLayer != null && OsmLayerTransferData.FLAVORS.contains(flavor)) {
83 return new OsmLayerTransferData(null, sourceLayer);
[10604]84 } else {
85 throw new UnsupportedFlavorException(flavor);
[9369]86 }
87 }
88
89 protected String getStringData() {
90 final StringBuilder sb = new StringBuilder();
[10812]91 for (PrimitiveData primitive : primitives.getDirectlyAdded()) {
[10604]92 if (sb.length() > 0) {
93 sb.append("\n");
94 }
95 sb.append(OsmPrimitiveType.from(primitive).getAPIName()).append(' ').append(primitive.getId());
[9369]96 }
97 return sb.toString().replace("\u200E", "").replace("\u200F", "");
98 }
99}
Note: See TracBrowser for help on using the repository browser.