avoid re-using disposed browser

This commit is contained in:
Alexey Kudravtsev
2015-11-23 15:48:10 +03:00
parent e2cf4aa235
commit 483af417cb
5 changed files with 62 additions and 39 deletions
@@ -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);
}
}
@@ -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<String, HierarchyTreeBuilder> myBuilders = new Hashtable<String, HierarchyTreeBuilder>();
protected final Hashtable<String, JTree> myType2TreeMap = new Hashtable<String, JTree>();
private final Hashtable<String, JTree> myType2TreeMap = new Hashtable<String, JTree>();
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<String, OccurenceNavigator> myOccurrenceNavigators = new HashMap<String, OccurenceNavigator>();
@@ -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<String, String> myType2ScopeMap = new HashMap<String, String>();
private final Map<String, String> myType2ScopeMap = new HashMap<String, String>();
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<HierarchyProvider> myProviderLanguageExtension;
public BaseOnThisElementAction(String text, String actionId, String browserDataKey) {
BaseOnThisElementAction(@NotNull String text,
@NotNull String actionId,
@NotNull String browserDataKey,
@NotNull LanguageExtension<HierarchyProvider> 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));
}
});
}
@@ -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<MethodHierarchyBrowserBase> 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);
}
}
@@ -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<TypeHierarchyBrowserBase> 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
@@ -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<HierarchyProvider> myExtension;
protected BrowseHierarchyActionBase(final LanguageExtension<HierarchyProvider> extension) {
protected BrowseHierarchyActionBase(@NotNull LanguageExtension<HierarchyProvider> 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<HierarchyProvider> 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;
}