001package arcommon;
002
003import java.awt.Image;
004import java.awt.Toolkit;
005import java.awt.datatransfer.Clipboard;
006import java.awt.datatransfer.DataFlavor;
007import java.awt.datatransfer.StringSelection;
008import java.awt.datatransfer.Transferable;
009import java.awt.datatransfer.UnsupportedFlavorException;
010import java.awt.image.BufferedImage;
011import java.io.File;
012import java.io.IOException;
013import java.util.List;
014
015public class ClipboardUtil {
016    public static boolean isTextAvailable() {
017        return isFlavorAvailable(DataFlavor.stringFlavor);
018    }
019
020    public static boolean isHtmlAvailable() {
021        return isFlavorAvailable(DataFlavor.allHtmlFlavor);
022    }
023    
024    public static boolean isImageAvailable() {
025        return isFlavorAvailable(DataFlavor.imageFlavor);
026    }
027    
028    public static boolean isFilesAvailable() {
029        return isFlavorAvailable(DataFlavor.javaFileListFlavor);
030    }
031    
032    public static String readTextFromClipboard() {
033        Object transferData = readTransferDataFromClipboard(DataFlavor.stringFlavor);
034        if (!(transferData instanceof String)) {
035            return null;
036        }
037        return (String)transferData;
038    }
039    
040    public static void writeTextToClipboard(String text) {
041        if (text == null) {
042            throw new NullPointerException("text == null");
043        }
044        text = text.replace((char)0, ' ');
045        writeTransferDataToClipboard(new StringSelection(text));
046    }
047
048    public static String readHtmlFromClipboard() {
049        Object transferData = readTransferDataFromClipboard(DataFlavor.allHtmlFlavor);
050        if (!(transferData instanceof String)) {
051            return null;
052        }
053        return (String)transferData;
054    }
055    
056    @SuppressWarnings("unchecked")
057    public static List<File> readFilesFromClipboard() {
058        Object transferData = readTransferDataFromClipboard(DataFlavor.javaFileListFlavor);
059        if (!(transferData instanceof List)) {
060            return null;
061        }
062        return (List<File>)transferData;
063    }
064    
065    public static BufferedImage readImageFromClipboard() {
066        Object transferData = readTransferDataFromClipboard(DataFlavor.imageFlavor);
067        if (!(transferData instanceof BufferedImage)) {
068            return null;
069        }
070        return (BufferedImage)transferData;
071    }
072    
073    // Code copied from http://www.exampledepot.com/egs/java.awt.datatransfer/ToClipImg.html
074    private static class ImageSelection implements Transferable {
075        private Image image;
076
077        public ImageSelection(Image pimage) {
078            this.image = pimage;
079        }
080
081        // Returns supported flavors
082        public DataFlavor[] getTransferDataFlavors() {
083            return new DataFlavor[] {DataFlavor.imageFlavor};
084        }
085
086        // Returns true if flavor is supported
087        public boolean isDataFlavorSupported(DataFlavor flavor) {
088            return DataFlavor.imageFlavor.equals(flavor);
089        }
090
091        // Returns image
092        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
093            if (!DataFlavor.imageFlavor.equals(flavor)) {
094                throw new UnsupportedFlavorException(flavor);
095            }
096            return image;
097        }
098    };
099
100    public static void writeImageToClipboard(BufferedImage bufferedImage) {
101        writeTransferDataToClipboard(new ImageSelection(bufferedImage));
102    }
103
104    private static boolean isFlavorAvailable(DataFlavor dataFlavor) {
105        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
106        try {
107            return clipboard.isDataFlavorAvailable(dataFlavor);
108        } catch (IllegalStateException e) {
109            if (e.getMessage().equals("cannot open system clipboard")) {
110                return false;
111            }
112            throw e;
113        }
114    }
115    
116    private static Object readTransferDataFromClipboard(DataFlavor dataFlavor) {
117        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
118        try {
119            Transferable transferable = clipboard.getContents(null);
120            Object transferData = transferable.getTransferData(dataFlavor);
121            return transferData;
122        } catch (IllegalStateException e) {
123            if (e.getMessage().equals("cannot open system clipboard")) {
124                return null;
125            }
126            throw e;
127        } catch (UnsupportedFlavorException e) {
128            return null;
129        } catch (IOException e) {
130            return null;
131        }
132    }
133    
134    private static void writeTransferDataToClipboard(Transferable transferable) {
135        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
136        clipboard.setContents(transferable, null);
137    }
138}