InlayHints: add old parameter hints to the language section

GitOrigin-RevId: 762e21bffb70c4e9b89017626119d7bfa7d52597
This commit is contained in:
Roman.Ivanov
2019-07-02 06:52:16 +03:00
committed by intellij-monorepo-bot
parent 1be4cde11d
commit 2ebbf38aaa
3 changed files with 32 additions and 9 deletions
@@ -8,7 +8,8 @@ internal data class HintProviderOption<T>(
val key: SettingsKey<T>,
val name: String,
private var isEnabled: Boolean,
val previewText: String?
val previewText: String?,
val isOldParameterHints: Boolean = false
) {
fun setEnabled(enabled: Boolean) {
@@ -14,10 +14,15 @@ class SingleLanguageInlayHintsConfigurable(project: Project, val language: Langu
val settings = ServiceManager.getService(InlayHintsSettings::class.java)
// All configurables operate with copy of settings, that is why we can do live preview
val providers = HintUtils.getHintProvidersForLanguage(language, project).map { it.withSettingsCopy() }
val options = providers.map {
val options = mutableListOf<HintProviderOption<out Any>>()
providers.mapTo(options) {
val provider = it.provider
HintProviderOption(provider.key, provider.name, settings.hintsEnabled(provider.key, language), provider.previewText)
}
val parameterHintsProvider = InlayParameterHintsExtension.forLanguage(language)
if (parameterHintsProvider != null) {
options.add(HintProviderOption(oldParameterHintsKey, "Parameter hints", true, null, true))
}
val keyToProvider = providers.associateBy { it.provider.key }
val settingsWrappers = providers.map { it.toSettingsWrapper(settings, language) }
SingleLanguageInlayHintsSettingsPanel(project, language, keyToProvider, settingsWrappers, providers.first(), options)
@@ -49,4 +54,8 @@ class SingleLanguageInlayHintsConfigurable(project: Project, val language: Langu
fun loadFromSettings() {
panel.loadFromSettings()
}
companion object {
private val oldParameterHintsKey = SettingsKey<NoSettings>("parameter.hints.old")
}
}
@@ -38,7 +38,7 @@ internal class SingleLanguageInlayHintsSettingsPanel(
) : JPanel() {
private val editorField = createEditor()
private val hintTypeConfigurableToComponent: MutableMap<ImmediateConfigurable, JComponent> = hashMapOf()
private var selectedProvider = defaultProvider
private var selectedProvider: ProviderWithSettings<out Any>? = defaultProvider
private val providerTypesList = CheckBoxList<HintProviderOption<out Any>>()
private val bottomPanel = JPanel()
private val settings = ServiceManager.getService(InlayHintsSettings::class.java)
@@ -48,6 +48,11 @@ internal class SingleLanguageInlayHintsSettingsPanel(
}
}
private val parameterHintsPanel by lazy {
val options = InlayParameterHintsExtension.forLanguage(language)?.supportedOptions ?: emptyList()
ParameterHintsSettingsPanel(language, options, true)
}
init {
layout = GridLayout(1, 1)
@@ -119,7 +124,10 @@ internal class SingleLanguageInlayHintsSettingsPanel(
}
private fun collectAndDrawHints(editor: Editor, file: PsiFile) {
val settingsWrapper = settingsWrappers.find { it.providerWithSettings.provider === selectedProvider.provider }!!
val provider = selectedProvider
// if provider == null, old parameter hints panel is current, no preview
if (provider == null) return
val settingsWrapper = settingsWrappers.find { it.providerWithSettings.provider === provider.provider }!!
val collector = settingsWrapper.providerWithSettings.getCollectorWrapperFor(file, editor, settingsWrapper.language)
?: return
traverse(file) {
@@ -186,15 +194,20 @@ internal class SingleLanguageInlayHintsSettingsPanel(
private fun initProviderList(typeSettingsPane: JBScrollPane) {
providerTypesList.setCheckBoxListListener { index, value ->
providerTypesList.getItemAt(index)?.setEnabled(value)
updateEditor(editorField.text)
}
providerTypesList.addListSelectionListener {
val index = providerTypesList.selectedIndex
val newOption = providerTypesList.getItemAt(index) ?: return@addListSelectionListener
val providerWithSettings = keyToProvider.getValue(newOption.key)
typeSettingsPane.setViewportView(getComponentFor(providerWithSettings.configurable))
selectedProvider = providerWithSettings
updateEditor(newOption.previewText)
if (newOption.isOldParameterHints) {
typeSettingsPane.setViewportView(parameterHintsPanel)
selectedProvider = null
updateEditor(null)
} else {
val providerWithSettings = keyToProvider.getValue(newOption.key)
typeSettingsPane.setViewportView(getComponentFor(providerWithSettings.configurable))
selectedProvider = providerWithSettings
updateEditor(newOption.previewText)
}
}
for (option in providerTypes) {
providerTypesList.addItem(option, option.name, option.isEnabled())