// 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.extensions.io.GraphSaveObject; import graphtea.graph.atributeset.GraphAttrSet; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.SubGraph; import graphtea.graph.graph.Vertex; import graphtea.platform.core.AbstractAction; import graphtea.platform.core.BlackBoard; import graphtea.plugins.main.select.ClearSelection; import graphtea.plugins.main.select.Select; import graphtea.ui.UIUtils; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; /** * @author Ruzbeh Ebrahimi */ public class Cut extends AbstractAction { public static final String event = UIUtils.getUIEventKey("Cut"); public Cut(BlackBoard bb) { super(bb); this.listen4Event(event); } public void performAction(String eventName, Object value) { SubGraph sd = Select.getSelection(blackboard); GraphModel gg = blackboard.getData(GraphAttrSet.name); cut(sd, gg, blackboard); Paste.status = "Cut"; } public static void cut(SubGraph sd, GraphModel gg, BlackBoard bb) { GraphModel g = new GraphModel(gg.isDirected()); moveToGraph(g, sd.edges, sd.vertices, gg); Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); String data = GraphSaveObject.graph2String(g); StringSelection string = new StringSelection(data); cb.setContents(string, string); ClearSelection.clearSelected(bb); } public static void moveToGraph(GraphModel g, Collection<Edge> edges, Collection<Vertex> vertices, GraphModel previousGraph) { HashSet<Edge> rightEdges = new HashSet<>(); HashSet<Edge> wrongEdges = new HashSet<>(); Iterator<Edge> iter = previousGraph.edgeIterator(); removeInCompleteEdgesFromGraph(g, iter, vertices, wrongEdges); removeInCompleteEdgesFromSelection(previousGraph, edges, vertices, rightEdges); for (Vertex v : vertices) previousGraph.removeVertex(v); g.insertVertices(vertices); for (Edge e : rightEdges) g.insertEdge(e); // previousGraph.view.repaint(); } private static void removeInCompleteEdgesFromSelection(GraphModel g, Collection<Edge> edges, Collection<Vertex> vertices, HashSet<Edge> rightEdges) { for (Edge e : edges) { if (vertices.contains(e.source) && vertices.contains(e.target)) { rightEdges.add(e); } else { g.removeEdge(e); } } } private static void removeInCompleteEdgesFromGraph(GraphModel g, Iterator<Edge> iter, Collection<Vertex> vertices, HashSet<Edge> wrongEdges) { for (; iter.hasNext();) { Edge em = iter.next(); if ((vertices.contains(em.source) && !vertices.contains(em.target)) || (vertices.contains(em.target) && !vertices.contains(em.source))) { // wrongEdges.add(em); //the power full edge iterator g.removeEdge(em); } } } }