New Project Wizard IDEA-285038 Install language plugin instantly, show modal progress

GitOrigin-RevId: 685aed10ff62866185f2e896aa7e7d6c55911e3e
This commit is contained in:
Dmitry.Krasilschikov
2022-01-06 16:22:29 +02:00
committed by intellij-monorepo-bot
parent 2d97e515e1
commit 52ae63ebee
4 changed files with 89 additions and 16 deletions

View File

@@ -408,7 +408,7 @@ title.plugin.uninstall=Uninstall Plugin
progress.downloading.list.of.plugins=Downloading list of plugins from {0}
progress.downloading.plugins.meta=Downloading data for plugin {0}
progress.downloading.available.plugins=Downloading list of available plugins
progress.download.plugins=Downloading plugins
progress.download.plugins=Downloading Plugins
button.http.proxy.settings=&HTTP Proxy Settings\u2026
group.vendor=Vendor
plugin.status.installed=Installed
@@ -2682,3 +2682,7 @@ to.create.new.file.tooltip=To create a new file, press <b>{0}</b>. Alternatively
general.module.type.description=A basic project that allows working with separate files and compile Java and Kotlin classes.
main.toolbar.menu.button=Main menu
label.project.wizard.install.plugin=Install Plugin
new.project.wizard.download.plugin=Search For The Plugin In Repository
new.project.wizard.cannot.find.plugin=Cannot find compatible plugin: ''{0}''
new.project.wizard.cannot.find.plugin.title=Plugin Not Found

View File

@@ -2,19 +2,19 @@
package com.intellij.ide.wizard
import com.intellij.icons.AllIcons
import com.intellij.ide.plugins.PluginManagerConfigurable
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys.CONTEXT_COMPONENT
import com.intellij.openapi.actionSystem.impl.ActionButton
import com.intellij.openapi.actionSystem.impl.IdeaActionButtonLook
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.InstallAndEnablePluginTask
import com.intellij.ui.UIBundle
import com.intellij.ui.awt.RelativePoint
import com.intellij.ui.dsl.builder.Row
import com.intellij.ui.dsl.builder.components.SegmentedButtonBorder
import java.util.function.Consumer
import java.util.function.Supplier
import javax.swing.JComponent
@@ -46,18 +46,19 @@ abstract class AbstractNewProjectWizardMultiStepWithAddButton<S : NewProjectWiza
UIBundle.message("new.project.wizard.popup.title.install.plugin"), DefaultActionGroup(additionalSteps),
e.dataContext,
JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false
).show(RelativePoint.getSouthOf(e.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT) as JComponent))
).show(RelativePoint.getSouthOf(e.getData(CONTEXT_COMPONENT) as JComponent))
}
}
private inner class OpenMarketPlaceAction(private val language: String) : AnAction(Supplier { language }) {
override fun actionPerformed(e: AnActionEvent) {
ShowSettingsUtil.getInstance().editConfigurable(
ProjectManager.getInstance().defaultProject,
PluginManagerConfigurable(),
Consumer {
it.openMarketplaceTab(language)
})
val pluginId = PluginId.getId(additionalStepPlugins[language]!!)
val component = e.dataContext.getData(CONTEXT_COMPONENT)!!
val pluginDownloader = ProgressManager.getInstance().run(InstallAndEnablePluginTask(pluginId))
if (pluginDownloader != null) {
InstallAndEnablePluginTask.doInstallPlugins(component, pluginDownloader)
}
}
}
}

View File

@@ -20,11 +20,11 @@ class NewProjectWizardLanguageStep(parent: NewProjectWizardStep) :
override var language by ::step
override var additionalStepPlugins = mapOf(
"Go" to "com.intellij.go",
"Ruby" to "com.intellij.ruby",
"PHP" to "com.intellij.php",
"Go" to "org.jetbrains.plugins.go",
"Ruby" to "org.jetbrains.plugins.ruby",
"PHP" to "com.jetbrains.php",
"Python" to "com.intellij.python",
"Scala" to "com.intellij.scala",
"Scala" to "org.intellij.scala"
)
init {

View File

@@ -0,0 +1,68 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.updateSettings.impl.pluginsAdvertisement
import com.intellij.ide.IdeBundle
import com.intellij.ide.plugins.*
import com.intellij.ide.plugins.marketplace.MarketplaceRequests.Companion.loadLastCompatiblePluginDescriptors
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.invokeLater
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.Task
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.updateSettings.impl.PluginDownloader
import java.awt.Component
import java.io.IOException
class InstallAndEnablePluginTask(val pluginId: PluginId) :
Task.WithResult<PluginDownloader?, IOException>(null, IdeBundle.message("new.project.wizard.download.plugin"), true) {
override fun compute(indicator: ProgressIndicator): PluginDownloader? {
val pluginNode = loadLastCompatiblePluginDescriptors(setOf(pluginId))
.ifEmpty {
LOG.error("Cannot find compatible plugin: " + pluginId.idString)
invokeLater {
Messages.showWarningDialog(IdeBundle.message("new.project.wizard.cannot.find.plugin", pluginId.idString),
IdeBundle.message("new.project.wizard.cannot.find.plugin.title"))
}
return null
}.first()
return PluginDownloader.createDownloader(pluginNode)
}
companion object {
private val LOG = Logger.getInstance(InstallAndEnablePluginTask::class.java)
fun doInstallPlugins(component: Component, downloader: PluginDownloader) {
val plugin = downloader.descriptor
val nodes = mutableListOf<PluginNode>()
if (plugin.isEnabled) {
nodes.add(downloader.toPluginNode())
}
PluginManagerMain.suggestToEnableInstalledDependantPlugins(PluginEnabler.HEADLESS, nodes)
PluginEnabler.HEADLESS.enable(listOf(plugin))
downloadPlugins(nodes, ModalityState.stateForComponent(component))
}
fun downloadPlugins(plugins: List<PluginNode>, modalityState: ModalityState) {
ProgressManager.getInstance().run(object : Modal(null, IdeBundle.message("progress.download.plugins"), true) {
override fun run(indicator: ProgressIndicator) {
val operation = PluginInstallOperation(plugins, emptyList(), PluginEnabler.HEADLESS, indicator)
.apply {
setAllowInstallWithoutRestart(true)
run()
}
if (operation.isSuccess) {
invokeLater(modalityState) {
for ((file, pluginDescriptor) in operation.pendingDynamicPluginInstalls) {
PluginInstaller.installAndLoadDynamicPlugin(file, pluginDescriptor)
}
}
}
}
})
}
}
}