diff --git a/plugins/kotlin/fir/kotlin.fir.iml b/plugins/kotlin/fir/kotlin.fir.iml
index 48e2397688ec..217f1ef1720e 100644
--- a/plugins/kotlin/fir/kotlin.fir.iml
+++ b/plugins/kotlin/fir/kotlin.fir.iml
@@ -79,5 +79,7 @@
+
+
\ No newline at end of file
diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/FirStatusBarWidgetFactory.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/FirStatusBarWidgetFactory.kt
index 1ccd9bd1c2a0..be9d9c2e0b98 100644
--- a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/FirStatusBarWidgetFactory.kt
+++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/FirStatusBarWidgetFactory.kt
@@ -10,11 +10,20 @@ import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.util.registry.RegistryValue
import com.intellij.openapi.util.registry.RegistryValueListener
+import com.intellij.openapi.wm.CustomStatusBarWidget
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetFactory
import com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager
+import com.intellij.platform.feedback.impl.OnDemandFeedbackResolver
+import com.intellij.ui.ClickListener
import org.jetbrains.kotlin.idea.KotlinIcons
+import org.jetbrains.kotlin.onboarding.k2.satisfaction.survey.K2FeedbackSurvey
+import org.jetbrains.kotlin.onboarding.k2.satisfaction.survey.K2UserTracker
+import java.awt.event.MouseEvent
import javax.swing.Icon
+import javax.swing.JComponent
+import javax.swing.JLabel
+import javax.swing.SwingUtilities
private class FirStatusBarWidgetFactory : StatusBarWidgetFactory {
override fun getId(): String = ID
@@ -22,19 +31,19 @@ private class FirStatusBarWidgetFactory : StatusBarWidgetFactory {
override fun getDisplayName(): String = DISPLAY_NAME
override fun isAvailable(project: Project): Boolean {
- return Registry.`is`(REGISTRY_KEY, /* defaultValue = */ false)
+ return Registry.`is`(REGISTRY_KEY, /* defaultValue = */ true)
}
- override fun createWidget(project: Project): StatusBarWidget = Widget()
+ override fun createWidget(project: Project): StatusBarWidget = Widget(project)
companion object {
- const val ID = "kotlin.fir.ide"
-
- @NlsSafe
- private const val DISPLAY_NAME = "K2 mode"
+ const val ID = "kotlin.k2.mode"
}
}
+@NlsSafe
+private const val DISPLAY_NAME = "Kotlin plugin K2 mode"
+
private class FirStatusBarWidgetListener : RegistryValueListener {
override fun afterValueChanged(value: RegistryValue) {
if (value.key != REGISTRY_KEY) return
@@ -50,9 +59,43 @@ private class FirStatusBarWidgetListener : RegistryValueListener {
private const val REGISTRY_KEY: String = "kotlin.k2.show.fir.statusbar.icon"
-private class Widget : StatusBarWidget, StatusBarWidget.IconPresentation {
- override fun getPresentation(): StatusBarWidget.WidgetPresentation = this
+private class Widget(private val project: Project) : CustomStatusBarWidget, StatusBarWidget.IconPresentation {
+ private var icon: JLabel? = null
+
override fun ID(): String = FirStatusBarWidgetFactory.ID
- override fun getTooltipText(): String = "K2 mode"
+ override fun getPresentation(): StatusBarWidget.WidgetPresentation = this
+ override fun getTooltipText(): String = DISPLAY_NAME
override fun getIcon(): Icon = KotlinIcons.FIR
+ override fun getComponent(): JComponent {
+ val icon = JLabel()
+ .apply {
+ object : ClickListener() {
+ override fun onClick(event: MouseEvent, clickCount: Int): Boolean {
+ if (SwingUtilities.isLeftMouseButton(event)) {
+ showFeedbackForm()
+ }
+ return true
+ }
+
+ }.installOn(this)
+ }.apply {
+ toolTipText = DISPLAY_NAME
+ icon = KotlinIcons.FIR
+ }
+ this.icon = icon
+ return icon
+ }
+
+ fun showFeedbackForm() {
+ val userTracker = K2UserTracker.getInstance()
+ userTracker.forced = true
+ OnDemandFeedbackResolver.getInstance()
+ .showFeedbackNotification(K2FeedbackSurvey::class, project) {
+ userTracker.forced = false
+ }
+ }
+
+ override fun dispose() {
+ icon = null
+ }
}
\ No newline at end of file
diff --git a/plugins/kotlin/onboarding/src/org/jetbrains/kotlin/onboarding/k2/satisfaction/survey/K2UserTracker.kt b/plugins/kotlin/onboarding/src/org/jetbrains/kotlin/onboarding/k2/satisfaction/survey/K2UserTracker.kt
index bd50ebceb798..36a91aa19cf3 100644
--- a/plugins/kotlin/onboarding/src/org/jetbrains/kotlin/onboarding/k2/satisfaction/survey/K2UserTracker.kt
+++ b/plugins/kotlin/onboarding/src/org/jetbrains/kotlin/onboarding/k2/satisfaction/survey/K2UserTracker.kt
@@ -42,6 +42,8 @@ class K2UserTracker : PersistentStateComponent {
}
}
+ var forced: Boolean = false
+
internal var switchedToK1 = false
internal var forUnitTests = false
internal var k2PluginModeForTests = false // Want the test to not depend on a real K1/K2 mode
@@ -69,6 +71,7 @@ class K2UserTracker : PersistentStateComponent {
}
internal fun shouldShowK2FeedbackDialog(project: Project): Boolean {
+ if (forced) return true
LOG.debug("State: ${state}")
if (!Registry.`is`("test.k2.feedback.survey", false)) {
diff --git a/plugins/kotlin/plugin/k2/resources/kotlin.plugin.k2.xml b/plugins/kotlin/plugin/k2/resources/kotlin.plugin.k2.xml
index d994d17f2e32..aa992c47eab5 100644
--- a/plugins/kotlin/plugin/k2/resources/kotlin.plugin.k2.xml
+++ b/plugins/kotlin/plugin/k2/resources/kotlin.plugin.k2.xml
@@ -86,8 +86,8 @@
restartRequired="false"/>