package flare.vis.controls
{
import flare.vis.events.SelectionEvent;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Graphics;
import flash.display.InteractiveObject;
import flash.display.Shape;
import flash.display.Stage;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
[Event("select", type="flare.vis.events.SelectionEvent")]
[Event("deselect", type="flare.vis.events.SelectionEvent")]
/**
* Interactive control for selecting a group of objects by "rubber-banding"
* them with a rectangular section region.
*/
public class SelectionControl extends Control
{
private var _r:Rectangle = new Rectangle();
private var _drag:Boolean = false;
private var _shape:Shape = new Shape();
private var _hit:InteractiveObject;
private var _stage:Stage;
private var _sel:Dictionary = new Dictionary();
private var _add0:DisplayObject = null;
private var _rem0:DisplayObject = null;
private var _add:Array = null;
private var _rem:Array = null;
/** The active hit area over which selection
* interactions can be performed. */
public function get hitArea():InteractiveObject { return _hit; }
public function set hitArea(hitArea:InteractiveObject):void {
if (_hit != null) onRemove();
_hit = hitArea;
if (_object && _object.stage != null) onAdd();
}
/** Indicates if a selection events should be fired immediately upon a
* chane of selection status (true) or after the mouse is released
* (false). The default is true. Set this to false if immediate
* selections are causing any performance issues. */
public var fireImmediately:Boolean = true;
/** Line color of the selection region border. */
public var lineColor:uint = 0x8888FF;
/** Line alpha of the selection region border. */
public var lineAlpha:Number = 0.4;
/** Line width of the selection region border. */
public var lineWidth:Number = 2;
/** Fill color of the selection region. */
public var fillColor:uint = 0x8888FF;
/** Fill alpha of the selection region. */
public var fillAlpha:Number = 0.2;
/**
* Creates a new SelectionControl.
* @param filter an optional Boolean-valued filter determining which
* items are eligible for selection.
* @param hitArea a display object to use as the hit area for mouse
* events. For example, this could be a background region over which
* the selection can done. If this argument is null,
* the stage will be used.
* @param select an optional SelectionEvent listener for selections
* @param deselect an optional SelectionEvent listener for deselections
*/
public function SelectionControl(filter:*=n