do nothing in PsiClassFavoriteNodeProvider.createPathFromUrl in dumb mode (EA-64998...
[idea/community.git] / java / java-impl / src / com / intellij / ide / favoritesTreeView / PsiClassFavoriteNodeProvider.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: 21-Jan-2008
20  */
21 package com.intellij.ide.favoritesTreeView;
22
23 import com.intellij.ide.favoritesTreeView.smartPointerPsiNodes.ClassSmartPointerNode;
24 import com.intellij.ide.projectView.ViewSettings;
25 import com.intellij.ide.projectView.impl.nodes.ClassTreeNode;
26 import com.intellij.ide.util.treeView.AbstractTreeNode;
27 import com.intellij.openapi.actionSystem.CommonDataKeys;
28 import com.intellij.openapi.actionSystem.DataContext;
29 import com.intellij.openapi.actionSystem.LangDataKeys;
30 import com.intellij.openapi.module.Module;
31 import com.intellij.openapi.module.ModuleManager;
32 import com.intellij.openapi.module.ModuleUtilCore;
33 import com.intellij.openapi.project.DumbService;
34 import com.intellij.openapi.project.Project;
35 import com.intellij.openapi.roots.FileIndexFacade;
36 import com.intellij.openapi.util.Comparing;
37 import com.intellij.openapi.vfs.VirtualFile;
38 import com.intellij.psi.JavaPsiFacade;
39 import com.intellij.psi.PsiClass;
40 import com.intellij.psi.PsiElement;
41 import com.intellij.psi.PsiFile;
42 import com.intellij.psi.presentation.java.ClassPresentationUtil;
43 import com.intellij.psi.search.GlobalSearchScope;
44 import org.jetbrains.annotations.NotNull;
45
46 import java.util.ArrayList;
47 import java.util.Collection;
48
49 public class PsiClassFavoriteNodeProvider extends FavoriteNodeProvider {
50   @Override
51   public Collection<AbstractTreeNode> getFavoriteNodes(final DataContext context, final ViewSettings viewSettings) {
52     final Project project = CommonDataKeys.PROJECT.getData(context);
53     if (project == null) return null;
54     PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(context);
55     if (elements == null) {
56       final PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(context);
57       if (element != null) {
58         elements = new PsiElement[]{element};
59       }
60     }
61     if (elements != null) {
62       final Collection<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
63       for (PsiElement element : elements) {
64         if (element instanceof PsiClass && checkClassUnderSources(element, project)) {
65           result.add(new ClassSmartPointerNode(project, element, viewSettings));
66         }
67       }
68       return result.isEmpty() ? null : result;
69     }
70     return null;
71   }
72
73   private boolean checkClassUnderSources(final PsiElement element, final Project project) {
74     final PsiFile file = element.getContainingFile();
75     if (file != null && file.getVirtualFile() != null) {
76       final FileIndexFacade indexFacade = FileIndexFacade.getInstance(project);
77       final VirtualFile vf = file.getVirtualFile();
78       return indexFacade.isInSource(vf) || indexFacade.isInSourceContent(vf);
79     }
80     return false;
81   }
82
83   @Override
84   public AbstractTreeNode createNode(final Project project, final Object element, final ViewSettings viewSettings) {
85     if (element instanceof PsiClass && checkClassUnderSources((PsiElement)element, project)) {
86       return new ClassSmartPointerNode(project, element, viewSettings);
87     }
88     return super.createNode(project, element, viewSettings);
89   }
90
91   @Override
92   public boolean elementContainsFile(final Object element, final VirtualFile vFile) {
93     if (element instanceof PsiClass) {
94       final PsiFile file = ((PsiClass)element).getContainingFile();
95       if (file != null && Comparing.equal(file.getVirtualFile(), vFile)) return true;
96     }
97     return false;
98   }
99
100   @Override
101   public int getElementWeight(final Object value, final boolean isSortByType) {
102      if (value instanceof PsiClass){
103       return isSortByType ? ClassTreeNode.getClassPosition((PsiClass)value) : 3;
104     }
105
106     return -1;
107   }
108
109   @Override
110   public String getElementLocation(final Object element) {
111     if (element instanceof PsiClass) {
112       return ClassPresentationUtil.getNameForClass((PsiClass)element, true);
113     }
114     return null;
115   }
116
117   @Override
118   public boolean isInvalidElement(final Object element) {
119     return element instanceof PsiClass && !((PsiClass)element).isValid();
120   }
121
122   @Override
123   @NotNull
124   public String getFavoriteTypeId() {
125     return "class";
126   }
127
128   @Override
129   public String getElementUrl(final Object element) {
130     if (element instanceof PsiClass) {
131       PsiClass aClass = (PsiClass)element;
132       return aClass.getQualifiedName();
133     }
134     return null;
135   }
136
137   @Override
138   public String getElementModuleName(final Object element) {
139     if (element instanceof PsiClass) {
140       PsiClass aClass = (PsiClass)element;
141       Module module = ModuleUtilCore.findModuleForPsiElement(aClass);
142       return module != null ? module.getName() : null;
143     }
144     return null;
145   }
146
147   @Override
148   public Object[] createPathFromUrl(final Project project, final String url, final String moduleName) {
149     if (DumbService.isDumb(project)) {
150       return null;
151     }
152
153     GlobalSearchScope scope = null;
154     if (moduleName != null) {
155       final Module module = ModuleManager.getInstance(project).findModuleByName(moduleName);
156       if (module != null) {
157         scope = GlobalSearchScope.moduleScope(module);
158       }
159     }
160     if (scope == null) {
161       scope = GlobalSearchScope.allScope(project);
162     }
163     final PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(url, scope);
164     if (aClass == null) return null;
165     return new Object[]{aClass};
166   }
167 }