Files
narya/src/java/com/threerings/nodemap/direction/DirectionalLayoutManager.java
T
Walter Korman 2c98b8ce10 Revamped node map and scene node map to share a single scene map
manager and obtain building information from the config object.
Separated test code from base scene node map code.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@351 542714f4-19e9-0310-aa3c-eee0fc999fb1
2001-09-28 00:46:54 +00:00

107 lines
2.3 KiB
Java

//
// $Id: DirectionalLayoutManager.java,v 1.3 2001/09/28 00:46:54 shaper Exp $
package com.threerings.nodemap.direction;
import java.util.*;
import com.threerings.nodemap.*;
/**
* The directional layout manager lays nodes out according to the
* eight cardinal directions as specified in the {@link Directions}
* class. The nodes must be fully connected in both directions with
* {@link DirectionalEdge} edges.
*/
public class DirectionalLayoutManager implements LayoutManager
{
/**
* Construct a directional layout manager that lays out nodes
* connected by edges that are <code>edgelen</code> pixels long.
*
* @param edgelen the length of the edges in pixels.
*/
public DirectionalLayoutManager (int edgelen)
{
_edgelen = edgelen;
_closed = new HashMap();
}
public void layout (Node root, List nodes)
{
_closed.clear();
// lay out all nodes
layoutNode(root, 0, 0, root);
}
protected void layoutNode (Node root, int x, int y, Node n)
{
// consider each node only once for now
if (_closed.containsKey(n)) {
return;
}
// set the node's location
n.setLocation(x, y);
// remember that we've placed this node
_closed.put(n, null);
Iterator iter = n.getEdges();
while (iter.hasNext()) {
DirectionalEdge e = (DirectionalEdge)iter.next();
int tx = x, ty = y;
int wid = e.dst.getWidth(), hei = e.dst.getHeight();
// shift the node in the appropriate direction
switch (e.dir) {
case Directions.NORTH:
tx -= (_edgelen + wid);
ty -= (_edgelen + hei);
break;
case Directions.NORTHEAST:
ty -= (_edgelen + hei);
break;
case Directions.EAST:
tx += (_edgelen + wid);
ty -= (_edgelen + hei);
break;
case Directions.SOUTHEAST:
tx += (_edgelen + wid);
break;
case Directions.SOUTH:
tx += (_edgelen + wid);
ty += (_edgelen + hei);
break;
case Directions.SOUTHWEST:
ty += (_edgelen + hei);
break;
case Directions.WEST:
tx -= (_edgelen + wid);
ty += (_edgelen + hei);
break;
case Directions.NORTHWEST:
tx -= (_edgelen + wid);
break;
}
layoutNode(root, tx, ty, e.dst);
}
}
/** The length of the edges between nodes in pixels. */
protected int _edgelen;
/** The set of nodes already positioned. */
protected HashMap _closed;
}