package jetbrains.mps.ide.actions;
/*Generated by MPS */
import com.intellij.openapi.ui.DialogWrapper;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.project.Project;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.ide.ui.tree.MPSTree;
import jetbrains.mps.ide.ui.tree.MPSTreeNode;
import jetbrains.mps.smodel.ModelReadRunnable;
import jetbrains.mps.project.MPSProject;
import javax.swing.JScrollPane;
import com.intellij.ui.ScrollPaneFactory;
import java.awt.Dimension;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.TreePath;
import jetbrains.mps.ide.ui.tree.smodel.NodeTargetProvider;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.openapi.navigation.EditorNavigator;
import org.jetbrains.annotations.Nullable;
import javax.swing.JComponent;
import jetbrains.mps.ide.ui.tree.TextTreeNode;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.icons.MPSIcons;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.ide.icons.IconManager;
import jetbrains.mps.util.SNodeOperations;
import jetbrains.mps.smodel.SModelStereotype;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.ide.ui.tree.smodel.SNodeTreeNode;
import org.jetbrains.mps.util.Condition;
import com.intellij.ui.treeStructure.Tree;
import javax.swing.JOptionPane;
import javax.swing.Icon;
public class MappingDialog extends DialogWrapper {
private JPanel myMainComponent = new JPanel(new BorderLayout());
private Language myLanguage;
private Project myProject;
private SNode myResult;
private MPSTree myTree = new MPSTree() {
@Override
protected MPSTreeNode rebuild() {
return MappingDialog.this.rebuildTree();
}
@Override
protected void doInit(MPSTreeNode node, Runnable runnable) {
super.doInit(node, new ModelReadRunnable(myProject.getRepository().getModelAccess(), runnable));
}
};
public MappingDialog(MPSProject project, Language language) {
super(project.getProject());
setTitle("Choose Mapping Configuration");
myProject = project;
myLanguage = language;
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTree);
myMainComponent.add(scrollPane, BorderLayout.CENTER);
myMainComponent.setPreferredSize(new Dimension(500, 400));
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
myTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
if (e.getNewLeadSelectionPath() == null) {
return;
}
TreePath path = myTree.getSelectionModel().getSelectionPath();
if (path == null) {
return;
}
Object node = path.getLastPathComponent();
if (!(node instanceof NodeTargetProvider)) {
return;
}
SNodeReference treeNode = ((NodeTargetProvider) node).getNavigationTarget();
if (treeNode != null) {
new EditorNavigator(myProject).shallFocus(true).shallSelect(true).open(treeNode);
}
}
});
myTree.rebuildNow();
myTree.expandAll();
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return myMainComponent;
}
private MPSTreeNode rebuildTree() {
if (myLanguage == null) {
return null;
}
TextTreeNode root = new TextTreeNode("Generators");
for (final Generator generator : myLanguage.getGenerators()) {
MPSTreeNode generatorTreeNode = newTreeNode(MPSIcons.Nodes.Generator, generator.getModuleName(), "generator/" + generator.getModuleName());
root.add(generatorTreeNode);
for (SModel md : generator.getOwnTemplateModels()) {
MPSTreeNode modelTreeNode = newTreeNode(IconManager.getIconFor(md), md.toString(), SNodeOperations.getModelLongName(md) + '@' + SModelStereotype.getStereotype(md));
generatorTreeNode.add(modelTreeNode);
SModel model = md;
for (SNode node : SModelOperations.roots(model, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"))) {
SNodeTreeNode nodeTreeNode = new SNodeTreeNode(node, null, Condition.FALSE_CONDITION);
modelTreeNode.add(nodeTreeNode);
}
}
}
return root;
}
public SNode getResult() {
return myResult;
}
@Override
protected void doOKAction() {
Object[] selectedNode = myTree.getSelectedNodes(SNodeTreeNode.class, new Tree.NodeFilter() {
@Override
public boolean accept(Object p0) {
return true;
}
});
if (selectedNode.length != 1) {
JOptionPane.showMessageDialog(this.getContentPane(), "Mapping Configuration node is not selected!");
} else {
myResult = (SNode) ((SNodeTreeNode) selectedNode[0]).getSNode();
myTree.dispose();
super.doOKAction();
}
}
@Override
public void doCancelAction() {
myTree.dispose();
super.doCancelAction();
}
private static MPSTreeNode newTreeNode(Icon icon, String nodeIdentifier, String text) {
MPSTreeNode n = new MPSTreeNode();
n.setNodeIdentifier(nodeIdentifier);
n.setText(text);
n.setIcon(icon);
return n;
}
}