package com.oxylusflash.book { import caurina.transitions.Tweener; import com.oxylusflash.events.DropMenuEvent; import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; public class BarButtonMenu extends BarButton { /** * Drop down menu. */ private var _dropMenu:DropMenu; private var _menuItems:Array; private static const DROP_HIDE_DELAY:Number = 100; private var dropHideTimer:Timer = new Timer(DROP_HIDE_DELAY, 1); public function BarButtonMenu() { this.buttonMode = false; normalState.buttonMode = true; overState.buttonMode = true; dropHideTimer.addEventListener(TimerEvent.TIMER_COMPLETE, dropHideTimer_timerCompleteHandler, false, 0, true); overState.addEventListener(MouseEvent.CLICK, overState_clickHandler, false, 0, true); } /** * If menu has radio items, it can switch between them on bar button click. */ private function overState_clickHandler(e:MouseEvent):void { if (_dropMenu) _dropMenu.checkNextItem(); } /** * Drop menu item click handler fires ITEM_SELECT event. */ public function dropMenu_itemClickHandler(id:int):void { dropHideTimer_timerCompleteHandler(); this.dispatchEvent(new DropMenuEvent(id, DropMenuEvent.ITEM_SELECT)); } /** * Hide drop down after timer complete. */ private function dropHideTimer_timerCompleteHandler(e:TimerEvent = null):void { if (!overState.hitTestPoint(stage.mouseX, stage.mouseY, true)) { this.hitArea = normalState; this.mouseChildren = false; Tweener.addTween(overState, { alpha: 0, base: Global.baseTween, onUpdate: updateDropMenuAlpha } ); } } /** * If it has drop menu, update its alpha */ private function updateDropMenuAlpha():void { if (_dropMenu) _dropMenu.alpha = overState.alpha; } /** * Check / uncheck drop menu items. */ public function unCheckDropMenuItem():void { if (_dropMenu) { _dropMenu.unCheckSelItem(); } } public function checMenuItemById(id:int):void { if (_dropMenu) { _dropMenu.checkItemById(id); } } /** * Menu items. */ public function get menuItems():Array { return _menuItems; } public function addMenuItems(value:Array, radioLike:Boolean = false):void { if (!_dropMenu) _dropMenu = this.addChildAt(new DropMenu, this.getChildIndex(normalState) + 1) as DropMenu; _menuItems = value; _dropMenu.addItems(_menuItems, radioLike); } /** * Drop menu reference. */ public function get dropMenu():DropMenu { return _dropMenu; } /** * Overrides. */ override protected function rollOverHandler(e:MouseEvent):void { if (!e.buttonDown) { if (this.parent) this.parent.setChildIndex(this, this.parent.numChildren - 1); dropHideTimer.reset(); this.hitArea = null; this.mouseChildren = true; Tweener.addTween(overState, { alpha: 1, base: Global.baseTween, onUpdate: updateDropMenuAlpha } ); } } override protected function rollOutHandler(e:MouseEvent):void { if (_dropMenu) { dropHideTimer.reset(); dropHideTimer.start(); } else { dropHideTimer_timerCompleteHandler(); } } } }