mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-02-05 08:06:56 +07:00
New Project Wizard IDEA-285038 Install language plugin instantly, show modal progress
GitOrigin-RevId: 685aed10ff62866185f2e896aa7e7d6c55911e3e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
2d97e515e1
commit
52ae63ebee
@@ -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
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user