diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/CallHierarchyBrowserBase.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/CallHierarchyBrowserBase.java index 17fcd5280216..8c2fedacb690 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/CallHierarchyBrowserBase.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/CallHierarchyBrowserBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -28,9 +28,9 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; public abstract class CallHierarchyBrowserBase extends HierarchyBrowserBaseEx { - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String CALLEE_TYPE = IdeBundle.message("title.hierarchy.callees.of"); - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String CALLER_TYPE = IdeBundle.message("title.hierarchy.callers.of"); private static final String CALL_HIERARCHY_BROWSER_DATA_KEY = "com.intellij.ide.hierarchy.CallHierarchyBrowserBase"; @@ -84,7 +84,7 @@ public abstract class CallHierarchyBrowserBase extends HierarchyBrowserBaseEx { private class ChangeViewTypeActionBase extends ToggleAction { private final String myTypeName; - public ChangeViewTypeActionBase(final String shortDescription, final String longDescription, final Icon icon, String typeName) { + private ChangeViewTypeActionBase(final String shortDescription, final String longDescription, final Icon icon, String typeName) { super(shortDescription, longDescription, icon); myTypeName = typeName; } @@ -109,7 +109,7 @@ public abstract class CallHierarchyBrowserBase extends HierarchyBrowserBaseEx { } @Override - public final void update(final AnActionEvent event) { + public final void update(@NotNull final AnActionEvent event) { super.update(event); setEnabled(isValidBase()); } @@ -117,7 +117,8 @@ public abstract class CallHierarchyBrowserBase extends HierarchyBrowserBaseEx { protected static class BaseOnThisMethodAction extends BaseOnThisElementAction { public BaseOnThisMethodAction() { - super(IdeBundle.message("action.base.on.this.method"), IdeActions.ACTION_CALL_HIERARCHY, CALL_HIERARCHY_BROWSER_DATA_KEY); + super(IdeBundle.message("action.base.on.this.method"), IdeActions.ACTION_CALL_HIERARCHY, CALL_HIERARCHY_BROWSER_DATA_KEY, + LanguageCallHierarchy.INSTANCE); } } diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java index 0557c5e0903c..1b412b6224f4 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -23,9 +23,11 @@ import com.intellij.ide.OccurenceNavigatorSupport; import com.intellij.ide.PsiCopyPasteManager; import com.intellij.ide.dnd.*; import com.intellij.ide.dnd.aware.DnDAwareTree; +import com.intellij.ide.hierarchy.actions.BrowseHierarchyActionBase; import com.intellij.ide.projectView.impl.ProjectViewTree; import com.intellij.ide.util.scopeChooser.EditScopesDialog; import com.intellij.ide.util.treeView.NodeDescriptor; +import com.intellij.lang.LanguageExtension; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; @@ -67,7 +69,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem @NonNls private static final String HELP_ID = "reference.toolWindows.hierarchy"; protected final Hashtable myBuilders = new Hashtable(); - protected final Hashtable myType2TreeMap = new Hashtable(); + private final Hashtable myType2TreeMap = new Hashtable(); private final RefreshAction myRefreshAction = new RefreshAction(); private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); @@ -76,7 +78,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem private final JPanel myTreePanel; protected String myCurrentViewType; - private boolean myCachedIsValidBase = false; + private boolean myCachedIsValidBase; private final Map myOccurrenceNavigators = new HashMap(); @@ -115,7 +117,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem public static final String SCOPE_ALL = IdeBundle.message("hierarchy.scope.all"); public static final String SCOPE_TEST = IdeBundle.message("hierarchy.scope.test"); public static final String SCOPE_CLASS = IdeBundle.message("hierarchy.scope.this.class"); - protected final Map myType2ScopeMap = new HashMap(); + private final Map myType2ScopeMap = new HashMap(); public HierarchyBrowserBaseEx(@NotNull Project project, @NotNull PsiElement element) { super(project); @@ -447,7 +449,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem return myBuilders.get(myCurrentViewType); } - protected final boolean isValidBase() { + final boolean isValidBase() { if (PsiDocumentManager.getInstance(myProject).getUncommittedDocuments().length > 0) { return myCachedIsValidBase; } @@ -463,7 +465,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem return myType2TreeMap.get(myCurrentViewType); } - public String getCurrentViewType() { + String getCurrentViewType() { return myCurrentViewType; } @@ -486,7 +488,7 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem myBuilders.clear(); } - protected void doRefresh(boolean currentBuilderOnly) { + void doRefresh(boolean currentBuilderOnly) { if (currentBuilderOnly) LOG.assertTrue(myCurrentViewType != null); if (!isValidBase()) return; @@ -551,21 +553,26 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem } @Override - public final void update(final AnActionEvent event) { + public final void update(@NotNull final AnActionEvent event) { super.update(event); final Presentation presentation = event.getPresentation(); presentation.setEnabled(isValidBase()); } } - protected static class BaseOnThisElementAction extends AnAction { + static class BaseOnThisElementAction extends AnAction { private final String myActionId; private final String myBrowserDataKey; + @NotNull private final LanguageExtension myProviderLanguageExtension; - public BaseOnThisElementAction(String text, String actionId, String browserDataKey) { + BaseOnThisElementAction(@NotNull String text, + @NotNull String actionId, + @NotNull String browserDataKey, + @NotNull LanguageExtension providerLanguageExtension) { super(text); myActionId = actionId; myBrowserDataKey = browserDataKey; + myProviderLanguageExtension = providerLanguageExtension; } @Override @@ -579,12 +586,15 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem final String currentViewType = browser.myCurrentViewType; Disposer.dispose(browser); - browser.setHierarchyBase(selectedElement); - browser.validate(); + final HierarchyProvider provider = BrowseHierarchyActionBase.findProvider(myProviderLanguageExtension, + selectedElement, + selectedElement.getContainingFile(), + event.getDataContext()); + final HierarchyBrowser newBrowser = BrowseHierarchyActionBase.createAndAddToPanel(selectedElement.getProject(), provider, selectedElement); ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - browser.changeView(correctViewType(browser, currentViewType)); + ((HierarchyBrowserBaseEx)newBrowser).changeView(correctViewType(browser, currentViewType)); } }); } diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java index 005985d01864..81faee3da635 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -23,7 +23,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -31,11 +30,10 @@ import java.awt.*; public abstract class MethodHierarchyBrowserBase extends HierarchyBrowserBaseEx { - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String METHOD_TYPE = IdeBundle.message("title.hierarchy.method"); public static final DataKey DATA_KEY = DataKey.create("com.intellij.ide.hierarchy.MethodHierarchyBrowserBase"); - @Deprecated @NonNls public static final String METHOD_HIERARCHY_BROWSER_DATA_KEY = DATA_KEY.getName(); public MethodHierarchyBrowserBase(final Project project, final PsiElement method) { super(project, method); @@ -58,11 +56,10 @@ public abstract class MethodHierarchyBrowserBase extends HierarchyBrowserBaseEx final String methodShouldBeDefined) { final JPanel panel = new JPanel(new GridBagLayout()); - JLabel label; final GridBagConstraints gc = new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(3, 5, 0, 5), 0, 0); - label = new JLabel(methodDefinedText, AllIcons.Hierarchy.MethodDefined, SwingConstants.LEFT); + JLabel label = new JLabel(methodDefinedText, AllIcons.Hierarchy.MethodDefined, SwingConstants.LEFT); label.setUI(new MultiLineLabelUI()); label.setIconTextGap(10); panel.add(label, gc); @@ -100,8 +97,8 @@ public abstract class MethodHierarchyBrowserBase extends HierarchyBrowserBaseEx return ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR; } - final class ShowImplementationsOnlyAction extends ToggleAction { - public ShowImplementationsOnlyAction() { + private final class ShowImplementationsOnlyAction extends ToggleAction { + private ShowImplementationsOnlyAction() { super(IdeBundle.message("action.hide.non.implementations"), null, AllIcons.General.Filter); // TODO[anton] use own icon!!! } @@ -125,7 +122,7 @@ public abstract class MethodHierarchyBrowserBase extends HierarchyBrowserBaseEx } @Override - public final void update(final AnActionEvent event) { + public final void update(@NotNull final AnActionEvent event) { super.update(event); final Presentation presentation = event.getPresentation(); presentation.setEnabled(isValidBase()); @@ -134,7 +131,8 @@ public abstract class MethodHierarchyBrowserBase extends HierarchyBrowserBaseEx public static class BaseOnThisMethodAction extends BaseOnThisElementAction { public BaseOnThisMethodAction() { - super(IdeBundle.message("action.base.on.this.method"), IdeActions.ACTION_METHOD_HIERARCHY, DATA_KEY.getName()); + super(IdeBundle.message("action.base.on.this.method"), IdeActions.ACTION_METHOD_HIERARCHY, DATA_KEY.getName(), + LanguageMethodHierarchy.INSTANCE); } } diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/TypeHierarchyBrowserBase.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/TypeHierarchyBrowserBase.java index 1d4d69eb5eec..e9b9e2b0319d 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/TypeHierarchyBrowserBase.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/TypeHierarchyBrowserBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -32,11 +32,11 @@ import java.util.Map; public abstract class TypeHierarchyBrowserBase extends HierarchyBrowserBaseEx { - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String TYPE_HIERARCHY_TYPE = IdeBundle.message("title.hierarchy.class"); - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String SUBTYPES_HIERARCHY_TYPE = IdeBundle.message("title.hierarchy.subtypes"); - @SuppressWarnings({"UnresolvedPropertyKey"}) + @SuppressWarnings("UnresolvedPropertyKey") public static final String SUPERTYPES_HIERARCHY_TYPE = IdeBundle.message("title.hierarchy.supertypes"); private boolean myIsInterface; @@ -44,7 +44,6 @@ public abstract class TypeHierarchyBrowserBase extends HierarchyBrowserBaseEx { private final MyDeleteProvider myDeleteElementProvider = new MyDeleteProvider(); public static final DataKey DATA_KEY = DataKey.create("com.intellij.ide.hierarchy.TypeHierarchyBrowserBase"); - @Deprecated public static final String TYPE_HIERARCHY_BROWSER_DATA_KEY = DATA_KEY.getName(); public TypeHierarchyBrowserBase(final Project project, final PsiElement element) { super(project, element); @@ -167,7 +166,7 @@ public abstract class TypeHierarchyBrowserBase extends HierarchyBrowserBaseEx { protected static class BaseOnThisTypeAction extends BaseOnThisElementAction { public BaseOnThisTypeAction() { - super("", IdeActions.ACTION_TYPE_HIERARCHY, DATA_KEY.getName()); + super("", IdeActions.ACTION_TYPE_HIERARCHY, DATA_KEY.getName(), LanguageTypeHierarchy.INSTANCE); } @Override diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseHierarchyActionBase.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseHierarchyActionBase.java index e611961a84ee..241b5a000043 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseHierarchyActionBase.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseHierarchyActionBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -29,10 +29,12 @@ import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.ui.content.ContentManager; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; @@ -45,7 +47,7 @@ public abstract class BrowseHierarchyActionBase extends AnAction { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.hierarchy.actions.BrowseHierarchyActionBase"); private final LanguageExtension myExtension; - protected BrowseHierarchyActionBase(final LanguageExtension extension) { + protected BrowseHierarchyActionBase(@NotNull LanguageExtension extension) { myExtension = extension; } @@ -61,6 +63,10 @@ public abstract class BrowseHierarchyActionBase extends AnAction { if (provider == null) return; final PsiElement target = provider.getTarget(dataContext); if (target == null) return; + createAndAddToPanel(project, provider, target); + } + + public static HierarchyBrowser createAndAddToPanel(@NotNull Project project, @NotNull final HierarchyProvider provider, @NotNull PsiElement target) { final HierarchyBrowser hierarchyBrowser = provider.createHierarchyBrowser(target); final Content content; @@ -91,6 +97,7 @@ public abstract class BrowseHierarchyActionBase extends AnAction { } }; ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.HIERARCHY).activate(runnable); + return hierarchyBrowser; } @Override @@ -125,9 +132,17 @@ public abstract class BrowseHierarchyActionBase extends AnAction { @Nullable private HierarchyProvider getProvider(final AnActionEvent e) { - final HierarchyProvider provider = findBestHierarchyProvider(myExtension, e.getData(CommonDataKeys.PSI_ELEMENT), e.getDataContext()); + return findProvider(myExtension, e.getData(CommonDataKeys.PSI_ELEMENT), e.getData(CommonDataKeys.PSI_FILE), e.getDataContext()); + } + + @Nullable + public static HierarchyProvider findProvider(@NotNull LanguageExtension extension, + @Nullable PsiElement psiElement, + @Nullable PsiFile psiFile, + @NotNull DataContext dataContext) { + final HierarchyProvider provider = findBestHierarchyProvider(extension, psiElement, dataContext); if (provider == null) { - return findBestHierarchyProvider(myExtension, e.getData(CommonDataKeys.PSI_FILE), e.getDataContext()); + return findBestHierarchyProvider(extension, psiFile, dataContext); } return provider; }