From ae3318d46a5661af2129c31dee2aa74abc865753 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Fri, 15 Jul 2016 16:16:46 +0300 Subject: [PATCH 1/3] [project-view] psi file system item filter --- .../impl/JavaProjectViewDirectoryHelper.java | 9 ++- .../ide/util/treeView/TreeViewUtil.java | 20 ++++--- .../nodes/ProjectViewDirectoryHelper.java | 58 +++++++++++++------ .../impl/nodes/PsiDirectoryNode.java | 33 ++++++++++- .../GradleTreeStructureProvider.java | 9 ++- 5 files changed, 96 insertions(+), 33 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java b/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java index c248ddf5445b..8f8df9554190 100644 --- a/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java +++ b/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java @@ -22,9 +22,11 @@ import com.intellij.ide.projectView.impl.nodes.ProjectViewDirectoryHelper; import com.intellij.ide.util.treeView.TreeViewUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.DirectoryIndex; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaDirectoryService; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiPackage; import com.intellij.util.FontUtil; import org.jetbrains.annotations.NotNull; @@ -91,8 +93,11 @@ public class JavaProjectViewDirectoryHelper extends ProjectViewDirectoryHelper { } @Override - public boolean isEmptyMiddleDirectory(final PsiDirectory directory, final boolean strictlyEmpty) { - return JavaDirectoryService.getInstance().getPackage(directory) != null && TreeViewUtil.isEmptyMiddlePackage(directory, strictlyEmpty); + public boolean isEmptyMiddleDirectory(final PsiDirectory directory, + final boolean strictlyEmpty, + @Nullable Condition filter) { + return JavaDirectoryService.getInstance().getPackage(directory) != null && + TreeViewUtil.isEmptyMiddlePackage(directory, strictlyEmpty, filter); } @Override diff --git a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java index ba4cb56311a5..773757abacc9 100644 --- a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java +++ b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java @@ -17,16 +17,15 @@ package com.intellij.ide.util.treeView; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolderEx; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.JavaDirectoryService; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiManager; -import com.intellij.psi.PsiPackage; +import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.concurrent.ConcurrentMap; @@ -94,8 +93,11 @@ public class TreeViewUtil { * * @param strictlyEmpty if true, the package is considered empty if it has only 1 child and this child is a directory * otherwise the package is considered as empty if all direct children that it has are directories + * @param filter if returns false for some element, that elements is not counted */ - public static boolean isEmptyMiddlePackage(@NotNull PsiDirectory dir, boolean strictlyEmpty) { + public static boolean isEmptyMiddlePackage(@NotNull PsiDirectory dir, + boolean strictlyEmpty, + @Nullable Condition filter) { final VirtualFile[] files = dir.getVirtualFile().getChildren(); if (files.length == 0) { return false; @@ -105,9 +107,13 @@ public class TreeViewUtil { int directoriesCount = 0; for (VirtualFile file : files) { if (FileTypeManager.getInstance().isFileIgnored(file)) continue; - if (!file.isDirectory()) return false; + if (!file.isDirectory()) { + if (filter == null) return false; + PsiFile childFile = manager.findFile(file); + if (childFile != null && filter.value(childFile)) return false; + } PsiDirectory childDir = manager.findDirectory(file); - if (childDir != null) { + if (childDir != null && (filter == null || filter.value(childDir))) { directoriesCount++; if (strictlyEmpty && directoriesCount > 1) return false; if (JavaDirectoryService.getInstance().getPackage(childDir) != null) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java index 41edd8d6787f..6eb26042bca4 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -35,6 +35,7 @@ import com.intellij.openapi.roots.impl.DirectoryIndex; import com.intellij.openapi.roots.impl.DirectoryInfo; import com.intellij.openapi.roots.ui.configuration.ModuleSourceRootEditHandler; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VirtualFile; @@ -123,6 +124,12 @@ public class ProjectViewDirectoryHelper { } public boolean isEmptyMiddleDirectory(PsiDirectory directory, final boolean strictlyEmpty) { + return isEmptyMiddleDirectory(directory, strictlyEmpty, null); + } + + public boolean isEmptyMiddleDirectory(PsiDirectory directory, + final boolean strictlyEmpty, + @Nullable Condition filter) { return false; } @@ -142,9 +149,18 @@ public class ProjectViewDirectoryHelper { return false; } + @NotNull public Collection getDirectoryChildren(final PsiDirectory psiDirectory, final ViewSettings settings, final boolean withSubDirectories) { + return getDirectoryChildren(psiDirectory, settings, withSubDirectories, null); + } + + @NotNull + public Collection getDirectoryChildren(final PsiDirectory psiDirectory, + final ViewSettings settings, + final boolean withSubDirectories, + @Nullable Condition filter) { final List children = new ArrayList(); final Project project = psiDirectory.getProject(); final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); @@ -152,17 +168,17 @@ public class ProjectViewDirectoryHelper { final ModuleFileIndex moduleFileIndex = module == null ? null : ModuleRootManager.getInstance(module).getFileIndex(); if (!settings.isFlattenPackages() || skipDirectory(psiDirectory)) { processPsiDirectoryChildren(psiDirectory, directoryChildrenInProject(psiDirectory, settings), - children, fileIndex, null, settings, withSubDirectories); + children, fileIndex, null, settings, withSubDirectories, filter); } else { // source directory in "flatten packages" mode final PsiDirectory parentDir = psiDirectory.getParentDirectory(); if (parentDir == null || skipDirectory(parentDir) && withSubDirectories) { - addAllSubpackages(children, psiDirectory, moduleFileIndex, settings); + addAllSubpackages(children, psiDirectory, moduleFileIndex, settings, filter); } if (withSubDirectories) { PsiDirectory[] subdirs = psiDirectory.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (!skipDirectory(subdir)) { + if (!skipDirectory(subdir) || filter != null && !filter.value(subdir)) { continue; } VirtualFile directoryFile = subdir.getVirtualFile(); @@ -174,11 +190,11 @@ public class ProjectViewDirectoryHelper { if (FileTypeRegistry.getInstance().isFileIgnored(directoryFile)) continue; } - children.add(new PsiDirectoryNode(project, subdir, settings)); + children.add(new PsiDirectoryNode(project, subdir, settings, filter)); } } processPsiDirectoryChildren(psiDirectory, psiDirectory.getFiles(), children, fileIndex, moduleFileIndex, settings, - withSubDirectories); + withSubDirectories, filter); } return children; } @@ -260,7 +276,8 @@ public class ProjectViewDirectoryHelper { ProjectFileIndex projectFileIndex, @Nullable ModuleFileIndex moduleFileIndex, ViewSettings viewSettings, - boolean withSubDirectories) { + boolean withSubDirectories, + @Nullable Condition filter) { for (PsiElement child : children) { LOG.assertTrue(child.isValid()); @@ -275,6 +292,9 @@ public class ProjectViewDirectoryHelper { if (moduleFileIndex != null && !moduleFileIndex.isInContent(vFile)) { continue; } + if (filter != null && !filter.value((PsiFileSystemItem)child)) { + continue; + } if (child instanceof PsiFile) { container.add(new PsiFileNode(child.getProject(), (PsiFile) child, viewSettings)); } @@ -282,13 +302,14 @@ public class ProjectViewDirectoryHelper { if (withSubDirectories) { PsiDirectory dir = (PsiDirectory)child; if (!vFile.equals(projectFileIndex.getSourceRootForFile(vFile))) { // if is not a source root - if (viewSettings.isHideEmptyMiddlePackages() && !skipDirectory(psiDir) && isEmptyMiddleDirectory(dir, true)) { - processPsiDirectoryChildren(dir, directoryChildrenInProject(dir, viewSettings), - container, projectFileIndex, moduleFileIndex, viewSettings, withSubDirectories); // expand it recursively + if (viewSettings.isHideEmptyMiddlePackages() && !skipDirectory(psiDir) && isEmptyMiddleDirectory(dir, true, filter)) { + processPsiDirectoryChildren( + dir, directoryChildrenInProject(dir, viewSettings), container, projectFileIndex, moduleFileIndex, viewSettings, true, filter + ); // expand it recursively continue; } } - container.add(new PsiDirectoryNode(child.getProject(), (PsiDirectory) child, viewSettings)); + container.add(new PsiDirectoryNode(child.getProject(), (PsiDirectory)child, viewSettings, filter)); } } } @@ -298,27 +319,28 @@ public class ProjectViewDirectoryHelper { public void addAllSubpackages(List container, PsiDirectory dir, @Nullable ModuleFileIndex moduleFileIndex, - ViewSettings viewSettings) { + ViewSettings viewSettings, + @Nullable Condition filter) { final Project project = dir.getProject(); PsiDirectory[] subdirs = dir.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (skipDirectory(subdir)) { + if (skipDirectory(subdir) || filter != null && !filter.value(subdir)) { continue; } if (moduleFileIndex != null && !moduleFileIndex.isInContent(subdir.getVirtualFile())) { - container.add(new PsiDirectoryNode(project, subdir, viewSettings)); + container.add(new PsiDirectoryNode(project, subdir, viewSettings, filter)); continue; } if (viewSettings.isHideEmptyMiddlePackages()) { - if (!isEmptyMiddleDirectory(subdir, false)) { + if (!isEmptyMiddleDirectory(subdir, false, filter)) { - container.add(new PsiDirectoryNode(project, subdir, viewSettings)); + container.add(new PsiDirectoryNode(project, subdir, viewSettings, filter)); } } else { - container.add(new PsiDirectoryNode(project, subdir, viewSettings)); + container.add(new PsiDirectoryNode(project, subdir, viewSettings, filter)); } - addAllSubpackages(container, subdir, moduleFileIndex, viewSettings); + addAllSubpackages(container, subdir, moduleFileIndex, viewSettings, filter); } } } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java index a869465f64bf..75de92b83fea 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -34,6 +34,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.libraries.LibraryUtil; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; @@ -41,19 +42,36 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.NavigatableWithText; import com.intellij.projectImport.ProjectAttachProcessor; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileSystemItem; +import com.intellij.psi.PsiManager; import com.intellij.psi.impl.file.PsiDirectoryFactory; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.IconUtil; import com.intellij.util.PathUtil; import com.intellij.util.PlatformUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Collection; public class PsiDirectoryNode extends BasePsiNode implements NavigatableWithText { + + private final Condition myFilter; + public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings) { + this(project, value, viewSettings, null); + } + + public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings, @Nullable Condition filter) { super(project, value, viewSettings); + myFilter = filter; + } + + @Nullable + public Condition getFilter() { + return myFilter; } protected boolean shouldShowModuleName() { @@ -140,7 +158,7 @@ public class PsiDirectoryNode extends BasePsiNode implements Navig @Override public Collection getChildrenImpl() { - return ProjectViewDirectoryHelper.getInstance(myProject).getDirectoryChildren(getValue(), getSettings(), true); + return ProjectViewDirectoryHelper.getInstance(myProject).getDirectoryChildren(getValue(), getSettings(), true, getFilter()); } @Override @@ -169,8 +187,17 @@ public class PsiDirectoryNode extends BasePsiNode implements Navig return false; } + final Project project = value.getProject(); + Condition filter = getFilter(); + if (filter != null) { + PsiFile psiFile = PsiManager.getInstance(project).findFile(file); + if (psiFile != null && !filter.value(psiFile)) return false; + + PsiDirectory psiDirectory = PsiManager.getInstance(project).findDirectory(file); + if (psiDirectory != null && !filter.value(psiDirectory)) return false; + } + if (Registry.is("ide.hide.excluded.files")) { - final Project project = value.getProject(); final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); return !fileIndex.isExcluded(file); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java index 4ee1e5ea8a03..a4949c12f477 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java @@ -30,12 +30,14 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFileSystemItem; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -204,7 +206,7 @@ public class GradleTreeStructureProvider implements TreeStructureProvider { final Module module = fileIndex.getModuleForFile(virtualFile); String sourceSetName = getSourceSetName(module); if (sourceSetName == null) return null; - return new GradleSourceSetDirectoryNode(project, psiDirectory, settings, module, sourceSetName); + return new GradleSourceSetDirectoryNode(project, psiDirectory, settings, module, sourceSetName, directoryNode.getFilter()); } @Nullable @@ -228,8 +230,9 @@ public class GradleTreeStructureProvider implements TreeStructureProvider { PsiDirectory psiDirectory, ViewSettings settings, Module module, - String sourceSetName) { - super(project, psiDirectory, settings); + String sourceSetName, + Condition filter) { + super(project, psiDirectory, settings, filter); mySourceSetName = sourceSetName; myModule = module; } From c74aecd88c11bda3f9782bc54fbd55c0e8b607da Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 8 Aug 2016 15:27:48 +0300 Subject: [PATCH 2/3] [project-view] use separate interface for file system item filter --- .../impl/JavaProjectViewDirectoryHelper.java | 5 ++-- .../ide/util/treeView/TreeViewUtil.java | 8 +++---- .../nodes/ProjectViewDirectoryHelper.java | 15 ++++++------ .../impl/nodes/PsiDirectoryNode.java | 14 +++++------ .../impl/nodes/PsiFileSystemItemFilter.java | 24 +++++++++++++++++++ .../GradleTreeStructureProvider.java | 9 ++----- 6 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java diff --git a/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java b/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java index 8f8df9554190..a12e54670176 100644 --- a/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java +++ b/java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java @@ -19,14 +19,13 @@ import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.nodes.PackageElement; import com.intellij.ide.projectView.impl.nodes.PackageUtil; import com.intellij.ide.projectView.impl.nodes.ProjectViewDirectoryHelper; +import com.intellij.ide.projectView.impl.nodes.PsiFileSystemItemFilter; import com.intellij.ide.util.treeView.TreeViewUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.DirectoryIndex; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaDirectoryService; import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiPackage; import com.intellij.util.FontUtil; import org.jetbrains.annotations.NotNull; @@ -95,7 +94,7 @@ public class JavaProjectViewDirectoryHelper extends ProjectViewDirectoryHelper { @Override public boolean isEmptyMiddleDirectory(final PsiDirectory directory, final boolean strictlyEmpty, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { return JavaDirectoryService.getInstance().getPackage(directory) != null && TreeViewUtil.isEmptyMiddlePackage(directory, strictlyEmpty, filter); } diff --git a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java index 773757abacc9..8cec8eaf2742 100644 --- a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java +++ b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java @@ -15,9 +15,9 @@ */ package com.intellij.ide.util.treeView; +import com.intellij.ide.projectView.impl.nodes.PsiFileSystemItemFilter; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolderEx; import com.intellij.openapi.vfs.VirtualFile; @@ -97,7 +97,7 @@ public class TreeViewUtil { */ public static boolean isEmptyMiddlePackage(@NotNull PsiDirectory dir, boolean strictlyEmpty, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { final VirtualFile[] files = dir.getVirtualFile().getChildren(); if (files.length == 0) { return false; @@ -110,10 +110,10 @@ public class TreeViewUtil { if (!file.isDirectory()) { if (filter == null) return false; PsiFile childFile = manager.findFile(file); - if (childFile != null && filter.value(childFile)) return false; + if (childFile != null && filter.accept(childFile)) return false; } PsiDirectory childDir = manager.findDirectory(file); - if (childDir != null && (filter == null || filter.value(childDir))) { + if (childDir != null && (filter == null || filter.accept(childDir))) { directoriesCount++; if (strictlyEmpty && directoriesCount > 1) return false; if (JavaDirectoryService.getInstance().getPackage(childDir) != null) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java index 6eb26042bca4..dca406edfb96 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java @@ -35,7 +35,6 @@ import com.intellij.openapi.roots.impl.DirectoryIndex; import com.intellij.openapi.roots.impl.DirectoryInfo; import com.intellij.openapi.roots.ui.configuration.ModuleSourceRootEditHandler; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VirtualFile; @@ -129,7 +128,7 @@ public class ProjectViewDirectoryHelper { public boolean isEmptyMiddleDirectory(PsiDirectory directory, final boolean strictlyEmpty, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { return false; } @@ -160,7 +159,7 @@ public class ProjectViewDirectoryHelper { public Collection getDirectoryChildren(final PsiDirectory psiDirectory, final ViewSettings settings, final boolean withSubDirectories, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { final List children = new ArrayList(); final Project project = psiDirectory.getProject(); final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); @@ -178,7 +177,7 @@ public class ProjectViewDirectoryHelper { if (withSubDirectories) { PsiDirectory[] subdirs = psiDirectory.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (!skipDirectory(subdir) || filter != null && !filter.value(subdir)) { + if (!skipDirectory(subdir) || filter != null && !filter.accept(subdir)) { continue; } VirtualFile directoryFile = subdir.getVirtualFile(); @@ -277,7 +276,7 @@ public class ProjectViewDirectoryHelper { @Nullable ModuleFileIndex moduleFileIndex, ViewSettings viewSettings, boolean withSubDirectories, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { for (PsiElement child : children) { LOG.assertTrue(child.isValid()); @@ -292,7 +291,7 @@ public class ProjectViewDirectoryHelper { if (moduleFileIndex != null && !moduleFileIndex.isInContent(vFile)) { continue; } - if (filter != null && !filter.value((PsiFileSystemItem)child)) { + if (filter != null && !filter.accept((PsiFileSystemItem)child)) { continue; } if (child instanceof PsiFile) { @@ -320,11 +319,11 @@ public class ProjectViewDirectoryHelper { PsiDirectory dir, @Nullable ModuleFileIndex moduleFileIndex, ViewSettings viewSettings, - @Nullable Condition filter) { + @Nullable PsiFileSystemItemFilter filter) { final Project project = dir.getProject(); PsiDirectory[] subdirs = dir.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (skipDirectory(subdir) || filter != null && !filter.value(subdir)) { + if (skipDirectory(subdir) || filter != null && !filter.accept(subdir)) { continue; } if (moduleFileIndex != null && !moduleFileIndex.isInContent(subdir.getVirtualFile())) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java index 75de92b83fea..991755ff8b7e 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java @@ -34,7 +34,6 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.libraries.LibraryUtil; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; @@ -43,7 +42,6 @@ import com.intellij.pom.NavigatableWithText; import com.intellij.projectImport.ProjectAttachProcessor; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiManager; import com.intellij.psi.impl.file.PsiDirectoryFactory; import com.intellij.ui.SimpleTextAttributes; @@ -58,19 +56,19 @@ import java.util.Collection; public class PsiDirectoryNode extends BasePsiNode implements NavigatableWithText { - private final Condition myFilter; + private final PsiFileSystemItemFilter myFilter; public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings) { this(project, value, viewSettings, null); } - public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings, @Nullable Condition filter) { + public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings, @Nullable PsiFileSystemItemFilter filter) { super(project, value, viewSettings); myFilter = filter; } @Nullable - public Condition getFilter() { + public PsiFileSystemItemFilter getFilter() { return myFilter; } @@ -188,13 +186,13 @@ public class PsiDirectoryNode extends BasePsiNode implements Navig } final Project project = value.getProject(); - Condition filter = getFilter(); + PsiFileSystemItemFilter filter = getFilter(); if (filter != null) { PsiFile psiFile = PsiManager.getInstance(project).findFile(file); - if (psiFile != null && !filter.value(psiFile)) return false; + if (psiFile != null && !filter.accept(psiFile)) return false; PsiDirectory psiDirectory = PsiManager.getInstance(project).findDirectory(file); - if (psiDirectory != null && !filter.value(psiDirectory)) return false; + if (psiDirectory != null && !filter.accept(psiDirectory)) return false; } if (Registry.is("ide.hide.excluded.files")) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java new file mode 100644 index 000000000000..ca035cee0684 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2016 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ide.projectView.impl.nodes; + +import com.intellij.psi.PsiFileSystemItem; +import org.jetbrains.annotations.NotNull; + +public interface PsiFileSystemItemFilter { + + boolean accept(@NotNull PsiFileSystemItem item); +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java index a4949c12f477..1c6b82c4352e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java @@ -19,10 +19,7 @@ import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.ProjectRootsUtil; -import com.intellij.ide.projectView.impl.nodes.ProjectViewModuleGroupNode; -import com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode; -import com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode; -import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; +import com.intellij.ide.projectView.impl.nodes.*; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.module.Module; @@ -30,14 +27,12 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFileSystemItem; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -231,7 +226,7 @@ public class GradleTreeStructureProvider implements TreeStructureProvider { ViewSettings settings, Module module, String sourceSetName, - Condition filter) { + PsiFileSystemItemFilter filter) { super(project, psiDirectory, settings, filter); mySourceSetName = sourceSetName; myModule = module; From 1263db87f00f0ddccd1cd9fdfce82b5d07d3bfca Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 8 Aug 2016 16:48:33 +0300 Subject: [PATCH 3/3] [project-view] make method name meaningful and add docs --- .../com/intellij/ide/util/treeView/TreeViewUtil.java | 4 ++-- .../impl/nodes/ProjectViewDirectoryHelper.java | 6 +++--- .../ide/projectView/impl/nodes/PsiDirectoryNode.java | 4 ++-- .../impl/nodes/PsiFileSystemItemFilter.java | 10 +++++++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java index 8cec8eaf2742..f3c134e9e0e2 100644 --- a/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java +++ b/java/java-impl/src/com/intellij/ide/util/treeView/TreeViewUtil.java @@ -110,10 +110,10 @@ public class TreeViewUtil { if (!file.isDirectory()) { if (filter == null) return false; PsiFile childFile = manager.findFile(file); - if (childFile != null && filter.accept(childFile)) return false; + if (childFile != null && filter.shouldShow(childFile)) return false; } PsiDirectory childDir = manager.findDirectory(file); - if (childDir != null && (filter == null || filter.accept(childDir))) { + if (childDir != null && (filter == null || filter.shouldShow(childDir))) { directoriesCount++; if (strictlyEmpty && directoriesCount > 1) return false; if (JavaDirectoryService.getInstance().getPackage(childDir) != null) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java index dca406edfb96..c81f6d97e587 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java @@ -177,7 +177,7 @@ public class ProjectViewDirectoryHelper { if (withSubDirectories) { PsiDirectory[] subdirs = psiDirectory.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (!skipDirectory(subdir) || filter != null && !filter.accept(subdir)) { + if (!skipDirectory(subdir) || filter != null && !filter.shouldShow(subdir)) { continue; } VirtualFile directoryFile = subdir.getVirtualFile(); @@ -291,7 +291,7 @@ public class ProjectViewDirectoryHelper { if (moduleFileIndex != null && !moduleFileIndex.isInContent(vFile)) { continue; } - if (filter != null && !filter.accept((PsiFileSystemItem)child)) { + if (filter != null && !filter.shouldShow((PsiFileSystemItem)child)) { continue; } if (child instanceof PsiFile) { @@ -323,7 +323,7 @@ public class ProjectViewDirectoryHelper { final Project project = dir.getProject(); PsiDirectory[] subdirs = dir.getSubdirectories(); for (PsiDirectory subdir : subdirs) { - if (skipDirectory(subdir) || filter != null && !filter.accept(subdir)) { + if (skipDirectory(subdir) || filter != null && !filter.shouldShow(subdir)) { continue; } if (moduleFileIndex != null && !moduleFileIndex.isInContent(subdir.getVirtualFile())) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java index 991755ff8b7e..e32b00009027 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java @@ -189,10 +189,10 @@ public class PsiDirectoryNode extends BasePsiNode implements Navig PsiFileSystemItemFilter filter = getFilter(); if (filter != null) { PsiFile psiFile = PsiManager.getInstance(project).findFile(file); - if (psiFile != null && !filter.accept(psiFile)) return false; + if (psiFile != null && !filter.shouldShow(psiFile)) return false; PsiDirectory psiDirectory = PsiManager.getInstance(project).findDirectory(file); - if (psiDirectory != null && !filter.accept(psiDirectory)) return false; + if (psiDirectory != null && !filter.shouldShow(psiDirectory)) return false; } if (Registry.is("ide.hide.excluded.files")) { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java index ca035cee0684..07c7073abd1d 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiFileSystemItemFilter.java @@ -15,10 +15,18 @@ */ package com.intellij.ide.projectView.impl.nodes; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileSystemItem; import org.jetbrains.annotations.NotNull; public interface PsiFileSystemItemFilter { - boolean accept(@NotNull PsiFileSystemItem item); + /** + * @param item {@link PsiFile file} or {@link PsiDirectory directory}. + * @return true if item should be showed in project view, otherwise false. + * @see ProjectViewDirectoryHelper#getDirectoryChildren(PsiDirectory, ViewSettings, boolean, PsiFileSystemItemFilter) + */ + boolean shouldShow(@NotNull PsiFileSystemItem item); }