Author: scooter
Date: 2012-01-24 11:12:08 -0800 (Tue, 24 Jan 2012)
New Revision: 28089
Modified:
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupFactoryImpl.java
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupImpl.java
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupManagerImpl.java
Log:
Changed to support API changes. Also cleaned up event processing and
added group register to the createGroup factory methods.
Modified:
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupFactoryImpl.java
===================================================================
---
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupFactoryImpl.java
2012-01-24 19:11:00 UTC (rev 28088)
+++
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupFactoryImpl.java
2012-01-24 19:12:08 UTC (rev 28089)
@@ -78,7 +78,7 @@
*/
@Override
public CyGroup createGroup(CyNetwork network) {
- return new CyGroupImpl(help, mgr, network, null, null, null);
+ return createGroup(network, null, null, null);
}
/**
@@ -86,7 +86,7 @@
*/
@Override
public CyGroup createGroup(CyNetwork network, List<CyNode> nodes,
List<CyEdge> edges) {
- return new CyGroupImpl(help, mgr, network, null, nodes, edges);
+ return createGroup(network, null, nodes, edges);
}
/**
@@ -94,6 +94,8 @@
*/
@Override
public CyGroup createGroup(CyNetwork network, CyNode node, List<CyNode>
nodes, List<CyEdge> edges) {
- return new CyGroupImpl(help, mgr, network, node, nodes, edges);
+ CyGroup group = new CyGroupImpl(help, mgr, network, node,
nodes, edges);
+ mgr.addGroup(group);
+ return group;
}
}
Modified:
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupImpl.java
===================================================================
---
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupImpl.java
2012-01-24 19:11:00 UTC (rev 28088)
+++
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupImpl.java
2012-01-24 19:12:08 UTC (rev 28089)
@@ -30,6 +30,7 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -40,6 +41,7 @@
import org.cytoscape.group.CyGroupManager;
import org.cytoscape.group.events.GroupAboutToBeRemovedEvent;
import org.cytoscape.group.events.GroupAddedToNetworkEvent;
+import org.cytoscape.group.events.GroupChangedEvent;
import org.cytoscape.group.events.GroupCollapsedEvent;
import org.cytoscape.model.CyEdge;
@@ -61,6 +63,8 @@
private CyRootNetwork rootNetwork = null;
private Set<CyNetwork> networkSet = null;
private Set<CyNetwork> collapseSet = null;
+ private boolean batchUpdate = false;
+ private boolean nodeProvided = false; // We'll need this when we
destroy ourselves
CyGroupImpl(final CyEventHelper eventHelper,
final CyGroupManager mgr, CyNetwork network, CyNode node,
@@ -71,8 +75,10 @@
this.rootNetwork = ((CySubNetwork)network).getRootNetwork();
if (node == null)
this.groupNode = this.rootNetwork.addNode();
- else
+ else {
+ nodeProvided = true;
this.groupNode = node;
+ }
this.externalEdges = new HashSet<CyEdge>();
this.metaEdges = new HashSet<CyEdge>();
@@ -174,42 +180,48 @@
* @see org.cytoscape.group.CyGroup#addNode()
*/
@Override
- public void addNode(CyNode node) {
+ public synchronized void addNode(CyNode node) {
if (!rootNetwork.containsNode(node))
- throw new IllegalArgumentException("Can only add a node
in the same network tree");
+ throwIllegalArgumentException("Can only add a node in
the same network tree");
groupNet.addNode(node);
+ cyEventHelper.fireEvent(new GroupChangedEvent(CyGroupImpl.this,
node, GroupChangedEvent.ChangeType.NODE_ADDED));
}
/**
* @see org.cytoscape.group.CyGroup#addInternalEdge()
*/
@Override
- public void addInternalEdge(CyEdge edge) {
+ public synchronized void addInternalEdge(CyEdge edge) {
if (!rootNetwork.containsEdge(edge))
- throw new IllegalArgumentException("Can only add an
edge in the same network tree");
+ throwIllegalArgumentException("Can only add an edge in
the same network tree");
groupNet.addEdge(edge);
+ if (!batchUpdate)
+ cyEventHelper.fireEvent(new
GroupChangedEvent(CyGroupImpl.this, edge,
GroupChangedEvent.ChangeType.INTERNAL_EDGE_ADDED));
}
/**
* @see org.cytoscape.group.CyGroup#addExternalEdge()
*/
@Override
- public void addExternalEdge(CyEdge edge) {
+ public synchronized void addExternalEdge(CyEdge edge) {
if (!rootNetwork.containsEdge(edge))
- throw new IllegalArgumentException("Can only add an
edge in the same network tree");
+ throwIllegalArgumentException("Can only add an edge in
the same network tree");
if (!externalEdges.contains(edge))
externalEdges.add(edge);
+ if (!batchUpdate)
+ cyEventHelper.fireEvent(new
GroupChangedEvent(CyGroupImpl.this, edge,
GroupChangedEvent.ChangeType.EXTERNAL_EDGE_ADDED));
}
/**
* @see org.cytoscape.group.CyGroup#addNodes()
*/
@Override
- public void addNodes(List<CyNode> nodes) {
+ public synchronized void addNodes(List<CyNode> nodes) {
Set<CyEdge> edgeSet = new HashSet<CyEdge>();
+ batchUpdate = true;
for (CyNode n: nodes) {
if (!rootNetwork.containsNode(n))
- throw new IllegalArgumentException("Can only
add a node in the same network tree");
+ throwIllegalArgumentException("Can only add a
node in the same network tree");
addNode(n);
edgeSet.addAll(rootNetwork.getAdjacentEdgeList(n,
CyEdge.Type.ANY));
@@ -222,17 +234,70 @@
addExternalEdge(e);
}
}
+ batchUpdate = false;
+ cyEventHelper.fireEvent(new GroupChangedEvent(CyGroupImpl.this,
nodes, GroupChangedEvent.ChangeType.NODES_ADDED));
}
/**
+ * @see org.cytoscape.group.CyGroup#addEdges()
+ */
+ @Override
+ public synchronized void addEdges(List<CyEdge> edges) {
+ for (CyEdge edge: edges) {
+ CyNode source = edge.getSource();
+ CyNode target = edge.getTarget();
+ if(groupNet.containsNode(source) &&
groupNet.containsNode(target))
+ groupNet.addEdge(edge);
+ else if (groupNet.containsNode(source) ||
groupNet.containsNode(target))
+ externalEdges.add(edge);
+ else
+ throwIllegalArgumentException("Attempted to add
an edge that has no node in the group");
+ }
+ cyEventHelper.fireEvent(new GroupChangedEvent(CyGroupImpl.this,
edges, GroupChangedEvent.ChangeType.EDGES_ADDED));
+ }
+
+ /**
* @see org.cytoscape.group.CyGroup#removeNodes()
*/
@Override
- public void removeNodes(Collection<CyNode> nodes) {
+ public synchronized void removeNodes(List<CyNode> nodes) {
+ batchUpdate = true;
+ List<CyEdge> netEdges = new ArrayList<CyEdge>();
+ for (CyNode node: nodes) {
+ List<CyEdge> edges =
rootNetwork.getAdjacentEdgeList(node, CyEdge.Type.ANY);
+ for (CyEdge edge: edges) {
+ if (externalEdges.contains(edge))
+ externalEdges.remove(edge);
+ else {
+ netEdges.add(edge);
+ }
+ }
+ }
+ if (netEdges.size() > 0)
+ groupNet.removeEdges(netEdges);
groupNet.removeNodes(nodes);
+ batchUpdate = false;
+ cyEventHelper.fireEvent(new GroupChangedEvent(CyGroupImpl.this,
nodes, GroupChangedEvent.ChangeType.NODES_REMOVED));
}
/**
+ * @see org.cytoscape.group.CyGroup#removeEdges()
+ */
+ @Override
+ public synchronized void removeEdges(List<CyEdge> edges) {
+ List<CyEdge> netEdges = new ArrayList<CyEdge>();
+ for (CyEdge edge: edges) {
+ if (groupNet.containsEdge(edge))
+ netEdges.add(edge);
+ else if (externalEdges.contains(edge))
+ externalEdges.remove(edge);
+ else if (metaEdges.contains(edge))
+ metaEdges.remove(edge);
+ }
+ cyEventHelper.fireEvent(new GroupChangedEvent(CyGroupImpl.this,
edges, GroupChangedEvent.ChangeType.EDGES_REMOVED));
+ }
+
+ /**
* @see org.cytoscape.group.CyGroup#getRootNetwork()
*/
@Override
@@ -264,7 +329,7 @@
// First, we need to make sure this network is in the same
// root network as the group node
if (!inSameRoot(network))
- throw new IllegalArgumentException("Network not in same
root network as group");
+ throwIllegalArgumentException("Network not in same root
network as group");
if(!networkSet.contains(network))
networkSet.add(network);
@@ -335,9 +400,7 @@
// Expand it.
// Remove the group node from the target network
- List<CyNode> nodesToRemove = new ArrayList<CyNode>();
- nodesToRemove.add(groupNode);
- subnet.removeNodes(nodesToRemove);
+ subnet.removeNodes(Collections.singletonList(groupNode));
// Add all of the member nodes and edges in
for (CyNode n: getNodeList())
@@ -371,11 +434,41 @@
return collapseSet.contains(net);
}
- protected void addMetaEdge(CyEdge edge) {
+ /**
+ * Destroy this group. This will destroy the subnetwork, all metaEdges,
and
+ * the group node (if we created it). This is meant to be called from
the
+ * CyGroupManager, only.
+ */
+ public void destroyGroup() {
+ // Destroy the subNetwork
+ rootNetwork.removeSubNetwork(groupNet);
+ groupNet = null;
+
+ // Release all of our external edges
+ externalEdges = null;
+
+ // Remove all of our metaEdges from the root network
+ rootNetwork.removeEdges(metaEdges);
+
+ // If our group node was not provided, destroy it
+ if (!nodeProvided && rootNetwork.containsNode(groupNode)) {
+
rootNetwork.removeNodes(Collections.singletonList(groupNode));
+ }
+
+ networkSet = null;
+ collapseSet = null;
+ }
+
+ protected synchronized void addMetaEdge(CyEdge edge) {
if (!metaEdges.contains(edge))
metaEdges.add(edge);
}
+ protected synchronized void removeMetaEdge(CyEdge edge) {
+ if (!metaEdges.contains(edge))
+ metaEdges.remove(edge);
+ }
+
protected Set<CyEdge> getMetaEdgeList() {
return metaEdges;
}
@@ -391,4 +484,9 @@
return false;
return true;
}
+
+ private void throwIllegalArgumentException(String message) {
+ batchUpdate = false;
+ throw new IllegalArgumentException(message);
+ }
}
Modified:
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupManagerImpl.java
===================================================================
---
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupManagerImpl.java
2012-01-24 19:11:00 UTC (rev 28088)
+++
core3/impl/trunk/group-impl/src/main/java/org/cytoscape/group/internal/CyGroupManagerImpl.java
2012-01-24 19:12:08 UTC (rev 28089)
@@ -117,10 +117,8 @@
return;
cyEventHelper.fireEvent(new
GroupAboutToBeDestroyedEvent(CyGroupManagerImpl.this, group));
-
+ ((CyGroupImpl)group).destroyGroup();
groupSet.remove(group);
- for (CyNetwork network: group.getNetworkSet())
- group.removeGroupFromNetwork(network);
}
@Override
--
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.