package com.revolsys.swing.tree.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.tree.TreePath; public class TreePathListTransferable implements Transferable { public static final DataFlavor FLAVOR; public static final DataFlavor[] FLAVORS; static { try { final String mimeType = DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" + TreePathListTransferable.class.getName() + "\""; FLAVOR = new DataFlavor(mimeType); } catch (final ClassNotFoundException e) { throw new RuntimeException("Flavour not supported"); } FLAVORS = new DataFlavor[] { FLAVOR }; } private final Set<TreePath> copiedPaths = new HashSet<>(); private final Set<TreePath> movedPaths = new HashSet<>(); private final List<TreePath> paths; private final Map<TreePath, Boolean> sameParent = new HashMap<>(); public TreePathListTransferable(final List<TreePath> paths) { this.paths = paths; } public TreePathListTransferable(final TreePath... paths) { this(Arrays.asList(paths)); } public void addCopiedPath(final TreePath path) { this.copiedPaths.add(path); } public void addMovedPath(final TreePath path) { this.movedPaths.add(path); } public Set<TreePath> getCopiedPaths() { return this.copiedPaths; } public Set<TreePath> getMovedPaths() { return this.movedPaths; } public List<TreePath> getPaths() { return this.paths; } @Override public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return this; } else { throw new UnsupportedFlavorException(flavor); } } @Override public DataFlavor[] getTransferDataFlavors() { return FLAVORS; } public boolean isCopied(final TreePath path) { return this.copiedPaths.contains(path); } @Override public boolean isDataFlavorSupported(final DataFlavor flavor) { final boolean supported = FLAVOR.equals(flavor); return supported; } public boolean isMoved(final TreePath path) { return this.movedPaths.contains(path); } public boolean isSameParent(final TreePath path) { return this.sameParent.containsKey(path); } public void reset() { this.copiedPaths.clear(); this.movedPaths.clear(); } public void setSameParent(final TreePath path) { this.sameParent.put(path, Boolean.TRUE); } }