package org.easyb.idea.runner; import javax.swing.*; import com.intellij.execution.LocatableConfigurationType; import com.intellij.execution.Location; import com.intellij.execution.RunManager; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; /** * Adds an easyb run configuration to IntelliJ */ public class EasybRunConfigurationType implements LocatableConfigurationType { private EasybConfigurationFactory factory; public EasybRunConfigurationType() { factory = new EasybConfigurationFactory(this); } public String getDisplayName() { return "Easyb Specification"; } public String getConfigurationTypeDescription() { return "Easyb Specification"; } public Icon getIcon() { return IconLoader.getIcon("/easyb.png"); } @NotNull public String getId() { return "EasybRunConfigurationType"; } public ConfigurationFactory[] getConfigurationFactories() { return new ConfigurationFactory[]{factory}; } public RunnerAndConfigurationSettings createConfigurationByLocation(Location location) { final PsiElement element = location.getPsiElement(); final PsiFile file = element.getContainingFile(); if (file == null) { return null; } return createConfiguration(file); } @SuppressWarnings({"SimplifiableIfStatement"}) public boolean isConfigurationByLocation(RunConfiguration configuration, Location location) { final PsiClass aClass = getSpecClass(location.getPsiElement()); if (aClass == null) return false; final VirtualFile vFile = aClass.getContainingFile().getVirtualFile(); if (vFile == null) return false; return Comparing.equal(((EasybRunConfiguration) configuration).getSpecificationPath(), vFile.getPath()); } private PsiClass getSpecClass(PsiElement element) { final PsiFile file = element.getContainingFile(); if (!(file instanceof GroovyFile)) return null; return ((GroovyFile) file).getScriptClass(); } private RunnerAndConfigurationSettings createConfiguration(final PsiFile easybSpecFile) { final Project project = easybSpecFile.getProject(); RunnerAndConfigurationSettings settings = RunManager.getInstance(project). createRunConfiguration(easybSpecFile.getName(), factory); final EasybRunConfiguration configuration = (EasybRunConfiguration) settings.getConfiguration(); final PsiDirectory dir = easybSpecFile.getContainingDirectory(); assert dir != null; final VirtualFile vFile = easybSpecFile.getVirtualFile(); assert vFile != null; configuration.setSpecificationPath(vFile.getPath()); configuration.setModule(ModuleUtil.findModuleForPsiElement(easybSpecFile)); return settings; } }