    package flare.vis.controls
    {
        import flare.animate.Tween;
        import flare.display.TextSprite;
        import flare.vis.events.TooltipEvent;

        import flash.display.DisplayObject;
        import flash.display.DisplayObjectContainer;
        import flash.display.InteractiveObject;
        import flash.display.Stage;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.filters.DropShadowFilter;
        import flash.geom.Rectangle;
        import flash.text.TextFormat;
        import flash.utils.Timer;

        [Event("show", type="flare.vis.events.TooltipEvent")]
        [Event("hide", type="flare.vis.events.TooltipEvent")]
        [Event("update", type="flare.vis.events.TooltipEvent")]

        /**
         * Interactive control for displaying a tooltip in response to mouse
         * hovers exceeding a minimum time interval. By default, a
         * <code>flare.display.TextSprite</code> instance is used to show a
         * tooltip. To change the tooltip text, clients can set either the
         * <code>text</code> or <code>htmlText</code> properties of this
         * <code>TextSprite</code>. For example:
         *
         * <pre>
         * // create a new tooltip control and set the text
         * var ttc:TooltipControl = new TooltipControl();
         * TextSprite(ttc.tooltip).text = "The tooltip text";
         * </pre>
         *
         * <p>Furthermore, this control fires events corresponding to tooltip show,
         * update (move), and hide events. Listeners can be added to dynamically
         * change the tooltip text when these events occur. Additionally, the
         * default text tooltip can be replaced with an arbitrary
         * <code>DisplyObject</code> to provide completely customized tooltips.</p>
         *
         * @see flare.vis.events.TooltipEvent
         * @see flare.display.TextSprite
         */
        public class TooltipControl extends Control
        {
            private var _cur:DisplayObject;

            private var _showTimer:Timer;
            private var _hideTimer:Timer;
            private var _show:Boolean = false;
            private var _t:Tween;

            /** The tooltip delay, in milliseconds. */
            public function get showDelay():Number { return _showTimer.delay; }
            public function set showDelay(d:Number):void { _showTimer.delay = d; }

            /** The delay before hiding a tooltip, in milliseconds. */
            public function get hideDelay():Number { return _hideTimer.delay; }
            public function set hideDelay(d:Number):void { _hideTimer.delay = d; }

            /** The legal bounds for the tooltip in stage coordinates.
             *  If null (the default), the full stage bounds are used. */
            public var tipBounds:Rectangle = null;

            /** The x-offset from the mouse at which to place the tooltip. */
            public var xOffset:Number = 0;
            /** The y-offset from the mouse at which to place the tooltip. */
            public var yOffset:Number = 25;

            /** The display object presented as a tooltip. */
            public var tooltip:DisplayObject = null;

            /** Duration of fade animations (in seconds) for tooltip show and hide.
             *  If less than or equal to zero, no fade will be performed. */
            public var fadeDuration:Number = 0.3;

            /** Indicates if the tooltip should follow the mouse pointer. */
            public var followMouse:Boolean = true;

            // --------------------------------------------------------------------

            /**
             * Creates a new TooltipControl.
             * @param filter a Boolean-valued filter function indicating which
             *  items should receive tooltip handling
             */
            public function TooltipControl(filter:*=n