package org.infernus.idea.checkstyle.ui;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import java.util.Arrays;
/**
* Custom FileChooser Descriptor that allows the specification of a file extension.
*/
public class ExtensionFileChooserDescriptor extends FileChooserDescriptor {
private static final String JAR_EXTENSION = "jar";
private final String[] fileExtensions;
private final boolean allowFilesInJars;
/**
* Construct a file chooser descriptor for the given file extension.
* @param title the dialog title.
* @param description the dialog description.
* @param allowFilesInJars may files within JARs be selected?
* @param fileExtensions the file extension(s).
*/
public ExtensionFileChooserDescriptor(final String title,
final String description,
final boolean allowFilesInJars,
final String... fileExtensions) {
super(true, false, containsJar(fileExtensions), containsJar(fileExtensions), allowFilesInJars, false);
setTitle(title);
setDescription(description);
this.fileExtensions = sortAndMakeLowercase(fileExtensions);
this.allowFilesInJars = allowFilesInJars;
}
private static boolean containsJar(final String[] extensions) {
if (extensions == null) {
return false;
}
for (final String extension : extensions) {
if ("jar".equalsIgnoreCase(extension)) {
return true;
}
}
return false;
}
private String[] sortAndMakeLowercase(final String[] strings) {
Arrays.sort(strings);
for (int i = 0; i < strings.length; i++) {
strings[i] = strings[i].toLowerCase();
}
return strings;
}
@Override
public boolean isFileSelectable(final VirtualFile file) {
return fileExtensionMatches(file);
}
@Override
public boolean isFileVisible(final VirtualFile file, final boolean showHiddenFiles) {
return file.isDirectory()
|| fileExtensionMatches(file)
|| (isJar(file) && allowFilesInJars);
}
private boolean isJar(final VirtualFile file) {
final String currentExtension = file.getExtension();
return currentExtension != null && JAR_EXTENSION.equalsIgnoreCase(currentExtension);
}
private boolean fileExtensionMatches(final VirtualFile file) {
final String currentExtension = file.getExtension();
return currentExtension != null && Arrays.binarySearch(fileExtensions, currentExtension.toLowerCase()) >= 0;
}
}