diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide/projectView')
3 files changed, 119 insertions, 18 deletions
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java b/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java new file mode 100644 index 000000000000..64e374097635 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java @@ -0,0 +1,23 @@ +/* + * 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. + * 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; + +/** + * @author nik + */ +public interface ProjectViewSettings extends ViewSettings { + boolean isShowExcludedFiles(); +} 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; } |