Author: jm
Date: 2012-04-10 09:53:27 -0700 (Tue, 10 Apr 2012)
New Revision: 28779
Modified:
core3/impl/trunk/layout-cytoscape-impl/src/main/java/csapps/layout/algorithms/hierarchicalLayout/HierarchicalLayoutAlgorithmTask.java
Log:
Fixes #850: Fixed hierarchical layout so it maps nodes to indexes.
Modified:
core3/impl/trunk/layout-cytoscape-impl/src/main/java/csapps/layout/algorithms/hierarchicalLayout/HierarchicalLayoutAlgorithmTask.java
===================================================================
---
core3/impl/trunk/layout-cytoscape-impl/src/main/java/csapps/layout/algorithms/hierarchicalLayout/HierarchicalLayoutAlgorithmTask.java
2012-04-10 01:28:07 UTC (rev 28778)
+++
core3/impl/trunk/layout-cytoscape-impl/src/main/java/csapps/layout/algorithms/hierarchicalLayout/HierarchicalLayoutAlgorithmTask.java
2012-04-10 16:53:27 UTC (rev 28779)
@@ -1,6 +1,7 @@
package csapps.layout.algorithms.hierarchicalLayout;
import java.awt.geom.Point2D;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
@@ -99,18 +100,26 @@
return;
}
- // maps node's index (.getIndex()) to View<CyNode> of given node
- HashMap<Long, View<CyNode>> index2NodeView = new HashMap<Long,
View<CyNode>>(numNodes);
+ HashMap<Long, Integer> suid2Index = new HashMap<Long,
Integer>(numNodes);
+ List<View<CyNode>> nodeViews = new
ArrayList<View<CyNode>>(numNodes);
if (numSelectedNodes > 1) {
+ int index = 0;
for (CyNode n:
CyTableUtil.getNodesInState(network,"selected",true)){
- index2NodeView.put(n.getSUID(),
networkView.getNodeView(n));
+ Long suid = n.getSUID();
+ nodeViews.add(networkView.getNodeView(n));
+ suid2Index.put(suid, index);
+ index++;
}
} else {
+ int index = 0;
for (View<CyNode> nv: networkView.getNodeViews()){
if (cancelled)
return;
- index2NodeView.put(nv.getModel().getSUID(), nv);
+ Long suid = nv.getModel().getSUID();
+ nodeViews.add(nv);
+ suid2Index.put(suid, index);
+ index++;
}
}
@@ -124,8 +133,8 @@
for (View<CyEdge> ev: networkView.getEdgeViews()){
// FIXME: much better would be to query adjacent edges of
selected nodes...
- Long edgeFrom = ev.getModel().getSource().getSUID();
- Long edgeTo = ev.getModel().getTarget().getSUID();
+ Integer edgeFrom =
suid2Index.get(ev.getModel().getSource().getSUID());
+ Integer edgeTo =
suid2Index.get(ev.getModel().getTarget().getSUID());
if ((edgeFrom == null) || (edgeTo == null)) {
// Must be from an unselected node
@@ -136,10 +145,10 @@
return;
if ((numSelectedNodes <= 1)
- || ((edgeFrom.intValue() < numSelectedNodes)
- && (edgeTo.intValue() < numSelectedNodes))) {
+ || ((edgeFrom < numSelectedNodes)
+ && (edgeTo < numSelectedNodes))) {
/* add edge to graph */
- Edge theEdge = new Edge(edgeFrom.intValue(),
edgeTo.intValue());
+ Edge theEdge = new Edge(edgeFrom, edgeTo);
edges.add(theEdge);
}
}
@@ -272,10 +281,10 @@
reduced[x].setReduced(true);
int[] layerNew = new int[layerWithDummy.size()];
- Iterator iter = layerWithDummy.iterator();
+ Iterator<Integer> iter = layerWithDummy.iterator();
for (int i = 0; i < layerNew.length; i++)
- layerNew[i] = ((Integer)
iter.next()).intValue();
+ layerNew[i] = iter.next();
layer[x] = layerNew;
@@ -362,7 +371,7 @@
for (x = 0; x < resize; x++) {
if (x < numLayoutNodes)
- flowLayoutOrder[x] = new
HierarchyFlowLayoutOrderNode(index2NodeView.get(x), cI[x],
+ flowLayoutOrder[x] = new
HierarchyFlowLayoutOrderNode(nodeViews.get(x), cI[x],
reduced[cI[x]].getNodecount(),
layer[cI[x]][renumber[x]],
horizontalPosition[cI[x]][renumber[x]],
@@ -509,26 +518,25 @@
/* Map edges to edge views in order to map dummy nodes to edge
bends properly */
for (View<CyEdge>ev: networkView.getEdgeViews()){
- Long edgeFrom = ev.getModel().getSource().getSUID();
- Long edgeTo = ev.getModel().getTarget().getSUID();
+ Integer edgeFrom =
suid2Index.get(ev.getModel().getSource().getSUID());
+ Integer edgeTo =
suid2Index.get(ev.getModel().getTarget().getSUID());
if ((edgeFrom == null) || (edgeTo == null)) {
// Must be from an unselected node
continue;
}
- // DANGER: we're effectively casting Long to Integer
here. This needs to be rewritten!
if ((numSelectedNodes <= 1)
- || ((edgeFrom.longValue() < numSelectedNodes)
- && (edgeTo.longValue() < numSelectedNodes))) {
+ || ((edgeFrom < numSelectedNodes)
+ && (edgeTo < numSelectedNodes))) {
/* add edge to graph */
- Edge theEdge =
component[cI[edgeFrom.intValue()]].GetTheEdge(renumber[edgeFrom.intValue()],
-
renumber[edgeTo.intValue()]);
+ Edge theEdge =
component[cI[edgeFrom]].GetTheEdge(renumber[edgeFrom],
+
renumber[edgeTo]);
- if (myEdges2EdgeViews[cI[edgeFrom.intValue()]]
== null)
-
myEdges2EdgeViews[cI[edgeFrom.intValue()]] = new HashMap<Edge, View<CyEdge>>();
+ if (myEdges2EdgeViews[cI[edgeFrom]] == null)
+ myEdges2EdgeViews[cI[edgeFrom]] = new
HashMap<Edge, View<CyEdge>>();
-
myEdges2EdgeViews[cI[edgeFrom.intValue()]].put(theEdge, ev);
+ myEdges2EdgeViews[cI[edgeFrom]].put(theEdge,
ev);
}
}
@@ -559,15 +567,16 @@
View<CyEdge> ev =
myEdges2EdgeViews[cI[node.graphIndex]].get(theEdge);
if (ev != null) {
- long source =
ev.getModel().getSource().getSUID();
- long target =
ev.getModel().getTarget().getSUID();
- double k =
(getYPositionOf(index2NodeView, target) - getYPositionOf(index2NodeView,
source)) / (
-
getXPositionOf(index2NodeView, target) - getXPositionOf(index2NodeView,
source));
+ View<CyNode> source =
networkView.getNodeView(ev.getModel().getSource());
+ View<CyNode> target =
networkView.getNodeView(ev.getModel().getTarget());
+
+ double k = (getYPositionOf(target) -
getYPositionOf(source)) / (
+ getXPositionOf(target)
- getXPositionOf(source));
- double xPos =
getXPositionOf(index2NodeView, source);
+ double xPos = getXPositionOf(source);
if (k != 0)
- xPos += ((node.yPos -
getYPositionOf(index2NodeView, source)) / k);
+ xPos += ((node.yPos -
getYPositionOf(source)) / k);
Point2D p2d = new Point2D.Double();
p2d.setLocation(xPos, node.yPos);
@@ -603,11 +612,11 @@
taskMonitor.setProgress(1.0);
taskMonitor.setStatusMessage("hierarchical layout complete");
}
- private double getXPositionOf(HashMap<Long, View<CyNode>>
index2NodeView, long nodeIndex){
- return
index2NodeView.get(nodeIndex).getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION);
+ private double getXPositionOf(View<CyNode> nodeView){
+ return
nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION);
}
- private double getYPositionOf(HashMap<Long, View<CyNode>>
index2NodeView, long nodeIndex){
- return
index2NodeView.get(nodeIndex).getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION);
+ private double getYPositionOf(View<CyNode> nodeView){
+ return
nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION);
}
/**
@@ -892,7 +901,7 @@
}
}
- if (((dx % (startInd - endInd)) == 0) && (dx != 0))
+ if (startInd - endInd != 0 && dx % (startInd - endInd)
== 0 && (dx != 0))
if (!dirFirst) {
direct *= -1;
dirFirst = true;
--
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.