| /* |
| * Copyright 2000-2009 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.hierarchy.type; |
| |
| import com.intellij.ide.hierarchy.HierarchyNodeDescriptor; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.psi.CommonClassNames; |
| import com.intellij.psi.PsiClass; |
| |
| import java.util.ArrayList; |
| |
| public final class TypeHierarchyTreeStructure extends SubtypesHierarchyTreeStructure { |
| |
| public TypeHierarchyTreeStructure(final Project project, final PsiClass aClass, String currentScopeType) { |
| super(project, buildHierarchyElement(project, aClass), currentScopeType); |
| setBaseElement(myBaseDescriptor); //to set myRoot |
| } |
| |
| private static HierarchyNodeDescriptor buildHierarchyElement(final Project project, final PsiClass aClass) { |
| HierarchyNodeDescriptor descriptor = null; |
| final PsiClass[] superClasses = createSuperClasses(aClass); |
| for(int i = superClasses.length - 1; i >= 0; i--){ |
| final PsiClass superClass = superClasses[i]; |
| final HierarchyNodeDescriptor newDescriptor = new TypeHierarchyNodeDescriptor(project, descriptor, superClass, false); |
| if (descriptor != null){ |
| descriptor.setCachedChildren(new HierarchyNodeDescriptor[] {newDescriptor}); |
| } |
| descriptor = newDescriptor; |
| } |
| final HierarchyNodeDescriptor newDescriptor = new TypeHierarchyNodeDescriptor(project, descriptor, aClass, true); |
| if (descriptor != null) { |
| descriptor.setCachedChildren(new HierarchyNodeDescriptor[] {newDescriptor}); |
| } |
| return newDescriptor; |
| } |
| |
| private static PsiClass[] createSuperClasses(PsiClass aClass) { |
| if (!aClass.isValid()) return PsiClass.EMPTY_ARRAY; |
| if (aClass.isInterface()) return PsiClass.EMPTY_ARRAY; |
| |
| final ArrayList<PsiClass> superClasses = new ArrayList<PsiClass>(); |
| while (!CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) { |
| final PsiClass aClass1 = aClass; |
| final PsiClass[] superTypes = aClass1.getSupers(); |
| PsiClass superType = null; |
| for (int i = 0; i < superTypes.length; i++) { |
| final PsiClass type = superTypes[i]; |
| if (!type.isInterface()) { |
| superType = type; |
| break; |
| } |
| } |
| if (superType == null) break; |
| if (superClasses.contains(superType)) break; |
| superClasses.add(superType); |
| aClass = superType; |
| } |
| |
| return superClasses.toArray(new PsiClass[superClasses.size()]); |
| } |
| } |