package name.admitriev.jhelper.task;
import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.lang.Language;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
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.PsiFileFactory;
import com.intellij.psi.PsiManager;
import name.admitriev.jhelper.configuration.TaskConfiguration;
import name.admitriev.jhelper.configuration.TaskConfigurationType;
import name.admitriev.jhelper.exceptions.NotificationException;
import name.admitriev.jhelper.generation.FileUtils;
import name.admitriev.jhelper.generation.TemplatesUtils;
public class TaskUtils {
private TaskUtils() {
}
/**
* Generates task file content depending on custom user template
*/
private static String getTaskContent(Project project, String className) {
String template = TemplatesUtils.getTemplate(project, "task");
template = TemplatesUtils.replaceAll(template, TemplatesUtils.CLASS_NAME, className);
return template;
}
public static PsiElement saveNewTask(TaskData taskData, Project project) {
createConfigurationForTask(project, taskData);
return generateCPP(project, taskData);
}
private static PsiElement generateCPP(Project project, TaskData taskData) {
VirtualFile parent = FileUtils.findOrCreateByRelativePath(project.getBaseDir(), FileUtils.getDirectory(taskData.getCppPath()));
PsiDirectory psiParent = PsiManager.getInstance(project).findDirectory(parent);
if (psiParent == null) {
throw new NotificationException("Couldn't open parent directory as PSI");
}
Language objC = Language.findLanguageByID("ObjectiveC");
if (objC == null) {
throw new NotificationException("Language not found");
}
PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(
FileUtils.getFilename(taskData.getCppPath()),
objC,
getTaskContent(project, taskData.getClassName())
);
if (file == null) {
throw new NotificationException("Couldn't generate file");
}
return ApplicationManager.getApplication().runWriteAction(
(Computable<PsiElement>) () -> psiParent.add(file)
);
}
private static void createConfigurationForTask(Project project, TaskData taskData) {
TaskConfigurationType configurationType = new TaskConfigurationType();
ConfigurationFactory factory = configurationType.getConfigurationFactories()[0];
RunManager manager = RunManager.getInstance(project);
TaskConfiguration taskConfiguration = new TaskConfiguration(
project,
factory
);
taskConfiguration.setFromTaskData(taskData);
RunnerAndConfigurationSettings configuration = manager.createConfiguration(
taskConfiguration,
factory
);
manager.addConfiguration(configuration, true);
manager.setSelectedConfiguration(configuration);
}
}