]> git.mjollnir.org Git - moodle.git/blob
102c0cc403dcd17d2d0d10650d2bdccca8a99605
[moodle.git] /
1 package flare.vis.operator.layout
2 {
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;
8         
9         /**
10          * Layout that places tree nodes in an indented outline layout.
11          */
12         public class IndentedTreeLayout extends Layout
13         {               
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
20                 
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; }
24                 
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; }
28                 
29                 // --------------------------------------------------------------------
30                 
31                 /**
32                  * Creates a new IndentedTreeLayout.
33                  * @param depthSpace the amount of indent between depth levels
34                  * @param breadthSpace the amount of spacing between rows
35                  */             
36                 public function IndentedTreeLayout(depthSpace:Number=50,
37                                                                                    breadthSpace:Number=5)
38                 {
39                         _bspace = breadthSpace;
40                         _dspace = depthSpace;
41                 }
42                 
43                 /** @inheritDoc */
44                 public override function operate(t:Transitioner=null):void
45                 {
46                         _t = t!=null ? t : Transitioner.DEFAULT; // set transitioner
47                         
48                 Arrays.fill(_depths, 0);
49                 _maxDepth = 0;
50         
51                 var a:Point = layoutAnchor;
52                 _ax = a.x; _ay = a.y;
53         
54                 var root:NodeSprite = layoutRoot as NodeSprite;
55                 if (root == null) return; // TODO: throw exception?
56                 
57                 layoutNode(root,0,0,true);      
58
59                 _t = null; // clear transitioner reference
60         }
61         
62         
63         private function layoutNode(node:NodeSprite, height:Number, indent:uint, visible:Boolean):Number
64         {
65                 var x:Number = _ax + indent * _dspace;
66                 var y:Number = _ay + height;
67                 var o:Object = _t.$(node);
68                 
69                 // update node
70                 o.x = x;
71                 o.y = y;
72                 o.alpha = visible ? 1.0 : 0.0;
73                 
74                 // update edge
75                 if (node.parentEdge != null) 
76                 {
77                         var e:EdgeSprite = node.parentEdge;
78                         var p:NodeSprite = node.parentNode;
79                         o = _t.$(e); 
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];
83                         }
84                         o.points = [_t.getValue(p,"x"), y];
85                 }
86                 
87                 if (visible) { height += node.height + _bspace; }
88                 if (!node.expanded) { visible = false; }
89                 
90                 if (node.childDegree > 0) // is not a leaf node
91                 {                       
92                         var c:NodeSprite = node.firstChildNode;                         
93                         for (; c != null; c = c.nextNode) {
94                                 height = layoutNode(c, height, indent+1, visible);
95                         }
96                 }
97                 return height;
98         }
99         
100         } // end of class IndentedTreeLayout
101 }