support for resource directories: enable java-specific actions only for directories...
[idea/community.git] / java / java-impl / src / com / intellij / ide / navigationToolbar / JavaNavBarExtension.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*
18  * User: anna
19  * Date: 04-Feb-2008
20  */
21 package com.intellij.ide.navigationToolbar;
22
23 import com.intellij.analysis.AnalysisScopeBundle;
24 import com.intellij.lang.StdLanguages;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.psi.*;
27 import com.intellij.psi.presentation.java.ClassPresentationUtil;
28 import com.intellij.openapi.roots.ProjectFileIndex;
29 import com.intellij.openapi.roots.ProjectRootManager;
30 import com.intellij.openapi.vfs.VirtualFile;
31 import org.jetbrains.annotations.Nullable;
32 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
33
34 import java.util.Collection;
35 import java.util.Collections;
36
37 public class JavaNavBarExtension implements NavBarModelExtension{
38   public String getPresentableText(final Object object) {
39     if (object instanceof PsiClass) {
40       return ClassPresentationUtil.getNameForClass((PsiClass)object, false);
41     }
42     else if (object instanceof PsiPackage) {
43       final String name = ((PsiPackage)object).getName();
44       return name != null ? name : AnalysisScopeBundle.message("dependencies.tree.node.default.package.abbreviation");
45     }
46     return null;
47   }
48
49   public PsiElement getParent(final PsiElement psiElement) {
50     if (psiElement instanceof PsiPackage) {
51       final PsiPackage parentPackage = ((PsiPackage)psiElement).getParentPackage();
52       if (parentPackage != null && parentPackage.getQualifiedName().length() > 0) {
53         return parentPackage;
54       }
55     }
56     return null;
57   }
58
59
60   @Nullable
61   public PsiElement adjustElement(final PsiElement psiElement) {
62     final ProjectFileIndex index = ProjectRootManager.getInstance(psiElement.getProject()).getFileIndex();
63     final PsiFile containingFile = psiElement.getContainingFile();
64     if (containingFile != null) {
65       final VirtualFile file = containingFile.getVirtualFile();
66       if (file != null && (index.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) || index.isInLibraryClasses(file) || index.isInLibrarySource(file))) {
67         if (psiElement instanceof PsiJavaFile) {
68           final PsiJavaFile psiJavaFile = (PsiJavaFile)psiElement;
69           if (psiJavaFile.getViewProvider().getBaseLanguage() == StdLanguages.JAVA) {
70             final PsiClass[] psiClasses = psiJavaFile.getClasses();
71             if (psiClasses.length == 1) {
72               return psiClasses[0];
73             }
74           }
75         }
76         if (psiElement instanceof PsiClass) return psiElement;
77       }
78       return containingFile;
79     }
80     return psiElement.isPhysical() ? psiElement : null;
81   }
82
83   @Override
84   public Collection<VirtualFile> additionalRoots(Project project) {
85     return Collections.emptyList();
86   }
87 }