diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java')
-rw-r--r-- | platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java | 87 |
1 files changed, 52 insertions, 35 deletions
diff --git a/platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java b/platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java index 51d6362b36d8..b462fcbc11ad 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/OpenProjectFileChooserDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,74 +15,91 @@ */ package com.intellij.ide.actions; -import com.intellij.icons.AllIcons; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileElement; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectImport.ProjectOpenProcessor; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import javax.swing.*; +/** + * Intended for use in actions related to opening or importing existing projects. + * <strong>Due to a high I/O impact SHOULD NOT be used in any other cases.</strong> + */ public class OpenProjectFileChooserDescriptor extends FileChooserDescriptor { private static final Icon ourProjectIcon = IconLoader.getIcon(ApplicationInfoEx.getInstanceEx().getSmallIconUrl()); - public OpenProjectFileChooserDescriptor(final boolean chooseFiles) { + public OpenProjectFileChooserDescriptor(boolean chooseFiles) { super(chooseFiles, true, chooseFiles, chooseFiles, false, false); } - public boolean isFileSelectable(final VirtualFile file) { - if (file == null) return false; + @Override + public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { + return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || isProjectFile(file)); + } + + @Override + public boolean isFileSelectable(VirtualFile file) { return isProjectDirectory(file) || isProjectFile(file); } - public Icon getIcon(final VirtualFile file) { - if (isProjectDirectory(file)) { - return dressIcon(file, ourProjectIcon); - } - final Icon icon = getImporterIcon(file); - if (icon != null) { - return dressIcon(file, icon); + @Override + public Icon getIcon(VirtualFile file) { + if (canInspectDirectory(file)) { + if (isIprFile(file) || isIdeaDirectory(file)) { + return dressIcon(file, ourProjectIcon); + } + Icon icon = getImporterIcon(file); + if (icon != null) { + return dressIcon(file, icon); + } } return super.getIcon(file); } - @Nullable - private static Icon getImporterIcon(final VirtualFile virtualFile) { - final ProjectOpenProcessor provider = ProjectOpenProcessor.getImportProvider(virtualFile); + private static boolean canInspectDirectory(VirtualFile file) { + if (file.getParent() == null) return false; + + VirtualFile home = VfsUtil.getUserHomeDir(); + if (home == null) return false; // unnatural situation + VirtualFile homes = home.getParent(); + if (homes == null) return false; // another one + if (homes.equals(file.getParent()) || VfsUtilCore.isAncestor(file, homes, false)) return false; + + return true; + } + + private static Icon getImporterIcon(VirtualFile file) { + ProjectOpenProcessor provider = ProjectOpenProcessor.getImportProvider(file); if (provider != null) { - return virtualFile.isDirectory() && provider.lookForProjectsInDirectory() ? AllIcons.Nodes.IdeaModule : provider.getIcon(virtualFile); + return file.isDirectory() && provider.lookForProjectsInDirectory() ? ourProjectIcon : provider.getIcon(file); } return null; } - public boolean isFileVisible(final VirtualFile file, final boolean showHiddenFiles) { - if (!showHiddenFiles && FileElement.isFileHidden(file)) return false; - return isProjectFile(file) || super.isFileVisible(file, showHiddenFiles) && file.isDirectory(); + public static boolean isProjectFile(@NotNull VirtualFile file) { + return !file.isDirectory() && file.isValid() && (isIprFile(file) || hasImportProvider(file)); } - public static boolean isProjectFile(final VirtualFile file) { - if (isIprFile(file)) return true; - final ProjectOpenProcessor importProvider = ProjectOpenProcessor.getImportProvider(file); - return importProvider != null; + private static boolean isProjectDirectory(@NotNull VirtualFile file) { + return file.isDirectory() && file.isValid() && (isIdeaDirectory(file) || hasImportProvider(file)); } private static boolean isIprFile(VirtualFile file) { - if ((!file.isDirectory() && file.getName().toLowerCase().endsWith(ProjectFileType.DOT_DEFAULT_EXTENSION))) { - return true; - } - return false; + return ProjectFileType.DEFAULT_EXTENSION.equalsIgnoreCase(file.getExtension()); + } + + private static boolean isIdeaDirectory(VirtualFile file) { + return file.findChild(Project.DIRECTORY_STORE_FOLDER) != null; } - private static boolean isProjectDirectory(final VirtualFile virtualFile) { - // the root directory of any drive is never an IDEA project - if (virtualFile.getParent() == null) return false; - // NOTE: For performance reasons, it's very important not to iterate through all of the children here. - if (virtualFile.isDirectory() && virtualFile.isValid() && virtualFile.findChild(Project.DIRECTORY_STORE_FOLDER) != null) return true; - return false; + private static boolean hasImportProvider(VirtualFile file) { + return ProjectOpenProcessor.getImportProvider(file) != null; } } |