From ea026af3ec0ff1281476ba392997f8d1c0dad941 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 5 Jul 2007 15:05:24 +0400 Subject: [PATCH] jpa structure view --- .../com/intellij/util/xml/impl/DomServiceImpl.java | 9 ++ .../xml/structure/DomStructureTreeElement.java | 103 +++++++++++++++++++++ .../xml/structure/DomStructureViewBuilder.java | 66 +++++++++++++ .../xml/structure/DomStructureViewTreeModel.java | 65 +++++++++++++ .../src/com/intellij/util/xml/DomService.java | 7 ++ 5 files changed, 250 insertions(+) create mode 100644 dom/impl/src/com/intellij/util/xml/structure/DomStructureTreeElement.java create mode 100644 dom/impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java create mode 100644 dom/impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java diff --git a/dom/impl/src/com/intellij/util/xml/impl/DomServiceImpl.java b/dom/impl/src/com/intellij/util/xml/impl/DomServiceImpl.java index 2b8fff489c..8d55efebff 100644 --- a/dom/impl/src/com/intellij/util/xml/impl/DomServiceImpl.java +++ b/dom/impl/src/com/intellij/util/xml/impl/DomServiceImpl.java @@ -4,9 +4,13 @@ package com.intellij.util.xml.impl; +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.util.Function; +import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomService; import com.intellij.util.xml.ModelMerger; import com.intellij.util.xml.ModelMergerImpl; +import com.intellij.util.xml.structure.DomStructureViewBuilder; /** * @author Gregory.Shrago @@ -17,4 +21,9 @@ public class DomServiceImpl extends DomService { return new ModelMergerImpl(); } + + public StructureViewBuilder createSimpleStructureViewBuilder(final DomElement element, final Function modeProvider) { + return new DomStructureViewBuilder(element, modeProvider); + } + } diff --git a/dom/impl/src/com/intellij/util/xml/structure/DomStructureTreeElement.java b/dom/impl/src/com/intellij/util/xml/structure/DomStructureTreeElement.java new file mode 100644 index 0000000000..97423e8eb1 --- /dev/null +++ b/dom/impl/src/com/intellij/util/xml/structure/DomStructureTreeElement.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.util.xml.structure; + +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.TreeElement; +import com.intellij.navigation.ItemPresentation; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.util.Function; +import com.intellij.util.xml.*; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.ArrayList; + +/** + * @author Gregory.Shrago + */ +public class DomStructureTreeElement implements StructureViewTreeElement, ItemPresentation { + private final DomElement myElement; + private final Function myDescriptor; + private final DomElementNavigationProvider myNavigationProvider; + + public DomStructureTreeElement(final DomElement element, final Function descriptor, final DomElementNavigationProvider navigationProvider) { + myElement = element; + myDescriptor = descriptor; + myNavigationProvider = navigationProvider; + } + + public DomElement getElement() { + return myElement; + } + + public DomElementNavigationProvider getNavigationProvider() { + return myNavigationProvider; + } + + public Object getValue() { + return myElement.getXmlElement(); + } + + public ItemPresentation getPresentation() { + return this; + } + + public TreeElement[] getChildren() { + final ArrayList result = new ArrayList(); + final DomElementVisitor elementVisitor = new DomElementVisitor() { + public void visitDomElement(final DomElement element) { + final DomService.StructureViewMode viewMode = myDescriptor.fun(element); + switch (viewMode) { + case SHOW: + result.add(new DomStructureTreeElement(element, myDescriptor, myNavigationProvider)); + break; + case SHOW_CHILDREN: + DomUtil.acceptAvailableChildren(element, this); + break; + case SKIP: + break; + } + } + }; + DomUtil.acceptAvailableChildren(myElement, elementVisitor); + return result.toArray(new TreeElement[result.size()]); + } + + public void navigate(boolean requestFocus) { + if (myNavigationProvider != null) myNavigationProvider.navigate(myElement, true); + } + + public boolean canNavigate() { + return myNavigationProvider != null && myNavigationProvider.canNavigate(myElement); + } + + public boolean canNavigateToSource() { + return myNavigationProvider != null && myNavigationProvider.canNavigate(myElement); + } + + public String getPresentableText() { + if (!myElement.isValid()) return ""; + final ElementPresentation presentation = myElement.getPresentation(); + final String name = presentation.getElementName(); + return name != null? name : presentation.getTypeName(); + } + + @Nullable + public String getLocationString() { + return null; + } + + @Nullable + public Icon getIcon(boolean open) { + if (!myElement.isValid()) return null; + return myElement.getPresentation().getIcon(); + } + + @Nullable + public TextAttributesKey getTextAttributesKey() { + return null; + } +} diff --git a/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java b/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java new file mode 100644 index 0000000000..ff8727aedb --- /dev/null +++ b/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewBuilder.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.util.xml.structure; + +import com.intellij.ide.structureView.StructureView; +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; +import com.intellij.ide.structureView.newStructureView.StructureViewComponent; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlElement; +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 javax.swing.tree.DefaultMutableTreeNode; + +public class DomStructureViewBuilder extends TreeBasedStructureViewBuilder { + private final DomElement myRoot; + private final Function myDescriptor; + + public DomStructureViewBuilder(final DomElement root, final Function descriptor) { + myRoot = root; + myDescriptor = descriptor; + } + + @NotNull + public StructureViewModel createStructureViewModel() { + return new DomStructureViewTreeModel(myRoot, myRoot.getManager().getProject(), myDescriptor); + } + + public boolean isRootNodeShown() { + return true; + } + + @NotNull + public StructureView createStructureView(final FileEditor fileEditor, final Project project) { + return new StructureViewComponent(fileEditor, createStructureViewModel(), project) { + public DefaultMutableTreeNode expandPathToElement(final Object element) { + if (element instanceof XmlElement) { + final XmlElement xmlElement = (XmlElement)element; + XmlTag tag = PsiTreeUtil.getParentOfType(xmlElement, XmlTag.class, false); + while (tag != null) { + final DomElement domElement = DomManager.getDomManager(xmlElement.getProject()).getDomElement(tag); + if (domElement != null) { + for (DomElement curElement = domElement; curElement != null; curElement = curElement.getParent()) { + if (myDescriptor.fun(curElement) == DomService.StructureViewMode.SHOW) { + return super.expandPathToElement(curElement.getXmlElement()); + } + } + } + tag = PsiTreeUtil.getParentOfType(tag, XmlTag.class, true); + } + + } + return super.expandPathToElement(element); + } + }; + } +} \ No newline at end of file diff --git a/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java b/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java new file mode 100644 index 0000000000..8a7638ba56 --- /dev/null +++ b/dom/impl/src/com/intellij/util/xml/structure/DomStructureViewTreeModel.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.util.xml.structure; + +import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.Grouper; +import com.intellij.ide.util.treeView.smartTree.Sorter; +import com.intellij.ide.util.treeView.smartTree.Filter; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.project.Project; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomElementNavigationProvider; +import com.intellij.util.xml.DomElementsNavigationManager; +import com.intellij.util.xml.DomService; +import com.intellij.util.Function; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; + +/** + * @author Gregory.Shrago +*/ +public class DomStructureViewTreeModel extends XmlStructureViewTreeModel implements Disposable { + private DomElement myElement; + private DomElementNavigationProvider myNavigationProvider; + private final Function myDescriptor; + + public DomStructureViewTreeModel(@NotNull final DomElement mapping, Project project, final Function descriptor) { + this(mapping, DomElementsNavigationManager.getManager(project).getDomElementsNavigateProvider(DomElementsNavigationManager.DEFAULT_PROVIDER_NAME), descriptor); + } + + public DomStructureViewTreeModel(@NotNull final DomElement element, final DomElementNavigationProvider navigationProvider, final Function descriptor) { + super(element.getRoot().getFile()); + + myElement = element; + myNavigationProvider = navigationProvider; + myDescriptor = descriptor; + } + + @NotNull + public StructureViewTreeElement getRoot() { + return new DomStructureTreeElement(myElement, myDescriptor, myNavigationProvider); + } + + @NotNull + public Grouper[] getGroupers() { + return Grouper.EMPTY_ARRAY; + } + + @NotNull + public Sorter[] getSorters() { + return new Sorter[]{Sorter.ALPHA_SORTER}; + } + + @NotNull + public Filter[] getFilters() { + return Filter.EMPTY_ARRAY; + } + + protected PsiFile getPsiFile() { + return myElement.getRoot().getFile(); + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/DomService.java b/dom/openapi/src/com/intellij/util/xml/DomService.java index d1d61ae133..26ed6b2484 100644 --- a/dom/openapi/src/com/intellij/util/xml/DomService.java +++ b/dom/openapi/src/com/intellij/util/xml/DomService.java @@ -4,7 +4,9 @@ package com.intellij.util.xml; +import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.openapi.components.ServiceManager; +import com.intellij.util.Function; /** * @author Gregory.Shrago @@ -16,4 +18,9 @@ public abstract class DomService { } public abstract ModelMerger createModelMerger(); + + public enum StructureViewMode { + SHOW, SHOW_CHILDREN, SKIP + } + public abstract StructureViewBuilder createSimpleStructureViewBuilder(final DomElement element, final Function modeProvider); } -- 2.11.4.GIT