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.IOException; 008import java.util.ArrayList; 009import java.util.Collections; 010import java.util.List; 011 012import org.openstreetmap.josm.gui.layer.Layer; 013import org.openstreetmap.josm.gui.layer.LayerManager; 014 015/** 016 * This class allows to transfer multiple layers in the current JOSM instance. 017 * @author Michael Zangl 018 * @since 10605 019 */ 020public class LayerTransferable implements Transferable { 021 022 /** 023 * A wrapper for a collection of {@link Layer}. 024 */ 025 public static class Data { 026 private final LayerManager manager; 027 private final List<Layer> layers; 028 029 /** 030 * Create a new data object 031 * @param manager The layer manager the layers are from. 032 * @param layers The layers. 033 */ 034 public Data(LayerManager manager, List<Layer> layers) { 035 super(); 036 this.manager = manager; 037 this.layers = new ArrayList<>(layers); 038 } 039 040 /** 041 * Gets the layer manager the layers belong to. 042 * @return The layer manager. It may be <code>null</code> 043 */ 044 public LayerManager getManager() { 045 return manager; 046 } 047 048 /** 049 * Gets the list of layers that were copied. 050 * @return The layers. 051 */ 052 public List<Layer> getLayers() { 053 return Collections.unmodifiableList(layers); 054 } 055 056 @Override 057 public String toString() { 058 return "Data [layers=" + layers + ']'; 059 } 060 } 061 062 /** 063 * Data flavor for {@link Layer}s which are wrapped in {@link Data}. 064 */ 065 public static final DataFlavor LAYER_DATA = ClipboardUtils.newDataFlavor(Data.class, "Layers"); 066 067 private final Data data; 068 069 /** 070 * Create a new data object 071 * @param manager The layer manager the layers are from. 072 * @param layers The layers. 073 */ 074 public LayerTransferable(LayerManager manager, List<Layer> layers) { 075 this.data = new Data(manager, layers); 076 } 077 078 @Override 079 public DataFlavor[] getTransferDataFlavors() { 080 return new DataFlavor[] {LAYER_DATA}; 081 } 082 083 @Override 084 public boolean isDataFlavorSupported(DataFlavor flavor) { 085 return LAYER_DATA.equals(flavor); 086 } 087 088 @Override 089 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 090 if (!isDataFlavorSupported(flavor)) { 091 throw new UnsupportedFlavorException(flavor); 092 } else { 093 return data; 094 } 095 } 096}