package liveplugin.toolwindow.addplugin;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import liveplugin.IDEUtil;
import liveplugin.Icons;
import liveplugin.LivePluginAppComponent;
import liveplugin.pluginrunner.GroovyPluginRunner;
import liveplugin.toolwindow.PluginToolWindowManager;
import liveplugin.toolwindow.RefreshPluginsPanelAction;
import liveplugin.toolwindow.util.PluginsIO;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.*;
@SuppressWarnings("ComponentNotRegistered")
public class AddPluginFromPathAction extends AnAction implements DumbAware {
private static final Logger LOG = Logger.getInstance(AddPluginFromPathAction.class);
private static final String dialogTitle = "Copy Plugin From Path";
public AddPluginFromPathAction() {
super("Copy from Path", "Copy plugin from path into LivePlugins folder", Icons.COPY_PLUGIN_FROM_PATH_ICON);
}
private static List<VirtualFile> getFileSystemRoots() {
LocalFileSystem localFileSystem = LocalFileSystem.getInstance();
Set<VirtualFile> roots = new HashSet<>();
File[] ioRoots = File.listRoots();
if (ioRoots != null) {
for (File root : ioRoots) {
String path = FileUtil.toSystemIndependentName(root.getAbsolutePath());
VirtualFile file = localFileSystem.findFileByPath(path);
if (file != null) {
roots.add(file);
}
}
}
ArrayList<VirtualFile> result = new ArrayList<>();
Collections.addAll(result, VfsUtil.toVirtualFileArray(roots));
return result;
}
@Override public void actionPerformed(@NotNull AnActionEvent event) {
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, true, true, false);
PluginToolWindowManager.addRoots(descriptor, getFileSystemRoots());
VirtualFile virtualFile = FileChooser.chooseFile(descriptor, event.getProject(), null);
if (virtualFile == null) return;
if (LivePluginAppComponent.isInvalidPluginFolder(virtualFile) &&
userDoesNotWantToAddFolder(virtualFile, event.getProject())) return;
String folderToCopy = virtualFile.getPath();
String targetFolder = LivePluginAppComponent.pluginsRootPath();
try {
PluginsIO.copyFolder(folderToCopy, targetFolder);
} catch (IOException e) {
Project project = event.getProject();
if (project != null) {
IDEUtil.showErrorDialog(
project,
"Error adding plugin \"" + folderToCopy + "\" to " + targetFolder,
dialogTitle
);
}
LOG.error(e);
}
RefreshPluginsPanelAction.refreshPluginTree();
}
private boolean userDoesNotWantToAddFolder(VirtualFile virtualFile, Project project) {
int answer = Messages.showYesNoDialog(
project,
"Folder \"" + virtualFile.getPath() + "\" is not valid plugin folder because it does not contain \"" + GroovyPluginRunner.MAIN_SCRIPT + "\"." +
"\nDo you want to add it anyway?",
dialogTitle,
Messages.getQuestionIcon()
);
return answer != Messages.YES;
}
}