diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java new file mode 100644 index 0000000000000000000000000000000000000000..dd6e74dc9112e7671f2b20d98b23418432c63701 --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java @@ -0,0 +1,74 @@ +package org.jastadd.tooling; + +import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.SortableTreeElement; +import com.intellij.ide.util.treeView.smartTree.TreeElement; +import com.intellij.navigation.ItemPresentation; +import com.intellij.psi.NavigatablePsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import org.jastadd.tooling.psi.RelAstGrammarFile; +import org.jastadd.tooling.psi.RelAstGrammarTypeDecl; +import org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImpl; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class RelAstGrammarStructureViewElement implements StructureViewTreeElement, SortableTreeElement { + + private final NavigatablePsiElement myElement; + + public RelAstGrammarStructureViewElement(NavigatablePsiElement element) { + this.myElement = element; + } + + @Override + public Object getValue() { + return myElement; + } + + @Override + public void navigate(boolean requestFocus) { + myElement.navigate(requestFocus); + } + + @Override + public boolean canNavigate() { + return myElement.canNavigate(); + } + + @Override + public boolean canNavigateToSource() { + return myElement.canNavigateToSource(); + } + + @NotNull + @Override + public String getAlphaSortKey() { + String name = myElement.getName(); + return name != null ? name : ""; + } + + @NotNull + @Override + public ItemPresentation getPresentation() { + ItemPresentation presentation = myElement.getPresentation(); + return presentation != null ? presentation : new PresentationData(); + } + + @NotNull + @Override + public TreeElement @NotNull [] getChildren() { + if (myElement instanceof RelAstGrammarFile) { + List<RelAstGrammarTypeDecl> properties = PsiTreeUtil.getChildrenOfTypeAsList(myElement, RelAstGrammarTypeDecl.class); + List<TreeElement> treeElements = new ArrayList<>(properties.size()); + for (RelAstGrammarTypeDecl property : properties) { + treeElements.add(new RelAstGrammarStructureViewElement((RelAstGrammarTypeDeclImpl) property)); + } + return treeElements.toArray(new TreeElement[0]); + } + return EMPTY_ARRAY; + } + +} diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..23b14e4281f2816557667501fab17a594ce7485c --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java @@ -0,0 +1,26 @@ +package org.jastadd.tooling; + +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; +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; + +public class RelAstGrammarStructureViewFactory implements PsiStructureViewFactory { + + @Nullable + @Override + public StructureViewBuilder getStructureViewBuilder(@NotNull final PsiFile psiFile) { + return new TreeBasedStructureViewBuilder() { + @NotNull + @Override + public StructureViewModel createStructureViewModel(@Nullable Editor editor) { + return new RelAstGrammarStructureViewModel(psiFile); + } + }; + } + +} diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java new file mode 100644 index 0000000000000000000000000000000000000000..9f164f06b9c71570d7578c83452f1ad49dcaad1e --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java @@ -0,0 +1,34 @@ +package org.jastadd.tooling; + +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.StructureViewModelBase; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.Sorter; +import com.intellij.psi.PsiFile; +import org.jastadd.tooling.psi.RelAstGrammarFile; +import org.jetbrains.annotations.NotNull; + +public class RelAstGrammarStructureViewModel extends StructureViewModelBase implements + StructureViewModel.ElementInfoProvider { + + public RelAstGrammarStructureViewModel(PsiFile psiFile) { + super(psiFile, new RelAstGrammarStructureViewElement(psiFile)); + } + + @NotNull + public Sorter[] getSorters() { + return new Sorter[]{Sorter.ALPHA_SORTER}; + } + + + @Override + public boolean isAlwaysShowsPlus(StructureViewTreeElement element) { + return false; + } + + @Override + public boolean isAlwaysLeaf(StructureViewTreeElement element) { + return element instanceof RelAstGrammarFile; + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f2d489f03713716ac8366d9e10f068dc8130ae8f..29eb7921f9f6a73367c02f9b3c68a98271a4911a 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -41,8 +41,10 @@ <lang.findUsagesProvider language="JastAddGrammar" implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/> - <gotoSymbolContributor - implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/> + <gotoSymbolContributor implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/> + + <lang.psiStructureViewFactory language="JastAddGrammar" + implementationClass="org.jastadd.tooling.RelAstGrammarStructureViewFactory"/> </extensions> <actions>