package org.jabref.gui.util;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import javafx.stage.FileChooser;
import org.jabref.logic.util.FileExtensions;
public class FileDialogConfiguration {
private final List<FileChooser.ExtensionFilter> extensionFilters;
private final Path initialDirectory;
private final FileChooser.ExtensionFilter defaultExtension;
private final String initialFileName;
private FileDialogConfiguration(Path initialDirectory, List<FileChooser.ExtensionFilter> extensionFilters,
FileChooser.ExtensionFilter defaultExtension, String initialFileName) {
this.initialDirectory = initialDirectory;
this.extensionFilters = Objects.requireNonNull(extensionFilters);
this.defaultExtension = defaultExtension;
this.initialFileName = initialFileName;
}
public Optional<Path> getInitialDirectory() {
return Optional.ofNullable(initialDirectory);
}
public FileChooser.ExtensionFilter getDefaultExtension() {
return defaultExtension;
}
public String getInitialFileName() {
return initialFileName;
}
public List<FileChooser.ExtensionFilter> getExtensionFilters() {
return extensionFilters;
}
public static class Builder {
List<FileChooser.ExtensionFilter> extensionFilter = new ArrayList<>();
private Path initialDirectory;
private FileChooser.ExtensionFilter defaultExtension;
private String initialFileName;
public Builder addExtensionFilter(FileExtensions extension) {
extensionFilter.add(toFilter(extension));
return this;
}
private FileChooser.ExtensionFilter toFilter(FileExtensions extension) {
return new FileChooser.ExtensionFilter(extension.getDescription(),
extension.getExtensionsAsList().stream().map(ending -> "*." + ending).collect(Collectors.toList()));
}
public Builder addExtensionFilters(Collection<FileExtensions> extensions) {
extensions.forEach(this::addExtensionFilter);
return this;
}
public FileDialogConfiguration build() {
return new FileDialogConfiguration(initialDirectory, extensionFilter, defaultExtension, initialFileName);
}
public Builder withInitialDirectory(Path directory) {
//Dir must be a folder, not a file
if (!Files.isDirectory(directory)) {
directory = directory.getParent();
}
//The lines above work also if the dir does not exist at all!
//NULL is accepted by the filechooser as no inital path
if (!Files.exists(directory)) {
directory = null;
}
initialDirectory = directory;
return this;
}
public Builder withInitialDirectory(String directory) {
withInitialDirectory(Paths.get(directory));
return this;
}
public Builder withDefaultExtension(FileExtensions extension) {
defaultExtension = toFilter(extension);
return this;
}
public Builder withInitialFileName(String initialFileName) {
this.initialFileName = initialFileName;
return this;
}
}
}