package jetbrains.mps.ide.datatransfer; /*Generated by MPS */ import java.awt.datatransfer.Transferable; import org.jetbrains.annotations.NotNull; import java.util.List; import org.jetbrains.mps.openapi.model.SNode; import java.util.ArrayList; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNodeReference; import org.jetbrains.mps.openapi.model.SModelReference; import java.util.Set; import java.util.HashSet; import org.jetbrains.mps.openapi.language.SLanguage; import java.awt.datatransfer.DataFlavor; import java.util.Map; import java.util.Collections; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.io.StringReader; import jetbrains.mps.datatransfer.PasteNodeData; public class SNodeTransferable implements Transferable { @NotNull private List<SNode> mySNodes = new ArrayList<SNode>(); @Nullable private SNodeReference mySNodeReference; @Nullable private SModelReference mySourceModel; @NotNull private Set<SModelReference> myNecessaryModels = new HashSet<SModelReference>(); @NotNull private Set<SLanguage> myNecessaryLanguages = new HashSet<SLanguage>(); @Nullable private String myText; @NotNull private List<DataFlavor> mySupportedDataFlavors = new ArrayList<DataFlavor>(4); public SNodeTransferable(List<SNode> nodes, String text) { saveNodes(nodes, null); if (nodes.size() == 1) { saveNodeReference(nodes.get(0)); } saveText(text); } /** * Deprecated since MPS 3.1 looks like not used anymore */ @Deprecated public SNodeTransferable(List<SNode> nodes) { saveNodes(nodes, null); if (nodes.size() == 1) { saveNodeReference(nodes.get(0)); } saveText(""); } public SNodeTransferable(@NotNull List<SNode> nodes, String text, Map<SNode, Set<SNode>> nodesAndAttributes) { saveNodes(nodes, nodesAndAttributes); if (nodes.size() == 1) { saveNodeReference(nodes.get(0)); } saveText(text); } /** * Deprecated since MPS 3.1 looks like not used anymore */ @Deprecated public SNodeTransferable(SNode node) { saveNodes(Collections.singletonList(node), null); saveNodeReference(node); saveText(""); } public SNodeTransferable(String text, SNode node) { saveText(text); saveNodes(Collections.singletonList(node), null); saveNodeReference(node); } @Override public DataFlavor[] getTransferDataFlavors() { return mySupportedDataFlavors.toArray(new DataFlavor[mySupportedDataFlavors.size()]); } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return mySupportedDataFlavors.contains(flavor); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { if (flavor.equals(SModelDataFlavor.sNode)) { return this; } else if (flavor.equals(SModelDataFlavor.sNodeReference)) { return mySNodeReference; } else if (flavor.equals(DataFlavor.stringFlavor)) { return getAsString(); } else if (flavor.equals(DataFlavor.plainTextFlavor)) { return new StringReader(getAsString()); } } throw new UnsupportedFlavorException(flavor); } private String getAsString() { return myText; } private void saveNodes(@NotNull List<SNode> nodes, @Nullable Map<SNode, Set<SNode>> nodesAndAttributes) { for (SNode node : nodes) { assert node.getParent() == nodes.get(0).getParent(); } assert mySNodes.isEmpty(); PasteNodeData pasteNodeData = CopyPasteUtil.createNodeDataIn(nodes, nodesAndAttributes); mySNodes.addAll(pasteNodeData.getNodes()); mySourceModel = pasteNodeData.getSourceModel(); myNecessaryModels = pasteNodeData.getNecessaryModels(); myNecessaryLanguages = pasteNodeData.getNecessaryLanguages(); mySupportedDataFlavors.add(SModelDataFlavor.sNode); } private void saveNodeReference(@NotNull SNode node) { mySNodeReference = node.getReference(); mySupportedDataFlavors.add(SModelDataFlavor.sNodeReference); } private void saveText(String text) { myText = text; mySupportedDataFlavors.add(DataFlavor.stringFlavor); mySupportedDataFlavors.add(DataFlavor.plainTextFlavor); } public PasteNodeData createNodeData() { return CopyPasteUtil.createNodeDataOut(mySNodes, mySourceModel, new HashSet<SLanguage>(myNecessaryLanguages), new HashSet<SModelReference>(myNecessaryModels)); } public boolean containsNodes() { return (!(mySNodes.isEmpty())); } }