// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.plugins.main.ccp; import graphtea.graph.atributeset.GraphAttrSet; import graphtea.graph.event.GraphEvent; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.SubGraph; import graphtea.graph.graph.Vertex; import graphtea.graph.ui.GTabbedGraphPane; import graphtea.graph.ui.GraphRectRegionSelect; import graphtea.platform.core.AbstractAction; import graphtea.platform.core.BlackBoard; import graphtea.platform.core.exception.ExceptionHandler; import graphtea.plugins.main.saveload.xmlparser.GraphmlHandlerImpl; import graphtea.plugins.main.saveload.xmlparser.GraphmlParser; import graphtea.plugins.main.select.Select; import graphtea.ui.UIUtils; import org.xml.sax.InputSource; import org.xml.sax.SAXParseException; import java.awt.*; import java.awt.datatransfer.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashSet; import java.util.Iterator; /** * @author rouzbeh */ public class Paste extends AbstractAction { public static final String event = UIUtils.getUIEventKey("Paste"); public static String status = ""; GraphRectRegionSelect graphRectRegionSelector = new GraphRectRegionSelect(blackboard) { public void onMouseMoved(GraphEvent data) { // _onMouseMoved(data); } public void onDrop(GraphEvent data) { _onDrop(data); } }; public Paste(BlackBoard bb) { super(bb); this.listen4Event(event); } public void performAction(String eventName, Object value) { GTabbedGraphPane.showNotificationMessage("Select The Paste Region", blackboard, true); graphRectRegionSelector.startSelectingRegion(); } void _onDrop(GraphEvent data) { GTabbedGraphPane.showNotificationMessage("", blackboard, true); GraphModel gg = new GraphModel(); GraphModel g = blackboard.getData(GraphAttrSet.name); Toolkit tk = Toolkit.getDefaultToolkit(); Clipboard cb = tk.getSystemClipboard(); Transferable content = cb.getContents(this); if (content == null) { // nothing to paste tk.beep(); return; } // we only accept string or plain text data if (content.isDataFlavorSupported(DataFlavor.stringFlavor) || content.isDataFlavorSupported(DataFlavor.getTextPlainUnicodeFlavor())) { String strData = null; InputStream stream = null; try { // representation class is a String, so use that strData = (String) content.getTransferData(DataFlavor.stringFlavor); } catch (Exception e1) { try { // representation class is an input stream, so // leave the strData variable as null to be checked // by the code below stream = (InputStream) content.getTransferData(DataFlavor.getTextPlainUnicodeFlavor()); } catch (Exception e2) { // it was something we could handle but it didn't // want to be retrieved, too bad tk.beep(); // return; } } if (strData != null) { // data was a string, create a byte array and a // byte array input stream and read it byte[] bytes = strData.getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); try { GraphmlHandlerImpl gi = new GraphmlHandlerImpl(gg); GraphmlParser.parse(new InputSource(bais), gi); // PasteHandlerImpl ghi = new PasteHandlerImpl(gg); // PasteParser.parse(new InputSource(bais), ghi); bais.close(); } catch (Exception e) { if (e.getClass().equals(SAXParseException.class)) { tk.beep(); ExceptionHandler.catchException(e); } else { ExceptionHandler.catchException(e); } } } else if (stream != null) { // data was an input stream, read that directly try { GraphmlHandlerImpl phi = new GraphmlHandlerImpl(gg); GraphmlParser.parse(new InputSource(stream), phi); stream.close(); } catch (Exception e) { } } } else { tk.beep(); } // Point p; // //adds the pasted graph from temp graph to main graph // if(blackboard.get(GraphClickData.name) != null){ // GraphClickData gcd = blackboard.get(GraphClickData.name); // p = gcd.me.getPoint(); // // } // else{ // p=new Point(200,200); // } HashSet<Vertex> toBeSelectedVertices = new HashSet<>(); HashSet<Edge> toBeSelectedEdges = new HashSet<>(); for (Vertex vm : gg) { toBeSelectedVertices.add(vm); } for (Iterator<Edge> em = gg.edgeIterator(); em.hasNext();) { toBeSelectedEdges.add(em.next()); } g.addSubGraph(gg, graphRectRegionSelector.getCurrentRect().getBounds()); // ClearSelection.clearSelected(gg.blackboard); // ClearSelection.clearSelected(g.blackboard); //selects the inserted edges & vertices SubGraph sd = new SubGraph(); for (Vertex v : toBeSelectedVertices) { sd.vertices.add(v); } for (Edge e : toBeSelectedEdges) { sd.edges.add(e); } Select.setSelection(blackboard, sd); // if the prev. operation was cut, the clipboard should be cleand if (status.equalsIgnoreCase("cut")) { String _data = ""; StringSelection string = new StringSelection(_data); cb.setContents(string, string); try { cb.getContents(this).getTransferData(DataFlavor.stringFlavor).toString(); } catch (UnsupportedFlavorException | IOException e) { ExceptionHandler.catchException(e); } } } }