summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/ide/projectView/impl
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide/projectView/impl')
-rw-r--r--platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java81
-rw-r--r--platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java33
2 files changed, 96 insertions, 18 deletions
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
index 52e79d208147..bc2e509e085a 100644
--- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
@@ -23,15 +23,25 @@ import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.SelectInTarget;
import com.intellij.ide.impl.ProjectPaneSelectInTarget;
+import com.intellij.ide.projectView.ProjectView;
+import com.intellij.ide.projectView.ProjectViewSettings;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.ProjectViewDirectoryHelper;
import com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode;
import com.intellij.ide.util.treeView.AbstractTreeBuilder;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.AbstractTreeUpdater;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.InvalidDataException;
+import com.intellij.openapi.util.JDOMExternalizerUtil;
+import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiDirectory;
+import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -42,6 +52,8 @@ import java.awt.*;
public class ProjectViewPane extends AbstractProjectViewPSIPane {
@NonNls public static final String ID = "ProjectPane";
+ public static final String SHOW_EXCLUDED_FILES_OPTION = "show-excluded-files";
+ private boolean myShowExcludedFiles = true;
public ProjectViewPane(Project project) {
super(project);
@@ -76,12 +88,7 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
@Override
protected ProjectAbstractTreeStructureBase createStructure() {
- return new ProjectTreeStructure(myProject, ID){
- @Override
- protected AbstractTreeNode createRoot(final Project project, ViewSettings settings) {
- return new ProjectViewProjectNode(project, settings);
- }
- };
+ return new ProjectViewPaneTreeStructure();
}
@Override
@@ -111,6 +118,25 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
return "ProjectPane";
}
+ @Override
+ public void readExternal(Element element) throws InvalidDataException {
+ super.readExternal(element);
+ String showExcludedOption = JDOMExternalizerUtil.readField(element, SHOW_EXCLUDED_FILES_OPTION);
+ myShowExcludedFiles = showExcludedOption == null || Boolean.parseBoolean(showExcludedOption);
+ }
+
+ @Override
+ public void writeExternal(Element element) throws WriteExternalException {
+ super.writeExternal(element);
+ if (!myShowExcludedFiles) {
+ JDOMExternalizerUtil.writeField(element, SHOW_EXCLUDED_FILES_OPTION, String.valueOf(false));
+ }
+ }
+
+ @Override
+ public void addToolbarActions(DefaultActionGroup actionGroup) {
+ actionGroup.addAction(new ShowExcludedFilesAction()).setAsSecondary(true);
+ }
// should be first
@Override
@@ -148,4 +174,47 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
return super.addSubtreeToUpdateByElement(element);
}
}
+
+ private class ProjectViewPaneTreeStructure extends ProjectTreeStructure implements ProjectViewSettings {
+ public ProjectViewPaneTreeStructure() {
+ super(ProjectViewPane.this.myProject, ID);
+ }
+
+ @Override
+ protected AbstractTreeNode createRoot(final Project project, ViewSettings settings) {
+ return new ProjectViewProjectNode(project, settings);
+ }
+
+ @Override
+ public boolean isShowExcludedFiles() {
+ return myShowExcludedFiles;
+ }
+ }
+
+ private final class ShowExcludedFilesAction extends ToggleAction {
+ private ShowExcludedFilesAction() {
+ super(IdeBundle.message("action.show.excluded.files"), IdeBundle.message("action.show.hide.excluded.files"), null);
+ }
+
+ @Override
+ public boolean isSelected(AnActionEvent event) {
+ return myShowExcludedFiles;
+ }
+
+ @Override
+ public void setSelected(AnActionEvent event, boolean flag) {
+ if (myShowExcludedFiles != flag) {
+ myShowExcludedFiles = flag;
+ updateFromRoot(true);
+ }
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ super.update(e);
+ final Presentation presentation = e.getPresentation();
+ final ProjectView projectView = ProjectView.getInstance(myProject);
+ presentation.setVisible(projectView.getCurrentProjectViewPane() == ProjectViewPane.this);
+ }
+ }
}
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 13ba91900521..36c09aff2218 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
@@ -21,6 +21,7 @@
package com.intellij.ide.projectView.impl.nodes;
import com.intellij.ide.projectView.ProjectViewNode;
+import com.intellij.ide.projectView.ProjectViewSettings;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.components.ServiceManager;
@@ -37,10 +38,8 @@ import com.intellij.openapi.roots.impl.DirectoryInfo;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
+import com.intellij.psi.*;
+import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.util.PsiUtilCore;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
@@ -126,7 +125,7 @@ public class ProjectViewDirectoryHelper {
final Module module = fileIndex.getModuleForFile(psiDirectory.getVirtualFile());
final ModuleFileIndex moduleFileIndex = module == null ? null : ModuleRootManager.getInstance(module).getFileIndex();
if (!settings.isFlattenPackages() || skipDirectory(psiDirectory)) {
- processPsiDirectoryChildren(psiDirectory, directoryChildrenInProject(fileIndex, psiDirectory),
+ processPsiDirectoryChildren(psiDirectory, directoryChildrenInProject(psiDirectory, settings),
children, fileIndex, null, settings, withSubDirectories);
}
else { // source directory in "flatten packages" mode
@@ -172,10 +171,20 @@ public class ProjectViewDirectoryHelper {
return topLevelContentRoots;
}
- private PsiElement[] directoryChildrenInProject(ProjectFileIndex fileIndex, PsiDirectory psiDirectory) {
- VirtualFile dir = psiDirectory.getVirtualFile();
- if (isInProject(dir)) {
- return psiDirectory.getChildren();
+ private PsiElement[] directoryChildrenInProject(PsiDirectory psiDirectory, final ViewSettings settings) {
+ final VirtualFile dir = psiDirectory.getVirtualFile();
+ if (shouldBeShown(dir, settings)) {
+ final List<PsiElement> children = new ArrayList<PsiElement>();
+ psiDirectory.processChildren(new PsiElementProcessor<PsiFileSystemItem>() {
+ @Override
+ public boolean execute(@NotNull PsiFileSystemItem element) {
+ if (shouldBeShown(element.getVirtualFile(), settings)) {
+ children.add(element);
+ }
+ return true;
+ }
+ });
+ return PsiUtilCore.toPsiElementArray(children);
}
PsiManager manager = psiDirectory.getManager();
@@ -198,11 +207,11 @@ public class ProjectViewDirectoryHelper {
return PsiUtilCore.toPsiElementArray(directoriesOnTheWayToContentRoots);
}
- private boolean isInProject(VirtualFile dir) {
+ private boolean shouldBeShown(VirtualFile dir, ViewSettings settings) {
DirectoryInfo directoryInfo = myIndex.getInfoForFile(dir);
if (directoryInfo.isInProject()) return true;
- if (!Registry.is("ide.hide.excluded.files")) {
+ if (!Registry.is("ide.hide.excluded.files") && settings instanceof ProjectViewSettings && ((ProjectViewSettings)settings).isShowExcludedFiles()) {
return directoryInfo.isExcluded();
}
return false;
@@ -230,7 +239,7 @@ public class ProjectViewDirectoryHelper {
vFile = dir.getVirtualFile();
if (!vFile.equals(projectFileIndex.getSourceRootForFile(vFile))) { // if is not a source root
if (viewSettings.isHideEmptyMiddlePackages() && !skipDirectory(psiDir) && isEmptyMiddleDirectory(dir, true)) {
- processPsiDirectoryChildren(dir, directoryChildrenInProject(projectFileIndex, dir),
+ processPsiDirectoryChildren(dir, directoryChildrenInProject(dir, viewSettings),
container, projectFileIndex, moduleFileIndex, viewSettings, withSubDirectories); // expand it recursively
continue;
}