Skip to content

Commit b6d8ca3

Browse files
committed
related item keyboard support
1 parent fc7798a commit b6d8ca3

3 files changed

Lines changed: 44 additions & 12 deletions

File tree

src/main/kotlin/io/openapiprocessor/intellij/I18nSupport.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package io.openapiprocessor.intellij
77

88
import com.intellij.DynamicBundle
99
import org.jetbrains.annotations.PropertyKey
10+
import java.util.function.Supplier
1011

1112
private const val BUNDLE = "messages.I18nBundle"
1213

@@ -18,6 +19,10 @@ fun i18n(@PropertyKey(resourceBundle = BUNDLE) key: String): String {
1819
return I18nMessages.bundle.getMessage(key)
1920
}
2021

22+
fun i18nLazy(@PropertyKey(resourceBundle = BUNDLE) key: String): Supplier<String> {
23+
return I18nMessages.bundle.getLazyMessage(key)
24+
}
25+
2126
fun i18n(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any?): String {
2227
return I18nMessages.bundle.getMessage(key, *params)
2328
}

src/main/kotlin/io/openapiprocessor/intellij/TypeMappingPackageLineMarker.kt

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder
1111
import com.intellij.codeInsight.navigation.impl.PsiTargetPresentationRenderer
1212
import com.intellij.icons.AllIcons
1313
import com.intellij.ide.util.ModuleRendererFactory
14+
import com.intellij.navigation.GotoRelatedItem
1415
import com.intellij.openapi.components.service
1516
import com.intellij.openapi.module.Module
1617
import com.intellij.openapi.module.ModuleUtil
@@ -20,7 +21,8 @@ import com.intellij.platform.backend.presentation.TargetPresentation
2021
import com.intellij.psi.PsiDirectory
2122
import com.intellij.psi.PsiElement
2223
import com.intellij.psi.PsiFile
23-
import com.intellij.psi.presentation.java.SymbolPresentationUtil
24+
import com.intellij.psi.presentation.java.SymbolPresentationUtil.getSymbolContainerText
25+
import com.intellij.psi.presentation.java.SymbolPresentationUtil.getSymbolPresentableText
2426
import com.intellij.util.TextWithIcon
2527
import org.jetbrains.yaml.psi.YAMLKeyValue
2628
import org.slf4j.Logger
@@ -36,11 +38,11 @@ class TypeMappingPackageLineMarker : RelatedItemLineMarkerProvider() {
3638
class Renderer() : PsiTargetPresentationRenderer<PsiElement>() {
3739

3840
override fun getContainerText(element: PsiElement): String? {
39-
return SymbolPresentationUtil.getSymbolContainerText(element)
41+
return getSymbolContainerText(element)
4042
}
4143

4244
override fun getElementText(element: PsiElement): String {
43-
return SymbolPresentationUtil.getSymbolPresentableText(element)
45+
return getSymbolPresentableText(element)
4446
}
4547

4648
override fun getIcon(element: PsiElement): JIcon? {
@@ -72,6 +74,18 @@ class TypeMappingPackageLineMarker : RelatedItemLineMarkerProvider() {
7274
}
7375
}
7476

77+
class GotoPackage(element: PsiDirectory): GotoRelatedItem(element, I18n.GOTO_GROUP) {
78+
override fun getCustomName(): String {
79+
return "${getSymbolPresentableText(this.element!!)}"
80+
}
81+
82+
override fun getCustomContainerName(): String {
83+
val loc = element!!.getUserData(PACKAGE_LOCATION_USER_KEY)!!
84+
val pkg = getSymbolContainerText(element!!)!!
85+
return "$pkg - $loc"
86+
}
87+
}
88+
7589
override fun collectNavigationMarkers(
7690
element: PsiElement,
7791
result: MutableCollection<in RelatedItemLineMarkerInfo<*>>
@@ -83,31 +97,41 @@ class TypeMappingPackageLineMarker : RelatedItemLineMarkerProvider() {
8397
if (element.text != PACKAGE_KEY)
8498
return
8599

86-
val keyValue = element.parent
87-
if (keyValue !is YAMLKeyValue)
88-
return
89-
90-
val pkgName = keyValue.valueText
91-
val module = findModule(element.containingFile)
100+
val info = createLineMarkerInfo(element)
92101
?: return
93102

103+
result.add(info)
104+
}
105+
106+
private fun createLineMarkerInfo(packageKey: PsiElement): RelatedItemLineMarkerInfo<*>? {
107+
val packageKeyValue = packageKey.parent
108+
if (packageKeyValue !is YAMLKeyValue)
109+
return null
110+
111+
val pkgName = packageKeyValue.valueText
112+
val module = findModule(packageKeyValue.containingFile)
113+
?: return null
114+
94115
val pkgDirs = service<TargetPackageService>()
95116
.findPackageDirs(pkgName, module)
96117

97118
val targets = addLocations(pkgDirs)
98119
if (targets.isEmpty()) {
99120
log.warn("found no targets!")
100-
return
121+
return null
101122
}
102123

103124
val builder = NavigationGutterIconBuilder
104-
.create(Icon.`package`)
125+
.create<PsiDirectory>(
126+
Icon.`package`,
127+
{ listOf(it) },
128+
{ listOf(GotoPackage(it)) })
105129
.setTooltipText(I18n.TOOLTIP_TEXT)
106130
.setPopupTitle(I18n.POPUP_TITLE)
107131
.setTargets(targets)
108132
.setTargetRenderer { Renderer() }
109133

110-
result.add(builder.createLineMarkerInfo(element))
134+
return builder.createLineMarkerInfo(packageKey)
111135
}
112136

113137
private fun addLocations(pkgDirs: List<PsiDirectory>): List<PsiDirectory> {
@@ -161,6 +185,7 @@ class TypeMappingPackageLineMarker : RelatedItemLineMarkerProvider() {
161185
object I18n {
162186
val TOOLTIP_TEXT = i18n("line.marker.type.mapping.package.tooltip")
163187
val POPUP_TITLE = i18n("line.marker.type.mapping.package.title")
188+
val GOTO_GROUP = i18n("goto.related.item.group")
164189
}
165190

166191
companion object {

src/main/resources/messages/I18nBundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ line.marker.type.mapping.package.tooltip = Navigate to package
66
line.marker.type.mapping.package.title = Package Locations
77
line.marker.type.mapping.path.tooltip = Navigate to generated interface 'path' methods
88
line.marker.type.mapping.path.title = Generated interface 'path' methods
9+
10+
goto.related.item.group = openapi processor

0 commit comments

Comments
 (0)