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);
}
}