@Nullable
[fedora-idea.git] / lang-impl / src / com / intellij / ide / projectView / impl / nodes / PsiDirectoryNode.java
blobe46553938839137ac6595cf07da73c3c7972f34f
1 package com.intellij.ide.projectView.impl.nodes;
3 import com.intellij.ide.IconProvider;
4 import com.intellij.ide.projectView.PresentationData;
5 import com.intellij.ide.projectView.ViewSettings;
6 import com.intellij.ide.projectView.impl.ProjectRootsUtil;
7 import com.intellij.ide.util.treeView.AbstractTreeNode;
8 import com.intellij.openapi.extensions.Extensions;
9 import com.intellij.openapi.module.Module;
10 import com.intellij.openapi.module.ModuleUtil;
11 import com.intellij.openapi.project.Project;
12 import com.intellij.openapi.roots.ModuleFileIndex;
13 import com.intellij.openapi.roots.ModuleRootManager;
14 import com.intellij.openapi.roots.ProjectFileIndex;
15 import com.intellij.openapi.roots.ProjectRootManager;
16 import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
17 import com.intellij.openapi.util.Iconable;
18 import com.intellij.openapi.vfs.VfsUtil;
19 import com.intellij.openapi.vfs.VirtualFile;
20 import com.intellij.psi.PsiDirectory;
21 import com.intellij.psi.impl.file.PsiDirectoryFactory;
22 import com.intellij.ui.LayeredIcon;
23 import com.intellij.util.Icons;
24 import org.jetbrains.annotations.NotNull;
26 import javax.swing.*;
27 import java.util.Collection;
29 public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> {
30 public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings) {
31 super(project, value, viewSettings);
34 protected void updateImpl(PresentationData data) {
35 final Project project = getProject();
36 final PsiDirectory psiDirectory = getValue();
37 final VirtualFile directoryFile = psiDirectory.getVirtualFile();
38 final String name = getParentValue() instanceof Project
39 ? psiDirectory.getVirtualFile().getPresentableUrl()
40 : ProjectViewDirectoryHelper.getInstance(psiDirectory.getProject()).getNodeName(getSettings(), getParentValue(), psiDirectory);
41 if (name == null) {
42 setValue(null);
43 return;
46 final VirtualFile virtualFile = psiDirectory.getVirtualFile();
47 final boolean isWritable = virtualFile.isWritable();
49 data.setPresentableText(name);
50 if (ProjectRootsUtil.isModuleContentRoot(directoryFile, project) || ProjectRootsUtil.isLibraryRoot(directoryFile, project)) {
51 final String locationString = directoryFile.getPresentableUrl();
52 if (!locationString.equals(name)) {
53 data.setLocationString(locationString);
56 else {
57 if (!ProjectRootsUtil.isInTestSource(directoryFile, project)) {
58 data.setLocationString(ProjectViewDirectoryHelper.getInstance(project).getLocationString(psiDirectory, false));
62 for (final IconProvider provider : Extensions.getExtensions(IconProvider.EXTENSION_POINT_NAME)) {
63 final Icon openIcon = provider.getIcon(psiDirectory, Iconable.ICON_FLAG_OPEN);
64 if (openIcon != null) {
65 final Icon closedIcon = provider.getIcon(psiDirectory, Iconable.ICON_FLAG_CLOSED);
66 if (closedIcon != null) {
67 data.setOpenIcon(addReadMark(openIcon, isWritable));
68 data.setClosedIcon(addReadMark(closedIcon, isWritable));
69 return;
76 public Collection<AbstractTreeNode> getChildrenImpl() {
77 return ProjectViewDirectoryHelper.getInstance(myProject).getDirectoryChildren(getValue(), getSettings(), true);
80 public String getTestPresentation() {
81 return "PsiDirectory: " + getValue().getName();
84 public boolean isFQNameShown() {
85 return ProjectViewDirectoryHelper.getInstance(getProject()).isShowFQName(getSettings(), getParentValue(), getValue());
88 public boolean contains(@NotNull VirtualFile file) {
89 final PsiDirectory value = getValue();
90 if (value == null) {
91 return false;
94 if (!VfsUtil.isAncestor(value.getVirtualFile(), file, false)) {
95 return false;
97 final Project project = value.getProject();
98 final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
99 final Module module = fileIndex.getModuleForFile(value.getVirtualFile());
100 if (module == null) {
101 return fileIndex.getModuleForFile(file) == null;
103 final ModuleFileIndex moduleFileIndex = ModuleRootManager.getInstance(module).getFileIndex();
105 return moduleFileIndex.isInContent(file);
108 public VirtualFile getVirtualFile() {
109 PsiDirectory directory = getValue();
110 if (directory == null) return null;
111 return directory.getVirtualFile();
114 public boolean canRepresent(final Object element) {
115 if (super.canRepresent(element)) return true;
116 PsiDirectory directory = getValue();
117 if (directory == null) return false;
118 return ProjectViewDirectoryHelper.getInstance(getProject()).canRepresent(element, directory);
121 public boolean canNavigate() {
122 VirtualFile virtualFile = getVirtualFile();
123 return virtualFile != null && (ProjectRootsUtil.isSourceOrTestRoot(virtualFile, getProject()) || ProjectRootsUtil.isLibraryRoot(virtualFile, getProject()));
126 public boolean canNavigateToSource() {
127 return false;
130 public void navigate(final boolean requestFocus) {
131 Module module = ModuleUtil.findModuleForPsiElement(getValue());
132 if (module != null) {
133 ProjectSettingsService.getInstance(myProject).openContentEntriesSettings(module);
137 public int getWeight() {
138 return isFQNameShown() ? 70 : 0;
141 public String getTitle() {
142 final PsiDirectory directory = getValue();
143 if (directory != null) {
144 return PsiDirectoryFactory.getInstance(getProject()).getQualifiedName(directory, true);
146 return super.getTitle();
149 private static Icon addReadMark(Icon originalIcon, boolean isWritable) {
150 if (isWritable) {
151 return originalIcon;
153 else {
154 return LayeredIcon.create(originalIcon, Icons.LOCKED_ICON);
158 public String getQualifiedNameSortKey() {
159 final PsiDirectoryFactory factory = PsiDirectoryFactory.getInstance(getProject());
160 return factory.getQualifiedName(getValue(), true);
163 public int getTypeSortWeight(final boolean sortByType) {
164 return 3;
167 @Override
168 public boolean shouldDrillDownOnEmptyElement() {
169 return true;