package com.oxylusflash.book { import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BlurFilter; public class DropMenu extends Sprite { private var bgMc:DropMenuBackground; private var itemsHldr:Sprite; private var itemsMsk:Sprite; private var _items:Array = []; // Constants. public static const H_MARGIN:Number = 2; private static const OFFSET_Y:Number = 30; private static const V_MARGIN:Number = 1; private static const MASK_VMARGIN:Number = 1; public static const BLUR:Number = 8; public var blurFilter:BlurFilter = new BlurFilter(BLUR, BLUR, 3); private var groupId:int; public var hasRadioLikeItems:Boolean = false; public function DropMenu() { this.blendMode = BlendMode.LAYER; this.alpha = 0; bgMc = this.addChild(new LibDropMenuBackground) as DropMenuBackground; itemsMsk = this.addChild(new LibDropMenuItemsMask) as Sprite; itemsMsk.visible = false; } public function get items():Array { return _items; } /** * Add items. * @param pItems Items Array. * @param radioLike If true, items will behave like radio buttons. */ public function addItems(pItems:Array, radioLike:Boolean = false):void { hasRadioLikeItems = radioLike; itemsMsk.visible = false; if (itemsHldr) { this.removeChild(itemsHldr); itemsHldr = null; } itemsHldr = this.addChild(new Sprite) as Sprite; var menuW:Number = 0; var menuH:Number = 0; Global.dropMenuGroupIndex ++; groupId = Global.dropMenuGroupIndex; var n:int = pItems.length; var i:int = 0; var menuItm:DropMenuItem; var checkedItm:DropMenuItem; for (; i < n; i++) { menuItm = itemsHldr.addChild(new DropMenuItem(pItems[i], radioLike)) as DropMenuItem; menuItm.y = menuH; menuItm.groupId = groupId; menuItm.addEventListener(MouseEvent.CLICK, menuItm_clickHandler, false, 0, true); if (i == n - 1) menuItm.sepMc.visible = false; menuH += menuItm.height; menuW = Math.max(menuW, menuItm.width); if (radioLike && !checkedItm && menuItm.initChecked) checkedItm = menuItm; _items.push(menuItm); } for (i = 0; i < n; i++) { menuItm = itemsHldr.getChildAt(i) as DropMenuItem; menuItm.width = menuW; } if (checkedItm) checkedItm.initCheck(); bgMc.width = menuW + 2 * H_MARGIN; bgMc.height = menuH + OFFSET_Y + 2 * V_MARGIN; bgMc.y = -menuH - 2 * V_MARGIN; itemsHldr.x = H_MARGIN; itemsHldr.y = bgMc.y + V_MARGIN; itemsMsk.visible = true; itemsMsk.width = menuW; itemsMsk.height = menuH - 2 * MASK_VMARGIN; itemsMsk.x = itemsHldr.x; itemsMsk.y = itemsHldr.y + MASK_VMARGIN; itemsHldr.mask = itemsMsk; } /** * Item click handler. * @param e */ private function menuItm_clickHandler(e:MouseEvent):void { if (this.parent) BarButtonMenu(this.parent).dropMenu_itemClickHandler(DropMenuItem(e.currentTarget).id); } /** * Deselects current selected item. */ public function unCheckSelItem():void { if (hasRadioLikeItems) { var selItem:DropMenuItem = DropMenuItem.selItem[DropMenuItem.GROUP + groupId]; if (selItem) selItem.unCheck(); } } /** * It selects an item by its id. * @param id Item id. */ public function checkItemById(id:int):void { if (hasRadioLikeItems) { var n:int = _items.length; var menuItem:DropMenuItem; for (var i:int = 0; i < n; i++) { menuItem = _items[i]; if (menuItem.id == id) { menuItem.check(); break; } } } } /** * It selects the next item. */ public function checkNextItem():void { if (hasRadioLikeItems) { var n:int = _items.length; var menuItem:DropMenuItem; var nextMenuItem:DropMenuItem = _items[0]; for (var i:int = 0; i < n; i++) { menuItem = _items[i]; if (!menuItem.mouseEnabled) { nextMenuItem = _items[(i + 1) % n]; break; } } nextMenuItem.simulateClick(); if (this.parent) BarButtonMenu(this.parent).dropMenu_itemClickHandler(nextMenuItem.id); } } /** * Overrides. */ override public function get alpha():Number { return super.alpha; } override public function set alpha(value:Number):void { super.alpha = value; this.visible = value > 0; blurFilter.blurX = blurFilter.blurY = (1 - value) * BLUR; this.filters = this.visible ? [blurFilter] : []; } } }