1 package flare.vis.operator.filter
3 import flare.vis.operator.Operator;
4 import flare.animate.Transitioner;
5 import flare.vis.data.NodeSprite;
6 import flash.utils.Dictionary;
7 import flare.vis.data.EdgeSprite;
8 import flare.vis.data.DataSprite;
9 import flare.vis.data.Data;
12 * Filter operator that sets visible all items within a specified graph
13 * distance from a set of focus nodes.
15 public class GraphDistanceFilter extends Operator
17 /** An array of focal NodeSprites. */
18 public var focusNodes:/*NodeSprite*/Array;
19 /** Graph distance within which which items wll be visible. */
20 public var distance:int;
21 /** Flag indicating which graph links to traverse. */
25 * Creates a new GraphDistanceFilter.
26 * @param focusNodes an array of focal NodeSprites. Graph distance is
27 * measured as the minimum number of edge-hops to one of these nodes.
28 * @param distance graph distance within which items will be visible
29 * @param links flag indicating which graph links to traverse. The
30 * default value is <code>NodeSprite.GRAPH_LINKS</code>.
32 public function GraphDistanceFilter(focusNodes:Array, distance:int=1,
33 links:int=3/*NodeSprite.GRAPH_LINKS*/)
35 this.focusNodes = focusNodes;
36 this.distance = distance;
41 public override function operate(t:Transitioner=null):void
43 t = (t==null ? Transitioner.DEFAULT : t);
45 // initialize breadth-first traversal
46 var q:Array = [], depths:Dictionary = new Dictionary();
47 for each (var fn:NodeSprite in focusNodes) {
49 fn.visitEdges(function(e:EdgeSprite):void {
55 // perform breadth-first traversal
56 var xe:EdgeSprite, xn:NodeSprite, d:int;
57 while (q.length > 0) {
58 xe = q.shift(); d = depths[xe];
59 xn = (depths[xe.source] == undefined ? xe.source : xe.target);
61 if (d == distance) continue; // stop traversal at max distance
63 xn.visitEdges(function(e:EdgeSprite):void {
64 if (depths[e] == undefined) {
71 // now set visibility based on traversal results
72 visualization.data.visit(function(ds:DataSprite):void {
73 var visible:Boolean = (depths[ds] != undefined);
74 var alpha:Number = visible ? 1 : 0;
75 var obj:Object = t.$(ds);
78 if (ds is NodeSprite) {
79 var ns:NodeSprite = ds as NodeSprite;
80 ns.expanded = (visible && depths[ds] < distance);
85 obj.visible = visible;
90 } // end of class GraphDistanceFilter