package jetbrains.mps.ide.platform.refactoring; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.project.Project; import javax.swing.JOptionPane; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.ide.project.ProjectHelper; import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import java.awt.Dimension; import org.jetbrains.annotations.NonNls; import org.jetbrains.mps.openapi.model.SModel; public class MoveNodeDialog extends ModelOrNodeChooserDialog { private SNode myNodeToMove; private MoveNodeDialog.NodeFilter myNodeFilter; private SNode mySelectedObject; public MoveNodeDialog(@NotNull Project project, SNode node) { super(project); myNodeToMove = node; init(); setTitle(REFACTORING_NAME + " " + "node"); } @Override protected void doRefactoringAction() { final NodeLocation selectedObject = myChooser.getSelectedObject(); if (!(selectedObject instanceof NodeLocation.NodeLocationChild)) { JOptionPane.showMessageDialog(myChooser.getComponent(), "Choose node", "Node can't be moved", JOptionPane.INFORMATION_MESSAGE); return; } final Wrappers._boolean doRefactoring = new Wrappers._boolean(false); ProjectHelper.toMPSProject(getProject()).getModelAccess().runReadAction(new Runnable() { public void run() { SNode node = ((NodeLocation.NodeLocationChild) selectedObject).getNode().resolve(ProjectHelper.toMPSProject(getProject()).getRepository()); if (myNodeFilter == null || myNodeFilter.checkForObject(node, myNodeToMove, myNodeToMove.getModel(), myChooser.getComponent())) { mySelectedObject = node; doRefactoring.value = true; } } }); if (doRefactoring.value) { super.doRefactoringAction(); } } public void setFilter(MoveNodeDialog.NodeFilter filter) { myNodeFilter = filter; } @Nullable @Override protected JComponent createCenterPanel() { ProjectHelper.toMPSProject(getProject()).getModelAccess().runReadAction(new Runnable() { public void run() { myChooser = RefactoringAccessEx.getInstance().createTargetChooser(myProject, myNodeToMove); } }); JComponent centerPanel = myChooser.getComponent(); centerPanel.setPreferredSize(new Dimension(400, 900)); return centerPanel; } @Nullable @NonNls @Override protected String getDimensionServiceKey() { return getClass().getName(); } public static SNode getSelectedObject(@NotNull Project project, SNode node) { MoveNodeDialog dialog = new MoveNodeDialog(project, node); dialog.show(); return dialog.mySelectedObject; } public static SNode getSelectedObject(@NotNull Project project, SNode node, MoveNodeDialog.NodeFilter filter) { MoveNodeDialog dialog = new MoveNodeDialog(project, node); dialog.setFilter(filter); dialog.show(); return dialog.mySelectedObject; } public static abstract class NodeFilter extends ModelOrNodeChooserDialog.Filter { public NodeFilter() { } public NodeFilter(String errorMessage) { super(errorMessage); } public abstract boolean check(SNode selectedObject, SNode nodeToMove, SModel modelOfSelectedNode); private boolean checkForObject(SNode selectedObject, SNode nodeToMove, SModel modelOfSelectedNode, JComponent component) { if (!(check(selectedObject, nodeToMove, modelOfSelectedNode))) { showError("Nodes can't be moved", component); return false; } return true; } } }