⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indentedtreelayout.as

📁 用于flash/flex的 as3的 2D图形图像图表的动态生成
💻 AS
字号:
package flare.vis.operator.layout
{
	import flare.vis.data.NodeSprite;
	import flare.animate.Transitioner;
	import flash.geom.Point;
	import flare.util.Arrays;
	import flare.vis.data.EdgeSprite;
	
	/**
	 * Layout that places tree nodes in an indented outline layout.
	 */
	public class IndentedTreeLayout extends Layout
	{		
		private var _bspace:Number = 5;  // the spacing between sibling nodes
    	private var _dspace:Number = 50; // the spacing between depth levels
    	private var _depths:Array = new Array(20); // TODO make sure array regrows as needed
    	private var _maxDepth:int = 0;
    	private var _ax:Number, _ay:Number; // for holding anchor co-ordinates
		
		/** The spacing to use between depth levels (the amount of indent). */
		public function get depthSpacing():Number { return _dspace; }
		public function set depthSpacing(s:Number):void { _dspace = s; }
		
		/** The spacing to use between rows in the layout. */
		public function get breadthSpacing():Number { return _bspace; }
		public function set breadthSpacing(s:Number):void { _bspace = s; }
		
		// --------------------------------------------------------------------
		
		/**
		 * Creates a new IndentedTreeLayout.
		 * @param depthSpace the amount of indent between depth levels
		 * @param breadthSpace the amount of spacing between rows
		 */		
		public function IndentedTreeLayout(depthSpace:Number=50,
										   breadthSpace:Number=5)
		{
			_bspace = breadthSpace;
			_dspace = depthSpace;
		}
		
		/** @inheritDoc */
		protected override function layout():void
		{
        	Arrays.fill(_depths, 0);
        	_maxDepth = 0;
        
        	var a:Point = layoutAnchor;
        	_ax = a.x + layoutBounds.x;
        	_ay = a.y + layoutBounds.y;
        
        	var root:NodeSprite = layoutRoot as NodeSprite;
        	if (root == null) return; // TODO: throw exception?
        	
        	layoutNode(root,0,0,true);
    	}
    	
    	
    	private function layoutNode(node:NodeSprite, height:Number, indent:uint, visible:Boolean):Number
    	{
    		var x:Number = _ax + indent * _dspace;
    		var y:Number = _ay + height;
    		var o:Object = _t.$(node);
    		node.h = _t.endSize(node, _rect).height;
    		
    		// update node
    		o.x = x;
    		o.y = y;
    		o.alpha = visible ? 1.0 : 0.0;
    		
    		// update edge
    		if (node.parentEdge != null) 
    		{
    			var e:EdgeSprite = node.parentEdge;
    			var p:NodeSprite = node.parentNode;
    			o = _t.$(e); 
    			o.alpha = visible ? 1.0 : 0.0;
    			if (e.points == null) {
					e.points = [(p.x+node.x)/2, (p.y+node.y)/2];
    			}
    			o.points = [_t.getValue(p,"x"), y];
    		}
    		
    		if (visible) { height += node.h + _bspace; }
    		if (!node.expanded) { visible = false; }
    		
    		if (node.childDegree > 0) // is not a leaf node
    		{    			
    			var c:NodeSprite = node.firstChildNode;   			
    			for (; c != null; c = c.nextNode) {
    				height = layoutNode(c, height, indent+1, visible);
    			}
    		}
    		return height;
    	}
    	
	} // end of class IndentedTreeLayout
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -