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

📄 expressioniterator.as

📁 用于flash/flex的 as3的 2D图形图像图表的动态生成
💻 AS
字号:
package flare.query
{	
	/**
	 * The ExpressionIterator simplifies the process of traversing an
	 * expression tree.
	 */
	public class ExpressionIterator
	{
		private var _estack:Array;
		private var _istack:Array;
		private var _root:Expression;
		private var _cur:Expression;
		private var _idx:int;
		
		/** The expression being traversed. */
		public function get expression():Expression { return _root; }
		public function set expression(expr:Expression):void {
			_root = expr; reset();
		}
		/** The parent expression of the iterator's current position. */
		public function get parent():Expression { return _estack[_estack.length-1]; }
		/** The expression at this iterator's current position. */
		public function get current():Expression { return _cur; }
		/** The depth of this iterator's current position in the
		 *  expression tree. */
		public function get depth():int { return _estack.length; }
		/** An array of expressions from the root expression down to this
		 *  iterator's current position. */
		public function get path():Array {
			var a:Array = new Array(_estack.length);
			for (var i:int=0; i<a.length; ++i) { a[i] = _estack[i]; }
			a.push(_cur);
			return a;
		}
		
		/**
		 * Creates a new ExpressionIterator.
		 * @param expr the expression to iterate over
		 */
		public function ExpressionIterator(expr:Expression=null) {
			expression = expr;
		}
		
		/**
		 * Resets this iterator to the root of the expression tree.
		 */
		public function reset():void
		{
			_estack = new Array();
			_istack = new Array();
			_cur = _root;
			_idx = 0;
		}
		
		/**
		 * Moves the iterator one level up the expression tree.
		 * @return the new current expression, or null if the iterator
		 *  could not move any further up the tree
		 */
		public function up():Expression
		{
			if (_cur != _root) {
				_cur = _estack.pop();
				_idx = _istack.pop();
				return _cur;
			} else {
				return null;
			}
		}
		
		/**
		 * Moves the iterator one level down the expression tree. By default,
		 * the iterator moves to the left-most child of the previous position.
		 * @param idx the index of the child expression this iterator should
		 *  move down to
		 * @return the new current expression, or null if the iterator
		 *  could not move any further down the tree
		 */
		public function down(idx:int=0):Expression
		{
			if (idx >= 0 && _cur.numChildren > idx) {
				_estack.push(_cur);
				_istack.push(_idx);
				_idx = idx;
				_cur = _cur.getChildAt(_idx);
				return _cur;
			} else {
				return null;
			}
		}
		
		/**
		 * Moves the iterator to the next sibling expression in the expression
		 * tree.
		 * @return the new current expression, or null if the current position
		 *  has no next sibling.
		 */
		public function next():Expression
		{
			if (_estack.length > 0) {
				var p:Expression = _estack[_estack.length-1];
				if (p.numChildren > _idx+1) {
					_idx = _idx + 1;
					_cur = p.getChildAt(_idx);
					return _cur;
				}
			}
			return null;
		}
		
		/**
		 * Moves the iterator to the previous sibling expression in the
		 * expression tree.
		 * @return the new current expression, or null if the current position
		 *  has no previous sibling.
		 */
		public function prev():Expression
		{
			if (_estack.length > 0) {
				var p:Expression = _estack[_estack.length-1];
				if (_idx > 0) {
					_idx = _idx - 1;
					_cur = p.getChildAt(_idx);
					return _cur;
				}
			}
			return null;
		}
		
	} // end of class ExpressionIterator
}

⌨️ 快捷键说明

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