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.