mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
avoid re-using disposed browser
This commit is contained in:
@@ -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
|
||||
|
||||
+19
-4
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user