package net.filebot.ui.list;
import static java.util.Arrays.*;
import static java.util.Collections.*;
import static java.util.stream.Collectors.*;
import static net.filebot.MediaTypes.*;
import static net.filebot.ui.transfer.FileTransferable.*;
import static net.filebot.util.FileUtilities.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import net.filebot.torrent.Torrent;
import net.filebot.ui.transfer.ArrayTransferable;
import net.filebot.ui.transfer.FileTransferablePolicy;
import net.filebot.util.FileUtilities.ExtensionFileFilter;
import net.filebot.web.Episode;
class FileListTransferablePolicy extends FileTransferablePolicy {
private static final DataFlavor episodeArrayFlavor = ArrayTransferable.flavor(Episode.class);
private Consumer<String> title;
private Consumer<String> format;
private Consumer<List<?>> model;
public FileListTransferablePolicy(Consumer<String> title, Consumer<String> format, Consumer<List<?>> model) {
this.title = title;
this.format = format;
this.model = model;
}
@Override
public boolean accept(Transferable tr) throws Exception {
return hasFileListFlavor(tr) || tr.isDataFlavorSupported(episodeArrayFlavor);
}
@Override
public void handleTransferable(Transferable tr, TransferAction action) throws Exception {
// handle episode data
if (tr.isDataFlavorSupported(episodeArrayFlavor)) {
Episode[] episodes = (Episode[]) tr.getTransferData((episodeArrayFlavor));
if (episodes.length > 0) {
format.accept(ListPanel.DEFAULT_EPISODE_FORMAT);
title.accept(episodes[0].getSeriesName());
model.accept(asList(episodes));
}
return;
}
// handle files
super.handleTransferable(tr, action);
}
@Override
protected boolean accept(List<File> files) {
return true;
}
@Override
protected void clear() {
format.accept("");
title.accept("");
model.accept(emptyList());
}
@Override
protected void load(List<File> files, TransferAction action) throws IOException {
// set title based on parent folder of first file
title.accept(getFolderName(files.get(0).getParentFile()));
if (containsOnly(files, TORRENT_FILES)) {
loadTorrents(files);
} else {
// if only one folder was dropped, use its name as title
if (files.size() == 1 && files.get(0).isDirectory()) {
title.accept(getFolderName(files.get(0)));
}
// load all files from the given folders recursively up do a depth of 32
format.accept(ListPanel.DEFAULT_FILE_FORMAT);
model.accept(listFiles(files, FILES, HUMAN_NAME_ORDER));
}
}
private void loadTorrents(List<File> files) throws IOException {
List<Torrent> torrents = new ArrayList<Torrent>(files.size());
for (File file : files) {
torrents.add(new Torrent(file));
}
// set title
if (torrents.size() > 0) {
title.accept(getNameWithoutExtension(torrents.get(0).getName()));
}
// add torrent entries
format.accept(ListPanel.DEFAULT_FILE_FORMAT);
model.accept(torrents.stream().flatMap(t -> t.getFiles().stream()).collect(toList()));
}
@Override
public String getFileFilterDescription() {
return "Files, Folders and Torrents";
}
@Override
public List<String> getFileFilterExtensions() {
return ExtensionFileFilter.WILDCARD;
}
}