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;
}
}