package org.korsakow.ide.util; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.io.IOException; import org.apache.log4j.Logger; import org.korsakow.ide.ui.dnd.EmptyTransferable; import org.korsakow.ide.ui.dnd.TransferableTreeTableNodes; public class ClipboardHelper { public static class ClipboardResult { private Transferable transferable; private int action; public ClipboardResult(Transferable transferable, int action) { this.transferable = transferable; this.action = action; } public Transferable getTransferable() { return transferable; } public int getAction() { return action; } } private static class CopyCutProxy implements Transferable { int action; private Transferable innerTransferable; public CopyCutProxy(int action, Transferable t) { this.action = action; this.innerTransferable = t; } public int getAction() { return action; } public Transferable getTransferable() { return innerTransferable; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (CopyCutFlavor.match(flavor)) return this; return innerTransferable.getTransferData(flavor); } public DataFlavor[] getTransferDataFlavors() { return innerTransferable.getTransferDataFlavors(); } public boolean isDataFlavorSupported(DataFlavor flavor) { if (CopyCutFlavor.match(flavor)) return true; return innerTransferable.isDataFlavorSupported(flavor); } } private static DataFlavor CopyCutFlavor = new DataFlavor(CopyCutProxy.class, ""); public static void copy(Transferable t) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable transferable = new CopyCutProxy(DnDConstants.ACTION_COPY, t); clipboard.setContents(transferable, null); } public static void cut(Transferable t) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable transferable = new CopyCutProxy(DnDConstants.ACTION_MOVE, t); clipboard.setContents(transferable, null); } public static ClipboardResult paste() { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable t = clipboard.getContents(null); int action = DnDConstants.ACTION_COPY_OR_MOVE; if (t.isDataFlavorSupported(CopyCutFlavor)) { CopyCutProxy proxy = null; try { proxy = (CopyCutProxy)t.getTransferData(CopyCutFlavor); action = proxy.getAction(); t = proxy.getTransferable(); } catch (UnsupportedFlavorException e) { // this is one of those "will never happen" situations Logger.getLogger(ClipboardHelper.class).error("", e); } catch (IOException e) { // worse case they just get a general copy_or_move operation Logger.getLogger(ClipboardHelper.class).error("", e); } } if (action == DnDConstants.ACTION_MOVE) { clipboard.setContents(new EmptyTransferable(), null); } return new ClipboardResult(t, action); } }