1 package flare.vis.operator.layout
3 import flare.vis.data.NodeSprite;
4 import flare.animate.Transitioner;
5 import flash.geom.Point;
6 import flare.util.Arrays;
7 import flare.vis.data.EdgeSprite;
10 * Layout that places tree nodes in an indented outline layout.
12 public class IndentedTreeLayout extends Layout
14 private var _bspace:Number = 5; // the spacing between sibling nodes
15 private var _dspace:Number = 50; // the spacing between depth levels
16 private var _depths:Array = new Array(20); // TODO make sure array regrows as needed
17 private var _maxDepth:int = 0;
18 private var _ax:Number, _ay:Number; // for holding anchor co-ordinates
19 private var _t:Transitioner; // temp variable for transitioner access
21 /** The spacing to use between depth levels (the amount of indent). */
22 public function get depthSpacing():Number { return _dspace; }
23 public function set depthSpacing(s:Number):void { _dspace = s; }
25 /** The spacing to use between rows in the layout. */
26 public function get breadthSpacing():Number { return _bspace; }
27 public function set breadthSpacing(s:Number):void { _bspace = s; }
29 // --------------------------------------------------------------------
32 * Creates a new IndentedTreeLayout.
33 * @param depthSpace the amount of indent between depth levels
34 * @param breadthSpace the amount of spacing between rows
36 public function IndentedTreeLayout(depthSpace:Number=50,
37 breadthSpace:Number=5)
39 _bspace = breadthSpace;
44 public override function operate(t:Transitioner=null):void
46 _t = t!=null ? t : Transitioner.DEFAULT; // set transitioner
48 Arrays.fill(_depths, 0);
51 var a:Point = layoutAnchor;
54 var root:NodeSprite = layoutRoot as NodeSprite;
55 if (root == null) return; // TODO: throw exception?
57 layoutNode(root,0,0,true);
59 _t = null; // clear transitioner reference
63 private function layoutNode(node:NodeSprite, height:Number, indent:uint, visible:Boolean):Number
65 var x:Number = _ax + indent * _dspace;
66 var y:Number = _ay + height;
67 var o:Object = _t.$(node);
72 o.alpha = visible ? 1.0 : 0.0;
75 if (node.parentEdge != null)
77 var e:EdgeSprite = node.parentEdge;
78 var p:NodeSprite = node.parentNode;
80 o.alpha = visible ? 1.0 : 0.0;
81 if (e.points == null) {
82 e.points = [(p.x+node.x)/2, (p.y+node.y)/2];
84 o.points = [_t.getValue(p,"x"), y];
87 if (visible) { height += node.height + _bspace; }
88 if (!node.expanded) { visible = false; }
90 if (node.childDegree > 0) // is not a leaf node
92 var c:NodeSprite = node.firstChildNode;
93 for (; c != null; c = c.nextNode) {
94 height = layoutNode(c, height, indent+1, visible);
100 } // end of class IndentedTreeLayout