mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
install plugins in background (IDEA-23187)
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user