nicer UI for choosing a configurator when multiple options are available

This commit is contained in:
Dmitry Jemerov
2016-01-26 20:15:05 +01:00
parent 7c8a5b0b83
commit e3e463ef70
2 changed files with 22 additions and 15 deletions
@@ -45,8 +45,8 @@ abstract class ConfigureKotlinInProjectAction : AnAction() {
configurators.size == 1 -> configurators.first().configure(project, emptyList())
configurators.isEmpty() -> Messages.showErrorDialog("There aren't configurators available", e.presentation.text!!)
else -> {
Messages.showErrorDialog("More than one configurator is available", e.presentation.text!!)
showConfigureKotlinNotificationIfNeeded(project)
val configuratorsPopup = KotlinSetupEnvironmentNotificationProvider.createConfiguratorsPopup(project, configurators.toList())
configuratorsPopup.showInBestPositionFor(e.dataContext)
}
}
}
@@ -28,6 +28,7 @@ import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopup
import com.intellij.openapi.ui.popup.PopupStep
import com.intellij.openapi.ui.popup.util.BaseListPopupStep
import com.intellij.openapi.util.Key
@@ -108,22 +109,28 @@ class KotlinSetupEnvironmentNotificationProvider(
val configurators = getApplicableConfigurators(module).toList()
if (!configurators.isEmpty()) {
createComponentActionLabel("Configure") { label ->
val step = object : BaseListPopupStep<KotlinProjectConfigurator>("Choose Configurator", configurators) {
override fun getTextFor(value: KotlinProjectConfigurator?): String {
return value?.presentableText ?: "<none>"
}
override fun onChosen(selectedValue: KotlinProjectConfigurator?, finalChoice: Boolean): PopupStep<*>? {
selectedValue?.let {
it.configure(module.project, emptyList())
}
return null
}
}
JBPopupFactory.getInstance().createListPopup(step).showUnderneathOf(label)
val configuratorsPopup = createConfiguratorsPopup(module.project, configurators)
configuratorsPopup.showUnderneathOf(label)
}
}
}
}
fun createConfiguratorsPopup(project: Project, configurators: List<KotlinProjectConfigurator>): ListPopup {
val step = object : BaseListPopupStep<KotlinProjectConfigurator>("Choose Configurator", configurators) {
override fun getTextFor(value: KotlinProjectConfigurator?): String {
return value?.presentableText ?: "<none>"
}
override fun onChosen(selectedValue: KotlinProjectConfigurator?, finalChoice: Boolean): PopupStep<*>? {
selectedValue?.let {
it.configure(project, emptyList())
}
return null
}
}
val configuratorsPopup = JBPopupFactory.getInstance().createListPopup(step)
return configuratorsPopup
}
}
}