package org.dlangplugin.module; import com.intellij.execution.BeforeRunTask; import com.intellij.execution.BeforeRunTaskProvider; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.ConfigurationType; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.impl.RunConfigurationBeforeRunProvider; import com.intellij.execution.impl.RunManagerImpl; import com.intellij.ide.util.projectWizard.JavaModuleBuilder; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.SdkTypeId; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.util.Pair; import org.dlangplugin.DLangIcons; import org.dlangplugin.DLangBundle; import org.dlangplugin.run.DLangRunAppConfigurationType; import org.dlangplugin.run.DLangRunDmdConfigurationType; import org.dlangplugin.sdk.DLangSdkType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.io.File; import java.util.ArrayList; import java.util.List; /* Builder for new projects from template "D Application". * Creates configurations "Run DMD Compiler" and "Run D App". */ public class DLangModuleBuilder extends JavaModuleBuilder { public static final String DLANG_GROUP_NAME = "D Language"; public static final String RUN_CONFIG_NAME = "Run D App"; public static final String COMPILE_CONFIG_NAME = "Compile with DMD"; private final String myBuilderId; private final String myPresentableName; private final String myDescription; private final Icon myBigIcon; private List<Pair<String,String>> sourcePaths; public DLangModuleBuilder() { this("DLangDmdApp", DLangBundle.message("module.title"), DLangBundle.message("module.description"), null); } protected DLangModuleBuilder(String builderId, String presentableName, String description, Icon bigIcon) { myBuilderId = builderId; myPresentableName = presentableName; myDescription = description; myBigIcon = bigIcon; } @Override public String getBuilderId() { return myBuilderId; } @Override public Icon getBigIcon() { return myBigIcon; } @Override public Icon getNodeIcon() { return DLangIcons.MODULE; } @Override public String getDescription() { return myDescription; } @Override public String getPresentableName() { return myPresentableName; } @Override public String getGroupName() { return DLANG_GROUP_NAME; } @Override public String getParentGroup() { return DLANG_GROUP_NAME; } protected void setJavaRootModel(ModifiableRootModel rootModel) throws ConfigurationException { super.setupRootModel(rootModel); } @Override public void setupRootModel(ModifiableRootModel rootModel) throws ConfigurationException { setJavaRootModel(rootModel); Project project = rootModel.getProject(); RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(project); //Create "Compile with DMD" configuration RunnerAndConfigurationSettings runDmdSettings = runManager.findConfigurationByName(COMPILE_CONFIG_NAME); if(runDmdSettings == null) { final DLangRunDmdConfigurationType configurationType = Extensions.findExtension(ConfigurationType.CONFIGURATION_TYPE_EP, DLangRunDmdConfigurationType.class); final ConfigurationFactory factory = configurationType.getConfigurationFactories()[0]; runDmdSettings = runManager.createRunConfiguration(COMPILE_CONFIG_NAME, factory); ((ModuleBasedConfiguration) runDmdSettings.getConfiguration()).setModule(rootModel.getModule()); runManager.addConfiguration(runDmdSettings, false); } //Create "Run D App" configuration RunnerAndConfigurationSettings runAppSettings = runManager.findConfigurationByName(RUN_CONFIG_NAME); if(runAppSettings == null) { final DLangRunAppConfigurationType configurationType = Extensions.findExtension(ConfigurationType.CONFIGURATION_TYPE_EP, DLangRunAppConfigurationType.class); final ConfigurationFactory factory = configurationType.getConfigurationFactories()[0]; runAppSettings = runManager.createRunConfiguration(RUN_CONFIG_NAME, factory); ((ModuleBasedConfiguration) runAppSettings.getConfiguration()).setModule(rootModel.getModule()); runManager.addConfiguration(runAppSettings, false); } //Add dependency to exec "runDmdSettings" before running "runAppSettings". //XXX: next code doesn't add BeforeRunTask. I don't know why. BeforeRunTaskProvider provider = RunConfigurationBeforeRunProvider.getProvider(project, RunConfigurationBeforeRunProvider.ID); if(provider != null) { BeforeRunTask runDmdTask = provider.createTask(runDmdSettings.getConfiguration()); List<BeforeRunTask> beforeRunTasks = new ArrayList<BeforeRunTask>(1); beforeRunTasks.add(runDmdTask); runManager.setBeforeRunTasks(runAppSettings.getConfiguration(), beforeRunTasks, false); } } /* By default sources are located in {WORKING_DIR}/source folder. */ @NotNull @Override public List<Pair<String,String>> getSourcePaths() { if (sourcePaths == null) { final List<Pair<String, String>> paths = new ArrayList<Pair<String, String>>(); @NonNls final String path = getContentEntryPath() + File.separator + "source"; new File(path).mkdirs(); paths.add(Pair.create(path, "")); sourcePaths = paths; } return sourcePaths; } @Override public boolean isSuitableSdkType(SdkTypeId sdkType) { return sdkType == DLangSdkType.getInstance(); } @Override public ModuleType getModuleType() { return DLangModuleType.getInstance(); } }