package org.limewire.ui.swing.util; 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.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import javax.swing.TransferHandler.TransferSupport; import org.limewire.util.OSUtils; import org.limewire.util.URIUtils; /** * Static helper class with DND tasks that provides methods for handling URI and * file drops and also provides default transfer handlers. */ public class DNDUtils { public static final DataFlavor URIFlavor = createURIFlavor(); private static final List<DataFlavor> fileDataFlavors = new ArrayList<DataFlavor>(); static { if(OSUtils.isLinux()) { //the uri flavor does not play well with itunes on windows fileDataFlavors.add(URIFlavor); } fileDataFlavors.add(DataFlavor.javaFileListFlavor); } /** * Returns array of URIs extracted from transferable. * * @throws UnsupportedFlavorException * @throws IOException */ public static URI[] getURIs(Transferable transferable) throws UnsupportedFlavorException, IOException { String lines = (String) transferable.getTransferData(URIFlavor); StringTokenizer st = new StringTokenizer(lines, System.getProperty("line.separator")); ArrayList<URI> uris = new ArrayList<URI>(); while (st.hasMoreTokens()) { String line = st.nextToken().trim(); if (line.length() == 0) { continue; } try { URI uri = URIUtils.toURI(line); uris.add(uri); } catch (URISyntaxException e) { } } return uris.toArray(new URI[uris.size()]); } /** * Checks for {@link DataFlavor#javaFileListFlavor} and * {@link DNDUtils#URIFlavor} for Unix systems. */ public static boolean containsFileFlavors(TransferSupport transferSupport) { for(DataFlavor dataFlavor : getFileFlavors()) { if(transferSupport.isDataFlavorSupported(dataFlavor)) { return true; } } return false; } /** * Returns array of all flavors we consider to be file flavors. */ public static DataFlavor[] getFileFlavors() { return fileDataFlavors.toArray(new DataFlavor[]{}); } /** * Extracts the array of files from a transferable * * @return an empty array if the transferable does not contain any data that * can be interpreted as a list of files */ @SuppressWarnings("unchecked") public static File[] getFiles(Transferable transferable) throws UnsupportedFlavorException, IOException { if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return ((List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor)) .toArray(new File[0]); } else if (transferable.isDataFlavorSupported(URIFlavor)) { return getFiles(getURIs(transferable)); } return new File[0]; } /** * Returns array of files for URIs that denote local paths. * * @return empty array if no URI denotes a local file */ public static File[] getFiles(URI[] uris) { ArrayList<File> files = new ArrayList<File>(uris.length); for (URI uri : uris) { String scheme = uri.getScheme(); if (uri.isAbsolute() && scheme != null && scheme.equalsIgnoreCase("file")) { String path = uri.getPath(); files.add(new File(path)); } } return files.toArray(new File[files.size()]); } private static DataFlavor createURIFlavor() { try { return new DataFlavor("text/uri-list;class=java.lang.String"); } catch (ClassNotFoundException cnfe) { return null; } } /** * Returns true if the supplied flavor is what we consider to be a file flavor. */ public static boolean isFileFlavor(DataFlavor flavor) { return fileDataFlavors.contains(flavor); } }