package org.rr.commons.swing.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; import java.util.List; import java.util.logging.Level; import org.rr.commons.log.LoggerFactory; import org.rr.commons.utils.StringUtil; public class URIListTransferable implements Transferable { public static DataFlavor uriListDataFlavor = null; public static DataFlavor gnomeCopiedFilesDataFlavor = null; private static DataFlavor[] allSupportedDataFlavors = null; static { try { uriListDataFlavor = new DataFlavor("text/uri-list;class=java.io.InputStream"); gnomeCopiedFilesDataFlavor = new DataFlavor("x-special/gnome-copied-files;class=java.io.InputStream"); allSupportedDataFlavors = new DataFlavor[] { uriListDataFlavor, gnomeCopiedFilesDataFlavor }; } catch (ClassNotFoundException e) { LoggerFactory.getLogger().log(Level.WARNING, "Failed initialize clipboard clafor types.", e); } } private List<URI> uris; private String action; private static String LINE_BREAK = "\n"; public URIListTransferable(List<URI> uris, String action) { this.uris = uris; this.action = action; } public DataFlavor[] getTransferDataFlavors() { return allSupportedDataFlavors; } public boolean isDataFlavorSupported(DataFlavor flavor) { boolean result = flavor.getMimeType().indexOf("x-special/gnome-copied-files") != -1 || flavor.getMimeType().indexOf("text/uri-list") != -1; return result; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (!isDataFlavorSupported(flavor)) { throw new UnsupportedFlavorException(flavor); } StringBuilder buffer = new StringBuilder(); for(URI uri : uris) { String uriString = uri.toString(); uriString = StringUtil.replace(uriString, "file:", "file://"); buffer.append(uriString).append(LINE_BREAK); } String transferString = buffer.toString(); if(transferString.endsWith(LINE_BREAK)) { transferString = transferString.substring(0, transferString.length() - LINE_BREAK.length()); } String addAction = addAction(transferString); return new ByteArrayInputStream(addAction.getBytes()); } private String addAction(String transferString) { if(action != null && action.length() > 0) { return "copy\n" + transferString; } return transferString; } }