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

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

fix #12900 - Conflicts in pasted tags cannot be resolved, cannot be resolved to "none" (patch by michael2402) - gsoc-core

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