package de.janthomae.leiningenplugin.run;
import com.intellij.compiler.options.CompileStepBeforeRun;
import com.intellij.execution.*;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.ConfigurationTypeUtil;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.LocalFileSystem;
import de.janthomae.leiningenplugin.LeiningenIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* @author <a href="janthomae@janthomae.de">Jan Thomä</a>
* @version $Id:$
*/
public class LeiningenRunConfigurationType implements ConfigurationType {
private ConfigurationFactory myFactory;
LeiningenRunConfigurationType() {
myFactory = new ConfigurationFactory(this) {
public RunConfiguration createTemplateConfiguration(Project project) {
throw new UnsupportedOperationException();
}
public RunConfiguration createTemplateConfiguration(Project project, RunManager runManager) {
return new LeiningenRunConfiguration(project, this, "");
}
@Override
public void configureBeforeRunTaskDefaults(Key<? extends BeforeRunTask> providerID, BeforeRunTask task) {
if (providerID == CompileStepBeforeRun.ID) {
task.setEnabled(false);
}
}
};
}
public RunnerAndConfigurationSettings createConfigurationByLocation(Location location) {
return null;
}
public boolean isConfigurationByLocation(RunConfiguration runConfiguration, Location location) {
return false;
}
public String getDisplayName() {
return "Leiningen";
}
public String getConfigurationTypeDescription() {
return "Leiningen Build";
}
public Icon getIcon() {
return LeiningenIcons.GOAL_ICON;
}
@NotNull
public String getId() {
return "LeiningenRunConfiguration";
}
public ConfigurationFactory[] getConfigurationFactories() {
return new ConfigurationFactory[]{myFactory};
}
public static void runConfiguration(Project project,
LeiningenRunnerParameters params,
DataContext context) {
RunnerAndConfigurationSettings configSettings = createRunnerAndConfigurationSettings(
params,
project);
ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(DefaultRunExecutor.EXECUTOR_ID);
Executor executor = DefaultRunExecutor.getRunExecutorInstance();
ExecutionEnvironment env = new ExecutionEnvironment(executor, runner, configSettings, project);
try {
runner.execute(env, new ProgramRunner.Callback() {
public void processStarted(RunContentDescriptor runContentDescriptor) {
final ProcessHandler runContentDescriptorProcessHandler = runContentDescriptor.getProcessHandler();
if (runContentDescriptorProcessHandler != null) {
runContentDescriptorProcessHandler.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(ProcessEvent event) {
LocalFileSystem.getInstance().refreshWithoutFileWatcher(true);
}
});
}
}
});
} catch (ExecutionException e) {
}
}
private static RunnerAndConfigurationSettings createRunnerAndConfigurationSettings(
LeiningenRunnerParameters params, Project project) {
LeiningenRunConfigurationType type =
ConfigurationTypeUtil.findConfigurationType(LeiningenRunConfigurationType.class);
final RunnerAndConfigurationSettings settings =
RunManagerEx.getInstanceEx(project).createConfiguration("Leiningen", type.myFactory);
LeiningenRunConfiguration configuration = (LeiningenRunConfiguration) settings.getConfiguration();
configuration.setRunnerParams(params);
return settings;
}
}