From 099e29b5e39bc63cfc567e760cbb307830040ddd Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 19 Jul 2017 11:18:46 +0300 Subject: [PATCH] allow to dnd plugins into the frame to install --- .../plugins/InstalledPluginsManagerMain.java | 111 ++++++++++++------ .../src/META-INF/PlatformExtensions.xml | 1 + 2 files changed, 76 insertions(+), 36 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java index 107abaa5dcca..6b03a1fafec5 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java @@ -20,12 +20,15 @@ import com.intellij.icons.AllIcons; import com.intellij.ide.CopyProvider; import com.intellij.ide.DataManager; import com.intellij.ide.actions.ShowSettingsUtilImpl; +import com.intellij.ide.dnd.FileCopyPasteUtil; import com.intellij.ide.startup.StartupActionScriptManager; import com.intellij.ide.ui.search.ActionFromOptionDescriptorProvider; import com.intellij.ide.ui.search.OptionDescription; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.editor.CustomFileDropHandler; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; @@ -33,12 +36,14 @@ import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.options.ex.SingleConfigurableEditor; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.ex.MessagesEx; import com.intellij.openapi.updateSettings.impl.PluginDownloader; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VfsUtilCore; @@ -55,6 +60,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; @@ -127,45 +133,53 @@ public class InstalledPluginsManagerMain extends PluginManagerMain { FileChooser.chooseFile(descriptor, null, parent, toSelect, virtualFile -> { File file = VfsUtilCore.virtualToIoFile(virtualFile); PropertiesComponent.getInstance().setValue(PLUGINS_PRESELECTION_PATH, FileUtil.toSystemIndependentName(file.getParent())); - - try { - IdeaPluginDescriptorImpl pluginDescriptor = PluginDownloader.loadDescriptionFromJar(file); - if (pluginDescriptor == null) { - MessagesEx.showErrorDialog(parent, "Fail to load plugin descriptor from file " + file.getName(), CommonBundle.getErrorTitle()); - return; - } - - if (ourState.wasInstalled(pluginDescriptor.getPluginId())) { - String message = "Plugin '" + pluginDescriptor.getName() + "' was already installed"; - MessagesEx.showWarningDialog(parent, message, CommonBundle.getWarningTitle()); - return; - } - - if (PluginManagerCore.isIncompatible(pluginDescriptor)) { - String message = "Plugin '" + pluginDescriptor.getName() + "' is incompatible with this installation"; - MessagesEx.showErrorDialog(parent, message, CommonBundle.getErrorTitle()); - return; - } - - IdeaPluginDescriptor installedPlugin = PluginManager.getPlugin(pluginDescriptor.getPluginId()); - if (installedPlugin != null && !installedPlugin.isBundled()) { - File oldFile = installedPlugin.getPath(); - if (oldFile != null) { - StartupActionScriptManager.addActionCommand(new StartupActionScriptManager.DeleteCommand(oldFile)); - } - } - - PluginInstaller.install(file, file.getName(), false, pluginDescriptor); - ourState.onPluginInstall(pluginDescriptor); - checkInstalledPluginDependencies(model, pluginDescriptor, parent); - callback.consume(pair(file, pluginDescriptor)); - } - catch (IOException ex) { - MessagesEx.showErrorDialog(parent, ex.getMessage(), CommonBundle.getErrorTitle()); - } + install(model, file, callback, parent); }); } + private static boolean install(@NotNull InstalledPluginsTableModel model, + @NotNull File file, + @NotNull Consumer> callback, + @Nullable Component parent) { + try { + IdeaPluginDescriptorImpl pluginDescriptor = PluginDownloader.loadDescriptionFromJar(file); + if (pluginDescriptor == null) { + MessagesEx.showErrorDialog(parent, "Fail to load plugin descriptor from file " + file.getName(), CommonBundle.getErrorTitle()); + return false; + } + + if (ourState.wasInstalled(pluginDescriptor.getPluginId())) { + String message = "Plugin '" + pluginDescriptor.getName() + "' was already installed"; + MessagesEx.showWarningDialog(parent, message, CommonBundle.getWarningTitle()); + return false; + } + + if (PluginManagerCore.isIncompatible(pluginDescriptor)) { + String message = "Plugin '" + pluginDescriptor.getName() + "' is incompatible with this installation"; + MessagesEx.showErrorDialog(parent, message, CommonBundle.getErrorTitle()); + return false; + } + + IdeaPluginDescriptor installedPlugin = PluginManager.getPlugin(pluginDescriptor.getPluginId()); + if (installedPlugin != null && !installedPlugin.isBundled()) { + File oldFile = installedPlugin.getPath(); + if (oldFile != null) { + StartupActionScriptManager.addActionCommand(new StartupActionScriptManager.DeleteCommand(oldFile)); + } + } + + PluginInstaller.install(file, file.getName(), false, pluginDescriptor); + ourState.onPluginInstall(pluginDescriptor); + checkInstalledPluginDependencies(model, pluginDescriptor, parent); + callback.consume(pair(file, pluginDescriptor)); + return true; + } + catch (IOException ex) { + MessagesEx.showErrorDialog(parent, ex.getMessage(), CommonBundle.getErrorTitle()); + } + return false; + } + private static void checkInstalledPluginDependencies(@NotNull InstalledPluginsTableModel model, @NotNull IdeaPluginDescriptorImpl pluginDescriptor, @Nullable Component parent) { @@ -508,6 +522,31 @@ public class InstalledPluginsManagerMain extends PluginManagerMain { chooseAndInstall(new InstalledPluginsTableModel(), pair -> PluginManagerConfigurable.shutdownOrRestartApp(), null); } } + + public static class PluginDropHandler extends CustomFileDropHandler { + @Override + public boolean canHandle(@NotNull Transferable t, @Nullable Editor editor) { + File file = getFile(t); + if (file == null) return false; + String path = file.getPath(); + return FileUtilRt.extensionEquals(path, "jar") || + FileUtilRt.extensionEquals(path, "zip"); + } + + @Override + public boolean handleDrop(@NotNull Transferable t, @Nullable Editor editor, Project project) { + File file = getFile(t); + if (file == null) return false; + return install(new InstalledPluginsTableModel(), file, + pair -> PluginManagerConfigurable.shutdownOrRestartApp(), null); + } + + @Nullable + private static File getFile(@NotNull Transferable t) { + List list = FileCopyPasteUtil.getFileList(t); + return list == null || list.size() != 1 ? null : list.get(0); + } + } public static class PluginsActionFromOptionDescriptorProvider extends ActionFromOptionDescriptorProvider { @Nullable diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 48c89121a418..7ea4db595da6 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -309,6 +309,7 @@ +