package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import jetbrains.mps.icons.MPSIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.project.AbstractModule; import jetbrains.mps.smodel.SModelStereotype; import org.jetbrains.annotations.NotNull; import java.awt.Frame; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.project.MPSProject; import javax.swing.tree.TreeNode; import javax.swing.JOptionPane; import jetbrains.mps.ide.ui.dialogs.properties.MPSPropertiesConfigurable; import jetbrains.mps.ide.ui.dialogs.properties.ModulePropertiesConfigurable; import com.intellij.openapi.options.ex.SingleConfigurableEditor; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.ide.dialogs.project.creation.NewModelDialog; import org.jetbrains.mps.openapi.model.SModel; import com.intellij.openapi.application.ApplicationManager; import jetbrains.mps.ide.projectPane.ProjectPane; import jetbrains.mps.ide.ui.tree.module.StereotypeProvider; import jetbrains.mps.ide.ui.tree.module.NamespaceTextNode; import jetbrains.mps.smodel.Generator; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; public class NewModel_Action extends BaseAction { private static final Icon ICON = MPSIcons.Nodes.Model; public NewModel_Action() { super("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 (!(((SModule) MapSequence.fromMap(_params).get("module")) instanceof AbstractModule)) { return false; } String stereotype = NewModel_Action.this.getStereotype(_params); if (stereotype == null) { return true; } for (String availableStereotype : SModelStereotype.values) { if (stereotype.equals(availableStereotype)) { return true; } } return false; } @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; } { Frame p = event.getData(MPSCommonDataKeys.FRAME); MapSequence.fromMap(_params).put("frame", p); if (p == null) { return false; } } { Project p = event.getData(CommonDataKeys.PROJECT); MapSequence.fromMap(_params).put("ideaProject", p); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } { SModule p = event.getData(MPSCommonDataKeys.CONTEXT_MODULE); MapSequence.fromMap(_params).put("module", p); if (p == null) { return false; } } { TreeNode p = event.getData(MPSCommonDataKeys.TREE_NODE); MapSequence.fromMap(_params).put("treeNode", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { if (!(NewModel_Action.this.hasModelRoots(_params))) { int code = JOptionPane.showConfirmDialog(((Frame) MapSequence.fromMap(_params).get("frame")), "There are no model roots. Do you want to create one?", "", JOptionPane.YES_NO_OPTION); if (code == JOptionPane.YES_OPTION) { MPSPropertiesConfigurable configurable = new ModulePropertiesConfigurable(((SModule) MapSequence.fromMap(_params).get("module")), ((MPSProject) MapSequence.fromMap(_params).get("project"))); final SingleConfigurableEditor configurableEditor = new SingleConfigurableEditor(((Project) MapSequence.fromMap(_params).get("ideaProject")), configurable, "#MPSPropertiesConfigurable"); configurableEditor.show(); } return; } if (!(NewModel_Action.this.hasModelRoots(_params))) { JOptionPane.showMessageDialog(((Frame) MapSequence.fromMap(_params).get("frame")), "Can't create a model in solution with no model roots", "Can't create model", JOptionPane.ERROR_MESSAGE); return; } final Wrappers._T<NewModelDialog> dialog = new Wrappers._T<NewModelDialog>(); ((MPSProject) MapSequence.fromMap(_params).get("project")).getModelAccess().runReadAction(new Runnable() { public void run() { String stereotype = NewModel_Action.this.getStereotype(_params); dialog.value = new NewModelDialog(((MPSProject) MapSequence.fromMap(_params).get("project")), (AbstractModule) ((SModule) MapSequence.fromMap(_params).get("module")), NewModel_Action.this.getNamespace(_params), stereotype, NewModel_Action.this.isStrict(_params)); } }); dialog.value.show(); SModel result = dialog.value.getResult(); if (result != null) { final SModel modelDescriptor = result; ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { ProjectPane.getInstance(((Project) MapSequence.fromMap(_params).get("ideaProject"))).selectModel(modelDescriptor, false); } }); } } private StereotypeProvider getStereotypeProvider(final Map<String, Object> _params) { TreeNode parent = ((TreeNode) MapSequence.fromMap(_params).get("treeNode")).getParent(); while (parent != null) { if (parent instanceof StereotypeProvider) { return ((StereotypeProvider) parent); } parent = parent.getParent(); } return null; } protected String getStereotype(final Map<String, Object> _params) { if (((TreeNode) MapSequence.fromMap(_params).get("treeNode")) instanceof StereotypeProvider) { return ((StereotypeProvider) ((TreeNode) MapSequence.fromMap(_params).get("treeNode"))).getStereotype(); } else if (((TreeNode) MapSequence.fromMap(_params).get("treeNode")) instanceof NamespaceTextNode) { StereotypeProvider parent = NewModel_Action.this.getStereotypeProvider(_params); if (parent != null) { return parent.getStereotype(); } } return null; } protected boolean isStrict(final Map<String, Object> _params) { if (((TreeNode) MapSequence.fromMap(_params).get("treeNode")) instanceof StereotypeProvider) { return ((StereotypeProvider) ((TreeNode) MapSequence.fromMap(_params).get("treeNode"))).isStrict(); } else if (((TreeNode) MapSequence.fromMap(_params).get("treeNode")) instanceof NamespaceTextNode) { StereotypeProvider parent = NewModel_Action.this.getStereotypeProvider(_params); if (parent != null) { return parent.isStrict(); } } return false; } protected String getNamespace(final Map<String, Object> _params) { if (((SModule) MapSequence.fromMap(_params).get("module")) instanceof Generator) { Generator gen = (Generator) ((SModule) MapSequence.fromMap(_params).get("module")); String name = gen.getModuleName(); String genNamespace = gen.getSourceLanguage().getModuleName() + ".generator"; if ((name == null || name.length() == 0)) { return genNamespace; } return genNamespace + "." + name; } return ((SModule) MapSequence.fromMap(_params).get("module")).getModuleName(); } private boolean hasModelRoots(final Map<String, Object> _params) { return new ModelAccessHelper(((MPSProject) MapSequence.fromMap(_params).get("project")).getModelAccess()).runReadAction(new Computable<Boolean>() { public Boolean compute() { return ((SModule) MapSequence.fromMap(_params).get("module")).getModelRoots().iterator().hasNext(); } }); } }