package flare.vis.controls { import flare.vis.Visualization; import flare.vis.operator.layout.Layout; import flash.display.InteractiveObject; import flash.events.Event; import flash.geom.Point; /** * Interactive control for updating a layout's anchor point in response * to mouse movement. This control is often used to dynamically update a * focus+context distortion. */ public class AnchorControl extends Control { private var _layout:Layout; public function get layout():Layout { return _layout; } public function set layout(l:Layout):void { _layout = l; } /** Update function called when the layout anchor changes. */ public var update:Function = function():void { Visualization(_object).update(); } // -------------------------------------------------------------------- /** * Creates a new AnchorControl * @param layout the layout on which to update the anchor point */ public function AnchorControl(layout:Layout=null) { _layout = layout; } /** @inheritDoc */ public override function attach(obj:InteractiveObject):void { super.attach(obj); if (obj != null) { obj.addEventListener(Event.ENTER_FRAME, updateMouse); } } /** @inheritDoc */ public override function detach():InteractiveObject { if (_object != null) { _object.removeEventListener(Event.ENTER_FRAME, updateMouse); } return super.detach(); } /** * Causes the layout anchor to be updated according to the current * mouse position. * @param evt an optional mouse event */ public function updateMouse(evt:Event=null):void { // get current anchor, run update if changed var p1:Point = _layout.layoutAnchor; _layout.layoutAnchor = new Point(_object.mouseX, _object.mouseY); // distortion might snap the anchor to the layout bounds // so we need to re-retrieve the point to ensure accuracy var p2:Point = _layout.layoutAnchor; if (p1.x != p2.x || p1.y != p2.y) update(); } } // end of class AnchorControl }