package org.limewire.core.api.library;
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.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A Transferable that returns a javaFileListFlavor, built up from
* a list of 'FileTransfer' and 'LazyFileTransfer' items. The lazy
* items will be retrieved only when the data of the transfer is requested
* (in response to a getTransferData call).
*/
public class FileTransferable implements Transferable {
private final List<File> files;
private final List<? extends File> lazyFiles;
/**
* Holds the data flavor used on linux desktops for file drags.
*/
public static final DataFlavor URIFlavor = createURIFlavor();
public static final List<? extends File> EMPTY_FILE_TRANSFER_LiST =
Collections.emptyList();
public static final List<File> EMPTY_FILE_LIST = Collections.emptyList();
static DataFlavor createURIFlavor() {
try {
return new DataFlavor("text/uri-list;class=java.lang.String");
} catch (ClassNotFoundException cnfe) {
return null;
}
}
public FileTransferable(List<File> files) {
this(files, EMPTY_FILE_TRANSFER_LiST);
}
public FileTransferable(List<File> realFiles,
List<? extends File> lazyFiles) {
if (realFiles == null) {
throw new NullPointerException("realFiles must not be null");
}
if (lazyFiles == null) {
throw new NullPointerException("lazyFiles must not be empty");
}
// copy, given list might not me mutable
this.files = new ArrayList<File>(realFiles);
this.lazyFiles = new ArrayList<File>(lazyFiles);
}
private List<File> getFiles() {
if (!lazyFiles.isEmpty()) {
for (File transfer : lazyFiles) {
File f = transfer;
if (f != null)
files.add(f);
}
lazyFiles.clear();
}
return files;
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (flavor.equals(DataFlavor.javaFileListFlavor)) {
return getFiles();
} else if (URIFlavor.equals(flavor)) {
StringBuilder sb = new StringBuilder();
String lineSep = System.getProperty("line.separator");
for (File file : getFiles()) {
URI uri = file.toURI();
if (sb.length() > 0) {
sb.append(lineSep);
}
sb.append(uri.toString());
}
return sb.toString();
}
else {
throw new UnsupportedFlavorException(flavor);
}
}
public DataFlavor[] getTransferDataFlavors() {
// if(OSUtils.isWindows()) {
return new DataFlavor[] { DataFlavor.javaFileListFlavor };
// } else {
// return new DataFlavor[] { DataFlavor.javaFileListFlavor, URIFlavor };
// }
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.javaFileListFlavor)
|| flavor.equals(URIFlavor);
}
}