/ Published in: ActionScript 3
                    
                                        
Here's a very VERY rough but working implementation of a multi-line ToggleButtonBar component in Flex
                
                            
                                Expand |
                                Embed | Plain Text
                            
                        
                        Copy this code and paste it in your HTML
package components
{
import flash.display.DisplayObject;
import flash.events.Event;
import mx.containers.VBox;
import mx.controls.ToggleButtonBar;
import mx.events.FlexEvent;
import mx.events.ItemClickEvent;
/**
* @author Danny Kopping
* @link http://ria-coder.com
*
* ==========================USAGE==========================
* <components:MultiLineToggleButtonBar id="mltbb" width="100%" selectedIndex="5" columns="2"
barWidth="100%" barHeight="30" itemClick="trace(mltbb.selectedIndex)">
<components:dataProvider>
<mx:Array>
<mx:Object label="Label" icon="@Embed(source='/path/to/icon')/>
<mx:Object label="Label" icon="@Embed(source='/path/to/icon')/>
<mx:Object label="Label" icon="@Embed(source='/path/to/icon')/>
<mx:Object label="Label" icon="@Embed(source='/path/to/icon')/>
<mx:Object label="Label" icon="@Embed(source='/path/to/icon')/>
</mx:Array>
</components:dataProvider>
</components:MultiLineToggleButtonBar>
*/
[Event(name="itemClick",type="mx.events.ItemClickEvent")]
public class MultiLineToggleButtonBar extends VBox
{
private var _dataProvider:Array;
[ArrayElementType("mx.controls.ToggleButtonBar")]
private var toggleBars:Array;
private var selectedBar:ToggleButtonBar;
private var _selectedIndex:int = 0;
private var _barWidth:Object;
private var _barHeight:Object;
public var columns:uint = 3;
public function MultiLineToggleButtonBar()
{
super();
toggleBars = [];
addEventListener(Event.ADDED_TO_STAGE, setSelected);
}
public function get barWidth():Object
{
return _barWidth;
}
public function set barWidth(value:Object):void
{
_barWidth = value;
}
public function get barHeight():Object
{
return _barHeight;
}
public function set barHeight(value:Object):void
{
_barHeight = value;
}
public function get dataProvider():Array
{
return _dataProvider;
}
public function set dataProvider(value:Array):void
{
_dataProvider = value;
createBars();
}
private function createBars():void
{
for each(var bar:ToggleButtonBar in toggleBars)
removeChild(bar);
var tbIndex:uint = 0;
var counter:uint = 0;
var current:ToggleButtonBar;
for each(var item:Object in dataProvider)
{
if(counter % columns == 0)
{
current = new ToggleButtonBar();
current.setStyle("horizontalGap", 6);
current.dataProvider = dataProvider.slice(counter, counter + columns);
toggleBars.push(addChild(current) as ToggleButtonBar);
current.addEventListener(FlexEvent.CREATION_COMPLETE, updateSizes);
current.addEventListener(ItemClickEvent.ITEM_CLICK, onItemClick);
}
counter++;
}
}
private function updateSizes(event:FlexEvent):void
{
var current:ToggleButtonBar = event.target as ToggleButtonBar;
if(barWidth.toString().indexOf("%") != -1)
current.percentWidth = barWidth.toString().substr(0, barWidth.toString().length - 1);
else
current.width = Number(barWidth);
if(barHeight.toString().indexOf("%") != -1)
current.percentHeight = barHeight.toString().substr(0, barHeight.toString().length - 1);
else
current.height = Number(barHeight);
}
private function setSelected(event:Event):void
{
if(selectedIndex < 0)
return;
if(!toggleBars[Math.floor(selectedIndex / columns)])
return;
var selected:ToggleButtonBar = toggleBars[Math.floor(selectedIndex / columns)];
selected.selectedIndex = selectedIndex % columns;
deselectOthers(selected);
}
public function get selectedIndex():int
{
return _selectedIndex;;
}
public function set selectedIndex(value:int):void
{
_selectedIndex = value;
}
private function onItemClick(event:ItemClickEvent):void
{
deselectOthers(event.target as ToggleButtonBar);
this.dispatchEvent(event);
}
private function deselectOthers(selected:ToggleButtonBar):void
{
this.selectedBar = selected;
for each(var bar:ToggleButtonBar in toggleBars)
if(bar !== selected)
{
for each(var child:* in bar.getChildren())
child.selected = false;
}
selectedIndex = (toggleBars.indexOf(selected) * columns) + selected.selectedIndex;
}
}
}
Comments
 Subscribe to comments
                    Subscribe to comments
                
                