package jetbrains.mps.ide.java.util; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.ide.java.newparser.FeatureKind; import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SModel; import java.awt.datatransfer.Transferable; import com.intellij.ide.CopyPasteManagerEx; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import jetbrains.mps.ide.java.newparser.JavaParser; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import javax.swing.JOptionPane; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.ide.java.newparser.JavaToMpsConverter; import jetbrains.mps.ide.messages.MessagesViewTool; import jetbrains.mps.progress.EmptyProgressMonitor; import jetbrains.mps.ide.java.newparser.JavaParseException; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.openapi.language.SContainmentLink; import org.jetbrains.mps.openapi.language.SConcept; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.ide.datatransfer.SModelDataFlavor; public class JavaPaster { private static Logger LOG = LogManager.getLogger(JavaPaster.class); public JavaPaster() { } public void pasteJava(SNode anchor, FeatureKind featureKind, Project project) { String javaCode = getStringFromClipboard(); if (javaCode == null) { return; } pasteJavaAsNode(anchor, anchor.getModel(), javaCode, featureKind, project); } public void pasteJavaAsClass(SModel model, Project project) { String javaCode = getStringFromClipboard(); if (javaCode == null) { return; } pasteJavaAsNode(null, model, javaCode, FeatureKind.CLASS, project); } public String getStringFromClipboard() { Transferable contents = null; for (Transferable trf : CopyPasteManagerEx.getInstanceEx().getAllContents()) { if (trf != null && trf.isDataFlavorSupported(DataFlavor.stringFlavor)) { contents = trf; } break; } if (contents == null) { return null; } if (contents.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { Object data = contents.getTransferData(DataFlavor.stringFlavor); if (data instanceof String) { return (String) data; } } catch (UnsupportedFlavorException ex) { return null; } catch (IOException ex) { LOG.error(null, ex); } } return null; } public void pasteJavaAsNode(SNode anchor, final SModel model, String javaCode, FeatureKind featureKind, Project project) { JavaParser parser = new JavaParser(); try { SNode context = null; if (FeatureKind.CLASS_CONTENT.equals(featureKind)) { context = SNodeOperations.getNodeAncestor(anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier"), true, false); } List<SNode> nodes = parser.parse(javaCode, featureKind, context, true).getNodes(); if (ListSequence.fromList(nodes).isEmpty()) { JOptionPane.showMessageDialog(null, "nothing to paste as Java", "ERROR", JOptionPane.ERROR_MESSAGE); return; } switch (featureKind) { case CLASS: ListSequence.fromList(nodes).visitAll(new IVisitor<SNode>() { public void visit(SNode node) { SModelOperations.addRootNode(model, node); } }); break; case CLASS_CONTENT: for (SNode node : ListSequence.fromList(nodes)) { if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b21dL, "jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b21dL, "jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf93c84351fL, "jetbrains.mps.baseLanguage.structure.StaticFieldDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf93c84351fL, "jetbrains.mps.baseLanguage.structure.StaticFieldDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca68L, "jetbrains.mps.baseLanguage.structure.FieldDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca68L, "jetbrains.mps.baseLanguage.structure.FieldDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b204L, "jetbrains.mps.baseLanguage.structure.ConstructorDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b204L, "jetbrains.mps.baseLanguage.structure.ConstructorDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x114a6a17a27L, "jetbrains.mps.baseLanguage.structure.AnnotationMethodDeclaration"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x114a6a17a27L, "jetbrains.mps.baseLanguage.structure.AnnotationMethodDeclaration")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x114a69dc80cL, "jetbrains.mps.baseLanguage.structure.Annotation")); } else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier"))) { pasteMember(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier")), anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier")); } } break; case STATEMENTS: for (SNode node : ListSequence.fromList(nodes)) { pasteAtAnchorInRole(node, anchor, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, "jetbrains.mps.baseLanguage.structure.StatementList"), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement")); } break; default: } // trying to resolve names when nodes are already in a model JavaToMpsConverter mfParser = new JavaToMpsConverter(model, project.getRepository(), project.getComponent(MessagesViewTool.class).newHandler()); mfParser.tryResolveRefs(nodes, featureKind, new EmptyProgressMonitor()); } catch (JavaParseException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE); } } private static boolean pasteAtAnchorInRole(SNode node, SNode anchor, SAbstractConcept parentConcept, SContainmentLink role) { SNode parent = SNodeOperations.getNodeAncestor(anchor, SNodeOperations.asSConcept(parentConcept), true, false); if ((parent == null)) { return false; } anchor = SNodeOperations.getNodeAncestor(anchor, SNodeOperations.asSConcept(role.getTargetConcept()), true, false); if ((anchor == null) || SNodeOperations.getParent(anchor) != parent) { parent.addChild(role, node); } else { parent.insertChildBefore(role, node, anchor); } return true; } private static boolean pasteMember(SNode member, SNode anchor, SConcept parentConcept) { SNode parent = SNodeOperations.getNodeAncestor(anchor, SNodeOperations.asSConcept(parentConcept), true, false); if ((parent == null)) { return false; } while ((anchor != null) && SNodeOperations.getParent(anchor) != parent) { anchor = SNodeOperations.getParent(anchor); } int index = -1; if (SNodeOperations.isInstanceOf(anchor, MetaAdapterFactory.getInterfaceConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112574373bdL, "jetbrains.mps.baseLanguage.structure.ClassifierMember"))) { index = ListSequence.fromList(SNodeOperations.getChildren(parent, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).indexOf(SNodeOperations.cast(anchor, MetaAdapterFactory.getInterfaceConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112574373bdL, "jetbrains.mps.baseLanguage.structure.ClassifierMember"))); } if (index == -1) { ListSequence.fromList(SLinkOperations.getChildren(parent, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).addElement(member); } else { ListSequence.fromList(SNodeOperations.getChildren(parent, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).insertElement(index, member); } return true; } public static boolean areDataAvailableInClipboard() { Transferable trf = CopyPasteManagerEx.getInstanceEx().getContents(); if (trf == null || trf.isDataFlavorSupported(SModelDataFlavor.sNode)) { return false; } if (trf.isDataFlavorSupported(DataFlavor.stringFlavor)) { return true; } return false; } }