diff options
Diffstat (limited to 'platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java')
-rw-r--r-- | platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java index c19173c7e906..7509394a2368 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooserDescriptor.java @@ -18,6 +18,7 @@ package com.intellij.openapi.fileChooser; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.FileTypes; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VFileProperty; @@ -51,6 +52,7 @@ public class FileChooserDescriptor implements Cloneable { private boolean myShowFileSystemRoots = true; private boolean myTreeRootVisible = false; private boolean myShowHiddenFiles = false; + private Condition<VirtualFile> myFileFilter = null; private final Map<String, Object> myUserData = new HashMap<String, Object>(); @@ -218,18 +220,15 @@ public class FileChooserDescriptor implements Cloneable { } /** - * Defines whether file can be chosen or not + * Sets simple boolean condition for use in {@link #isFileVisible(VirtualFile, boolean)} and {@link #isFileSelectable(VirtualFile)}. */ - public boolean isFileSelectable(VirtualFile file) { - if (file == null) return false; - if (file.isDirectory() && myChooseFolders) return true; - if (acceptAsJarFile(file)) return true; - if (acceptAsGeneralFile(file)) return true; - return false; + public FileChooserDescriptor withFileFilter(@Nullable Condition<VirtualFile> filter) { + myFileFilter = filter; + return this; } /** - * Defines whether file is visible in the tree + * Defines whether a file is visible in the tree. */ public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { if (!file.isDirectory()) { @@ -238,28 +237,47 @@ public class FileChooserDescriptor implements Cloneable { return false; } } - else { - if (!myChooseFiles) { - return false; - } + else if (!myChooseFiles) { + return false; + } + if (myFileFilter != null && !myFileFilter.value(file)) { + return false; } } - // do not include ignored files if (isHideIgnored() && FileTypeManager.getInstance().isFileIgnored(file)) { return false; } - // do not include hidden files - if (!showHiddenFiles) { - if (FileElement.isFileHidden(file)) { - return false; - } + if (!showHiddenFiles && FileElement.isFileHidden(file)) { + return false; } return true; } + /** + * Defines whether a file can be chosen. + */ + public boolean isFileSelectable(VirtualFile file) { + if (file == null) return false; + + if (file.isDirectory() && myChooseFolders) { + return true; + } + if (acceptAsJarFile(file)) { + return true; + } + if (acceptAsGeneralFile(file)) { + return true; + } + if (myFileFilter != null && !file.isDirectory() && myFileFilter.value(file)) { + return true; + } + + return false; + } + public Icon getIcon(final VirtualFile file) { if (file.isDirectory()) { return dressIcon(file, PlatformIcons.DIRECTORY_CLOSED_ICON); |