Author: scooter
Date: 2012-08-13 15:18:14 -0700 (Mon, 13 Aug 2012)
New Revision: 30181

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/CopyTask.java
   
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
Log:
Fix copy and paste semantics and bugs


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 22:09:14 UTC (rev 30180)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/ClipboardManagerImpl.java
  2012-08-13 22:18:14 UTC (rev 30181)
@@ -26,7 +26,8 @@
        private List<View<CyEdge>> edgeViews;
 
        // Row maps
-       private Map<CyIdentifiable, CyRow> oldDefaultRowMap;
+       private Map<CyIdentifiable, CyRow> oldSharedRowMap;
+       private Map<CyIdentifiable, CyRow> oldLocalRowMap;
        private Map<CyIdentifiable, CyRow> oldHiddenRowMap;
 
        private double xCenter, yCenter;
@@ -34,6 +35,8 @@
        public boolean clipboardHasData() {
                if (nodeViews != null && nodeViews.size() > 0)
                        return true;
+               if (edgeViews != null && edgeViews.size() > 0)
+                       return true;
                return false;
        }
 
@@ -42,9 +45,13 @@
                CyNetwork sourceNetwork = sourceView.getModel();
                nodeViews = new ArrayList<View<CyNode>>();
                edgeViews = new ArrayList<View<CyEdge>>();
-               oldDefaultRowMap = new WeakHashMap<CyIdentifiable, CyRow>();
+               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) {
@@ -52,16 +59,14 @@
                        nodeViews.add(nodeView);
                        xCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION);
                        yCenter += 
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION);
-                       oldDefaultRowMap.put(node, sourceNetwork.getRow(node, 
CyNetwork.DEFAULT_ATTRS));
-                       oldHiddenRowMap.put(node, sourceNetwork.getRow(node, 
CyNetwork.HIDDEN_ATTRS));
+                       saveRows(node, sourceRootNetwork, sourceNetwork);
                }
                xCenter = xCenter / nodes.size();
                yCenter = yCenter / nodes.size();
 
                for (CyEdge edge: edges) {
                        edgeViews.add(networkView.getEdgeView(edge));
-                       oldDefaultRowMap.put(edge, sourceNetwork.getRow(edge, 
CyNetwork.DEFAULT_ATTRS));
-                       oldHiddenRowMap.put(edge, sourceNetwork.getRow(edge, 
CyNetwork.HIDDEN_ATTRS));
+                       saveRows(edge, sourceRootNetwork, sourceNetwork);
                }
        }
 
@@ -76,13 +81,6 @@
                List<CyIdentifiable> pastedObjects = new 
ArrayList<CyIdentifiable>();
                final Map<CyRow, CyRow> rowMap = new HashMap<CyRow, CyRow>();
 
-               CyNetwork sourceNetwork = sourceView.getModel();
-
-               CyRootNetwork sourceRoot = 
((CySubNetwork)sourceNetwork).getRootNetwork();
-
-               CySubNetwork targetNetwork = 
(CySubNetwork)targetView.getModel();
-               CyRootNetwork targetRoot = targetNetwork.getRootNetwork();
-
                // 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.
@@ -91,26 +89,7 @@
                final Map<CyNode, CyNode> newNodeMap = new HashMap<CyNode, 
CyNode>();
                for (View<CyNode> nodeView: nodeViews) {
                        CyNode node = nodeView.getModel();
-                       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 || 
targetNetwork.containsNode(node)) {
-                               newNode = targetNetwork.addNode();
-                               // Copy the attributes over
-                               rowMap.put(oldDefaultRowMap.get(node),
-                                          targetNetwork.getRow(newNode, 
CyNetwork.DEFAULT_ATTRS));
-                               rowMap.put(oldHiddenRowMap.get(node),
-                                          targetNetwork.getRow(newNode, 
CyNetwork.HIDDEN_ATTRS));
-                       } else {
-                               // Same node: no need to copy the attributes
-                               targetNetwork.addNode(node);
-                               newNode = node;
-                       }
-
-                       // Save the original node and it's new node
+                       CyNode newNode = pasteNode(sourceView, targetView, 
node, rowMap);
                        newNodeMap.put(node, newNode);
                        pastedObjects.add(newNode);
                }
@@ -118,26 +97,8 @@
                // Pass 2: add the edges in
                for (View<CyEdge> edgeView: edgeViews) {
                        CyEdge edge = edgeView.getModel();
-                       CyEdge newEdge = null;
-                       if (sourceRoot != targetRoot || 
targetNetwork.containsEdge(edge)) {
-                               CyNode sourceNode = edge.getSource();
-                               CyNode targetNode = edge.getTarget();
-                               if (!newNodeMap.containsKey(sourceNode) || 
!newNodeMap.containsKey(targetNode))
-                                       continue;  // Maybe a dangling edge
+                       CyEdge newEdge = pasteEdge(sourceView, targetView, 
edge, rowMap, newNodeMap);
 
-                               // Create the edge
-                               newEdge = 
targetNetwork.addEdge(newNodeMap.get(sourceNode), 
-                                                               
newNodeMap.get(targetNode), edge.isDirected());
-
-                               // Copy the attributes over
-                               rowMap.put(oldDefaultRowMap.get(edge),
-                                          targetNetwork.getRow(newEdge, 
CyNetwork.DEFAULT_ATTRS));
-                               rowMap.put(oldHiddenRowMap.get(edge),
-                                          targetNetwork.getRow(newEdge, 
CyNetwork.HIDDEN_ATTRS));
-                       } else {
-                               targetNetwork.addEdge(edge);
-                               newEdge = edge;
-                       }
                        pastedObjects.add(newEdge);
                }
 
@@ -164,6 +125,145 @@
                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)) {
+                               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;
 
@@ -190,4 +290,10 @@
                        }
                }
        }
+
+       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/CopyTask.java
===================================================================
--- 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CopyTask.java
      2012-08-13 22:09:14 UTC (rev 30180)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CopyTask.java
      2012-08-13 22:18:14 UTC (rev 30181)
@@ -32,17 +32,20 @@
 
        public CopyTask(final CyNetworkView netView, final View<?extends 
CyIdentifiable> objView, 
                        final ClipboardManagerImpl clipMgr) {
-               this.netView = netView;
+
+               // Get all of the selected nodes and edges first
+               this(netView, clipMgr);
+
+               // Now, make sure we add our
                if (objView.getModel() instanceof CyNode) {
-                       selEdges = new ArrayList<CyEdge>();
-                       selNodes = 
Collections.singletonList(((View<CyNode>)objView).getModel());
+                       CyNode node = ((View<CyNode>)objView).getModel();
+                       if (!selNodes.contains(node))
+                               selNodes.add(node);
                } else if (objView.getModel() instanceof CyEdge) {
-                       selNodes = new ArrayList<CyNode>();
-                       selEdges = 
Collections.singletonList(((View<CyEdge>)objView).getModel());
+                       CyEdge edge = ((View<CyEdge>)objView).getModel();
+                       if (!selEdges.contains(edge))
+                               selEdges.add(edge);
                }
-
-               // Save them in our list
-               mgr = clipMgr;
        }
 
        public void run(TaskMonitor tm) throws Exception {

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 22:09:14 UTC (rev 30180)
+++ 
core3/impl/trunk/editor-impl/src/main/java/org/cytoscape/editor/internal/CutTask.java
       2012-08-13 22:18:14 UTC (rev 30181)
@@ -34,17 +34,20 @@
 
        public CutTask(final CyNetworkView netView, final View<?extends 
CyIdentifiable> objView, 
                       final ClipboardManagerImpl clipMgr) {
-               this.view = netView;
+
+               // Get all of the selected nodes and edges first
+               this(netView, clipMgr);
+
+               // Now, make sure we add our
                if (objView.getModel() instanceof CyNode) {
-                       selEdges = new ArrayList<CyEdge>();
-                       selNodes = 
Collections.singletonList(((View<CyNode>)objView).getModel());
+                       CyNode node = ((View<CyNode>)objView).getModel();
+                       if (!selNodes.contains(node))
+                               selNodes.add(node);
                } else if (objView.getModel() instanceof CyEdge) {
-                       selNodes = new ArrayList<CyNode>();
-                       selEdges = 
Collections.singletonList(((View<CyEdge>)objView).getModel());
+                       CyEdge edge = ((View<CyEdge>)objView).getModel();
+                       if (!selEdges.contains(edge))
+                               selEdges.add(edge);
                }
-
-               // Save them in our list
-               mgr = clipMgr;
        }
 
        public void run(TaskMonitor tm) throws Exception {

-- 
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