source: josm/trunk/src/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandler.java@ 10604

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

fix #12478, fix #12565, fix #11114 - Use ​Swing Copy/Paste instead of CopyAction/PasteAction with custom buffer (patch by michael2402, modified) - gsoc-core

File size: 4.5 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.io.IOException;
8import java.util.Arrays;
9import java.util.Collection;
10
11import javax.swing.TransferHandler;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.data.coor.EastNorth;
15import org.openstreetmap.josm.data.osm.OsmPrimitive;
16import org.openstreetmap.josm.gui.datatransfer.importers.AbstractOsmDataPaster;
17import org.openstreetmap.josm.gui.datatransfer.importers.FilePaster;
18import org.openstreetmap.josm.gui.datatransfer.importers.PrimitiveDataPaster;
19import org.openstreetmap.josm.gui.datatransfer.importers.TagTransferPaster;
20import org.openstreetmap.josm.gui.datatransfer.importers.TextTagPaster;
21import org.openstreetmap.josm.gui.layer.OsmDataLayer;
22
23/**
24 * This transfer hanlder provides the ability to transfer OSM data. It allows you to receive files, primitives or tags.
25 * @author Michael Zangl
26 * @since 10604
27 */
28public class OsmTransferHandler extends TransferHandler {
29
30 private static final Collection<AbstractOsmDataPaster> SUPPORTED = Arrays.asList(
31 new FilePaster(), new PrimitiveDataPaster(),
32 new TagTransferPaster(), new TextTagPaster());
33
34 @Override
35 public boolean canImport(TransferSupport support) {
36 // import everything for now, only support copy.
37 for (AbstractOsmDataPaster df : SUPPORTED) {
38 if (df.supports(support)) {
39 return true;
40 }
41 }
42 return false;
43 }
44
45 @Override
46 public boolean importData(TransferSupport support) {
47 return importData(support, Main.getLayerManager().getEditLayer(), null);
48 }
49
50 private boolean importData(TransferSupport support, OsmDataLayer layer, EastNorth center) {
51 for (AbstractOsmDataPaster df : SUPPORTED) {
52 if (df.supports(support)) {
53 try {
54 if (df.importData(support, layer, center)) {
55 return true;
56 }
57 } catch (UnsupportedFlavorException | IOException e) {
58 Main.warn(e);
59 }
60 }
61 }
62 return super.importData(support);
63 }
64
65 private boolean importTags(TransferSupport support, Collection<? extends OsmPrimitive> primitives) {
66 for (AbstractOsmDataPaster df : SUPPORTED) {
67 if (df.supports(support)) {
68 try {
69 if (df.importTagsOn(support, primitives)) {
70 return true;
71 }
72 } catch (UnsupportedFlavorException | IOException e) {
73 Main.warn(e);
74 }
75 }
76 }
77 return super.importData(support);
78 }
79
80 /**
81 * Paste the current clipboard current at the given position
82 * @param editLayer The layer to paste on.
83 * @param mPosition The position to paste at.
84 */
85 public void pasteOn(OsmDataLayer editLayer, EastNorth mPosition) {
86 Transferable transferable = ClipboardUtils.getClipboard().getContents(null);
87 pasteOn(editLayer, mPosition, transferable);
88 }
89
90 /**
91 * Paste the given clipboard current at the given position
92 * @param editLayer The layer to paste on.
93 * @param mPosition The position to paste at.
94 * @param transferable The transferable to use.
95 */
96 public void pasteOn(OsmDataLayer editLayer, EastNorth mPosition, Transferable transferable) {
97 importData(new TransferSupport(Main.panel, transferable), editLayer, mPosition);
98 }
99
100 /**
101 * Paste the given tags on the primitives.
102 * @param primitives The primitives to paste on.
103 */
104 public void pasteTags(Collection<? extends OsmPrimitive> primitives) {
105 Transferable transferable = ClipboardUtils.getClipboard().getContents(null);
106 importTags(new TransferSupport(Main.panel, transferable), primitives);
107 }
108
109 /**
110 * Check if any primitive data or any other supported data is available in the clipboard.
111 * @return <code>true</code> if any flavor is supported.
112 */
113 public boolean isDataAvailable() {
114 Collection<DataFlavor> available = Arrays.asList(ClipboardUtils.getClipboard().getAvailableDataFlavors());
115 for (AbstractOsmDataPaster s : SUPPORTED) {
116 if (s.supports(available)) {
117 return true;
118 }
119 }
120 return false;
121 }
122}
Note: See TracBrowser for help on using the repository browser.