From dc893007e5b3228dee9b3cd752cb4cbf88c4b5f0 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 24 Jun 2013 12:26:36 +0200 Subject: [PATCH] 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 --- .../JavaClsStructureViewBuilderProvider.java | 7 +++-- .../impl/java/JavaFileTreeModel.java | 15 +++++++++-- .../java/JavaStructureViewBuilderFactory.java | 5 ++-- .../structureView/StructureViewModelBase.java | 6 +++-- .../TextEditorBasedStructureViewModel.java | 2 +- .../TreeBasedStructureViewBuilder.java | 27 ++++++++++++++----- .../ide/actions/SelectInContextImpl.java | 11 ++++++-- .../FavoritesAutoscrollFromSourceHandler.java | 13 +++------ .../ide/impl/StructureViewSelectInTarget.java | 21 +++++++++------ .../structure/GroovyStructureViewFactory.java | 8 ++++-- .../structure/DomStructureViewBuilder.java | 15 ++++++++--- .../structure/DomStructureViewTreeModel.java | 16 ++++++++--- .../impl/xml/XmlStructureViewTreeModel.java | 14 +++++++--- .../dtd/DtdStructureViewBuilderFactory.java | 8 ++++-- .../HtmlStructureViewBuilderProvider.java | 10 ++++--- .../HtmlStructureViewTreeModel.java | 12 +++++++-- .../xml/XmlStructureViewBuilderFactory.java | 7 +++-- 17 files changed, 141 insertions(+), 56 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java b/java/java-impl/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java index 3d4f103cce09..7361877b7e69 100644 --- a/java/java-impl/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java +++ b/java/java-impl/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java @@ -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); } }; } diff --git a/java/java-impl/src/com/intellij/ide/structureView/impl/java/JavaFileTreeModel.java b/java/java-impl/src/com/intellij/ide/structureView/impl/java/JavaFileTreeModel.java index d9c25eb53e28..962bf5f2c436 100644 --- a/java/java-impl/src/com/intellij/ide/structureView/impl/java/JavaFileTreeModel.java +++ b/java/java-impl/src/com/intellij/ide/structureView/impl/java/JavaFileTreeModel.java @@ -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}; diff --git a/java/java-impl/src/com/intellij/lang/java/JavaStructureViewBuilderFactory.java b/java/java-impl/src/com/intellij/lang/java/JavaStructureViewBuilderFactory.java index a353cff157f5..e8d4eba8a8ed 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaStructureViewBuilderFactory.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaStructureViewBuilderFactory.java @@ -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 diff --git a/platform/lang-api/src/com/intellij/ide/structureView/StructureViewModelBase.java b/platform/lang-api/src/com/intellij/ide/structureView/StructureViewModelBase.java index 00d9f5134253..3d00bf2a0baf 100644 --- a/platform/lang-api/src/com/intellij/ide/structureView/StructureViewModelBase.java +++ b/platform/lang-api/src/com/intellij/ide/structureView/StructureViewModelBase.java @@ -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; } diff --git a/platform/lang-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java b/platform/lang-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java index 067f1be779aa..809ee2cd6172 100644 --- a/platform/lang-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java +++ b/platform/lang-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java @@ -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; diff --git a/platform/lang-api/src/com/intellij/ide/structureView/TreeBasedStructureViewBuilder.java b/platform/lang-api/src/com/intellij/ide/structureView/TreeBasedStructureViewBuilder.java index 95796f053153..aec6a54d801b 100644 --- a/platform/lang-api/src/com/intellij/ide/structureView/TreeBasedStructureViewBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/structureView/TreeBasedStructureViewBuilder.java @@ -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 false if root node created by {@link #createStructureViewModel()} shall not be visible + * Override returning false if root node created by {@link #createStructureViewModel(Editor editor)} shall not be visible * @return false if root node shall not be visible in structure tree. */ public boolean isRootNodeShown() { return true; } -} +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java b/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java index 5b35576cd66c..9377369df6bc 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java @@ -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) { diff --git a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesAutoscrollFromSourceHandler.java b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesAutoscrollFromSourceHandler.java index 9e053ad2efe1..30bbf034a031 100644 --- a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesAutoscrollFromSourceHandler.java +++ b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesAutoscrollFromSourceHandler.java @@ -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); } } } } -} +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/impl/StructureViewSelectInTarget.java b/platform/lang-impl/src/com/intellij/ide/impl/StructureViewSelectInTarget.java index 2c3f8d46e198..5298efb949b4 100644 --- a/platform/lang-impl/src/com/intellij/ide/impl/StructureViewSelectInTarget.java +++ b/platform/lang-impl/src/com/intellij/ide/impl/StructureViewSelectInTarget.java @@ -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 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; } - -} +} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/structure/GroovyStructureViewFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/structure/GroovyStructureViewFactory.java index 08723b39b400..f1ccc7bb959c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/structure/GroovyStructureViewFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/structure/GroovyStructureViewFactory.java @@ -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 getNodeProviders() { diff --git a/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java b/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java index 94ccf53e6414..a8fb409e7c2a 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java +++ b/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java @@ -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 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 expandPathToElement(final Object element) { if (element instanceof XmlElement) { final XmlElement xmlElement = (XmlElement)element; diff --git a/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java b/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java index 41139a282d0d..bb5b01b008f4 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java +++ b/xml/dom-impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java @@ -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 myDescriptor; - public DomStructureViewTreeModel(final XmlFile file, final Function descriptor) { - this(file, DomElementsNavigationManager.getManager(file.getProject()).getDomElementsNavigateProvider(DomElementsNavigationManager.DEFAULT_PROVIDER_NAME), descriptor); + public DomStructureViewTreeModel(final XmlFile file, final Function 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 descriptor) { - super(file); + public DomStructureViewTreeModel(final XmlFile file, + final DomElementNavigationProvider navigationProvider, + final Function descriptor, + @Nullable Editor editor) { + super(file, editor); myFile = file; myNavigationProvider = navigationProvider; myDescriptor = descriptor; } + @Override @NotNull public StructureViewTreeElement getRoot() { final DomFileElement 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; } diff --git a/xml/impl/src/com/intellij/ide/structureView/impl/xml/XmlStructureViewTreeModel.java b/xml/impl/src/com/intellij/ide/structureView/impl/xml/XmlStructureViewTreeModel.java index 71212d1d4e37..9ea42d254006 100644 --- a/xml/impl/src/com/intellij/ide/structureView/impl/xml/XmlStructureViewTreeModel.java +++ b/xml/impl/src/com/intellij/ide/structureView/impl/xml/XmlStructureViewTreeModel.java @@ -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; } -} +} \ No newline at end of file diff --git a/xml/impl/src/com/intellij/lang/dtd/DtdStructureViewBuilderFactory.java b/xml/impl/src/com/intellij/lang/dtd/DtdStructureViewBuilderFactory.java index f88cafeb3ead..fcccefe44f88 100644 --- a/xml/impl/src/com/intellij/lang/dtd/DtdStructureViewBuilderFactory.java +++ b/xml/impl/src/com/intellij/lang/dtd/DtdStructureViewBuilderFactory.java @@ -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); } }; } diff --git a/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewBuilderProvider.java b/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewBuilderProvider.java index 3243fe7db7de..9a8741d308a8 100644 --- a/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewBuilderProvider.java +++ b/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewBuilderProvider.java @@ -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); } }; } -} +} \ No newline at end of file diff --git a/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewTreeModel.java b/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewTreeModel.java index 230a89ae4c26..f2bc5c148b85 100644 --- a/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewTreeModel.java +++ b/xml/impl/src/com/intellij/lang/html/structureView/HtmlStructureViewTreeModel.java @@ -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.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 getNodeProviders() { return myNodeProviders; } + @Override @NotNull public StructureViewTreeElement getRoot() { return new HtmlFileTreeElement(ViewStructureAction.isInStructureViewPopup(this), (XmlFile)getPsiFile()); diff --git a/xml/impl/src/com/intellij/lang/xml/XmlStructureViewBuilderFactory.java b/xml/impl/src/com/intellij/lang/xml/XmlStructureViewBuilderFactory.java index 2282b1787cdc..ba2721457763 100644 --- a/xml/impl/src/com/intellij/lang/xml/XmlStructureViewBuilderFactory.java +++ b/xml/impl/src/com/intellij/lang/xml/XmlStructureViewBuilderFactory.java @@ -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); } }; }