From 4049d02937ba2f36aa1eb24d4db85227a50a5f45 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 13 Jan 2012 12:27:57 +0100 Subject: [PATCH] install plugins in background (IDEA-23187) --- .../ide/plugins/ActionInstallPlugin.java | 77 +++++++++++++++---- .../ide/plugins/PluginManagerMain.java | 23 ++++-- 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java b/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java index c96d1f09a529..15b3f9a14734 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java @@ -16,15 +16,24 @@ package com.intellij.ide.plugins; import com.intellij.ide.IdeBundle; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationListener; +import com.intellij.notification.NotificationType; +import com.intellij.notification.Notifications; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.application.ApplicationNamesInfo; +import com.intellij.openapi.application.ex.ApplicationEx; +import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.IconLoader; import com.intellij.util.net.IOExceptionDialog; +import org.jetbrains.annotations.NotNull; +import javax.swing.event.HyperlinkEvent; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -81,7 +90,7 @@ public class ActionInstallPlugin extends AnAction implements DumbAware { IdeaPluginDescriptor[] selection = getPluginTable().getSelectedObjects(); if (userConfirm(selection)) { - ArrayList list = new ArrayList(); + final ArrayList list = new ArrayList(); for (IdeaPluginDescriptor descr : selection) { PluginNode pluginNode = null; if (descr instanceof PluginNode) { @@ -99,31 +108,69 @@ public class ActionInstallPlugin extends AnAction implements DumbAware { } } try { - if (PluginManagerMain.downloadPlugins(list, host.getPluginsModel().view)) { - for (PluginNode pluginNode : list) { - final String idString = pluginNode.getPluginId().getIdString(); - final PluginManagerUISettings pluginManagerUISettings = PluginManagerUISettings.getInstance(); - if (!pluginManagerUISettings.myInstalledPlugins.contains(idString)) { - pluginManagerUISettings.myInstalledPlugins.add(idString); + final Runnable onInstallRunnable = new Runnable() { + @Override + public void run() { + installedPluginsToModel(list); + installed.setRequireShutdown(true); + if (!installed.isDisposed()) { + getPluginTable().updateUI(); + } + else { + notifyPluginsWereInstalled(); } - pluginManagerUISettings.myOutdatedPlugins.remove(idString); } - final InstalledPluginsTableModel installedPluginsModel = (InstalledPluginsTableModel)installed.getPluginsModel(); - for (PluginNode node : list) { - installedPluginsModel.appendOrUpdateDescriptor(node); - } - installed.setRequireShutdown(true); - } + }; + PluginManagerMain.downloadPlugins(list, host.getPluginsModel().view, onInstallRunnable); } catch (IOException e1) { PluginManagerMain.LOG.error(e1); IOExceptionDialog .showErrorDialog(IdeBundle.message("action.download.and.install.plugin"), IdeBundle.message("error.plugin.download.failed")); } - getPluginTable().updateUI(); } } + private void installedPluginsToModel(ArrayList list) { + for (PluginNode pluginNode : list) { + final String idString = pluginNode.getPluginId().getIdString(); + final PluginManagerUISettings pluginManagerUISettings = PluginManagerUISettings.getInstance(); + if (!pluginManagerUISettings.myInstalledPlugins.contains(idString)) { + pluginManagerUISettings.myInstalledPlugins.add(idString); + } + pluginManagerUISettings.myOutdatedPlugins.remove(idString); + } + + final InstalledPluginsTableModel installedPluginsModel = (InstalledPluginsTableModel)installed.getPluginsModel(); + for (PluginNode node : list) { + installedPluginsModel.appendOrUpdateDescriptor(node); + } + } + + private static void notifyPluginsWereInstalled() { + final ApplicationEx app = ApplicationManagerEx.getApplicationEx(); + final boolean restartCapable = app.isRestartCapable(); + String message = ""; + message += restartCapable ? IdeBundle.message("message.idea.restart.required", ApplicationNamesInfo.getInstance().getProductName()) + : IdeBundle.message("message.idea.shutdown.required", ApplicationNamesInfo.getInstance().getProductName()); + message += "
Restart now" : "\"shutdown\">Shutdown"; + message += ""; + Notifications.Bus.notify(new Notification(IdeBundle.message("title.plugin.error"), IdeBundle.message("title.plugin.error"), + message, NotificationType.INFORMATION, new NotificationListener() { + @Override + public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { + notification.expire(); + if (restartCapable) { + app.restart(); + } + else { + app.exit(true); + } + } + })); + } + public PluginTable getPluginTable() { return host.getPluginTable(); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java index 8891bb01c92c..de9d2b33330a 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java @@ -22,9 +22,12 @@ import com.intellij.ide.ui.search.SearchUtil; import com.intellij.ide.ui.search.SearchableOptionsRegistrar; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.updateSettings.impl.PluginDownloader; @@ -99,6 +102,7 @@ public abstract class PluginManagerMain implements Disposable { protected final MyPluginsFilter myFilter = new MyPluginsFilter(); protected PluginManagerUISettings myUISettings; + private boolean myDisposed = false; public PluginManagerMain( PluginManagerUISettings uiSettings) { @@ -125,6 +129,11 @@ public abstract class PluginManagerMain implements Disposable { protected abstract JScrollPane createTable(); public void dispose() { + myDisposed = true; + } + + public boolean isDisposed() { + return myDisposed; } public void filter(String filter) { @@ -280,14 +289,18 @@ public abstract class PluginManagerMain implements Disposable { loadPluginsFromHostInBackground(); } - public static boolean downloadPlugins(final List plugins, final List allPlugins) throws IOException { + public static boolean downloadPlugins(final List plugins, final List allPlugins, final Runnable onSuccess) throws IOException { final boolean[] result = new boolean[1]; try { - ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { - public void run() { - result[0] = PluginInstaller.prepareToInstall(plugins, allPlugins); + ProgressManager.getInstance().run(new Task.Backgroundable(null, IdeBundle.message("progress.download.plugins"), true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + if (PluginInstaller.prepareToInstall(plugins, allPlugins)) { + ApplicationManager.getApplication().invokeLater(onSuccess); + result[0] = true; + } } - }, IdeBundle.message("progress.download.plugins"), true, null); + }); } catch (RuntimeException e) { if (e.getCause() != null && e.getCause() instanceof IOException) {