Skip to content

Commit b6c340f

Browse files
committed
Add "Goto Script" tab to the "Find Action" window
1 parent 5962f6c commit b6c340f

File tree

10 files changed

+257
-33
lines changed

10 files changed

+257
-33
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Support for varclan and varclansetting.
1313
- Trigger support for shiftop and onclick variants.
1414
- Support for "midi" type.
15+
- Add "Goto Script" tab to the "Find Action" window.
1516

1617
### Changed
1718

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.runescript.plugin.ide.icons
2+
3+
import com.intellij.ide.FileIconProvider
4+
import com.intellij.ide.IconProvider
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.openapi.vfs.VirtualFile
7+
import com.intellij.psi.PsiElement
8+
import io.runescript.plugin.ide.RsIcons
9+
import io.runescript.plugin.ide.neptune.isNeptuneBuildFile
10+
import io.runescript.plugin.lang.psi.RsScript
11+
import io.runescript.plugin.lang.psi.mixin.getIconForTriggerName
12+
import io.runescript.plugin.lang.psi.triggerName
13+
import javax.swing.Icon
14+
15+
class RsIconProvider : IconProvider() {
16+
override fun getIcon(element: PsiElement, flags: Int): Icon? {
17+
if (element is RsScript) {
18+
return getIconForTriggerName(element.triggerName)
19+
}
20+
return null
21+
}
22+
}

src/main/kotlin/io/runescript/plugin/ide/RsGotoClassContributor.kt renamed to src/main/kotlin/io/runescript/plugin/ide/searchEverywhere/RsChooseByNameContributor.kt

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
package io.runescript.plugin.ide
1+
package io.runescript.plugin.ide.searchEverywhere
22

33
import com.intellij.navigation.ChooseByNameContributorEx
4-
import com.intellij.navigation.GotoClassContributor
54
import com.intellij.navigation.NavigationItem
65
import com.intellij.psi.search.GlobalSearchScope
76
import com.intellij.psi.stubs.StubIndex
87
import com.intellij.util.Processor
98
import com.intellij.util.indexing.FindSymbolParameters
109
import com.intellij.util.indexing.IdFilter
11-
import io.runescript.plugin.lang.RuneScript
1210
import io.runescript.plugin.lang.psi.RsScript
13-
import io.runescript.plugin.lang.psi.qualifiedName
1411
import io.runescript.plugin.lang.stubs.index.RsClientScriptIndex
1512
import io.runescript.plugin.lang.stubs.index.RsCommandScriptIndex
1613
import io.runescript.plugin.lang.stubs.index.RsProcScriptIndex
1714

18-
class RsGotoClassContributor : ChooseByNameContributorEx, GotoClassContributor {
15+
class RsChooseByNameContributor : ChooseByNameContributorEx {
1916

2017
private val keys = arrayOf(
2118
RsProcScriptIndex.KEY,
@@ -53,24 +50,4 @@ class RsGotoClassContributor : ChooseByNameContributorEx, GotoClassContributor {
5350
}
5451
}
5552
}
56-
57-
override fun getQualifiedName(item: NavigationItem): String? {
58-
return (item as? RsScript)?.qualifiedName
59-
}
60-
61-
override fun getQualifiedNameSeparator(): String {
62-
return "|"
63-
}
64-
65-
// These are only effective if we override the IdeLanguageCustomization
66-
67-
override fun getElementKind(): String {
68-
return RsBundle.message("go.to.script.kind.text")
69-
}
70-
71-
override fun getElementKindsPluralized(): List<String> {
72-
return listOf(RsBundle.message("go.to.script.kind.text.pluralized"))
73-
}
74-
75-
override fun getElementLanguage() = RuneScript
7653
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package io.runescript.plugin.ide.searchEverywhere
2+
3+
import com.intellij.ide.IdeBundle
4+
import com.intellij.ide.util.gotoByName.FilteringGotoByModel
5+
import com.intellij.navigation.ChooseByNameContributor
6+
import com.intellij.navigation.NavigationItem
7+
import com.intellij.openapi.project.Project
8+
import com.intellij.ui.IdeUICustomization
9+
import io.runescript.plugin.lang.psi.RsScript
10+
import io.runescript.plugin.lang.psi.qualifiedName
11+
12+
class RsGotoScriptModel(project: Project) :
13+
FilteringGotoByModel<RsTriggerRef>(project, emptyArray()) {
14+
15+
private val contributor = RsChooseByNameContributor()
16+
private val separators = emptyArray<String>()
17+
18+
override fun getPromptText(): String {
19+
return "Enter script name"
20+
}
21+
22+
override fun getNotInMessage(): String {
23+
return IdeUICustomization.getInstance().projectMessage("label.no.matches.found.in.project")
24+
}
25+
26+
override fun getNotFoundMessage(): String {
27+
return IdeBundle.message("label.no.matches.found");
28+
}
29+
30+
override fun getCheckBoxName(): String? {
31+
return null
32+
}
33+
34+
override fun loadInitialCheckBoxState(): Boolean {
35+
return false
36+
}
37+
38+
override fun saveInitialCheckBoxState(state: Boolean) {
39+
}
40+
41+
override fun getSeparators(): Array<String> {
42+
return separators
43+
}
44+
45+
override fun getFullName(item: Any): String? {
46+
return (item as? RsScript)?.qualifiedName
47+
}
48+
49+
override fun willOpenEditor(): Boolean {
50+
return true
51+
}
52+
53+
override fun filterValueFor(item: NavigationItem): RsTriggerRef? {
54+
return RsTriggerRef.forNavigationItem(item)
55+
}
56+
57+
override fun getContributorList(): MutableList<ChooseByNameContributor> {
58+
return mutableListOf(contributor)
59+
}
60+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.runescript.plugin.ide.searchEverywhere
2+
3+
import com.intellij.ide.util.gotoByName.ChooseByNameFilterConfiguration
4+
import com.intellij.openapi.components.*
5+
import com.intellij.openapi.project.Project
6+
7+
@Service(Service.Level.PROJECT)
8+
@State(name = "GotoScriptSymbolConfiguration", storages = [Storage(StoragePathMacros.WORKSPACE_FILE)])
9+
class RsGotoScriptSymbolConfiguration : ChooseByNameFilterConfiguration<RsTriggerRef>() {
10+
11+
companion object {
12+
@JvmStatic
13+
fun getInstance(project: Project): RsGotoScriptSymbolConfiguration = project.service()
14+
}
15+
16+
override fun nameForElement(type: RsTriggerRef): String {
17+
return type.displayName
18+
}
19+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.runescript.plugin.ide.searchEverywhere
2+
3+
import com.intellij.ide.actions.searcheverywhere.*
4+
import com.intellij.ide.actions.searcheverywhere.footer.createPsiExtendedInfo
5+
import com.intellij.ide.util.gotoByName.FilteringGotoByModel
6+
import com.intellij.openapi.actionSystem.AnAction
7+
import com.intellij.openapi.actionSystem.AnActionEvent
8+
import com.intellij.openapi.actionSystem.CommonDataKeys
9+
import com.intellij.openapi.project.Project
10+
11+
class RsSearchEverywhereContributor(event: AnActionEvent) : AbstractGotoSEContributor(event),
12+
SearchFieldActionsContributor {
13+
14+
private val filter = createTriggerFilter(event.getRequiredData(CommonDataKeys.PROJECT))
15+
16+
override fun getGroupName(): String {
17+
return "Scripts"
18+
}
19+
20+
override fun getFullGroupName(): String {
21+
return "Scripts"
22+
}
23+
24+
override fun getSortWeight(): Int {
25+
return 400
26+
}
27+
28+
override fun createModel(project: Project): FilteringGotoByModel<RsTriggerRef> {
29+
val model = RsGotoScriptModel(project)
30+
model.setFilterItems(filter.selectedElements)
31+
return model
32+
}
33+
34+
override fun getActions(onChanged: Runnable): List<AnAction> {
35+
return doGetActions(filter, RsTriggerFilterCollector(), onChanged)
36+
}
37+
38+
override fun isEmptyPatternSupported(): Boolean {
39+
return true
40+
}
41+
42+
@Suppress("OVERRIDE_DEPRECATION")
43+
override fun getElementPriority(element: Any, searchPattern: String): Int {
44+
return super.getElementPriority(element, searchPattern) + 5
45+
}
46+
47+
override fun createExtendedInfo(): ExtendedInfo {
48+
return createPsiExtendedInfo()
49+
}
50+
51+
class Factory : SearchEverywhereContributorFactory<Any> {
52+
override fun createContributor(initEvent: AnActionEvent): SearchEverywhereContributor<Any> {
53+
return PSIPresentationBgRendererWrapper.wrapIfNecessary(RsSearchEverywhereContributor(initEvent))
54+
}
55+
56+
override fun isAvailable(project: Project): Boolean {
57+
return true
58+
}
59+
}
60+
61+
companion object {
62+
fun createTriggerFilter(project: Project): PersistentSearchEverywhereContributorFilter<RsTriggerRef> {
63+
val items = RsTriggerRef.forAllTriggers()
64+
val persistentConfig = RsGotoScriptSymbolConfiguration.getInstance(project)
65+
return PersistentSearchEverywhereContributorFilter(
66+
items,
67+
persistentConfig,
68+
RsTriggerRef::displayName,
69+
RsTriggerRef::icon
70+
)
71+
}
72+
}
73+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.runescript.plugin.ide.searchEverywhere;
2+
3+
import com.intellij.ide.actions.searcheverywhere.SearchEverywhereFiltersStatisticsCollector;
4+
5+
public class RsTriggerFilterCollector extends SearchEverywhereFiltersStatisticsCollector.BaseFilterStatisticsCollector<RsTriggerRef> {
6+
7+
@Override
8+
public void elementMarkChanged(RsTriggerRef element, boolean isMarked) {
9+
}
10+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.runescript.plugin.ide.searchEverywhere
2+
3+
import com.intellij.navigation.NavigationItem
4+
import com.intellij.openapi.util.text.StringUtil
5+
import io.runescript.plugin.ide.RsIcons
6+
import io.runescript.plugin.lang.psi.RsScript
7+
import io.runescript.plugin.lang.psi.triggerName
8+
import io.runescript.plugin.lang.psi.type.trigger.RsTriggerType
9+
import javax.swing.Icon
10+
11+
data class RsTriggerRef(val displayName: String, val icon: Icon?) {
12+
13+
companion object {
14+
@JvmStatic
15+
fun forTrigger(trigger: RsTriggerType): RsTriggerRef = RsTriggerRef(
16+
trigger.literal,
17+
when (trigger) {
18+
RsTriggerType.PROC -> RsIcons.GutterProc
19+
RsTriggerType.CLIENTSCRIPT -> RsIcons.GutterClientScript
20+
RsTriggerType.COMMAND -> RsIcons.GutterCommand
21+
else -> RsIcons.GutterOther
22+
}
23+
)
24+
25+
@JvmStatic
26+
fun forNavigationItem(item: NavigationItem): RsTriggerRef? {
27+
val trigger = RsTriggerType.lookup((item as RsScript).triggerName) ?: return null
28+
return forTrigger(trigger)
29+
}
30+
31+
@JvmStatic
32+
fun forAllTriggers(): List<RsTriggerRef> {
33+
return RsTriggerType.values()
34+
.sortedWith { a, b -> StringUtil.naturalCompare(a.literal, b.literal) }
35+
.map { forTrigger(it) }
36+
}
37+
}
38+
39+
override fun equals(other: Any?): Boolean {
40+
if (this === other) return true
41+
if (javaClass != other?.javaClass) return false
42+
43+
other as RsTriggerRef
44+
45+
return displayName == other.displayName
46+
}
47+
48+
override fun hashCode(): Int {
49+
return displayName.hashCode()
50+
}
51+
}

src/main/kotlin/io/runescript/plugin/lang/psi/mixin/RsScriptMixin.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.runescript.plugin.ide.codeInsight.controlFlow.RsControlFlowBuilder
2121
import io.runescript.plugin.ide.highlight.RsSyntaxHighlighterColors
2222
import io.runescript.plugin.lang.psi.*
2323
import io.runescript.plugin.lang.stubs.RsScriptStub
24+
import javax.swing.Icon
2425

2526
abstract class RsScriptMixin : StubBasedPsiElementBase<RsScriptStub>, RsScript {
2627

@@ -36,7 +37,12 @@ abstract class RsScriptMixin : StubBasedPsiElementBase<RsScriptStub>, RsScript {
3637
CachedValueProvider.Result(controlFlow, this)
3738
}
3839

39-
override fun processDeclarations(processor: PsiScopeProcessor, state: ResolveState, lastParent: PsiElement?, place: PsiElement): Boolean {
40+
override fun processDeclarations(
41+
processor: PsiScopeProcessor,
42+
state: ResolveState,
43+
lastParent: PsiElement?,
44+
place: PsiElement
45+
): Boolean {
4046
parameterList?.let {
4147
if (!it.processDeclarations(processor, state, lastParent, place)) {
4248
return false
@@ -46,12 +52,7 @@ abstract class RsScriptMixin : StubBasedPsiElementBase<RsScriptStub>, RsScript {
4652
}
4753

4854
override fun getPresentation(): ItemPresentation? {
49-
val icon = when (triggerName) {
50-
"proc" -> RsIcons.GutterProc
51-
"clientscript" -> RsIcons.GutterClientScript
52-
"command" -> RsIcons.GutterCommand
53-
else -> RsIcons.GutterOther
54-
}
55+
val icon = getIconForTriggerName(triggerName)
5556
return PresentationData(qualifiedName, containingFile.name, icon, RsSyntaxHighlighterColors.SCRIPT_DECLARATION)
5657
}
5758

@@ -75,4 +76,13 @@ abstract class RsScriptMixin : StubBasedPsiElementBase<RsScriptStub>, RsScript {
7576
override fun getTextOffset(): Int {
7677
return scriptNameExpression.startOffset
7778
}
79+
}
80+
81+
fun getIconForTriggerName(triggerName: String): Icon {
82+
return when (triggerName) {
83+
"proc" -> RsIcons.GutterProc
84+
"clientscript" -> RsIcons.GutterClientScript
85+
"command" -> RsIcons.GutterCommand
86+
else -> RsIcons.GutterOther
87+
}
7888
}

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
implementationClass="io.runescript.plugin.ide.filetypes.RsFileType" fieldName="INSTANCE"
1616
extensions="cs2"/>
1717
<fileIconProvider order="first" implementation="io.runescript.plugin.ide.icons.NeptuneIconProvider" />
18+
<iconProvider implementation="io.runescript.plugin.ide.icons.RsIconProvider" />
1819

1920
<!-- Project & Modules -->
2021
<moduleBuilder builderClass="io.runescript.plugin.ide.projectWizard.NeptuneModuleBuilder"/>
@@ -42,7 +43,7 @@
4243
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsClientScriptIndex"/>
4344
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsCommandScriptIndex"/>
4445
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsScriptIndex"/>
45-
<gotoClassContributor implementation="io.runescript.plugin.ide.RsGotoClassContributor"/>
46+
<searchEverywhereContributor implementation="io.runescript.plugin.ide.searchEverywhere.RsSearchEverywhereContributor$Factory"/>
4647
<lang.elementManipulator forClass="io.runescript.plugin.lang.psi.RsGosubExpression" implementationClass="io.runescript.plugin.lang.psi.manipulator.RsGosubExpressionManipulator"/>
4748
<lang.elementManipulator forClass="io.runescript.plugin.lang.psi.RsStringLiteralContent" implementationClass="io.runescript.plugin.lang.psi.manipulator.RsStringLiteralContentManipulator"/>
4849
<lang.elementManipulator forClass="io.runescript.plugin.lang.doc.psi.impl.RsDocName" implementationClass="io.runescript.plugin.lang.psi.manipulator.RsDocNameManipulator"/>

0 commit comments

Comments
 (0)