blob: 4596f9d14144406b7a5dd9992c23933848f3b9ca [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package spark.components
{
import spark.components.listClasses.IListItemRenderer;
import spark.components.itemRenderers.*;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import mx.core.IFlexModuleFactory;
import mx.core.IVisualElement;
import mx.events.FlexEvent;
import mx.styles.CSSStyleDeclaration;
import mx.styles.IStyleManager2;
import mx.styles.StyleManager;
import spark.components.List;
import spark.events.IndexChangeEvent;
import avmplus.getQualifiedClassName;
import spark.events.MenuEvent;
import spark.skins.MenuBarSkin;
// for asdoc
[Experimental]
/**
* Plain simple MenuBar class, based upon list.
*
* @langversion 3.0
* @playerversion Flash 10.1
* @playerversion AIR 2.5
* @productversion Flex 4.5
*/
[Event(name="selected", type="spark.events.MenuEvent")]
[Event(name="checked", type="spark.events.MenuEvent")]
/**
* Note : works with both Horizontal and Vertical Layouts
*/
/**
* @author Bogdan Dinu (http://www.badu.ro)
*/
public class MenuBar extends List
{
/**
* Constructor, we don't use virtual layout
*/
public function MenuBar()
{
super();
useVirtualLayout = false;
}
/**
* Overriden because we don't want to dispatch change event directly, but forward it to MenuEvent
*/
override public function dispatchEvent(e:Event):Boolean
{
if (e.type == IndexChangeEvent.CHANGE && e is IndexChangeEvent && !(e is MenuEvent))
{
dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
return true;
}
return super.dispatchEvent(e);
}
/**
* Sets for every item renderer the instance of this,
* so we can dispatch events and access properties like labelField
*/
override public function updateRenderer(renderer:IVisualElement, itemIndex:int, data:Object):void
{
super.updateRenderer(renderer, itemIndex, data);
if (renderer is IListItemRenderer)
{
(renderer as IListItemRenderer).listOwner = this;
}
}
/**
* this gets called by child to restore focus to us or to change the selected index
*/
public function keyDownInChild(e:KeyboardEvent):void
{
keyDownHandler(e);
}
/**
* Key down handler for handling key navigation
*/
override protected function keyDownHandler(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.DOWN)
{
if (selectedIndex < 0)
{
selectedIndex = 0;
}
}
else if (e.keyCode == Keyboard.UP)
{
if (selectedIndex >= 0)
{
selectedIndex = -1;
setFocus();
}
}
else
{
super.keyDownHandler(e);
}
//we are passing the focus to our child
if (selectedIndex >= 0)
{
var item : MenuCoreItemRenderer = dataGroup.getElementAt(selectedIndex) as MenuCoreItemRenderer;
if (item)
{
item.setFocus();
}
}
}
}
}