package jetbrains.mps.idea.core.refactoring; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveHandlerDelegate; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.ide.platform.actions.core.MoveNodesAction; import jetbrains.mps.ide.platform.actions.core.MoveNodesUtil; import jetbrains.mps.ide.platform.actions.core.MoveNodesActionHelper; import jetbrains.mps.idea.core.psi.impl.MPSPsiRealNode; import jetbrains.mps.project.MPSProject; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; import java.util.ArrayList; import java.util.List; /** * danilla 6/13/13 */ // This is glue between Idea move refactoring infrastructure a MPS move actions/refactorings // It is always applicable in MPS editor (so that no other non-mps delegate takes control), // and it further dispatches control to registered MPS contributors. public class MPSMoveHandlerDelegate extends MoveHandlerDelegate { @Override public boolean canMove(DataContext dataContext) { return dataContext.getData(MPSCommonDataKeys.NODE.getName()) != null; } @Override public boolean canMove(PsiElement[] elements, @Nullable PsiElement targetContainer) { if (elements.length == 0) return false; for (PsiElement element : elements) { if (!(element instanceof MPSPsiRealNode)) { return false; } } return true; } @Override public void doMove(final Project project, final PsiElement[] elements, @Nullable PsiElement targetContainer, @Nullable MoveCallback callback) { final MPSProject mpsProject = project.getComponent(MPSProject.class); mpsProject.getRepository().getModelAccess().runReadInEDT(() -> { List<SNode> nodes = new ArrayList<SNode>(elements.length); for (PsiElement element : elements) { nodes.add(((MPSPsiRealNode) element).getSNodeReference().resolve(mpsProject.getRepository())); } if (MoveNodesUtil.areSiblings(nodes, mpsProject.getRepository())) { MoveNodesAction moveNodesAction = MoveNodesActionHelper.getRefactoring(mpsProject, nodes); moveNodesAction.execute(mpsProject, nodes); } }); } }