package jetbrains.mps.ide.java.workbench.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; 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 jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.project.MPSProject; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import javax.swing.tree.TreeNode; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.util.Computable; import jetbrains.mps.smodel.ModelAccessHelper; 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 com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.vfs.VirtualFile; import java.util.List; import jetbrains.mps.vfs.IFile; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.vfs.FileSystem; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.ide.java.newparser.JavaConvertUtil; import jetbrains.mps.ide.java.newparser.JavaToMpsConverter; import jetbrains.mps.ide.messages.MessagesViewTool; import com.intellij.openapi.util.Ref; import jetbrains.mps.ide.java.newparser.JavaParseException; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.ProgressIndicator; import jetbrains.mps.progress.ProgressMonitorAdapter; import java.io.IOException; import com.intellij.openapi.application.ApplicationManager; import jetbrains.mps.ide.projectPane.ProjectPane; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.ide.ui.tree.module.StereotypeProvider; public class NewModelFromSource_Action extends BaseAction { private static final Icon ICON = null; public NewModelFromSource_Action() { super("Models from Java Sources", "", 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 = NewModelFromSource_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; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } { Project p = event.getData(CommonDataKeys.PROJECT); MapSequence.fromMap(_params).put("ideaProject", 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) { final SRepository repository = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository(); Computable<Boolean> checkModelRoots = new Computable<Boolean>() { public Boolean compute() { return ((SModule) MapSequence.fromMap(_params).get("module")).getModelRoots().iterator().hasNext(); } }; ModelAccessHelper maHelper = new ModelAccessHelper(repository); if (!(maHelper.runReadAction(checkModelRoots))) { 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(); } else { return; } if (!(maHelper.runReadAction(checkModelRoots))) { 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; } } FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, true); FileChooserDialog fileDialog = FileChooserFactory.getInstance().createFileChooser(descriptor, ((Project) MapSequence.fromMap(_params).get("ideaProject")), ((Frame) MapSequence.fromMap(_params).get("frame"))); VirtualFile[] chosen = fileDialog.choose(null, ((Project) MapSequence.fromMap(_params).get("ideaProject"))); if (chosen.length == 0) { return; } List<IFile> chosenIFiles = ListSequence.fromList(new ArrayList<IFile>(chosen.length)); for (VirtualFile vfile : chosen) { ListSequence.fromList(chosenIFiles).addElement(FileSystem.getInstance().getFileByPath(vfile.getPath())); } final List<IFile> ifilesToParse = Sequence.fromIterable(JavaConvertUtil.flattenDirs(chosenIFiles)).toListSequence(); final JavaToMpsConverter parser = new JavaToMpsConverter(((SModule) MapSequence.fromMap(_params).get("module")), repository, ((Project) MapSequence.fromMap(_params).get("ideaProject")).getComponent(MessagesViewTool.class).newHandler()); final Ref<JavaParseException> parseException = new Ref<JavaParseException>(); ProgressManager.getInstance().run(new Task.Modal(null, "Convert to MPS", false) { public void run(@NotNull ProgressIndicator indicator) { try { parser.convertToMps(ifilesToParse, new ProgressMonitorAdapter(indicator)); } catch (JavaParseException e) { parseException.set(e); } catch (IOException e) { throw new RuntimeException(e); } } }); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository().getModelAccess().runWriteAction(new Runnable() { public void run() { parser.saveAll(); } }); } }); // workaround for project pane not rebuilding itself when a model has been added // not in a command but in a write action ProjectPane.getInstance(((MPSProject) MapSequence.fromMap(_params).get("project"))).rebuild(); if (!(parseException.isNull())) { JOptionPane.showMessageDialog(((Frame) MapSequence.fromMap(_params).get("frame")), parseException.get().getMessage(), "Parse error", JOptionPane.ERROR_MESSAGE); } List<SModel> resulting = parser.getModels(); if (ListSequence.fromList(resulting).isNotEmpty()) { SModel firstModel = ListSequence.fromList(resulting).first(); ProjectPane.getInstance(((MPSProject) MapSequence.fromMap(_params).get("project"))).selectModel(firstModel, false); } } 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(); } 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(); } return false; } protected String getNamespace(final Map<String, Object> _params) { return null; } }