package net.filebot.ui.filter;
import static net.filebot.Logging.*;
import static net.filebot.Settings.*;
import static net.filebot.util.ExceptionUtilities.*;
import static net.filebot.util.FileUtilities.*;
import static net.filebot.util.ui.SwingUI.*;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import javax.swing.tree.TreeNode;
import net.filebot.platform.mac.MacAppUtilities;
import net.filebot.ui.filter.FileTree.FileNode;
import net.filebot.ui.filter.FileTree.FolderNode;
import net.filebot.ui.transfer.BackgroundFileTransferablePolicy;
import net.filebot.util.FastFile;
class FileTreeTransferablePolicy extends BackgroundFileTransferablePolicy<TreeNode> {
private final FileTree tree;
public FileTreeTransferablePolicy(FileTree tree) {
this.tree = tree;
}
@Override
protected boolean accept(List<File> files) {
return true;
}
@Override
protected void clear() {
super.clear();
tree.clear();
}
@Override
protected void process(List<TreeNode> root) {
tree.getModel().setRoot(new FolderNode(root));
tree.getModel().reload();
}
@Override
protected void process(Exception e) {
log.log(Level.WARNING, getRootCauseMessage(e), e);
}
@Override
protected void load(List<File> files, TransferAction action) {
// make sure we have access to the parent folder structure, not just the dropped file
if (isMacSandbox()) {
MacAppUtilities.askUnlockFolders(getWindow(tree), files);
}
try {
// use fast file to minimize system calls like length(), isDirectory(), isFile(), ...
TreeNode[] node = files.stream().map(FastFile::new).map(this::getTreeNode).toArray(TreeNode[]::new);
// publish on EDT
publish(node);
} catch (CancellationException e) {
// supposed to happen if background execution was aborted
}
}
private TreeNode getTreeNode(File file) {
if (Thread.interrupted()) {
throw new CancellationException();
}
if (file.isDirectory()) {
LinkedList<TreeNode> children = new LinkedList<TreeNode>();
for (File f : getChildren(file, NOT_HIDDEN, HUMAN_NAME_ORDER)) {
if (f.isDirectory()) {
children.addFirst(getTreeNode(f));
} else {
children.addLast(getTreeNode(f));
}
}
return new FolderNode(file, getFolderName(file), new ArrayList<TreeNode>(children));
}
return new FileNode(file);
}
@Override
public String getFileFilterDescription() {
return "Folders";
}
@Override
public List<String> getFileFilterExtensions() {
return null;
}
}