install plugins in background (IDEA-23187)

This commit is contained in:
anna
2012-01-13 12:46:14 +01:00
parent 63e8272a76
commit 4049d02937
2 changed files with 80 additions and 20 deletions
@@ -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<PluginNode> list = new ArrayList<PluginNode>();
final ArrayList<PluginNode> list = new ArrayList<PluginNode>();
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<PluginNode> 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 = "<html>";
message += restartCapable ? IdeBundle.message("message.idea.restart.required", ApplicationNamesInfo.getInstance().getProductName())
: IdeBundle.message("message.idea.shutdown.required", ApplicationNamesInfo.getInstance().getProductName());
message += "<br><a href=";
message += restartCapable ? "\"restart\">Restart now" : "\"shutdown\">Shutdown";
message += "</a></html>";
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();
@@ -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<PluginNode> plugins, final List<IdeaPluginDescriptor> allPlugins) throws IOException {
public static boolean downloadPlugins(final List<PluginNode> plugins, final List<IdeaPluginDescriptor> 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) {