Author: scooter
Date: 2012-08-13 19:01:54 -0700 (Mon, 13 Aug 2012)
New Revision: 30184

Added:
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardImpl.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdit.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteEdit.java
Modified:
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardManagerImpl.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdgeTaskFactory.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutNodeTaskFactory.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTaskFactory.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CyActivator.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTask.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTaskFactory.java
Log:
Added undo


Added: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardImpl.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardImpl.java
                         (rev 0)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardImpl.java
 2012-08-14 02:01:54 UTC (rev 30184)
@@ -0,0 +1,296 @@
+package org.cytoscape.editor.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.cytoscape.model.CyColumn;
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyIdentifiable;
+import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.model.CyRow;
+import org.cytoscape.model.CyTable;
+import org.cytoscape.model.subnetwork.CyRootNetwork;
+import org.cytoscape.model.subnetwork.CySubNetwork;
+import org.cytoscape.view.model.CyNetworkView;
+import org.cytoscape.view.model.View;
+import org.cytoscape.view.presentation.property.BasicVisualLexicon;
+
+
+public class ClipboardImpl {
+       private CyNetworkView sourceView;
+       private List<View<CyNode>> nodeViews;
+       private List<View<CyEdge>> edgeViews;
+       private List<CyNode> nodes;
+       private List<CyEdge> edges;
+
+       // Row maps
+       private Map<CyIdentifiable, CyRow> oldSharedRowMap;
+       private Map<CyIdentifiable, CyRow> oldLocalRowMap;
+       private Map<CyIdentifiable, CyRow> oldHiddenRowMap;
+
+       private double xCenter, yCenter;
+
+       public ClipboardImpl(CyNetworkView networkView, List<CyNode> nodes, 
List<CyEdge> edges) {
+               this.sourceView = networkView;
+               this.nodes = nodes;
+               this.edges = edges;
+
+               CyNetwork sourceNetwork = sourceView.getModel();
+               nodeViews = new ArrayList<View<CyNode>>();
+               edgeViews = new ArrayList<View<CyEdge>>();
+               oldSharedRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
+               oldLocalRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
+               oldHiddenRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
+
+               // We need the root network to get the shared attributes
+               CyRootNetwork sourceRootNetwork = 
((CySubNetwork)sourceNetwork).getRootNetwork();
+
+               xCenter = 0.0;
+               yCenter = 0.0;
+               for (CyNode node: nodes) {
+                       View<CyNode> nodeView = networkView.getNodeView(node);
+                       nodeViews.add(nodeView);
+                       xCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION);
+                       yCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION);
+                       addRows(node, sourceRootNetwork, sourceNetwork);
+               }
+               xCenter = xCenter / nodes.size();
+               yCenter = yCenter / nodes.size();
+
+               for (CyEdge edge: edges) {
+                       edgeViews.add(networkView.getEdgeView(edge));
+                       addRows(edge, sourceRootNetwork, sourceNetwork);
+               }
+       }
+
+       public List<View<CyNode>> getNodeViews() { return nodeViews; }
+       public List<View<CyEdge>> getEdgeViews() { return edgeViews; }
+       public List<CyNode> getNodes() { return nodes; }
+       public List<CyEdge> getEdges() { return edges; }
+
+       public double getCenterX() { return xCenter; }
+       public double getCenterY() { return yCenter; }
+
+       public boolean clipboardHasData() {
+               if (nodeViews != null && nodeViews.size() > 0)
+                       return true;
+               if (edgeViews != null && edgeViews.size() > 0)
+                       return true;
+               return false;
+       }
+
+       public List<CyIdentifiable> paste(CyNetworkView targetView, double x, 
double y) {
+               List<CyIdentifiable> pastedObjects = new 
ArrayList<CyIdentifiable>();
+               final Map<CyRow, CyRow> rowMap = new HashMap<CyRow, CyRow>();
+
+               // We need to do this in two passes.  In pass 1, we'll add all 
of the nodes
+               // and store their (possibly new) SUID.  In pass 2, we'll 
reposition the
+               // nodes and add the edges.
+
+               // Pass 1: add the nodes 
+               final Map<CyNode, CyNode> newNodeMap = new HashMap<CyNode, 
CyNode>();
+               for (View<CyNode> nodeView: nodeViews) {
+                       CyNode node = nodeView.getModel();
+                       CyNode newNode = pasteNode(sourceView, targetView, 
node, rowMap);
+                       newNodeMap.put(node, newNode);
+                       pastedObjects.add(newNode);
+               }
+
+               // Pass 2: add the edges in
+               for (View<CyEdge> edgeView: edgeViews) {
+                       CyEdge edge = edgeView.getModel();
+                       CyEdge newEdge = pasteEdge(sourceView, targetView, 
edge, rowMap, newNodeMap);
+
+                       pastedObjects.add(newEdge);
+               }
+
+               copyRows(rowMap);
+               targetView.updateView();
+
+               // Finally, Pass 3: reposition the nodes and update our view
+               double xOffset = xCenter - x;
+               double yOffset = yCenter - y;
+               for (View<CyNode> nodeView: nodeViews) {
+                       double nodeX = 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION) - xOffset;
+                       double nodeY = 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION) - yOffset;
+
+                       if (!newNodeMap.containsKey(nodeView.getModel())) 
continue; // Shouldn't happen
+
+                       // Now, get the node view
+                       View<CyNode> newNodeView = 
targetView.getNodeView(newNodeMap.get(nodeView.getModel()));
+                       if (newNodeView != null) {
+                               
newNodeView.setVisualProperty(BasicVisualLexicon.NODE_X_LOCATION, nodeX);
+                               
newNodeView.setVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION, nodeY);
+                       }
+               }
+
+               return pastedObjects;
+       }
+
+       private CyEdge pasteEdge(CyNetworkView sourceView, CyNetworkView 
targetView, 
+                                CyEdge edge, Map<CyRow, CyRow> rowMap, 
Map<CyNode, CyNode> newNodeMap) {
+               CyNetwork sourceNetwork = sourceView.getModel();
+               CyRootNetwork sourceRoot = 
((CySubNetwork)sourceNetwork).getRootNetwork();
+
+               CySubNetwork targetNetwork = 
(CySubNetwork)targetView.getModel();
+               CyRootNetwork targetRoot = targetNetwork.getRootNetwork();
+
+               CyEdge newEdge = null;
+               CyNode sourceNode = edge.getSource();
+               CyNode targetNode = edge.getTarget();
+
+               // Same three cases as pasteNode, but we need to be careful to 
add missing nodes.  If
+               // we paste and edge, but there's no corresponding node, we 
need to copy the
+               // node in.
+               //
+               // Three cases:
+               // 1) We're copying edges to a new network in a different 
network tree
+               // 2) We're copying edges to a new network in the same network 
tree
+               // 3) We're copying edges to a new location in the same network
+               if (sourceRoot != targetRoot) {
+                       // Case 1: different root
+
+                       if (!newNodeMap.containsKey(sourceNode)) {
+                               addRows(sourceNode, sourceRoot, sourceNetwork);
+                               newNodeMap.put(sourceNode, 
pasteNode(sourceView, targetView, sourceNode, rowMap));
+                       }
+
+                       if (!newNodeMap.containsKey(targetNode)) {
+                               addRows(targetNode, sourceRoot, sourceNetwork);
+                               newNodeMap.put(targetNode, 
pasteNode(sourceView, targetView, targetNode, rowMap));
+                       }
+
+                       // Create the edge
+                       newEdge = 
targetNetwork.addEdge(newNodeMap.get(sourceNode), 
+                                                       
newNodeMap.get(targetNode), edge.isDirected());
+
+                       // Copy the attributes over
+                       rowMap.put(oldSharedRowMap.get(edge),
+                                  targetNetwork.getRow(newEdge, 
CyNetwork.DEFAULT_ATTRS));
+                       rowMap.put(oldLocalRowMap.get(edge),
+                                  targetNetwork.getRow(newEdge, 
CyNetwork.LOCAL_ATTRS));
+                       rowMap.put(oldHiddenRowMap.get(edge),
+                                  targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
+               } else {
+                       // Case 2: different network, same root and
+                       // Case 3: same network
+
+                       // First, see if we already have the nodes
+                       if (!newNodeMap.containsKey(sourceNode)) {
+                               addRows(sourceNode, sourceRoot, sourceNetwork);
+                               if (targetNetwork.containsNode(sourceNode)) {
+                                       newNodeMap.put(sourceNode, sourceNode);
+                               } else {
+                                       newNodeMap.put(sourceNode, 
pasteNode(sourceView, targetView, sourceNode, rowMap));
+                               }
+                       }
+
+                       if (!newNodeMap.containsKey(targetNode)) {
+                               addRows(targetNode, sourceRoot, sourceNetwork);
+                               if (targetNetwork.containsNode(targetNode)) {
+                                       newNodeMap.put(targetNode, targetNode);
+                               } else {
+                                       newNodeMap.put(targetNode, 
pasteNode(sourceView, targetView, targetNode, rowMap));
+                               }
+                       }
+
+                       // We want to create another copy of the edge
+                       // Create the edge
+                       newEdge = 
targetNetwork.addEdge(newNodeMap.get(sourceNode), 
+                                                       
newNodeMap.get(targetNode), edge.isDirected());
+
+                       // Copy the attributes over
+                       rowMap.put(oldLocalRowMap.get(edge),
+                                  targetNetwork.getRow(newEdge, 
CyNetwork.LOCAL_ATTRS));
+                       rowMap.put(oldHiddenRowMap.get(edge),
+                                  targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
+               } 
+               return newEdge;
+       }
+
+       // TODO: Need to figure out how to copy LOCAL_ATTRS, SHARED_ATTRS, and 
HIDDEN_ATTRS
+       // The latter is easy.  The second two are both part of the 
DEFAULT_ATTRS, but it's
+       // not clear how to create a local attribute specifically....
+       private CyNode pasteNode(CyNetworkView sourceView, CyNetworkView 
targetView, 
+                                CyNode node, Map<CyRow, CyRow> rowMap) {
+
+               CyNetwork sourceNetwork = sourceView.getModel();
+               CyRootNetwork sourceRoot = 
((CySubNetwork)sourceNetwork).getRootNetwork();
+
+               CySubNetwork targetNetwork = 
(CySubNetwork)targetView.getModel();
+               CyRootNetwork targetRoot = targetNetwork.getRootNetwork();
+
+               CyNode newNode = null;
+
+               // Three cases:
+               // 1) We're copying nodes to a new network in a different 
network tree
+               // 2) We're copying nodes to a new network in the same network 
tree
+               // 3) We're copying nodes to a new location in the same network
+               if (sourceRoot != targetRoot) {
+                       // Case 1: Different roots
+                       newNode = targetNetwork.addNode();
+                       // Copy the attributes over
+                       rowMap.put(oldSharedRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.DEFAULT_ATTRS));
+                       rowMap.put(oldLocalRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
+                       rowMap.put(oldHiddenRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
+               } else if (!targetNetwork.containsNode(node)) {
+                       // Case 2: different subnetwork, same root
+                       newNode = targetNetwork.addNode();
+                       rowMap.put(oldLocalRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
+                       rowMap.put(oldHiddenRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
+               } else {
+                       // Case 3: Copying the node to the same network
+                       newNode = targetNetwork.addNode();
+                       // Copy in the hidden attributes
+                       rowMap.put(oldHiddenRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
+                       // Copy in the local attributes
+                       rowMap.put(oldLocalRowMap.get(node),
+                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
+                       targetNetwork.addNode(node);
+               }
+               return newNode;
+       }
+
+       private void copyRows(Map<CyRow,CyRow> rowMap) {
+               if (rowMap == null || rowMap.size() == 0) return;
+
+               for (CyRow sourceRow: rowMap.keySet()) {
+                       CyRow targetRow = rowMap.get(sourceRow);
+                       CyTable destTable = targetRow.getTable();
+                       CyTable sourceTable = sourceRow.getTable();
+
+                       Map<String, Object> oldDataMap = 
sourceRow.getAllValues();
+                       for (String colName: oldDataMap.keySet()) {
+                               CyColumn column = destTable.getColumn(colName);
+                               if (column == null) {
+                                       CyColumn sourceColumn = 
sourceTable.getColumn(colName);
+                                       if (sourceColumn.getType() == 
List.class) {
+                                               
destTable.createListColumn(colName, sourceColumn.getListElementType(), 
+                                                                          
sourceColumn.isImmutable());
+                                       } else {
+                                               destTable.createColumn(colName, 
sourceColumn.getType(), 
+                                                                      
sourceColumn.isImmutable());
+                                       }
+                               } else if (column == null || 
column.isPrimaryKey()) continue;
+
+                               targetRow.set(colName, oldDataMap.get(colName));
+                       }
+               }
+       }
+
+       public void addRows(CyIdentifiable object, CyRootNetwork 
sourceRootNetwork, CyNetwork sourceNetwork) {
+               oldSharedRowMap.put(object, sourceRootNetwork.getRow(object, 
CyRootNetwork.SHARED_ATTRS));
+               oldLocalRowMap.put(object, sourceNetwork.getRow(object, 
CyNetwork.LOCAL_ATTRS));
+               oldHiddenRowMap.put(object, sourceNetwork.getRow(object, 
CyNetwork.HIDDEN_ATTRS));
+       }
+}

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardManagerImpl.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardManagerImpl.java
  2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardManagerImpl.java
  2012-08-14 02:01:54 UTC (rev 30184)
@@ -1,299 +1,44 @@
+/**
+ * The ClipboardManager provides a simple wrapper around a Clipboard.  This
+ * allows us to manipulate the "current" clipboard.  In the future, we might
+ * also want to provide for multiple clipboards....
+ */
 package org.cytoscape.editor.internal;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
 
-import org.cytoscape.model.CyColumn;
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
-import org.cytoscape.model.CyRow;
-import org.cytoscape.model.CyTable;
-import org.cytoscape.model.subnetwork.CyRootNetwork;
-import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.cytoscape.view.model.CyNetworkView;
-import org.cytoscape.view.model.View;
-import org.cytoscape.view.presentation.property.BasicVisualLexicon;
 
-
 public final class ClipboardManagerImpl {
-       private CyNetworkView sourceView;
-       private List<View<CyNode>> nodeViews;
-       private List<View<CyEdge>> edgeViews;
+       private ClipboardImpl currentClipboard;
 
-       // Row maps
-       private Map<CyIdentifiable, CyRow> oldSharedRowMap;
-       private Map<CyIdentifiable, CyRow> oldLocalRowMap;
-       private Map<CyIdentifiable, CyRow> oldHiddenRowMap;
-
-       private double xCenter, yCenter;
-
        public boolean clipboardHasData() {
-               if (nodeViews != null && nodeViews.size() > 0)
-                       return true;
-               if (edgeViews != null && edgeViews.size() > 0)
-                       return true;
-               return false;
+               if (currentClipboard == null)
+                       return false;
+               return currentClipboard.clipboardHasData();
        }
 
-       public void copy(CyNetworkView networkView, List<CyNode> nodes, 
List<CyEdge> edges) {
-               this.sourceView = networkView;
-               CyNetwork sourceNetwork = sourceView.getModel();
-               nodeViews = new ArrayList<View<CyNode>>();
-               edgeViews = new ArrayList<View<CyEdge>>();
-               oldSharedRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
-               oldLocalRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
-               oldHiddenRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
+       public ClipboardImpl getCurrentClipboard() { return currentClipboard; }
+       public void setCurrentClipboard(ClipboardImpl clip) {
+               this.currentClipboard = clip;
+       }
 
-               // We need the root network to get the shared attributes
-               CyRootNetwork sourceRootNetwork = 
((CySubNetwork)sourceNetwork).getRootNetwork();
-
-               xCenter = 0.0;
-               yCenter = 0.0;
-               for (CyNode node: nodes) {
-                       View<CyNode> nodeView = networkView.getNodeView(node);
-                       nodeViews.add(nodeView);
-                       xCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION);
-                       yCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION);
-                       saveRows(node, sourceRootNetwork, sourceNetwork);
-               }
-               xCenter = xCenter / nodes.size();
-               yCenter = yCenter / nodes.size();
-
-               for (CyEdge edge: edges) {
-                       edgeViews.add(networkView.getEdgeView(edge));
-                       saveRows(edge, sourceRootNetwork, sourceNetwork);
-               }
+       public void copy(CyNetworkView networkView, List<CyNode> nodes, 
List<CyEdge> edges) {
+               currentClipboard = new ClipboardImpl(networkView, nodes, edges);
        }
 
-
        public void cut(CyNetworkView networkView, List<CyNode> nodes, 
List<CyEdge> edges) {
                copy(networkView, nodes, edges);
                networkView.getModel().removeEdges(edges);
                networkView.getModel().removeNodes(nodes);
        }
 
-       public List<CyIdentifiable> paste(CyNetworkView targetView, double x, 
double y, boolean createColumns) {
-               List<CyIdentifiable> pastedObjects = new 
ArrayList<CyIdentifiable>();
-               final Map<CyRow, CyRow> rowMap = new HashMap<CyRow, CyRow>();
-
-               // We need to do this in two passes.  In pass 1, we'll add all 
of the nodes
-               // and store their (possibly new) SUID.  In pass 2, we'll 
reposition the
-               // nodes and add the edges.
-
-               // Pass 1: add the nodes 
-               final Map<CyNode, CyNode> newNodeMap = new HashMap<CyNode, 
CyNode>();
-               for (View<CyNode> nodeView: nodeViews) {
-                       CyNode node = nodeView.getModel();
-                       CyNode newNode = pasteNode(sourceView, targetView, 
node, rowMap);
-                       newNodeMap.put(node, newNode);
-                       pastedObjects.add(newNode);
-               }
-
-               // Pass 2: add the edges in
-               for (View<CyEdge> edgeView: edgeViews) {
-                       CyEdge edge = edgeView.getModel();
-                       CyEdge newEdge = pasteEdge(sourceView, targetView, 
edge, rowMap, newNodeMap);
-
-                       pastedObjects.add(newEdge);
-               }
-
-               copyRows(rowMap, createColumns);
-               targetView.updateView();
-
-               // Finally, Pass 3: reposition the nodes and update our view
-               double xOffset = xCenter - x;
-               double yOffset = yCenter - y;
-               for (View<CyNode> nodeView: nodeViews) {
-                       double nodeX = 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION) - xOffset;
-                       double nodeY = 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION) - yOffset;
-
-                       if (!newNodeMap.containsKey(nodeView.getModel())) 
continue; // Shouldn't happen
-
-                       // Now, get the node view
-                       View<CyNode> newNodeView = 
targetView.getNodeView(newNodeMap.get(nodeView.getModel()));
-                       if (newNodeView != null) {
-                               
newNodeView.setVisualProperty(BasicVisualLexicon.NODE_X_LOCATION, nodeX);
-                               
newNodeView.setVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION, nodeY);
-                       }
-               }
-
-               return pastedObjects;
+       public List<CyIdentifiable> paste(CyNetworkView targetView, double x, 
double y) {
+               return currentClipboard.paste(targetView, x, y);
        }
 
-       private CyEdge pasteEdge(CyNetworkView sourceView, CyNetworkView 
targetView, 
-                                CyEdge edge, Map<CyRow, CyRow> rowMap, 
Map<CyNode, CyNode> newNodeMap) {
-               CyNetwork sourceNetwork = sourceView.getModel();
-               CyRootNetwork sourceRoot = 
((CySubNetwork)sourceNetwork).getRootNetwork();
-
-               CySubNetwork targetNetwork = 
(CySubNetwork)targetView.getModel();
-               CyRootNetwork targetRoot = targetNetwork.getRootNetwork();
-
-               CyEdge newEdge = null;
-               CyNode sourceNode = edge.getSource();
-               CyNode targetNode = edge.getTarget();
-
-               // Same three cases as pasteNode, but we need to be careful to 
add missing nodes.  If
-               // we paste and edge, but there's no corresponding node, we 
need to copy the
-               // node in.
-               //
-               // Three cases:
-               // 1) We're copying edges to a new network in a different 
network tree
-               // 2) We're copying edges to a new network in the same network 
tree
-               // 3) We're copying edges to a new location in the same network
-               if (sourceRoot != targetRoot) {
-                       // Case 1: different root
-
-                       if (!newNodeMap.containsKey(sourceNode)) {
-                               saveRows(sourceNode, sourceRoot, sourceNetwork);
-                               newNodeMap.put(sourceNode, 
pasteNode(sourceView, targetView, sourceNode, rowMap));
-                       }
-
-                       if (!newNodeMap.containsKey(targetNode)) {
-                               saveRows(targetNode, sourceRoot, sourceNetwork);
-                               newNodeMap.put(targetNode, 
pasteNode(sourceView, targetView, targetNode, rowMap));
-                       }
-
-                       // Create the edge
-                       newEdge = 
targetNetwork.addEdge(newNodeMap.get(sourceNode), 
-                                                       
newNodeMap.get(targetNode), edge.isDirected());
-
-                       // Copy the attributes over
-                       rowMap.put(oldSharedRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.DEFAULT_ATTRS));
-                       rowMap.put(oldLocalRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.LOCAL_ATTRS));
-                       rowMap.put(oldHiddenRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
-               // } else if (!targetNetwork.containsEdge(edge)) {
-               } else {
-                       // Case 2: different network, same root and
-                       // Case 3: same network
-
-                       // First, see if we already have the nodes
-                       if (!newNodeMap.containsKey(sourceNode)) {
-                               saveRows(sourceNode, sourceRoot, sourceNetwork);
-                               if (targetNetwork.containsNode(sourceNode)) {
-                                       newNodeMap.put(sourceNode, sourceNode);
-                               } else {
-                                       newNodeMap.put(sourceNode, 
pasteNode(sourceView, targetView, sourceNode, rowMap));
-                               }
-                       }
-
-                       if (!newNodeMap.containsKey(targetNode)) {
-                               saveRows(targetNode, sourceRoot, sourceNetwork);
-                               if (targetNetwork.containsNode(targetNode)) {
-                                       newNodeMap.put(targetNode, targetNode);
-                               } else {
-                                       newNodeMap.put(targetNode, 
pasteNode(sourceView, targetView, targetNode, rowMap));
-                               }
-                       }
-
-                       // We want to create another copy of the edge
-                       // Create the edge
-                       newEdge = 
targetNetwork.addEdge(newNodeMap.get(sourceNode), 
-                                                       
newNodeMap.get(targetNode), edge.isDirected());
-
-                       // Copy the attributes over
-                       rowMap.put(oldLocalRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.LOCAL_ATTRS));
-                       rowMap.put(oldHiddenRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
-               } /* else {
-                       // Case 3: same network
-                       newEdge = edge;
-                       // Copy the attributes over
-                       rowMap.put(oldLocalRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.LOCAL_ATTRS));
-                       rowMap.put(oldHiddenRowMap.get(edge),
-                                  targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
-               }  */
-               return newEdge;
-       }
-
-       // TODO: Need to figure out how to copy LOCAL_ATTRS, SHARED_ATTRS, and 
HIDDEN_ATTRS
-       // The latter is easy.  The second two are both part of the 
DEFAULT_ATTRS, but it's
-       // not clear how to create a local attribute specifically....
-       private CyNode pasteNode(CyNetworkView sourceView, CyNetworkView 
targetView, 
-                                CyNode node, Map<CyRow, CyRow> rowMap) {
-
-               CyNetwork sourceNetwork = sourceView.getModel();
-               CyRootNetwork sourceRoot = 
((CySubNetwork)sourceNetwork).getRootNetwork();
-
-               CySubNetwork targetNetwork = 
(CySubNetwork)targetView.getModel();
-               CyRootNetwork targetRoot = targetNetwork.getRootNetwork();
-
-               CyNode newNode = null;
-
-               // Three cases:
-               // 1) We're copying nodes to a new network in a different 
network tree
-               // 2) We're copying nodes to a new network in the same network 
tree
-               // 3) We're copying nodes to a new location in the same network
-               if (sourceRoot != targetRoot) {
-                       // Case 1: Different roots
-                       newNode = targetNetwork.addNode();
-                       // Copy the attributes over
-                       rowMap.put(oldSharedRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.DEFAULT_ATTRS));
-                       rowMap.put(oldLocalRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
-                       rowMap.put(oldHiddenRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
-               } else if (!targetNetwork.containsNode(node)) {
-                       // Case 2: different subnetwork, same root
-                       newNode = targetNetwork.addNode();
-                       rowMap.put(oldLocalRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
-                       rowMap.put(oldHiddenRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
-               } else {
-                       // Case 3: Copying the node to the same network
-                       newNode = targetNetwork.addNode();
-                       // Copy in the hidden attributes
-                       rowMap.put(oldHiddenRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
-                       // Copy in the local attributes
-                       rowMap.put(oldLocalRowMap.get(node),
-                                  targetNetwork.getRow(newNode, 
CyNetwork.LOCAL_ATTRS));
-                       targetNetwork.addNode(node);
-               }
-               return newNode;
-       }
-
-       private void copyRows(Map<CyRow,CyRow> rowMap, boolean createColumns) {
-               if (rowMap == null || rowMap.size() == 0) return;
-
-               for (CyRow sourceRow: rowMap.keySet()) {
-                       CyRow targetRow = rowMap.get(sourceRow);
-                       CyTable destTable = targetRow.getTable();
-                       CyTable sourceTable = sourceRow.getTable();
-
-                       Map<String, Object> oldDataMap = 
sourceRow.getAllValues();
-                       for (String colName: oldDataMap.keySet()) {
-                               CyColumn column = destTable.getColumn(colName);
-                               if (column == null && createColumns) {
-                                       CyColumn sourceColumn = 
sourceTable.getColumn(colName);
-                                       if (sourceColumn.getType() == 
List.class) {
-                                               
destTable.createListColumn(colName, sourceColumn.getListElementType(), 
-                                                                          
sourceColumn.isImmutable());
-                                       } else {
-                                               destTable.createColumn(colName, 
sourceColumn.getType(), 
-                                                                      
sourceColumn.isImmutable());
-                                       }
-                               } else if (column == null || 
column.isPrimaryKey()) continue;
-
-                               targetRow.set(colName, oldDataMap.get(colName));
-                       }
-               }
-       }
-
-       private void saveRows(CyIdentifiable object, CyRootNetwork 
sourceRootNetwork, CyNetwork sourceNetwork) {
-               oldSharedRowMap.put(object, sourceRootNetwork.getRow(object, 
CyRootNetwork.SHARED_ATTRS));
-               oldLocalRowMap.put(object, sourceNetwork.getRow(object, 
CyNetwork.LOCAL_ATTRS));
-               oldHiddenRowMap.put(object, sourceNetwork.getRow(object, 
CyNetwork.HIDDEN_ATTRS));
-       }
 }

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdgeTaskFactory.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdgeTaskFactory.java
    2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdgeTaskFactory.java
    2012-08-14 02:01:54 UTC (rev 30184)
@@ -8,18 +8,22 @@
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.model.View;
 import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.undo.UndoSupport;
 
 public class CutEdgeTaskFactory extends AbstractEdgeViewTaskFactory {
        final CyNetworkManager netMgr;
        final ClipboardManagerImpl clipMgr;
+       final UndoSupport undoSupport;
 
-       public CutEdgeTaskFactory(final ClipboardManagerImpl clipboardMgr, 
final CyNetworkManager netMgr) {
+       public CutEdgeTaskFactory(final ClipboardManagerImpl clipboardMgr, 
final UndoSupport undoSupport,
+                                 final CyNetworkManager netMgr) {
                this.netMgr = netMgr;
                this.clipMgr = clipboardMgr;
+               this.undoSupport = undoSupport;
        }
 
        @Override
        public TaskIterator createTaskIterator(View<CyEdge> edgeView, 
CyNetworkView networkView) {
-               return new TaskIterator(new CutTask(networkView, edgeView, 
clipMgr));
+               return new TaskIterator(new CutTask(networkView, edgeView, 
clipMgr, undoSupport));
        }
 }

Added: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdit.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdit.java
                               (rev 0)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutEdit.java
       2012-08-14 02:01:54 UTC (rev 30184)
@@ -0,0 +1,36 @@
+package org.cytoscape.editor.internal;
+
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.view.model.CyNetworkView;
+import org.cytoscape.view.model.View;
+import org.cytoscape.work.undo.AbstractCyEdit;
+
+import static 
org.cytoscape.view.presentation.property.BasicVisualLexicon.NODE_X_LOCATION;
+import static 
org.cytoscape.view.presentation.property.BasicVisualLexicon.NODE_Y_LOCATION;
+
+import java.util.List;
+
+public class CutEdit extends AbstractCyEdit {
+       private final CyNetworkView view;
+       private final ClipboardManagerImpl mgr;
+       private final ClipboardImpl clipboard;
+
+       public CutEdit(ClipboardManagerImpl clipMgr, CyNetworkView view) { 
+               super("Cut");
+               this.clipboard = clipMgr.getCurrentClipboard();
+               this.view = view;
+               this.mgr = clipMgr;
+       }
+
+       public void redo() {
+               mgr.cut(view, clipboard.getNodes(), clipboard.getEdges());
+       }
+
+       public void undo() {
+               mgr.setCurrentClipboard(clipboard);
+               mgr.paste(view, clipboard.getCenterX(), clipboard.getCenterY());
+               view.updateView();
+       }
+}

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutNodeTaskFactory.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutNodeTaskFactory.java
    2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutNodeTaskFactory.java
    2012-08-14 02:01:54 UTC (rev 30184)
@@ -8,18 +8,22 @@
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.model.View;
 import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.undo.UndoSupport;
 
 public class CutNodeTaskFactory extends AbstractNodeViewTaskFactory {
        final CyNetworkManager netMgr;
        final ClipboardManagerImpl clipMgr;
+       final UndoSupport undoSupport;
 
-       public CutNodeTaskFactory(final ClipboardManagerImpl clipboardMgr, 
final CyNetworkManager netMgr) {
+       public CutNodeTaskFactory(final ClipboardManagerImpl clipboardMgr, 
final UndoSupport undoSupport,
+                                 final CyNetworkManager netMgr) {
                this.netMgr = netMgr;
                this.clipMgr = clipboardMgr;
+               this.undoSupport = undoSupport;
        }
 
        @Override
        public TaskIterator createTaskIterator(View<CyNode> nodeView, 
CyNetworkView networkView) {
-               return new TaskIterator(new CutTask(networkView, nodeView, 
clipMgr));
+               return new TaskIterator(new CutTask(networkView, nodeView, 
clipMgr, undoSupport));
        }
 }

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
       2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
       2012-08-14 02:01:54 UTC (rev 30184)
@@ -10,6 +10,7 @@
 import org.cytoscape.view.model.View;
 import org.cytoscape.work.AbstractTask;
 import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.undo.UndoSupport;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -19,11 +20,14 @@
        CyNetwork net;
        CyNetworkView view;
        ClipboardManagerImpl mgr;
+       final UndoSupport undoSupport;
        List<CyNode> selNodes;
        List<CyEdge> selEdges;
        
-       public CutTask(final CyNetworkView netView, final ClipboardManagerImpl 
clipMgr) {
+       public CutTask(final CyNetworkView netView, final ClipboardManagerImpl 
clipMgr, 
+                      final UndoSupport undoSupport) {
                this.view = netView;
+               this.undoSupport = undoSupport;
                // Get all of the selected nodes and edges
                selNodes = CyTableUtil.getNodesInState(netView.getModel(), 
CyNetwork.SELECTED, true);
                selEdges = CyTableUtil.getEdgesInState(netView.getModel(), 
CyNetwork.SELECTED, true);
@@ -33,10 +37,10 @@
        }
 
        public CutTask(final CyNetworkView netView, final View<?extends 
CyIdentifiable> objView, 
-                      final ClipboardManagerImpl clipMgr) {
+                      final ClipboardManagerImpl clipMgr, final UndoSupport 
undoSupport) {
 
                // Get all of the selected nodes and edges first
-               this(netView, clipMgr);
+               this(netView, clipMgr, undoSupport);
 
                // Now, make sure we add our
                if (objView.getModel() instanceof CyNode) {
@@ -52,5 +56,6 @@
 
        public void run(TaskMonitor tm) throws Exception {
                mgr.cut(view, selNodes, selEdges);
+               undoSupport.postEdit(new CutEdit(mgr, view));
        }
 }

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTaskFactory.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTaskFactory.java
        2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTaskFactory.java
        2012-08-14 02:01:54 UTC (rev 30184)
@@ -14,14 +14,18 @@
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.model.View;
 import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.undo.UndoSupport;
 
 public class CutTaskFactory extends AbstractNetworkViewTaskFactory {
        final CyNetworkManager netMgr;
        final ClipboardManagerImpl clipMgr;
+       final UndoSupport undoSupport;
 
-       public CutTaskFactory(final ClipboardManagerImpl clipboardMgr, final 
CyNetworkManager netMgr) {
+       public CutTaskFactory(final ClipboardManagerImpl clipboardMgr, final 
UndoSupport undoSupport, 
+                             final CyNetworkManager netMgr) {
                this.netMgr = netMgr;
                this.clipMgr = clipboardMgr;
+               this.undoSupport = undoSupport;
        }
 
        @Override
@@ -38,6 +42,6 @@
 
        @Override
        public TaskIterator createTaskIterator(CyNetworkView networkView) {
-               return new TaskIterator(new CutTask(networkView, clipMgr));
+               return new TaskIterator(new CutTask(networkView, clipMgr, 
undoSupport));
        }
 }

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CyActivator.java
   2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CyActivator.java
   2012-08-14 02:01:54 UTC (rev 30184)
@@ -16,6 +16,7 @@
 import org.cytoscape.task.create.CreateNetworkViewTaskFactory;
 import org.cytoscape.view.model.CyNetworkViewManager;
 import org.cytoscape.view.vizmap.VisualMappingManager;
+import org.cytoscape.work.undo.UndoSupport;
 import org.osgi.framework.BundleContext;
 
 import static org.cytoscape.work.ServiceProperties.*;
@@ -30,6 +31,7 @@
                CyApplicationManager cyApplicationManagerServiceRef = 
getService(bc, CyApplicationManager.class);
                CyNetworkManager cyNetworkManagerServiceRef = getService(bc, 
CyNetworkManager.class);
                CyNetworkViewManager cyNetworkViewManagerServiceRef = 
getService(bc, CyNetworkViewManager.class);
+               UndoSupport undoSupportServiceRef = 
getService(bc,UndoSupport.class);
                CyEventHelper cyEventHelperServiceRef = getService(bc, 
CyEventHelper.class);
                VisualMappingManager visualMappingManagerServiceRef = 
getService(bc, VisualMappingManager.class);
                CyGroupManager cyGroupManagerServiceRef = getService(bc, 
CyGroupManager.class);
@@ -71,7 +73,7 @@
 
                // Cut node
                NetworkViewTaskFactory cutTaskFactory = 
-                       new CutTaskFactory(clipboardManager, 
cyNetworkManagerServiceRef);
+                       new CutTaskFactory(clipboardManager, 
undoSupportServiceRef, cyNetworkManagerServiceRef);
                Properties cutTaskFactoryProps = new Properties();
                cutTaskFactoryProps.setProperty(ENABLE_FOR, "networkAndView");
                cutTaskFactoryProps.setProperty(PREFERRED_ACTION, "NEW");
@@ -83,7 +85,8 @@
 
                // Paste node
                NetworkViewLocationTaskFactory pasteTaskFactory = 
-                       new PasteTaskFactory(clipboardManager, 
cyEventHelperServiceRef, visualMappingManagerServiceRef);
+                       new PasteTaskFactory(clipboardManager, 
cyEventHelperServiceRef, 
+                                      undoSupportServiceRef, 
visualMappingManagerServiceRef);
                Properties pasteTaskFactoryProps = new Properties();
                pasteTaskFactoryProps.setProperty(ENABLE_FOR, "networkAndView");
                pasteTaskFactoryProps.setProperty(PREFERRED_ACTION, "NEW");
@@ -110,7 +113,7 @@
 
                // Cut node
                NodeViewTaskFactory cutNodeTaskFactory = 
-                       new CutNodeTaskFactory(clipboardManager, 
cyNetworkManagerServiceRef);
+                       new CutNodeTaskFactory(clipboardManager, 
undoSupportServiceRef, cyNetworkManagerServiceRef);
                Properties cutNodeTaskFactoryProps = new Properties();
                cutNodeTaskFactoryProps.setProperty(PREFERRED_ACTION, "NEW");
                cutNodeTaskFactoryProps.setProperty(PREFERRED_MENU, 
NODE_EDIT_MENU);
@@ -159,7 +162,7 @@
 
                // Cut edge
                EdgeViewTaskFactory cutEdgeTaskFactory = 
-                       new CutEdgeTaskFactory(clipboardManager, 
cyNetworkManagerServiceRef);
+                       new CutEdgeTaskFactory(clipboardManager, 
undoSupportServiceRef, cyNetworkManagerServiceRef);
                Properties cutEdgeTaskFactoryProps = new Properties();
                cutEdgeTaskFactoryProps.setProperty(PREFERRED_ACTION, "NEW");
                cutEdgeTaskFactoryProps.setProperty(PREFERRED_MENU, 
EDGE_EDIT_MENU);

Added: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteEdit.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteEdit.java
                             (rev 0)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteEdit.java
     2012-08-14 02:01:54 UTC (rev 30184)
@@ -0,0 +1,63 @@
+package org.cytoscape.editor.internal;
+
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyIdentifiable;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.task.AbstractNetworkViewTask;
+import org.cytoscape.view.model.CyNetworkView;
+import org.cytoscape.view.vizmap.VisualMappingManager;
+import org.cytoscape.view.vizmap.VisualStyle;
+import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.undo.AbstractCyEdit;
+
+public class PasteEdit extends AbstractCyEdit {
+       private final CyNetworkView view;
+       private final VisualMappingManager vmm;
+       private final Point2D xformPt;
+       private final ClipboardManagerImpl clipMgr;
+       private final ClipboardImpl clipboard;
+       private final List<CyIdentifiable> pastedObjects;
+
+       public PasteEdit(VisualMappingManager vmm, CyNetworkView view, Point2D 
xformPt, 
+                        ClipboardManagerImpl clipMgr, List<CyIdentifiable> 
pastedObjects) {
+               super("Paste");
+               this.view = view;
+               this.vmm = vmm;
+               this.xformPt = xformPt;
+               this.clipMgr = clipMgr;
+               this.clipboard = clipMgr.getCurrentClipboard();
+               this.pastedObjects = pastedObjects;
+       }
+
+       public void undo() {
+               List<CyNode> nodeList = new ArrayList<CyNode>();
+               List<CyEdge> edgeList = new ArrayList<CyEdge>();
+               for (CyIdentifiable object: pastedObjects) {
+                       // Remove edges first
+                       if (object instanceof CyEdge)
+                               edgeList.add((CyEdge)object);
+                       else if (object instanceof CyNode)
+                               nodeList.add((CyNode)object);
+               }
+
+               view.getModel().removeEdges(edgeList);
+               view.getModel().removeNodes(nodeList);
+               view.updateView();
+       }
+
+       public void redo() {
+               if (this.xformPt == null)
+                       clipboard.paste(view, 0.0, 0.0);
+               else
+                       clipboard.paste(view, xformPt.getX(), xformPt.getY());
+               
+               // Apply visual style
+               VisualStyle vs = vmm.getVisualStyle(view);
+               vs.apply(view);
+               view.updateView();
+       }
+}

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTask.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTask.java
     2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTask.java
     2012-08-14 02:01:54 UTC (rev 30184)
@@ -1,25 +1,30 @@
 package org.cytoscape.editor.internal;
 
 import java.awt.geom.Point2D;
+import java.util.List;
 
+import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.task.AbstractNetworkViewTask;
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.vizmap.VisualMappingManager;
 import org.cytoscape.view.vizmap.VisualStyle;
 import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.undo.UndoSupport;
 
 public class PasteTask extends AbstractNetworkViewTask {
 
        private final VisualMappingManager vmm;
        private final Point2D xformPt;
        private final ClipboardManagerImpl clipMgr;
+       private final UndoSupport undoSupport;
 
        public PasteTask(final VisualMappingManager vmm, final CyNetworkView 
view, final Point2D xformPt,
-                       final ClipboardManagerImpl clip) {
+                       final ClipboardManagerImpl clip, final UndoSupport 
undoSupport) {
                super(view);
                this.vmm = vmm;
                this.xformPt = xformPt;
                this.clipMgr = clip;
+               this.undoSupport = undoSupport;
 
        }
 
@@ -27,10 +32,13 @@
 
        @Override
        public void run(TaskMonitor tm) throws Exception {
+               List<CyIdentifiable> pastedObjects;
                if (xformPt == null)
-                       clipMgr.paste(view, 0.0, 0.0, true);
+                       pastedObjects = clipMgr.paste(view, 0.0, 0.0);
                else
-                       clipMgr.paste(view, xformPt.getX(), xformPt.getY(), 
true);
+                       pastedObjects = clipMgr.paste(view, xformPt.getX(), 
xformPt.getY());
+
+               undoSupport.postEdit(new PasteEdit(vmm, view, xformPt, clipMgr, 
pastedObjects));
                
                // Apply visual style
                VisualStyle vs = vmm.getVisualStyle(view);

Modified: 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTaskFactory.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTaskFactory.java
      2012-08-13 23:24:53 UTC (rev 30183)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/PasteTaskFactory.java
      2012-08-14 02:01:54 UTC (rev 30184)
@@ -9,17 +9,21 @@
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.vizmap.VisualMappingManager;
 import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.undo.UndoSupport;
 
 public class PasteTaskFactory extends AbstractNetworkViewLocationTaskFactory {
 
        private final CyEventHelper eh;
        private final VisualMappingManager vmm;
        private final ClipboardManagerImpl clipMgr;
+       private final UndoSupport undoSupport;
        
-       public PasteTaskFactory(final ClipboardManagerImpl mgr, CyEventHelper 
eh, VisualMappingManager vmm) {
+       public PasteTaskFactory(final ClipboardManagerImpl mgr, CyEventHelper 
eh, 
+                               UndoSupport undoSupport, VisualMappingManager 
vmm) {
                this.clipMgr = mgr;
                this.eh = eh;
                this.vmm = vmm;
+               this.undoSupport = undoSupport;
        }
 
        @Override
@@ -33,7 +37,7 @@
        @Override
        public TaskIterator createTaskIterator(CyNetworkView networkView, 
                                               Point2D javaPt, Point2D xformPt) 
{
-               return new TaskIterator(new PasteTask(vmm, networkView, 
xformPt, clipMgr));
+               return new TaskIterator(new PasteTask(vmm, networkView, 
xformPt, clipMgr, undoSupport));
        }
 
 }

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to