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