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}