package jetbrains.mps.ide.devkit.actions; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import javax.swing.JOptionPane; import jetbrains.mps.smodel.Language; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations; import jetbrains.mps.smodel.LanguageAspect; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.action.SNodeFactoryOperations; public class GoToEditorDeclarationHelper { public GoToEditorDeclarationHelper() { } public static SNode getOrCreateEditorForConcept(Project project, final SModel languageEditor, final SNode concept, final SNode node) { ModelAccessHelper mah = new ModelAccessHelper(project.getModelAccess()); SNode editorDeclaration = mah.runReadAction(new Computable<SNode>() { @Override public SNode compute() { return GoToEditorDeclarationHelper.findEditorDeclaration(languageEditor, concept); } }); if (editorDeclaration != null) { return editorDeclaration; } String message = mah.runReadAction(new Computable<String>() { @Override public String compute() { return "Concept \"" + node.getConcept().getQualifiedName() + "\" has no editor.\n" + "Create new editor?"; } }); int option = JOptionPane.showConfirmDialog(null, message, "Editor not found", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (option != JOptionPane.YES_OPTION) { return null; } return mah.executeCommand(new Computable<SNode>() { @Override public SNode compute() { return GoToEditorDeclarationHelper.createEditorDeclaration(concept, languageEditor); } }); } public static SModel getOrCreateEditorAspect(Project project, final Language language, final SNode concept) { final SModel languageEditor = SModuleOperations.getAspect(language, "editor"); if (languageEditor != null) { return languageEditor; } String message = "Language \"" + language.getModuleName() + "\" has no editor model.\n" + "Create new editor model?"; int option = JOptionPane.showConfirmDialog(null, message, "Editor not found", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (option != JOptionPane.YES_OPTION) { return null; } project.getModelAccess().executeCommand(new Runnable() { @Override public void run() { LanguageAspect.EDITOR.createNew(language); GoToEditorDeclarationHelper.createEditorDeclaration(concept, SModuleOperations.getAspect(language, "editor")); } }); return SModuleOperations.getAspect(language, "editor"); } public static SNode findEditorDeclaration(SModel editorModel, final SNode conceptDeclaration) { return ListSequence.fromList(SModelOperations.roots(editorModel, MetaAdapterFactory.getConcept(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0xf9845363abL, "jetbrains.mps.lang.editor.structure.ConceptEditorDeclaration"))).findFirst(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return SLinkOperations.getTarget(it, MetaAdapterFactory.getReferenceLink(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0x10f7df344a9L, 0x10f7df451aeL, "conceptDeclaration")) == conceptDeclaration; } }); } public static SNode createEditorDeclaration(SNode conceptDeclaration, SModel editorModelDescriptor) { SModel editorModel = editorModelDescriptor; SNode result = SNodeFactoryOperations.createNewNode(editorModel, SNodeFactoryOperations.asInstanceConcept(MetaAdapterFactory.getConcept(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0xf9845363abL, "jetbrains.mps.lang.editor.structure.ConceptEditorDeclaration")), null); SLinkOperations.setTarget(result, MetaAdapterFactory.getReferenceLink(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0x10f7df344a9L, 0x10f7df451aeL, "conceptDeclaration"), conceptDeclaration); SModelOperations.addRootNode(editorModel, result); return result; } }