ability to provide custom structure view wrapper (editor action "Select in -> File Structure")

structure view model must use Editor from passed FileEditor, but not current focused Editor if document virtual file is not in local file system
This commit is contained in:
Vladimir Krivosheev
2013-06-24 12:27:17 +02:00
parent b9279ce152
commit dc893007e5
17 changed files with 141 additions and 56 deletions
@@ -27,6 +27,7 @@ import com.intellij.ide.structureView.impl.java.JavaFileTreeModel;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageStructureViewBuilder;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor;
import com.intellij.openapi.fileTypes.FileType;
@@ -39,6 +40,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class JavaClsStructureViewBuilderProvider implements StructureViewBuilderProvider {
@Override
@Nullable
public StructureViewBuilder getStructureViewBuilder(@NotNull final FileType fileType, @NotNull final VirtualFile file, @NotNull final Project project) {
@@ -58,9 +60,10 @@ public class JavaClsStructureViewBuilderProvider implements StructureViewBuilder
final PsiJavaFile javaFile = (PsiJavaFile)psiFile;
if (javaFile == null) return null;
return new TreeBasedStructureViewBuilder() {
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new JavaFileTreeModel(javaFile);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new JavaFileTreeModel(javaFile, editor);
}
};
}
@@ -23,9 +23,11 @@ import com.intellij.ide.util.treeView.smartTree.Filter;
import com.intellij.ide.util.treeView.smartTree.Grouper;
import com.intellij.ide.util.treeView.smartTree.NodeProvider;
import com.intellij.ide.util.treeView.smartTree.Sorter;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.*;
import com.intellij.ui.PlaceHolder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
@@ -36,11 +38,12 @@ public class JavaFileTreeModel extends TextEditorBasedStructureViewModel impleme
private final PsiClassOwner myFile;
private String myPlace;
public JavaFileTreeModel(@NotNull PsiClassOwner file) {
super(file);
public JavaFileTreeModel(@NotNull PsiClassOwner file, @Nullable Editor editor) {
super(editor, file);
myFile = file;
}
@Override
@NotNull
public Filter[] getFilters() {
return new Filter[]{new FieldsFilter(),
@@ -53,20 +56,24 @@ public class JavaFileTreeModel extends TextEditorBasedStructureViewModel impleme
return NODE_PROVIDERS;
}
@Override
@NotNull
public Grouper[] getGroupers() {
return new Grouper[]{new SuperTypesGrouper(), new PropertiesGrouper()};
}
@Override
@NotNull
public StructureViewTreeElement getRoot() {
return new JavaFileTreeElement(myFile);
}
@Override
public boolean shouldEnterElement(final Object element) {
return element instanceof PsiClass;
}
@Override
@NotNull
public Sorter[] getSorters() {
return new Sorter[] {
@@ -76,15 +83,18 @@ public class JavaFileTreeModel extends TextEditorBasedStructureViewModel impleme
Sorter.ALPHA_SORTER};
}
@Override
protected PsiFile getPsiFile() {
return myFile;
}
@Override
public boolean isAlwaysShowsPlus(StructureViewTreeElement element) {
Object value = element.getValue();
return value instanceof PsiClass || value instanceof PsiFile;
}
@Override
public boolean isAlwaysLeaf(StructureViewTreeElement element) {
Object value = element.getValue();
return value instanceof PsiMethod || value instanceof PsiField;
@@ -113,6 +123,7 @@ public class JavaFileTreeModel extends TextEditorBasedStructureViewModel impleme
return false;
}
@Override
@NotNull
protected Class[] getSuitableClasses() {
return new Class[]{PsiClass.class, PsiMethod.class, PsiField.class, PsiJavaFile.class};
@@ -24,6 +24,7 @@ import com.intellij.ide.structureView.StructureViewModel;
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
import com.intellij.ide.structureView.impl.java.JavaFileTreeModel;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import org.jetbrains.annotations.NotNull;
@@ -37,8 +38,8 @@ public class JavaStructureViewBuilderFactory implements PsiStructureViewFactory
return new TreeBasedStructureViewBuilder() {
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new JavaFileTreeModel((PsiJavaFile)psiFile);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new JavaFileTreeModel((PsiJavaFile)psiFile, editor);
}
@Override
@@ -17,8 +17,10 @@
package com.intellij.ide.structureView;
import com.intellij.ide.util.treeView.smartTree.Sorter;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yole
@@ -28,8 +30,8 @@ public class StructureViewModelBase extends TextEditorBasedStructureViewModel {
private Sorter[] mySorters = Sorter.EMPTY_ARRAY;
private Class[] mySuitableClasses = null;
public StructureViewModelBase(@NotNull PsiFile psiFile, @NotNull StructureViewTreeElement root) {
super(psiFile);
public StructureViewModelBase(@NotNull PsiFile psiFile, @Nullable Editor editor, @NotNull StructureViewTreeElement root) {
super(editor, psiFile);
myRoot = root;
}
@@ -66,7 +66,7 @@ public abstract class TextEditorBasedStructureViewModel implements StructureView
this(editor, null);
}
private TextEditorBasedStructureViewModel(Editor editor, PsiFile file) {
protected TextEditorBasedStructureViewModel(Editor editor, PsiFile file) {
myEditor = editor;
myPsiFile = file;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2013 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.
@@ -16,11 +16,13 @@
package com.intellij.ide.structureView;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Default implementation of the {@link StructureViewBuilder} interface which uses the
@@ -32,20 +34,33 @@ import org.jetbrains.annotations.NotNull;
* @see com.intellij.lang.LanguageStructureViewBuilder#getStructureViewBuilder(com.intellij.psi.PsiFile)
*/
public abstract class TreeBasedStructureViewBuilder implements StructureViewBuilder {
/**
* @deprecated Use createStructureViewModel(Editor editor)
*/
@NotNull
@Deprecated
public StructureViewModel createStructureViewModel() {
throw new AbstractMethodError();
}
/**
* Returns the structure view model defining the data displayed in the structure view
* for a specific file.
*
* todo This method must be abstract, but due to compatibility reasons we wait IDEA 13 release
*
* @return the structure view model instance.
* @see TextEditorBasedStructureViewModel
*/
@NotNull
public abstract StructureViewModel createStructureViewModel();
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return createStructureViewModel();
}
@Override
@NotNull
public StructureView createStructureView(FileEditor fileEditor, Project project) {
final StructureViewModel model = createStructureViewModel();
final StructureViewModel model = createStructureViewModel(fileEditor instanceof TextEditor ? ((TextEditor)fileEditor).getEditor() : null);
StructureView view = StructureViewFactory.getInstance(project).createStructureView(fileEditor, model, project, isRootNodeShown());
Disposer.register(view, new Disposable() {
@Override
@@ -57,10 +72,10 @@ public abstract class TreeBasedStructureViewBuilder implements StructureViewBuil
}
/**
* Override returning <code>false</code> if root node created by {@link #createStructureViewModel()} shall not be visible
* Override returning <code>false</code> if root node created by {@link #createStructureViewModel(Editor editor)} shall not be visible
* @return <code>false</code> if root node shall not be visible in structure tree.
*/
public boolean isRootNodeShown() {
return true;
}
}
}
@@ -112,16 +112,23 @@ public abstract class SelectInContextImpl implements SelectInContext {
private static SelectInContext createEditorContext(DataContext dataContext) {
final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
final FileEditor editor = PlatformDataKeys.FILE_EDITOR.getData(dataContext);
return createEditorContext(project, editor);
return doCreateEditorContext(project, editor, dataContext);
}
public static SelectInContext createEditorContext(Project project, FileEditor editor) {
return doCreateEditorContext(project, editor, null);
}
private static SelectInContext doCreateEditorContext(Project project, FileEditor editor, @Nullable DataContext dataContext) {
if (project == null || editor == null) {
return null;
}
VirtualFile file = FileEditorManagerEx.getInstanceEx(project).getFile(editor);
if (file == null) {
return null;
file = dataContext == null ? null : PlatformDataKeys.VIRTUAL_FILE.getData(dataContext);
if (file == null) {
return null;
}
}
final PsiFile psiFile = PsiManager.getInstance(project).findFile(file);
if (psiFile == null) {
@@ -16,7 +16,6 @@
package com.intellij.ide.favoritesTreeView;
import com.intellij.ide.SelectInContext;
import com.intellij.ide.SelectInTarget;
import com.intellij.ide.actions.SelectInContextImpl;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
@@ -53,15 +52,11 @@ public class FavoritesAutoscrollFromSourceHandler extends AutoScrollFromSourceHa
if (file != null) {
final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file);
if (psiFile != null) {
final SelectInTarget target = mySelectInTarget;
if (target != null) {
final SelectInContext selectInContext = SelectInContextImpl.createEditorContext(myProject, editor);
if (target.canSelect(selectInContext)) {
target.selectIn(selectInContext, false);
}
final SelectInContext selectInContext = SelectInContextImpl.createEditorContext(myProject, editor);
if (mySelectInTarget.canSelect(selectInContext)) {
mySelectInTarget.selectIn(selectInContext, false);
}
}
}
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2013 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.
@@ -24,17 +24,19 @@ import com.intellij.ide.structureView.StructureViewFactoryEx;
import com.intellij.ide.structureView.StructureViewWrapper;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
public class StructureViewSelectInTarget implements SelectInTarget {
public static final Key<StructureViewWrapper> CUSTOM_STRUCTURE_VIEW_KEY = Key.create("customStructureView");
private final Project myProject;
public StructureViewSelectInTarget(Project project) {
myProject = project;
}
public String toString() {
return IdeBundle.message("select.in.file.structure");
}
@@ -48,15 +50,20 @@ public class StructureViewSelectInTarget implements SelectInTarget {
public void selectIn(final SelectInContext context, final boolean requestFocus) {
final FileEditor fileEditor = context.getFileEditorProvider().openFileEditor();
ToolWindowManager windowManager=ToolWindowManager.getInstance(context.getProject());
StructureViewWrapper customStructureView = CUSTOM_STRUCTURE_VIEW_KEY.get(context.getVirtualFile());
if (customStructureView != null) {
customStructureView.selectCurrentElement(fileEditor, context.getVirtualFile(), requestFocus);
return;
}
ToolWindowManager windowManager = ToolWindowManager.getInstance(context.getProject());
final Runnable runnable = new Runnable() {
@Override
public void run() {
StructureViewFactoryEx.getInstanceEx(myProject).runWhenInitialized(new Runnable() {
@Override
public void run() {
final StructureViewWrapper structureView = getStructureViewWrapper();
structureView.selectCurrentElement(fileEditor, context.getVirtualFile(), requestFocus);
getStructureViewWrapper().selectCurrentElement(fileEditor, context.getVirtualFile(), requestFocus);
}
});
}
@@ -67,7 +74,6 @@ public class StructureViewSelectInTarget implements SelectInTarget {
else {
runnable.run();
}
}
private StructureViewWrapper getStructureViewWrapper() {
@@ -88,5 +94,4 @@ public class StructureViewSelectInTarget implements SelectInTarget {
public float getWeight() {
return StandardTargetWeights.STRUCTURE_WEIGHT;
}
}
}
@@ -27,20 +27,24 @@ import com.intellij.ide.structureView.impl.java.JavaFileTreeModel;
import com.intellij.ide.structureView.impl.java.JavaInheritedMembersNodeProvider;
import com.intellij.ide.util.treeView.smartTree.NodeProvider;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase;
import java.util.Arrays;
import java.util.Collection;
public class GroovyStructureViewFactory implements PsiStructureViewFactory {
@Override
public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) {
return new TreeBasedStructureViewBuilder() {
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new JavaFileTreeModel((GroovyFileBase)psiFile) {
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new JavaFileTreeModel((GroovyFileBase)psiFile, editor) {
@NotNull
@Override
public Collection<NodeProvider> getNodeProviders() {
@@ -21,18 +21,21 @@ import com.intellij.ide.structureView.StructureViewModel;
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.Function;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomManager;
import com.intellij.util.xml.DomService;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class DomStructureViewBuilder extends TreeBasedStructureViewBuilder {
private final Function<DomElement, DomService.StructureViewMode> myDescriptor;
@@ -43,18 +46,22 @@ public class DomStructureViewBuilder extends TreeBasedStructureViewBuilder {
myDescriptor = descriptor;
}
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new DomStructureViewTreeModel(myFile, myDescriptor);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new DomStructureViewTreeModel(myFile, myDescriptor, editor);
}
@Override
public boolean isRootNodeShown() {
return true;
}
@Override
@NotNull
public StructureView createStructureView(final FileEditor fileEditor, final Project project) {
return new StructureViewComponent(fileEditor, createStructureViewModel(), project) {
return new StructureViewComponent(fileEditor, createStructureViewModel(fileEditor instanceof TextEditor ? ((TextEditor)fileEditor).getEditor() : null), project) {
@Override
public AsyncResult<AbstractTreeNode> expandPathToElement(final Object element) {
if (element instanceof XmlElement) {
final XmlElement xmlElement = (XmlElement)element;
@@ -21,11 +21,13 @@ import com.intellij.ide.structureView.impl.xml.XmlFileTreeElement;
import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel;
import com.intellij.ide.util.treeView.smartTree.Sorter;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.Function;
import com.intellij.util.xml.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Gregory.Shrago
@@ -35,17 +37,21 @@ public class DomStructureViewTreeModel extends XmlStructureViewTreeModel impleme
private final DomElementNavigationProvider myNavigationProvider;
private final Function<DomElement, DomService.StructureViewMode> myDescriptor;
public DomStructureViewTreeModel(final XmlFile file, final Function<DomElement, DomService.StructureViewMode> descriptor) {
this(file, DomElementsNavigationManager.getManager(file.getProject()).getDomElementsNavigateProvider(DomElementsNavigationManager.DEFAULT_PROVIDER_NAME), descriptor);
public DomStructureViewTreeModel(final XmlFile file, final Function<DomElement, DomService.StructureViewMode> descriptor, @Nullable Editor editor) {
this(file, DomElementsNavigationManager.getManager(file.getProject()).getDomElementsNavigateProvider(DomElementsNavigationManager.DEFAULT_PROVIDER_NAME), descriptor, editor);
}
public DomStructureViewTreeModel(final XmlFile file, final DomElementNavigationProvider navigationProvider, final Function<DomElement, DomService.StructureViewMode> descriptor) {
super(file);
public DomStructureViewTreeModel(final XmlFile file,
final DomElementNavigationProvider navigationProvider,
final Function<DomElement, DomService.StructureViewMode> descriptor,
@Nullable Editor editor) {
super(file, editor);
myFile = file;
myNavigationProvider = navigationProvider;
myDescriptor = descriptor;
}
@Override
@NotNull
public StructureViewTreeElement getRoot() {
final DomFileElement<DomElement> fileElement = DomManager.getDomManager(myFile.getProject()).getFileElement(myFile, DomElement.class);
@@ -58,11 +64,13 @@ public class DomStructureViewTreeModel extends XmlStructureViewTreeModel impleme
return myNavigationProvider;
}
@Override
@NotNull
public Sorter[] getSorters() {
return new Sorter[]{Sorter.ALPHA_SORTER};
}
@Override
protected PsiFile getPsiFile() {
return myFile;
}
@@ -21,10 +21,12 @@ import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.ide.structureView.TextEditorBasedStructureViewModel;
import com.intellij.ide.util.treeView.smartTree.Sorter;
import com.intellij.lang.dtd.DTDLanguage;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
@@ -33,30 +35,35 @@ public class XmlStructureViewTreeModel extends TextEditorBasedStructureViewModel
private static final Class[] myClasses = new Class[]{XmlTag.class, XmlFile.class, XmlEntityDecl.class, XmlElementDecl.class, XmlAttlistDecl.class, XmlConditionalSection.class};
private static final Sorter[] mySorters = {Sorter.ALPHA_SORTER};
public XmlStructureViewTreeModel(XmlFile file) {
super(file);
public XmlStructureViewTreeModel(XmlFile file, @Nullable Editor editor) {
super(editor, file);
myFile = file;
}
@Override
@NotNull
public StructureViewTreeElement getRoot() {
if (myFile.getLanguage() == DTDLanguage.INSTANCE) return new DtdFileTreeElement(myFile);
return new XmlFileTreeElement(myFile);
}
@Override
public boolean shouldEnterElement(final Object element) {
return element instanceof XmlTag && ((XmlTag)element).getSubTags().length > 0;
}
@Override
protected PsiFile getPsiFile() {
return myFile;
}
@Override
@NotNull
protected Class[] getSuitableClasses() {
return myClasses;
}
@Override
public Object getCurrentEditorElement() {
final Object editorElement = super.getCurrentEditorElement();
if (editorElement instanceof XmlTag) {
@@ -70,8 +77,9 @@ public class XmlStructureViewTreeModel extends TextEditorBasedStructureViewModel
return editorElement;
}
@Override
@NotNull
public Sorter[] getSorters() {
return mySorters;
}
}
}
@@ -24,17 +24,21 @@ import com.intellij.ide.structureView.StructureViewModel;
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class DtdStructureViewBuilderFactory implements PsiStructureViewFactory {
@Override
@NotNull
public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) {
return new TreeBasedStructureViewBuilder() {
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new XmlStructureViewTreeModel((XmlFile)psiFile);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new XmlStructureViewTreeModel((XmlFile)psiFile, editor);
}
};
}
@@ -20,24 +20,28 @@ import com.intellij.ide.structureView.StructureViewBuilder;
import com.intellij.ide.structureView.StructureViewModel;
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
import com.intellij.ide.structureView.xml.XmlStructureViewBuilderProvider;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.xml.XmlFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class HtmlStructureViewBuilderProvider implements XmlStructureViewBuilderProvider {
@Override
@Nullable
public StructureViewBuilder createStructureViewBuilder(@NotNull final XmlFile file) {
if (file.getViewProvider().getVirtualFile().getFileType() != HtmlFileType.INSTANCE) return null;
return new TreeBasedStructureViewBuilder() {
@Override
public boolean isRootNodeShown() {
return false;
}
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new HtmlStructureViewTreeModel(file);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new HtmlStructureViewTreeModel(file, editor);
}
};
}
}
}
@@ -20,9 +20,11 @@ import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel;
import com.intellij.ide.util.treeView.smartTree.NodeProvider;
import com.intellij.ide.util.treeView.smartTree.Sorter;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.PlaceHolder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
@@ -33,29 +35,35 @@ class HtmlStructureViewTreeModel extends XmlStructureViewTreeModel implements Pl
private String myStructureViewPlace;
public HtmlStructureViewTreeModel(final XmlFile file) {
super(file);
public HtmlStructureViewTreeModel(final XmlFile file, @Nullable Editor editor) {
super(file, editor);
myNodeProviders = Arrays.<NodeProvider>asList(new Html5SectionsNodeProvider());
}
@Override
public void setPlace(final String place) {
myStructureViewPlace = place;
}
@Override
public String getPlace() {
return myStructureViewPlace;
}
@Override
@NotNull
public Sorter[] getSorters() {
return Sorter.EMPTY_ARRAY;
}
@Override
@NotNull
public Collection<NodeProvider> getNodeProviders() {
return myNodeProviders;
}
@Override
@NotNull
public StructureViewTreeElement getRoot() {
return new HtmlFileTreeElement(ViewStructureAction.isInStructureViewPopup(this), (XmlFile)getPsiFile());
@@ -27,6 +27,7 @@ import com.intellij.ide.structureView.xml.XmlStructureViewBuilderProvider;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageStructureViewBuilder;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
@@ -34,6 +35,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class XmlStructureViewBuilderFactory implements PsiStructureViewFactory {
@Override
@Nullable
public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) {
if (!(psiFile instanceof XmlFile)) {
@@ -52,9 +54,10 @@ public class XmlStructureViewBuilderFactory implements PsiStructureViewFactory {
}
return new TreeBasedStructureViewBuilder() {
@Override
@NotNull
public StructureViewModel createStructureViewModel() {
return new XmlStructureViewTreeModel((XmlFile)psiFile);
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
return new XmlStructureViewTreeModel((XmlFile)psiFile, editor);
}
};
}