mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
StructureViewExtension refactored
This commit is contained in:
@@ -16,10 +16,16 @@
|
||||
package com.intellij.ide.structureView;
|
||||
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface StructureViewExtension {
|
||||
|
||||
ExtensionPointName<StructureViewExtension> EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.lang.structureViewExtension");
|
||||
|
||||
Class<? extends PsiElement> getType();
|
||||
|
||||
StructureViewTreeElement[] getChildren(PsiElement parent);
|
||||
@Nullable
|
||||
Object getCurrentEditorElement(Editor editor, PsiElement parent);
|
||||
|
||||
@@ -30,9 +30,6 @@ public abstract class StructureViewFactoryEx extends StructureViewFactory {
|
||||
@Nullable
|
||||
public abstract StructureViewWrapper getStructureViewWrapper();
|
||||
|
||||
public abstract void registerExtension(Class<? extends PsiElement> type, StructureViewExtension extension);
|
||||
public abstract void unregisterExtension(Class<? extends PsiElement> type, StructureViewExtension extension);
|
||||
|
||||
public abstract Collection<StructureViewExtension> getAllExtensions(Class<? extends PsiElement> type);
|
||||
|
||||
public abstract void setActiveAction(final String name, final boolean state);
|
||||
|
||||
+19
-13
@@ -22,16 +22,19 @@ import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
|
||||
import com.intellij.openapi.components.PersistentStateComponent;
|
||||
import com.intellij.openapi.components.State;
|
||||
import com.intellij.openapi.components.Storage;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.fileEditor.FileEditor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.MultiValuesMap;
|
||||
import com.intellij.openapi.util.NotNullLazyValue;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.ui.content.Content;
|
||||
import com.intellij.ui.content.ContentFactory;
|
||||
import com.intellij.util.ReflectionCache;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -62,7 +65,19 @@ public final class StructureViewFactoryImpl extends StructureViewFactoryEx imple
|
||||
private State myState = new State();
|
||||
private Runnable myRunWhenInitialized = null;
|
||||
|
||||
private final MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension> myExtensions = new MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension>();
|
||||
private static final NotNullLazyValue<MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension>> myExtensions = new NotNullLazyValue<MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension>>() {
|
||||
@NotNull
|
||||
@Override
|
||||
protected MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension> compute() {
|
||||
MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension> map =
|
||||
new MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension>();
|
||||
StructureViewExtension[] extensions = Extensions.getExtensions(StructureViewExtension.EXTENSION_POINT_NAME);
|
||||
for (StructureViewExtension extension : extensions) {
|
||||
map.put(extension.getType(), extension);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
};
|
||||
private final MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension> myImplExtensions = new MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension>();
|
||||
|
||||
public StructureViewFactoryImpl(Project project) {
|
||||
@@ -93,22 +108,13 @@ public final class StructureViewFactoryImpl extends StructureViewFactoryEx imple
|
||||
}
|
||||
}
|
||||
|
||||
public void registerExtension(Class<? extends PsiElement> type, StructureViewExtension extension) {
|
||||
myExtensions.put(type, extension);
|
||||
myImplExtensions.clear();
|
||||
}
|
||||
|
||||
public void unregisterExtension(Class<? extends PsiElement> type, StructureViewExtension extension) {
|
||||
myExtensions.remove(type, extension);
|
||||
myImplExtensions.clear();
|
||||
}
|
||||
|
||||
public Collection<StructureViewExtension> getAllExtensions(Class<? extends PsiElement> type) {
|
||||
Collection<StructureViewExtension> result = myImplExtensions.get(type);
|
||||
if (result == null) {
|
||||
for (Class<? extends PsiElement> registeredType : myExtensions.keySet()) {
|
||||
MultiValuesMap<Class<? extends PsiElement>, StructureViewExtension> map = myExtensions.getValue();
|
||||
for (Class<? extends PsiElement> registeredType : map.keySet()) {
|
||||
if (ReflectionCache.isAssignable(registeredType, type)) {
|
||||
final Collection<StructureViewExtension> extensions = myExtensions.get(registeredType);
|
||||
final Collection<StructureViewExtension> extensions = map.get(registeredType);
|
||||
for (StructureViewExtension extension : extensions) {
|
||||
myImplExtensions.put(type, extension);
|
||||
}
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
beanClass="com.intellij.lang.LanguageExtensionPoint"/>
|
||||
<extensionPoint name="lang.psiStructureViewFactory"
|
||||
beanClass="com.intellij.lang.LanguageExtensionPoint"/>
|
||||
<extensionPoint name="lang.structureViewExtension"
|
||||
interface="com.intellij.ide.structureView.StructureViewExtension"/>
|
||||
<extensionPoint name="lang.ast.factory"
|
||||
beanClass="com.intellij.lang.LanguageExtensionPoint"/>
|
||||
<extensionPoint name="lang.formatter" beanClass="com.intellij.lang.LanguageExtensionPoint"/>
|
||||
|
||||
Reference in New Issue
Block a user