I just did a quick extension of the Flex LinkBar so you can tie it to the states of a component. I haven’t tested it throughly yet, so if you find anything weird in there, let me know…
usage:
<components:StateLinkBar dataProvider="{states}"/>
you can download the code here, or just cut and paste from below:
package view.components
{
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import mx.controls.LinkBar;
import mx.core.UIComponent;
import mx.events.StateChangeEvent;
public class StateLinkBar extends LinkBar
{
private var measurementHasBeenCalled:Boolean = false;
private var __pendingStates:Array;
private var __states:Array;
public function StateLinkBar()
{
super();
labelField = "name";
}
override public function set dataProvider(value:Object):void{
super.dataProvider = value;
if(value==parentDocument.states){
setStateListeners(value as Array);
}
}
override protected function commitProperties():void{
super.commitProperties();
if(!measurementHasBeenCalled && __pendingStates){
measurementHasBeenCalled = true
setStateListeners(__pendingStates);
}
}
override protected function clickHandler(event:MouseEvent):void{
if(__states){
var index:int = getChildIndex(DisplayObject(event.currentTarget));
var uic:UIComponent = parentDocument as UIComponent;
uic.currentState = __states[index].name;
hiliteSelectedNavItem(index);
}
super.clickHandler(event);
}
private function setStateListeners(arr:Array):void{
if(!measurementHasBeenCalled){
__pendingStates = arr;
invalidateProperties();
return;
}
var p:UIComponent = parentDocument as UIComponent;
if(p !=null){
__states = arr;
//setup listeners
p.addEventListener(StateChangeEvent.CURRENT_STATE_CHANGE,onParentStateChange);
}
}
private function onParentStateChange(event:StateChangeEvent):void{
var newState:String = event.newState;
if(__states){
var max:Number = __states.length;
for (var i:Number=0;i<max;++i){
if(__states[i].name==newState){
selectedIndex = i
hiliteSelectedNavItem(i);
}
}
}
}
}
}