package jetbrains.mps.ide.platform.refactoring; /*Generated by MPS */ import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeReference; import org.jetbrains.mps.openapi.language.SContainmentLink; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.language.SConcept; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.smodel.LanguageAspect; import jetbrains.mps.smodel.Language; public interface NodeLocation { boolean canInsert(SRepository repository, SNode nodeToMove); void insertNode(SRepository repository, SNode nodeToMove); class NodeLocationChild implements NodeLocation { private SNodeReference parent; private SContainmentLink role; public NodeLocationChild(SNode parent, SContainmentLink role) { this(parent); this.role = role; } public NodeLocationChild(SNode parent) { this.parent = parent.getReference(); } public void setRole(SContainmentLink role) { this.role = role; } public SNodeReference getNode() { return parent; } public SContainmentLink getRole() { return role; } public boolean canInsert(SRepository repository, SNode nodeToMove) { SNode node = parent.resolve(repository); return role != null && node != null && node.getConcept().getContainmentLinks().contains(role) && SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(SNodeOperations.getConcept(nodeToMove)), SNodeOperations.asSConcept(role.getTargetConcept())); } public void insertNode(SRepository repository, SNode nodeToMove) { SNode oldParent = nodeToMove.getParent(); if (oldParent != null) { oldParent.removeChild(nodeToMove); } parent.resolve(repository).addChild(role, nodeToMove); } } class NodeLocationRoot implements NodeLocation { private SModelReference model; public NodeLocationRoot(SModel model) { this.model = model.getReference(); } public boolean canInsert(SRepository repository, SNode nodeToMove) { return model.resolve(repository) != null && ((SConcept) SNodeOperations.getConcept(nodeToMove)).isRootable(); } public void insertNode(SRepository repository, SNode nodeToMove) { SModel oldModel = nodeToMove.getModel(); if (oldModel != null) { oldModel.removeRootNode(nodeToMove); } model.resolve(repository).addRootNode(nodeToMove); } } class NodeLocationRootWithAspectModelCreation implements NodeLocation { private SModuleReference myLanguage; private LanguageAspect myAspect; public NodeLocationRootWithAspectModelCreation(Language languageModule, LanguageAspect aspect) { myLanguage = languageModule.getModuleReference(); myAspect = aspect; } public boolean canInsert(SRepository repository, SNode nodeToMove) { return myLanguage.resolve(repository) instanceof Language && ((SConcept) SNodeOperations.getConcept(nodeToMove)).isRootable(); } public void insertNode(SRepository repository, SNode nodeToMove) { SModel model = myAspect.getOrCreate(((Language) myLanguage.resolve(repository))); SModel oldModel = nodeToMove.getModel(); if (oldModel != null) { oldModel.removeRootNode(nodeToMove); } model.addRootNode(nodeToMove); } } }