package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import javax.swing.Icon; import jetbrains.mps.icons.MPSIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import jetbrains.mps.ide.ui.tree.smodel.SModelTreeNode; import org.jetbrains.mps.openapi.model.SModelName; import jetbrains.mps.smodel.SModelStereotype; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.model.SModel; import javax.swing.tree.TreeNode; import jetbrains.mps.project.SModuleOperations; import org.apache.log4j.Level; import jetbrains.mps.smodel.ModelImports; import jetbrains.mps.ide.projectPane.ProjectPane; import java.util.List; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.ide.ui.tree.SortUtil; public class NewSubTestModel_Action extends BaseAction { private static final Logger LOG = LogManager.getLogger(NewSubTestModel_Action.class); private static final Icon ICON = MPSIcons.Nodes.TestModel; public NewSubTestModel_Action() { super("Test Model", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { if (!(event.getData(MPSCommonDataKeys.TREE_NODE) instanceof SModelTreeNode)) { return false; } return !(event.getData(MPSCommonDataKeys.CONTEXT_MODEL).getName().hasStereotype()) && event.getData(MPSCommonDataKeys.CONTEXT_MODEL).getModelRoot().canCreateModel(new SModelName(event.getData(MPSCommonDataKeys.CONTEXT_MODEL).getName().getLongName(), SModelStereotype.TESTS).getValue()); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { Project p = event.getData(CommonDataKeys.PROJECT); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); if (p == null) { return false; } } { SModel p = event.getData(MPSCommonDataKeys.CONTEXT_MODEL); if (p == null) { return false; } } { TreeNode p = event.getData(MPSCommonDataKeys.TREE_NODE); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { event.getData(MPSCommonDataKeys.MPS_PROJECT).getModelAccess().executeCommand(new Runnable() { public void run() { SModelName testModelName = new SModelName(NewSubTestModel_Action.this.getTestModelName(event), SModelStereotype.TESTS); SModel parentModel = event.getData(MPSCommonDataKeys.CONTEXT_MODEL); SModel createdModel = SModuleOperations.createModelWithAdjustments(testModelName.getValue(), parentModel.getModelRoot()); if (createdModel == null) { if (LOG.isEnabledFor(Level.WARN)) { LOG.warn("Can't create submodel " + testModelName + " for model " + parentModel.getName()); } return; } ModelImports imports = new ModelImports(createdModel); imports.addModelImport(parentModel.getReference()); imports.copyImportedModelsFrom(parentModel); imports.copyUsedLanguagesFrom(parentModel); imports.copyEmployedDevKitsFrom(parentModel); imports.copyLanguageEngagedOnGeneration(parentModel); ProjectPane.getInstance(event.getData(CommonDataKeys.PROJECT)).selectModel(createdModel, false); } }); } /*package*/ String getTestModelName(final AnActionEvent event) { StringBuilder builder = new StringBuilder(); String modelBaseName = event.getData(MPSCommonDataKeys.CONTEXT_MODEL).getName().getLongName(); builder.append(modelBaseName); int testModelCount = 0; List<SModel> models = IterableUtil.asList(event.getData(MPSCommonDataKeys.CONTEXT_MODEL).getModule().getModels()); List<SModel> sortedModels = SortUtil.sortModels(models); for (SModel md : sortedModels) { if (!(SModelStereotype.isTestModel(md))) { continue; } String name = (testModelCount == 0 ? modelBaseName : modelBaseName + testModelCount); if (name.equals(md.getName().getLongName())) { testModelCount++; } } if (testModelCount != 0) { builder.append(testModelCount); } return builder.toString(); } }