package se.runa.clipboard;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
public class ClipboardManager implements ClipboardOwner {
private Logger logger = Logger.getLogger(getClass().getName());
private DataFlavor strategyDataFlavor = new DataFlavor(
ClipboardStrategy.class, "Strategy");
private static ClipboardManager instance = new ClipboardManager();
private ClipboardManager() {
}
public static ClipboardManager instance() {
return instance;
}
private void modifyFile(List<File> files, ClipboardStrategy strategy) {
Transferable contents = new FileContent(files, strategy);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(contents, this);
}
public void copy(List<File> files) {
modifyFile(files, ClipboardStrategy.COPY);
}
public void cut(List<File> files) {
modifyFile(files, ClipboardStrategy.MOVE);
}
private Object getContent(DataFlavor dataFlavor)
throws UnsupportedFlavorException, IOException {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable contents = clipboard.getContents(this);
if (contents != null && contents.isDataFlavorSupported(dataFlavor)) {
return contents.getTransferData(dataFlavor);
} else {
return null;
}
}
@SuppressWarnings("unchecked")
public List<File> getFileContent() throws IOException,
UnsupportedFlavorException {
return (List<File>) getContent(DataFlavor.javaFileListFlavor);
}
public ClipboardStrategy getStrategyContent()
throws UnsupportedFlavorException, IOException {
ClipboardStrategy strategy = (ClipboardStrategy) getContent(strategyDataFlavor);
return strategy == null ? ClipboardStrategy.COPY : strategy;
}
@Override
public void lostOwnership(Clipboard clipboard, Transferable contents) {
logger.info(String.valueOf(contents));
clipboard.setContents(contents, this);
}
private static class FileContent implements Transferable, Serializable {
private static final long serialVersionUID = -8248783625881260945L;
private Map<DataFlavor, Object> map;
public FileContent(List<File> files, ClipboardStrategy strategy) {
map = new HashMap<DataFlavor, Object>();
map.put(DataFlavor.javaFileListFlavor, files);
map.put(new DataFlavor(ClipboardStrategy.class, "Strategy"),
strategy);
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (map.containsKey(flavor)) {
return map.get(flavor);
} else {
throw new UnsupportedFlavorException(flavor);
}
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return map.keySet().toArray(new DataFlavor[] {});
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return map.containsKey(flavor);
}
}
}