package com.jetbrains.lang.dart.ide.hierarchy.type;
import com.intellij.ide.hierarchy.HierarchyBrowser;
import com.intellij.ide.hierarchy.HierarchyProvider;
import com.intellij.ide.hierarchy.TypeHierarchyBrowserBase;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.lang.dart.psi.DartClass;
import com.jetbrains.lang.dart.psi.DartReference;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class DartTypeHierarchyProvider implements HierarchyProvider {
@Nullable
@Override
public DartClass getTarget(@NotNull final DataContext dataContext) {
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
if (project == null || editor == null) return null;
final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
final PsiElement psiElement = file == null ? null : file.findElementAt(editor.getCaretModel().getOffset());
final DartReference dartReference = PsiTreeUtil.getParentOfType(psiElement, DartReference.class);
if (dartReference != null) {
return dartReference.resolveDartClass().getDartClass();
}
return PsiTreeUtil.getParentOfType(psiElement, DartClass.class);
}
@NotNull
@Override
public HierarchyBrowser createHierarchyBrowser(final PsiElement target) {
return new DartTypeHierarchyBrowser(target.getProject(), (DartClass)target);
}
@Override
public void browserActivated(@NotNull final HierarchyBrowser hierarchyBrowser) {
((DartTypeHierarchyBrowser)hierarchyBrowser).changeView(TypeHierarchyBrowserBase.TYPE_HIERARCHY_TYPE);
}
}