summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/language/ParameterInlayProviderSettingsModel.kt
blob: c2cf333f474f7df5c5a8079e3e76d349d7eb1bab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.hints.settings.language

import com.intellij.codeInsight.CodeInsightBundle
import com.intellij.codeInsight.daemon.impl.DaemonProgressIndicator
import com.intellij.codeInsight.hints.*
import com.intellij.codeInsight.hints.settings.InlayProviderSettingsModel
import com.intellij.codeInsight.hints.settings.ParameterHintsSettingsPanel
import com.intellij.lang.Language
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.util.ProgressIndicatorBase
import com.intellij.psi.PsiFile

class ParameterInlayProviderSettingsModel(
  val provider: InlayParameterHintsProvider,
  language: Language
) : InlayProviderSettingsModel(isParameterHintsEnabledForLanguage(language), ParameterInlayProviderSettingsModel.ID, language) {
  companion object {
    val ID = "parameter.hints.old"
  }

  override val mainCheckBoxLabel: String
    get() = provider.mainCheckboxText
  override val name: String
    get() = CodeInsightBundle.message("settings.inlay.parameter.hints.panel.name")
  override val group: InlayGroup
    get() = InlayGroup.PARAMETERS_GROUP
  override val previewText: String?
    get() = null

  override fun getCasePreview(case: ImmediateConfigurable.Case?): String? {
    return getCasePreview(language, provider, case)
  }

  override fun getCasePreviewLanguage(case: ImmediateConfigurable.Case?): Language {
    return language
  }

  override fun getCaseDescription(case: ImmediateConfigurable.Case): String? {
    return provider.getProperty("inlay.parameters." + case.id)
  }

  override val component by lazy {
    ParameterHintsSettingsPanel(
      language = language,
      excludeListSupported = provider.isBlackListSupported
    )
  }

  private val optionStates = provider.supportedOptions.map { OptionState(it) }

  override val cases: List<ImmediateConfigurable.Case> = provider.supportedOptions.mapIndexed { index, option ->
    val state = optionStates[index]
    ImmediateConfigurable.Case(option.name,
                               id = option.id,
                               loadFromSettings = { state.state },
                               onUserChanged = { state.state = it },
                               extendedDescription = option.extendedDescriptionSupplier?.get()
    )
  }

  override fun collectData(editor: Editor, file: PsiFile): Runnable {
    val pass = ParameterHintsPass(file, editor, HintInfoFilter { true }, true)
    ProgressManager.getInstance().runProcess({
                                               val backup = ParameterInlayProviderSettingsModel(provider, language)
                                               backup.reset()
                                               try {
                                                 apply()
                                                 pass.collectInformation(ProgressIndicatorBase())
                                               }
                                               finally {
                                                 backup.apply()
                                               }
                                             }, DaemonProgressIndicator())
    return Runnable {
      pass.doApplyInformationToEditor()
    }
  }

  override val description: String?
    get() = null

  override fun toString(): String = name

  override fun apply() {
    setShowParameterHintsForLanguage(isEnabled, language)
    for (state in optionStates) {
      state.apply()
    }
    ParameterHintsPassFactory.forceHintsUpdateOnNextPass()
  }

  override fun isModified(): Boolean {
    if (isEnabled != isParameterHintsEnabledForLanguage(language)) return true
    return optionStates.any { it.isModified() }
  }

  override fun reset() {
    isEnabled = isParameterHintsEnabledForLanguage(language)
    for (state in optionStates) {
      state.reset()
    }
  }

  private data class OptionState(val option: Option, var state: Boolean = option.get()) {
    fun isModified(): Boolean = state != option.get()

    fun reset() {
      state = option.get()
    }

    fun apply() {
      option.set(state)
    }
  }
}