package org.dlangplugin.run;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.*;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.CompilerModuleExtension;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.util.PathUtil;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class DLangRunAppConfiguration extends ModuleBasedConfiguration<RunConfigurationModule>
implements RunConfiguration
{
private String workDir;
private String additionalParams;
private Map<String, String> envVars;
public DLangRunAppConfiguration(String name, Project project, ConfigurationFactory factory) {
super(name, new RunConfigurationModule(project), factory);
Collection<Module> modules = this.getValidModules();
if(!modules.isEmpty()) {
//Get first valid module and use it
this.setModule(modules.iterator().next());
}
workDir = PathUtil.getLocalPath(project.getBaseDir());
envVars = new HashMap<String, String>();
}
public String getExecutablePath() {
Module module = getConfigurationModule().getModule();
if(module != null) {
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
String outputPath = moduleRootManager.getModuleExtension(CompilerModuleExtension.class).getCompilerOutputUrl();
String filename = module.getName();
if (SystemInfo.isWindows) {
filename += ".exe";
}
File outputFile = new File(VfsUtilCore.urlToPath(outputPath), filename);
return outputFile.getPath();
}
else {
return "";
}
}
@Override
public Collection<Module> getValidModules() {
Module[] modules = ModuleManager.getInstance(getProject()).getModules();
final DMDRunner appRunner = new DMDRunner();
ArrayList<Module> res = new ArrayList<Module>();
for (Module module : modules) {
if (appRunner.isValidModule(module)) {
res.add(module);
}
}
return res;
}
@Override
protected ModuleBasedConfiguration createInstance() {
return new DLangRunAppConfiguration(getName(), getProject(), getFactory());
}
@Override
public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() {
return new DLangRunAppConfigurationEditor();
}
@Nullable
@Override
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException {
return new DLangRunAppState(env, this);
}
@Override
public void writeExternal(@NotNull Element element) throws WriteExternalException {
if(envVars == null) {
envVars = new HashMap<String, String>();
}
super.writeExternal(element);
writeModule(element);
XmlSerializer.serializeInto(this, element);
}
@Override
public void readExternal(@NotNull Element element) throws InvalidDataException {
super.readExternal(element);
readModule(element);
XmlSerializer.deserializeInto(this, element);
}
/* Getters and Setters. Autogenerated by IntelliJ IDEA */
public String getWorkDir() {
return workDir;
}
public void setWorkDir(String workDir) {
this.workDir = workDir;
}
public String getAdditionalParams() {
return additionalParams;
}
public void setAdditionalParams(String additionalParams) {
this.additionalParams = additionalParams;
}
public Map<String, String> getEnvVars() {
return envVars;
}
public void setEnvVars(Map<String, String> envVars) {
this.envVars = envVars;
}
}