package net.sf.nmedit.nmutils.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.BufferedReader; import java.io.File; import java.io.Reader; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import net.sf.nmedit.nmutils.Platform; public class FileDnd { public static List<File> getTransferableFiles(DataFlavor flavor, Transferable transferable) { flavor = getFileFlavor(transferable.getTransferDataFlavors()); List<File> files = new ArrayList<File>(); if (flavor == null) return files; try { BufferedReader r = new BufferedReader(flavor.getReaderForText(transferable)); String line; while ((line=r.readLine())!=null) { if (line.startsWith("file:")) { URI uri = URI.create(line); if (uri.getAuthority() != null && uri.getAuthority().equals("localhost") && uri.getScheme() != null && uri.getScheme().equals("file")) { // OSX has file://localhost/bla uris, transform them for java.io.File uri = new URI(uri.getScheme(), uri.getPath(), uri.getFragment()); } if (Platform.isFlavor(Platform.OS.MacOSFlavor)) { if (uri.getAuthority() == null && uri.getScheme().equals("file")) { uri = new URI(uri.getScheme(), uri.getPath(), uri.getFragment()); } } File file = new File(uri); if (file.exists()) { files.add(file); } else { } } } r.close(); // always close stream } catch (Throwable e) { Log log = LogFactory.getLog(FileDnd.class); if (log.isTraceEnabled()) { log.trace("getTransferableFiles(DataFlavor "+flavor+", Transferable " +transferable+") failed", e); } return null; } return files; } public static DataFlavor getFileFlavor(DataFlavor[] flavors) { for (DataFlavor f: flavors) { if (f.isMimeTypeEqual("text/uri-list") && f.isFlavorTextType()) { return f; } } return null; } public static boolean testFileFlavor(DataFlavor[] list) { for (DataFlavor f: list) if(f.isMimeTypeEqual("text/uri-list") && f.isFlavorTextType()) return true; return false; } public static boolean isPatchStringFlavor(DataFlavor f) { if (f.isFlavorTextType() && (f.getHumanPresentableName().contains("patch") || f.getHumanPresentableName().contains("Patch"))) { return true; } if (f.getRepresentationClass().equals(java.lang.String.class) && f.getHumanPresentableName().equals("patch string")) return true; return false; } public static boolean isPatchStringFlavor(DataFlavor[] transferDataFlavors) { for (DataFlavor f : transferDataFlavors) { if (isPatchStringFlavor(f)) return true; } return false; } public static String getPatchString(Transferable t) { DataFlavor f = getPatchStringFlavor(t.getTransferDataFlavors()); if (f == null) return null; Reader r; try { r = f.getReaderForText(t); StringBuffer buf = new StringBuffer(); int c; while ((c = r.read()) != -1) { buf.append((char)c); } r.close(); return buf.toString(); } catch (Exception e) { Log log = LogFactory.getLog(FileDnd.class); if (log.isTraceEnabled()) { log.trace("getPatchString(Transferable "+t+") failed", e); } } return null; } public static DataFlavor getPatchStringFlavor(DataFlavor[] flavors) { for (DataFlavor f: flavors) { if (isPatchStringFlavor(f)) return f; } return null; } }