From 8bce29df3a99f49e82a1eeb6d998800030804c81 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 26 Apr 2018 18:38:29 +0300 Subject: [PATCH] Show plugin installation status in Kotlin Updates settings (KT-23980) #KT-23980 Fixed --- .../kotlin/idea/KotlinPluginUpdater.kt | 44 +++++++++-------- .../KotlinLanguageConfiguration.kt | 48 ++++++++++++++++++- .../ui/ConfigurePluginUpdatesForm.form | 21 ++++++-- .../ui/ConfigurePluginUpdatesForm.java | 17 +++++++ 4 files changed, 106 insertions(+), 24 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinPluginUpdater.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinPluginUpdater.kt index f38915c9192..aa136bc2418 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinPluginUpdater.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinPluginUpdater.kt @@ -221,18 +221,21 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos notification.notify(null) } - fun installPluginUpdate(update: PluginUpdateStatus.Update, - cancelCallback: () -> Unit = {}) { + fun installPluginUpdate( + update: PluginUpdateStatus.Update, + successCallback: () -> Unit = {}, cancelCallback: () -> Unit = {}, errorCallback: () -> Unit = {} + ) { val descriptor = update.pluginDescriptor val pluginDownloader = PluginDownloader.createDownloader(descriptor, update.hostToInstallFrom, null) - ProgressManager.getInstance().run(object : Task.Backgroundable(null, "Downloading plugins", true) { + ProgressManager.getInstance().run(object : Task.Backgroundable( + null, "Downloading plugins", true, PluginManagerUISettings.getInstance() + ) { override fun run(indicator: ProgressIndicator) { var installed = false var message: String? = null val prepareResult = try { pluginDownloader.prepareToInstall(indicator) - } - catch (e: IOException) { + } catch (e: IOException) { LOG.info(e) message = e.message false @@ -250,8 +253,13 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos } } - if (!installed) { - notifyNotInstalled(message) + ApplicationManager.getApplication().invokeLater { + if (!installed) { + errorCallback() + notifyNotInstalled(message) + } else { + successCallback() + } } } @@ -263,20 +271,18 @@ class KotlinPluginUpdater(val propertiesComponent: PropertiesComponent) : Dispos private fun notifyNotInstalled(message: String?) { val fullMessage = message?.let { ": $it" } ?: "" - ApplicationManager.getApplication().invokeLater { - val notification = notificationGroup.createNotification( - "Kotlin", - "Plugin update was not installed$fullMessage. See the log for more information", - NotificationType.INFORMATION) { notification, event -> + val notification = notificationGroup.createNotification( + "Kotlin", + "Plugin update was not installed$fullMessage. See the log for more information", + NotificationType.INFORMATION + ) { notification, _ -> + val logFile = File(PathManager.getLogPath(), "idea.log") + ShowFilePathAction.openFile(logFile) - val logFile = File(PathManager.getLogPath(), "idea.log") - ShowFilePathAction.openFile(logFile) - - notification.expire() - } - - notification.notify(null) + notification.expire() } + + notification.notify(null) } override fun dispose() { diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt index 0d6e96927fb..6d8869d7276 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.configuration +import com.intellij.ide.IdeBundle import com.intellij.openapi.options.Configurable import com.intellij.openapi.options.SearchableConfigurable import com.intellij.openapi.updateSettings.impl.UpdateSettings @@ -43,6 +44,11 @@ class KotlinUpdatesSettingsConfigurable : SearchableConfigurable, Configurable.N private val form = ConfigurePluginUpdatesForm() private var update: PluginUpdateStatus.Update? = null + private var versionForInstallation: String? = null + + private var installedVersion: String? = null + private var installingStatus: String? = null + override fun getId(): String = ID override fun getDisplayName(): String = "Kotlin Updates" @@ -53,6 +59,11 @@ class KotlinUpdatesSettingsConfigurable : SearchableConfigurable, Configurable.N // Selected channel is now saved automatically } + private fun setInstalledVersion(installedVersion: String?, installingStatus: String?) { + this.installedVersion = installedVersion + this.installingStatus = installingStatus + } + override fun createComponent(): JComponent? { form.updateCheckProgressIcon.suspend() form.updateCheckProgressIcon.setPaintPassiveIcon(false) @@ -64,7 +75,36 @@ class KotlinUpdatesSettingsConfigurable : SearchableConfigurable, Configurable.N form.installButton.isVisible = false form.installButton.addActionListener { update?.let { - KotlinPluginUpdater.getInstance().installPluginUpdate(it) + form.hideInstallButton() + + setInstalledVersion(it.pluginDescriptor.version, "Installing...") + + form.installStatusLabel.text = installingStatus + + KotlinPluginUpdater.getInstance().installPluginUpdate( + it, + successCallback = { + setInstalledVersion(it.pluginDescriptor.version, IdeBundle.message("plugin.manager.installed.tooltip")) + if (versionForInstallation == it.pluginDescriptor.version) { + form.installStatusLabel.text = installingStatus + } + }, + cancelCallback = { + if (versionForInstallation == it.pluginDescriptor.version) { + form.installStatusLabel.text = "" + form.showInstallButton() + + setInstalledVersion(null, null) + } + }, + errorCallback = { + if (versionForInstallation == it.pluginDescriptor.version) { + form.installStatusLabel.text = "Installation failed" + form.showInstallButton() + setInstalledVersion(null, null) + } + } + ) } } @@ -99,7 +139,13 @@ class KotlinUpdatesSettingsConfigurable : SearchableConfigurable, Configurable.N is PluginUpdateStatus.Update -> { update = pluginUpdateStatus + versionForInstallation = update?.pluginDescriptor?.version form.setUpdateStatus("A new version ${pluginUpdateStatus.pluginDescriptor.version} is available", true) + if (installedVersion != null && installedVersion == versionForInstallation) { + // Installation of the plugin has been started or finished + form.hideInstallButton() + form.installStatusLabel.text = installingStatus + } } is PluginUpdateStatus.CheckFailed -> diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form index 3204921cafe..7f2a1e9079c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form @@ -22,7 +22,7 @@ - + @@ -40,7 +40,7 @@ - + @@ -51,11 +51,24 @@ - + + + + + + + + + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.java b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.java index ecb37b9496f..9221515deac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.java @@ -16,6 +16,7 @@ public class ConfigurePluginUpdatesForm { public AsyncProcessIcon updateCheckProgressIcon; public JLabel updateStatusLabel; public JButton installButton; + public JLabel installStatusLabel; public ConfigurePluginUpdatesForm() { int size = channelCombo.getModel().getSize(); @@ -36,10 +37,26 @@ public class ConfigurePluginUpdatesForm { public void resetUpdateStatus() { updateStatusLabel.setText(" "); installButton.setVisible(false); + installStatusLabel.setVisible(false); } public void setUpdateStatus(String message, boolean showInstallButton) { + installButton.setEnabled(true); installButton.setVisible(showInstallButton); + updateStatusLabel.setText(message); + + installStatusLabel.setVisible(true); + installStatusLabel.setText(""); + } + + public void showInstallButton() { + installButton.setEnabled(true); + installButton.setVisible(true); + } + + public void hideInstallButton() { + installButton.setEnabled(false); + installButton.setVisible(false); } }