package flare.vis.controls { import flare.util.Vectors; import flare.vis.Visualization; import flash.utils.Proxy; import flash.utils.flash_proxy; /** * A ControlList maintains a sequential chain of controls for interacting * with a visualization. Controls may perform operations such as selection, * panning, zooming, and expand/contract. Controls can be added to a * ControlList using the add method. Once added, controls can be * retrieved and set using their index in the lists, either with array * notation ([]) or with the getControlAt and * setControlAt methods. */ public class ControlList extends Proxy implements IMXMLObject { protected var _vis:Visualization; protected var _list:Vector. = new Vector.(); /** The visualization manipulated by these controls. */ public function get visualization():Visualization { return _vis; } public function set visualization(v:Visualization):void { _vis = v; for each (var ic:IControl in _list) { ic.attach(v); } } /** An object vector of the controls contained in the control list. */ public function set list(ctrls:Vector.):void { // first remove all current operators while (_list.length > 0) { removeControlAt(_list.length-1); } // then add the new operators for each (var ic:IControl in ctrls) { add(ic); } } /** The number of controls in the list. */ public function get length():uint { return _list.length; } // -------------------------------------------------------------------- /** * Creates a new ControlList. * @param ops an ordered set of controls to include in the list. */ public function ControlList(...controls) { for each (var ic:IControl in controls) { add(ic); } } /** * Proxy method for retrieving controls from the internal object vector. */ flash_proxy override function getProperty(name:*):* { return _list[name]; } /** * Proxy method for setting controls in the internal object vector. */ flash_proxy override function setProperty(name:*, value:*):void { if (value is IControl) { var ic:IControl = IControl(value); _list[name].detach(); _list[name] = ic; ic.attach(_vis); } else { throw new ArgumentError("Input value must be an IControl."); } } /** * Returns the control at the specified position in the list * @param i the index into the control list * @return the requested control */ public function getControlAt(i:uint):IControl { return _list[i] as IControl; } /** * Removes the control at the specified position in the list * @param i the index into the control list * @return the removed control */ public function removeControlAt(i:uint):IControl { var ic:IControl = Vectors.removeAt(_list, i) as IControl; if (ic) ic.detach(); return ic; } /** * Set the control at the specified position in the list * @param i the index into the control list * @param ic the control to place in the list * @return the control previously at the index */ public function setControlAt(i:uint, ic:IControl):IControl { var old:IControl = _list[i] as IControl; _list[i] = ic; old.detach(); ic.attach(_vis); return old; } /** * Adds a control to the end of this list. * @param ic the control to add */ public function add(ic:IControl):void { ic.attach(_vis); _list.push(ic); } /** * Adds a control at the specified index in the list. * @param ic the control to add * @param idx the index into the list */ public function addAt(ic:IControl, idx:int):void { ic.attach(_vis); _list.splice(idx, 0, ic); } /** * Removes an control from this list. * @param ic the control to remove * @return true if the control was found and removed, false otherwise */ public function remove(ic:IControl):IControl { var idx:int = Vectors.remove(_list, ic); if (idx >= 0) ic.detach(); return ic; } /** * Removes all controls from this list. */ public function clear():void { for each (var ic:IControl in _list) { ic.detach(); } Vectors.clear(_list); } // -- MXML ------------------------------------------------------------ /** @private */ public function initialized(document:Object, id:String):void { // do nothing } } // end of class ControlList }