Skip to content

Commit d4370b1

Browse files
committed
add structure view
1 parent 88a6df5 commit d4370b1

File tree

16 files changed

+155
-33
lines changed

16 files changed

+155
-33
lines changed

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabCommand.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabCronExpression.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabSchedule.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabTimeRange.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabVariableDefinition.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/CrontabVisitor.java

Lines changed: 8 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/gen/com/github/xepozz/crontab/language/psi/impl/CrontabScheduleImpl.java

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.github.xepozz.crontab.ide.structureView
2+
3+
import com.intellij.ide.structureView.StructureViewBuilder
4+
import com.intellij.ide.structureView.StructureViewModel
5+
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder
6+
import com.intellij.lang.PsiStructureViewFactory
7+
import com.intellij.openapi.editor.Editor
8+
import com.intellij.psi.PsiFile
9+
10+
internal class CrontabStructureViewFactory : PsiStructureViewFactory {
11+
override fun getStructureViewBuilder(psiFile: PsiFile): StructureViewBuilder {
12+
return object : TreeBasedStructureViewBuilder() {
13+
override fun createStructureViewModel(editor: Editor?): StructureViewModel {
14+
return CrontabStructureViewModel(editor, psiFile)
15+
}
16+
}
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.github.xepozz.crontab.ide.structureView
2+
3+
import com.github.xepozz.crontab.language.psi.CrontabCommand
4+
import com.github.xepozz.crontab.language.psi.CrontabSchedule
5+
import com.github.xepozz.crontab.language.psi.CrontabVariableDefinition
6+
import com.intellij.ide.structureView.StructureViewModel.ElementInfoProvider
7+
import com.intellij.ide.structureView.StructureViewModelBase
8+
import com.intellij.ide.structureView.StructureViewTreeElement
9+
import com.intellij.ide.util.treeView.smartTree.Sorter
10+
import com.intellij.openapi.editor.Editor
11+
import com.intellij.psi.PsiFile
12+
13+
class CrontabStructureViewModel(editor: Editor?, psiFile: PsiFile) :
14+
StructureViewModelBase(psiFile, editor, RecursiveStructureViewElement(psiFile)), ElementInfoProvider {
15+
16+
override fun getSorters() = arrayOf(Sorter.ALPHA_SORTER)
17+
18+
override fun isAlwaysShowsPlus(element: StructureViewTreeElement) = false
19+
20+
override fun isAlwaysLeaf(element: StructureViewTreeElement) = when (element.value) {
21+
is CrontabCommand, is CrontabSchedule, is CrontabVariableDefinition -> true
22+
else -> false
23+
}
24+
25+
override fun getSuitableClasses() = arrayOf(CrontabCommand::class.java)
26+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.github.xepozz.crontab.ide.structureView
2+
3+
import com.github.xepozz.crontab.language.CrontabFile
4+
import com.github.xepozz.crontab.language.psi.CrontabCommand
5+
import com.github.xepozz.crontab.language.psi.CrontabCronExpression
6+
import com.github.xepozz.crontab.language.psi.CrontabSchedule
7+
import com.github.xepozz.crontab.language.psi.CrontabVariableDefinition
8+
import com.intellij.ide.projectView.PresentationData
9+
import com.intellij.ide.structureView.StructureViewTreeElement
10+
import com.intellij.ide.util.treeView.smartTree.SortableTreeElement
11+
import com.intellij.ide.util.treeView.smartTree.TreeElement
12+
import com.intellij.psi.NavigatablePsiElement
13+
import com.intellij.psi.util.PsiTreeUtil
14+
15+
class RecursiveStructureViewElement(val myElement: NavigatablePsiElement) :
16+
StructureViewTreeElement,
17+
SortableTreeElement {
18+
override fun navigate(requestFocus: Boolean) = myElement.navigate(requestFocus)
19+
20+
override fun canNavigate() = myElement.canNavigate()
21+
22+
override fun canNavigateToSource() = myElement.canNavigateToSource()
23+
24+
override fun getValue() = myElement
25+
26+
override fun getPresentation() = myElement.presentation
27+
?: PresentationData(myElement.text, null, myElement.getIcon(0), null)
28+
29+
override fun getChildren(): Array<out TreeElement> {
30+
return when (myElement) {
31+
is CrontabFile -> PsiTreeUtil.getChildrenOfAnyType(
32+
myElement,
33+
CrontabCronExpression::class.java,
34+
CrontabVariableDefinition::class.java
35+
)
36+
.map { RecursiveStructureViewElement(it) }
37+
.toTypedArray()
38+
39+
is CrontabCronExpression -> PsiTreeUtil.getChildrenOfAnyType(
40+
myElement,
41+
CrontabSchedule::class.java,
42+
CrontabCommand::class.java
43+
)
44+
.map { RecursiveStructureViewElement(it) }
45+
.toTypedArray()
46+
47+
else -> StructureViewTreeElement.EMPTY_ARRAY
48+
}
49+
}
50+
51+
override fun getAlphaSortKey(): String {
52+
val name = myElement.name
53+
return name ?: ""
54+
}
55+
}

0 commit comments

Comments
 (0)