package org.jetbrains.plugins.ruby.motion; import com.intellij.execution.RunManager; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.Key; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.ruby.RBundle; import org.jetbrains.plugins.ruby.motion.bridgesupport.Framework; import org.jetbrains.plugins.ruby.tasks.rake.RakeUtilBase; import org.jetbrains.plugins.ruby.tasks.rake.runConfigurations.RakeRunConfigurationType; import java.util.Collection; import java.util.Collections; /** * @author Anna Bulenkova */ public class RubyMotionUtilExt { protected static final Key<Collection<Framework>> FRAMEWORKS_LIST = Key.create("ruby.motion.frameworks.list"); private static RunnerAndConfigurationSettings createAndAddRakeConfiguration(final String taskFullName, final Module module, final RunManager runManager) { final RunnerAndConfigurationSettings settings = RakeRunConfigurationType.getInstance().getRakeFactory().createConfigurationSettings(module, taskFullName, ArrayUtil.EMPTY_STRING_ARRAY, Collections.emptyMap()); runManager.addConfiguration(settings, false); return settings; } public static void createMotionRunConfiguration(final Module module) { final Project project = module.getProject(); final String title = RBundle.message("rails.facet.builder.run.configuration.server.creating"); final Task task = new Task.Backgroundable(project, title, true) { public void run(@NotNull ProgressIndicator indicator) { indicator.setText(RBundle.message("progress.backgnd.indicator.title.please.wait", getTitle())); final RunManager runManager = RunManager.getInstance(project); ApplicationManager.getApplication().runReadAction(() -> { // requires read action // Rake : "simulator" final String taskName = RubyMotionUtil.getInstance().getMainRakeTask(module); final RunnerAndConfigurationSettings simulator = createAndAddRakeConfiguration(taskName, module, runManager); // Rake : "spec" createAndAddRakeConfiguration(RakeUtilBase.TASKS_SPEC_FULLCMD, module, runManager); // make development config active runManager.setSelectedConfiguration(simulator); }); } }; final Runnable taskRunner = () -> ProgressManager.getInstance().run(task); if (!project.isInitialized()) { StartupManager.getInstance(project).registerPostStartupActivity(taskRunner); } else { taskRunner.run(); } } }