Author: scooter
Date: 2011-06-17 12:58:54 -0700 (Fri, 17 Jun 2011)
New Revision: 25794
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/resources/plugin.props
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodeGroupViewer.java
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodePlugin2.java
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNodeManager.java
Log:
Fixes for use cases articulated by Jon Kornhauser.
Modified: csplugins/trunk/ucsf/scooter/metaNodePlugin2/resources/plugin.props
===================================================================
--- csplugins/trunk/ucsf/scooter/metaNodePlugin2/resources/plugin.props
2011-06-17 19:23:04 UTC (rev 25793)
+++ csplugins/trunk/ucsf/scooter/metaNodePlugin2/resources/plugin.props
2011-06-17 19:58:54 UTC (rev 25794)
@@ -31,4 +31,4 @@
pluginAuthorsIntsitutions=John "Scooter" Morris:UCSF
# Date this plugin/plugin version was released
-releaseDate=October 1, 2010
+releaseDate=July 15, 2011
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodeGroupViewer.java
===================================================================
---
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodeGroupViewer.java
2011-06-17 19:23:04 UTC (rev 25793)
+++
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodeGroupViewer.java
2011-06-17 19:58:54 UTC (rev 25794)
@@ -145,7 +145,7 @@
public void groupCreated(CyGroup group) {
// logger.debug("groupCreated("+group+")");
if (MetaNodeManager.getMetaNode(group) == null) {
- MetaNode newNode =
MetaNodeManager.createMetaNode(group);
+ MetaNode newNode =
MetaNodeManager.createMetaNode(group, false);
}
// Update the attributes of the group node
logger.info("updating group panel for new group: "+group);
@@ -172,7 +172,7 @@
initializeGroups(myview);
return;
}
- MetaNode newNode =
MetaNodeManager.createMetaNode(group);
+ MetaNode newNode =
MetaNodeManager.createMetaNode(group, true);
// We need to be a little tricky if we are restoring a
collapsed
// metaNode from XGMML. We essentially need to
"recollapse" it,
@@ -326,9 +326,12 @@
if (metaGroups != null) {
for (CyGroup group: metaGroups) {
// Create the metanode
- MetaNode newNode =
MetaNodeManager.createMetaNode(group);
+ MetaNode newNode =
MetaNodeManager.createMetaNode(group, true);
if (group.getState() ==
MetaNodePlugin2.COLLAPSED) {
newNode.recollapse(view);
+ } else {
+ CyNetwork network = view.getNetwork();
+ network.hideNode(group.getGroupNode());
}
}
}
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodePlugin2.java
===================================================================
---
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodePlugin2.java
2011-06-17 19:23:04 UTC (rev 25793)
+++
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/MetaNodePlugin2.java
2011-06-17 19:58:54 UTC (rev 25794)
@@ -91,7 +91,7 @@
GraphViewChangeListener {
public static final String viewerName = "metaNode";
- public static final double VERSION = 1.5;
+ public static final double VERSION = 1.6;
public CyLogger logger = null;
public enum Command {
NONE("none"),
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
===================================================================
---
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
2011-06-17 19:23:04 UTC (rev 25793)
+++
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
2011-06-17 19:58:54 UTC (rev 25794)
@@ -78,6 +78,7 @@
public static final String Y_HINT_ATTR = "__metanodeHintY";
public static final String CHILDREN_ATTR = "NumChildren";
public static final String DESCENDENTS_ATTR = "NumDescendents";
+ public static final String ISMETA_EDGE_ATTR = "__isMetaEdge";
private CyLogger logger = null;
private CyGroup metaGroup = null;
@@ -99,15 +100,16 @@
* Main constructor -- should this extend CyGroup????
*
* @param group the group to wrap the MetaNode around
+ * @param ignoreMetaEdges if true, be careful with marked metaEdges
*/
- protected MetaNode(CyGroup group) {
+ protected MetaNode(CyGroup group, boolean ignoreMetaEdges) {
metaGroup = group;
logger = CyLogger.getLogger(MetaNode.class);
- logger.debug("Creating new metanode: "+group.getGroupNode());
+ // logger.debug("Creating new metanode:
"+group.getGroupNode()+", ignoreMetaEdges = "+ignoreMetaEdges);
// This method does most of the work.
- updateMetaEdges();
+ updateMetaEdges(ignoreMetaEdges);
}
@@ -123,12 +125,12 @@
* @param node the CyNode that was added
*/
public void nodeAdded(CyNode node) {
- logger.debug("node added "+metaGroup);
+ // logger.debug("node added "+metaGroup);
// Recreate our meta-edges. There might be more efficient ways
of doing this
// than recreating everything, but the performance of
updateMetaEdges isn't too
// bad, and the complexity of managing the state necessary to
update meta-edges
// on a more granular basis isn't warranted.
- updateMetaEdges();
+ updateMetaEdges(false);
// Now, if this node is a child of a different metaNode, we
need to create
// metaEdges for that metaNode and this node.
@@ -148,9 +150,9 @@
* @param node the CyNode that was removed
*/
public void nodeRemoved(CyNode node) {
- logger.debug("node removed "+metaGroup);
+ // logger.debug("node removed "+metaGroup);
// First step, we need to remove any new meta-edges
- updateMetaEdges();
+ updateMetaEdges(false);
// Now, remove our member edge (if there is one)
if (membershipEdges != null &&
membershipEdges.containsKey(node))
membershipEdges.remove(node);
@@ -165,7 +167,7 @@
* @param view the view to use
*/
public void recollapse(CyNetworkView view) {
- logger.debug("recollapse "+metaGroup);
+ // logger.debug("recollapse "+metaGroup);
if (view == null)
view =
Cytoscape.getNetworkView(metaGroup.getNetwork().getIdentifier());
else
@@ -182,7 +184,7 @@
* @param updateNetwork if 'true', actually update the network
*/
public void collapse(CyNetworkView view) {
- logger.debug("collapse "+metaGroup+": isCollapsed =
"+isCollapsed()+" isHidden = "+isHidden()+" state = "+metaGroup.getState());
+ // logger.debug("collapse "+metaGroup+": isCollapsed =
"+isCollapsed()+" isHidden = "+isHidden()+" state = "+metaGroup.getState());
if (isCollapsed())
return;
@@ -214,7 +216,7 @@
* @param update update the display?
*/
public void expand(CyNetworkView view) {
- logger.debug("expand "+metaGroup+": isCollapsed =
"+isCollapsed()+" isHidden = "+isHidden()+" state = "+metaGroup.getState());
+ // logger.debug("expand "+metaGroup+": isCollapsed =
"+isCollapsed()+" isHidden = "+isHidden()+" state = "+metaGroup.getState());
if (!isCollapsed())
return;
@@ -280,8 +282,11 @@
* @return the created metaEdge
*/
public CyEdge createMetaEdge(String edgeName, CyNode source, CyNode
target) {
- logger.debug("Creating metaedge: meta-"+edgeName+" between
"+source+" and "+target);
+ CyAttributes edgeAttributes = Cytoscape.getEdgeAttributes();
+ // logger.debug("Creating metaedge: meta-"+edgeName+" between
"+source+" and "+target);
CyEdge newEdge = createEdge("meta-", edgeName, source, target);
+ edgeAttributes.setAttribute(newEdge.getIdentifier(),
ISMETA_EDGE_ATTR, Boolean.TRUE);
+ edgeAttributes.setUserVisible(ISMETA_EDGE_ATTR, false);
metaEdges.put(newEdge,newEdge);
return newEdge;
}
@@ -329,7 +334,7 @@
*
* @return meta-edge list
*/
- public Collection getMetaEdges() {
+ public Collection<CyEdge> getMetaEdges() {
return metaEdges.values();
}
@@ -502,7 +507,7 @@
* if the partner is in a group:
* add ourselves to the group's meta edge list
*/
- private void updateMetaEdges() {
+ private void updateMetaEdges(boolean ignoreMetaEdges) {
// Initialize our meta-edge map
metaEdges = new HashMap<CyEdge, CyEdge>();
@@ -514,9 +519,20 @@
CyNode node = getPartner(edge);
// logger.debug("Outer edge = "+edge.getIdentifier());
- // Create the meta-edge to the external node
- CyEdge metaEdge = createMetaEdge(edge.getIdentifier(),
metaGroup.getGroupNode(), node);
+ if (ignoreMetaEdges && isMeta(edge)) {
+ // logger.debug("...ignoring");
+ addMetaEdge(edge);
+ continue;
+ }
+ // Create the meta-edge to the external node, but
maintain the directionality of the
+ // original edge
+ CyEdge metaEdge = null;
+ if (isIncoming(edge))
+ metaEdge = createMetaEdge(edge.getIdentifier(),
node, metaGroup.getGroupNode());
+ else
+ metaEdge = createMetaEdge(edge.getIdentifier(),
metaGroup.getGroupNode(), node);
+
MetaNode metaPartner =
MetaNodeManager.getMetaNode(node);
if (metaPartner != null &&
metaPartner.metaGroup.getNetwork().equals(metaGroup.getNetwork())) {
// Recursively add links to the appropriate
children
@@ -616,11 +632,26 @@
MetaNode partner =
MetaNodeManager.getMetaNode(partnerGroup.getGroupNode());
if (partner != null) {
// Create a meta-meta edge
- CyEdge metaMetaEdge =
createMetaEdge(connectingEdge.getIdentifier(), metaGroup.getGroupNode(),
-
partnerGroup.getGroupNode());
+ CyEdge metaMetaEdge = null;
+ if (isIncoming(connectingEdge))
+ metaMetaEdge =
createMetaEdge(connectingEdge.getIdentifier(), partnerGroup.getGroupNode(),
+
metaGroup.getGroupNode());
+ else
+ metaMetaEdge =
createMetaEdge(connectingEdge.getIdentifier(), metaGroup.getGroupNode(),
+
partnerGroup.getGroupNode());
partner.addMetaEdge(metaMetaEdge);
// Add our meta-edge to the partner
group
partner.addMetaEdge(metaEdge);
+
+ // Now, get our partner's metaEdges and
if any of them point to our children,
+ // add them to our outer edges
+ for (CyEdge outerEdge:
partner.getMetaEdges()) {
+ // logger.debug("Looking at
"+partnerNode+" edge "+outerEdge.getIdentifier());
+ if
(isConnectingEdge(outerEdge)) {
+ // logger.debug("Adding
edge "+outerEdge.getIdentifier()+" to our outer edge map");
+
metaGroup.addOuterEdge(outerEdge);
+ }
+ }
}
}
}
@@ -704,4 +735,32 @@
return target;
}
+ /**
+ * Test the direction of the node
+ *
+ * @param edge the edge to test the direction of
+ * @return true if the edge is directed towards us
+ */
+ private boolean isIncoming(CyEdge edge) {
+ CyNode source = (CyNode)edge.getSource();
+ CyNode target = (CyNode)edge.getTarget();
+ if (source == metaGroup.getGroupNode() ||
metaGroup.getNodes().contains(source))
+ return false;
+ return true;
+ }
+
+ /**
+ * See if this edge is a metaEdge
+ *
+ * @param edge the edge in question
+ * @return true if this is a metaedge
+ */
+ private boolean isMeta(CyEdge edge) {
+ CyAttributes edgeAttributes = Cytoscape.getEdgeAttributes();
+ Boolean b =
edgeAttributes.getBooleanAttribute(edge.getIdentifier(), ISMETA_EDGE_ATTR);
+ if (b != null && b.booleanValue())
+ return true;
+ return false;
+ }
+
}
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNodeManager.java
===================================================================
---
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNodeManager.java
2011-06-17 19:23:04 UTC (rev 25793)
+++
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNodeManager.java
2011-06-17 19:58:54 UTC (rev 25794)
@@ -86,8 +86,26 @@
return null;
}
+ /**
+ * Create a new metanode
+ *
+ * @param metaGroup the CyGroup that we want to turn into a metanode
+ */
static public MetaNode createMetaNode(CyGroup metaGroup) {
- MetaNode mn = new MetaNode(metaGroup);
+ return createMetaNode(metaGroup, false);
+ }
+
+ /**
+ * Create a new metanode. This version is used when we're called
+ * from the XGMML reader so that we can carefully deal with saved
+ * meta-edges.
+ *
+ * @param metaGroup the CyGroup that we want to turn into a metanode
+ * @param ignoreMetaEdges if true, be careful with metaedges that we've
already saved
+ */
+
+ static public MetaNode createMetaNode(CyGroup metaGroup, boolean
ignoreMetaEdges) {
+ MetaNode mn = new MetaNode(metaGroup, ignoreMetaEdges);
metaMap.put(metaGroup.getGroupNode(), mn);
mn.setUseNestedNetworks(useNestedNetworksDefault);
mn.setHideMetaNode(hideMetanodeDefault);
--
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.