diff --git a/README.md b/README.md
index e150698..800375e 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ make it work with JUnit 5. Feel free to use the code (in package ```de.platon42.
### V0.4 (unreleased)
--
+- Enhancement: Added Structure View filters.
### V0.3 (28-Jul-21)
diff --git a/build.gradle b/build.gradle
index 0cc7231..bf3f918 100644
--- a/build.gradle
+++ b/build.gradle
@@ -57,6 +57,10 @@ runPluginVerifier {
patchPluginXml {
setChangeNotes("""
+
V0.4 (unreleased)
+
+ - Enhancement: Added Structure View filters.
+
V0.3 (28-Jul-21)
- Enhancement: Macro contents are no longer parsed, added syntax highlighting options for macros.
diff --git a/src/main/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewModel.kt b/src/main/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewModel.kt
index 2890aa0..a3307be 100644
--- a/src/main/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewModel.kt
+++ b/src/main/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewModel.kt
@@ -3,24 +3,77 @@ package de.platon42.intellij.plugins.m68k.structureview
import com.intellij.ide.structureView.StructureViewModel.ElementInfoProvider
import com.intellij.ide.structureView.StructureViewModelBase
import com.intellij.ide.structureView.StructureViewTreeElement
-import com.intellij.ide.util.treeView.smartTree.Sorter
+import com.intellij.ide.util.treeView.smartTree.*
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiFile
+import de.platon42.intellij.plugins.m68k.M68kIcons
+import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
import de.platon42.intellij.plugins.m68k.psi.M68kLocalLabel
import de.platon42.intellij.plugins.m68k.psi.M68kMacroDefinition
+import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
class M68kStructureViewModel(psiFile: PsiFile, editor: Editor?) :
StructureViewModelBase(psiFile, editor, M68kStructureViewElement(psiFile)), ElementInfoProvider {
- override fun isAlwaysShowsPlus(element: StructureViewTreeElement): Boolean {
- return false
+ companion object {
+ val FILTERS = arrayOf(SymbolsFilter(), MacrosFilter(), GlobalLabelFilter(), LocalLabelFilter())
+
+ const val SYMBOLS_FILTER_ID = "SHOW_SYMBOLS"
+ const val MACROS_FILTER_ID = "SHOW_MACROS"
+ const val GLOBAL_LABEL_FILTER_ID = "SHOW_GLOBAL_LABELS"
+ const val LOCAL_LABEL_FILTER_ID = "SHOW_LOCAL_LABELS"
}
+ override fun isAlwaysShowsPlus(element: StructureViewTreeElement): Boolean = false
+
override fun isAlwaysLeaf(element: StructureViewTreeElement): Boolean {
- return element.value is M68kLocalLabel || element.value is M68kMacroDefinition
+ return when (element.value) {
+ is M68kLocalLabel, is M68kMacroDefinition, is M68kSymbolDefinition -> true
+ else -> false
+ }
}
- override fun getSorters(): Array {
- return arrayOf(Sorter.ALPHA_SORTER)
+ override fun getSorters(): Array = arrayOf(Sorter.ALPHA_SORTER)
+
+ override fun getFilters(): Array = FILTERS
+
+ class SymbolsFilter : Filter {
+ override fun getPresentation(): ActionPresentation = ActionPresentationData("Show Symbols", null, M68kIcons.SYMBOL_DEF)
+
+ override fun getName(): String = SYMBOLS_FILTER_ID
+
+ override fun isVisible(treeNode: TreeElement?) = (treeNode as? StructureViewTreeElement)?.value !is M68kSymbolDefinition
+
+ override fun isReverted() = true
+ }
+
+ class MacrosFilter : Filter {
+ override fun getPresentation(): ActionPresentation = ActionPresentationData("Show Macros", null, M68kIcons.MACRO_DEF)
+
+ override fun getName(): String = MACROS_FILTER_ID
+
+ override fun isVisible(treeNode: TreeElement?) = (treeNode as? StructureViewTreeElement)?.value !is M68kMacroDefinition
+
+ override fun isReverted() = true
+ }
+
+ class GlobalLabelFilter : Filter {
+ override fun getPresentation(): ActionPresentation = ActionPresentationData("Show Global Labels", null, M68kIcons.GLOBAL_LABEL)
+
+ override fun getName(): String = GLOBAL_LABEL_FILTER_ID
+
+ override fun isVisible(treeNode: TreeElement?) = (treeNode as? StructureViewTreeElement)?.value !is M68kGlobalLabel
+
+ override fun isReverted() = true
+ }
+
+ class LocalLabelFilter : Filter {
+ override fun getPresentation(): ActionPresentation = ActionPresentationData("Show Local Labels", null, M68kIcons.LOCAL_LABEL)
+
+ override fun getName(): String = LOCAL_LABEL_FILTER_ID
+
+ override fun isVisible(treeNode: TreeElement?) = (treeNode as? StructureViewTreeElement)?.value !is M68kLocalLabel
+
+ override fun isReverted() = true
}
}
\ No newline at end of file
diff --git a/src/test/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewTest.kt b/src/test/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewTest.kt
index 48e9750..e702ff4 100644
--- a/src/test/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewTest.kt
+++ b/src/test/java/de/platon42/intellij/plugins/m68k/structureview/M68kStructureViewTest.kt
@@ -32,6 +32,93 @@ internal class M68kStructureViewTest : AbstractM68kTest() {
.loopw
main
exit
+"""
+ )
+ }
+ }
+
+ @Test
+ internal fun macros_filter_works(@MyFixture myFixture: CodeInsightTestFixture) {
+ myFixture.configureByFile("basic_example.asm")
+ myFixture.testStructureView {
+ val tree = it.tree
+ it.setActionActive(M68kStructureViewModel.MACROS_FILTER_ID, true)
+ PlatformTestUtil.waitWhileBusy(tree)
+ PlatformTestUtil.assertTreeEqual(
+ tree, """-basic_example.asm
+ PIC_WIDTH
+ PIC_HEIGHT
+ DEBUG_LEVEL
+ entry
+ -init
+ .looph
+ .loopw
+ main
+ exit
+"""
+ )
+ }
+ }
+
+ @Test
+ internal fun symbols_filter_works(@MyFixture myFixture: CodeInsightTestFixture) {
+ myFixture.configureByFile("basic_example.asm")
+ myFixture.testStructureView {
+ val tree = it.tree
+ it.setActionActive(M68kStructureViewModel.SYMBOLS_FILTER_ID, true)
+ PlatformTestUtil.waitWhileBusy(tree)
+ PlatformTestUtil.assertTreeEqual(
+ tree, """-basic_example.asm
+ BLTHOGON
+ BLTHOGOFF
+ entry
+ -init
+ .looph
+ .loopw
+ main
+ exit
+"""
+ )
+ }
+ }
+
+ @Test
+ internal fun global_labels_filter_works(@MyFixture myFixture: CodeInsightTestFixture) {
+ myFixture.configureByFile("basic_example.asm")
+ myFixture.testStructureView {
+ val tree = it.tree
+ it.setActionActive(M68kStructureViewModel.GLOBAL_LABEL_FILTER_ID, true)
+ PlatformTestUtil.waitWhileBusy(tree)
+ PlatformTestUtil.assertTreeEqual(
+ tree, """-basic_example.asm
+ PIC_WIDTH
+ PIC_HEIGHT
+ DEBUG_LEVEL
+ BLTHOGON
+ BLTHOGOFF
+"""
+ )
+ }
+ }
+
+ @Test
+ internal fun local_labels_filter_works(@MyFixture myFixture: CodeInsightTestFixture) {
+ myFixture.configureByFile("basic_example.asm")
+ myFixture.testStructureView {
+ val tree = it.tree
+ it.setActionActive(M68kStructureViewModel.LOCAL_LABEL_FILTER_ID, true)
+ PlatformTestUtil.waitWhileBusy(tree)
+ PlatformTestUtil.assertTreeEqual(
+ tree, """-basic_example.asm
+ PIC_WIDTH
+ PIC_HEIGHT
+ DEBUG_LEVEL
+ BLTHOGON
+ BLTHOGOFF
+ entry
+ init
+ main
+ exit
"""
)
}