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.

Reply via email to