package jetbrains.mps.ide.platform.actions.core; /*Generated by MPS */ import jetbrains.mps.project.MPSProject; import java.util.List; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.ide.platform.refactoring.NodeLocation; import jetbrains.mps.ide.platform.refactoring.MoveNodesDialog; import org.jetbrains.mps.openapi.language.SContainmentLink; import java.util.Collection; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; public class MoveNodesActionBase implements MoveNodesAction { public String getName() { return "Move Nodes"; } public boolean isApplicable(MPSProject project, List<SNode> nodesToMove) { return MoveNodesUtil.areSiblings(nodesToMove, project.getRepository()); } public void execute(final MPSProject project, final List<SNode> nodesToMove) { final Wrappers._T<SModel> currentModel = new Wrappers._T<SModel>(); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { currentModel.value = SNodeOperations.getModel(ListSequence.fromList(nodesToMove).first()); } }); final NodeLocation newLocation = MoveNodesDialog.getSelectedObject(project.getProject(), currentModel.value, new MoveNodesDialog.ModelFilter() { public String getErrorMessage(NodeLocation selectedObject) { return "Choose model or node that can contain moving nodes"; } public boolean tryToSetRole(final NodeLocation.NodeLocationChild selectedObject) { final Wrappers._T<SContainmentLink> role = new Wrappers._T<SContainmentLink>(); final Wrappers._T<Collection<SContainmentLink>> containmentLinks = new Wrappers._T<Collection<SContainmentLink>>(); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { containmentLinks.value = selectedObject.getNode().resolve(project.getRepository()).getConcept().getContainmentLinks(); role.value = ListSequence.fromList(nodesToMove).first().getContainmentLink(); } }); if (role.value != null && CollectionSequence.fromCollection(containmentLinks.value).contains(role.value)) { selectedObject.setRole(role.value); return true; } final Wrappers._T<Iterable<SContainmentLink>> applicableLinks = new Wrappers._T<Iterable<SContainmentLink>>(); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { applicableLinks.value = CollectionSequence.fromCollection(containmentLinks.value).where(new IWhereFilter<SContainmentLink>() { public boolean accept(final SContainmentLink link) { return ListSequence.fromList(nodesToMove).all(new IWhereFilter<SNode>() { public boolean accept(SNode node) { return SNodeOperations.getConcept(node).isSubConceptOf(link.getTargetConcept()); } }); } }); } }); if (Sequence.fromIterable(applicableLinks.value).count() == 1) { selectedObject.setRole(Sequence.fromIterable(applicableLinks.value).first()); return true; } return false; } @Override public boolean check(final NodeLocation selectedObject, SModel model) { if (selectedObject instanceof NodeLocation.NodeLocationChild) { return tryToSetRole((NodeLocation.NodeLocationChild) selectedObject); } else if (selectedObject instanceof NodeLocation.NodeLocationRoot) { return new ModelAccessHelper(project.getRepository()).runReadAction(new Computable<Boolean>() { public Boolean compute() { return ListSequence.fromList(nodesToMove).all(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return selectedObject.canInsert(project.getRepository(), it); } }); } }); } else { return false; } } }); if (newLocation == null) { return; } MoveNodesUtil.NodeProcessor processor = new MoveNodesUtil.NodeCreatingProcessor(newLocation, project); MoveNodesUtil.moveTo(project, getName(), MapSequence.<MoveNodesUtil.NodeProcessor, List<SNode>>fromMapAndKeysArray(new HashMap<MoveNodesUtil.NodeProcessor, List<SNode>>(), processor).withValues(nodesToMove)); } }