498 lines
12 KiB
ActionScript
Executable File
498 lines
12 KiB
ActionScript
Executable File
/*
|
||
Copyright (c) 2009 Yahoo! Inc. All rights reserved.
|
||
The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license
|
||
*/
|
||
package com.yahoo.astra.fl.controls
|
||
{
|
||
import flash.events.Event;
|
||
import flash.events.KeyboardEvent;
|
||
import fl.core.UIComponent;
|
||
import fl.data.DataProvider;
|
||
import fl.data.SimpleCollectionItem;
|
||
import fl.events.DataChangeEvent;
|
||
import fl.controls.Button;
|
||
|
||
/**
|
||
* Abstract class that extends UIComponent and creates a row of buttons.
|
||
*
|
||
* @see fl.core.UIComponent
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
* @author Dwight Bridges
|
||
*/
|
||
public class AbstractButtonRow extends UIComponent
|
||
{
|
||
|
||
//--------------------------------------
|
||
// Constructor
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* Constructor
|
||
*/
|
||
public function AbstractButtonRow()
|
||
{
|
||
super();
|
||
}
|
||
|
||
//--------------------------------------
|
||
// Class Methods
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* @private
|
||
* Creates the Accessibility class.
|
||
* This method is called from UIComponent.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public static var createAccessibilityImplementation:Function;
|
||
|
||
|
||
//--------------------------------------
|
||
// Properties
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* @private (protected)
|
||
*/
|
||
//When redrawing, buttons are saved in this cache for reuse.
|
||
protected var _cachedButtons:Array = [];
|
||
|
||
/**
|
||
* @private (protected)
|
||
*/
|
||
//Storage for the buttons displayed in the AbstractButtonRow.
|
||
protected var _buttons:Array = [];
|
||
|
||
/**
|
||
* @private (protected)
|
||
*/
|
||
protected var _focusIndex:int = 0;
|
||
|
||
/**
|
||
* Gets or sets the index of the currently focused tab (used for keyboard navigation).
|
||
*/
|
||
public function get focusIndex():int
|
||
{
|
||
return this._focusIndex;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*/
|
||
public function set focusIndex(value:int):void
|
||
{
|
||
this._focusIndex = value;
|
||
if(this._focusIndex >= 0)
|
||
{
|
||
var button:Button = this._buttons[this._focusIndex];
|
||
button.setFocus();
|
||
|
||
//internal event used for accessibility
|
||
//similar implementation in Flex TabBar control.
|
||
this.dispatchEvent(new Event("focusUpdate"));
|
||
}
|
||
this.invalidate();
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*/
|
||
//Like fl.controls.List, the purpose of this variable is
|
||
//only to make sure the SimpleCollectionItem is included.
|
||
private var collectionItemImport:SimpleCollectionItem;
|
||
|
||
/**
|
||
* @private (protected)
|
||
*/
|
||
//Storage for the dataProvider property.
|
||
protected var _dataProvider:DataProvider;
|
||
|
||
[Collection(collectionClass="fl.data.DataProvider", collectionItem="fl.data.SimpleCollectionItem", identifier="item")]
|
||
/**
|
||
* Gets or sets the data model of the list of items to be viewed. A data provider
|
||
* can be shared by multiple list-based components. Changes to the data provider
|
||
* are immediately available to all components that use it as a data source.
|
||
*
|
||
* @default null
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get dataProvider():DataProvider
|
||
{
|
||
return this._dataProvider;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set dataProvider(value:DataProvider):void
|
||
{
|
||
if(this._dataProvider)
|
||
{
|
||
this._dataProvider.removeEventListener(DataChangeEvent.DATA_CHANGE, dataChangeHandler);
|
||
}
|
||
|
||
this._dataProvider = value;
|
||
|
||
if(this._dataProvider)
|
||
{
|
||
this._dataProvider.addEventListener(DataChangeEvent.DATA_CHANGE, dataChangeHandler, false, 0, true);
|
||
}
|
||
|
||
this.invalidate();
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
* Storage for the labelField property.
|
||
*/
|
||
protected var _labelField:String = "label";
|
||
|
||
/**
|
||
* Gets or sets the name of the field in the <code>dataProvider</code> object
|
||
* to be displayed as the label in the tabs.
|
||
*
|
||
* <p>By default, the component displays the <code>label</code> property
|
||
* of each <code>dataProvider</code> item. If the <code>dataProvider</code>
|
||
* items do not contain a <code>label</code> property, you can set the
|
||
* <code>labelField</code> property to use a different property.</p>
|
||
*
|
||
* <p><strong>Note:</strong> The <code>labelField</code> property is not used
|
||
* if the <code>labelFunction</code> property is set to a callback function.</p>
|
||
*
|
||
* @default "label"
|
||
*
|
||
* @see #labelFunction
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get labelField():String
|
||
{
|
||
return this._labelField;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set labelField(value:String):void
|
||
{
|
||
if(this._labelField != value)
|
||
{
|
||
this._labelField = value;
|
||
this.invalidate();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
* Storage for the labelFunction property.
|
||
*/
|
||
protected var _labelFunction:Function = null;
|
||
|
||
/**
|
||
* Gets or sets the function to be used to obtain the label for the item.
|
||
*
|
||
* <p>By default, the component displays the <code>label</code> property
|
||
* for a <code>dataProvider</code> item. But some data sets may not have
|
||
* a <code>label</code> field or may not have a field whose value
|
||
* can be used as a label without modification. For example, a given data
|
||
* set might store full names but maintain them in <code>lastName</code> and
|
||
* <code>firstName</code> fields. In such a case, this property could be
|
||
* used to set a callback function that concatenates the values of the
|
||
* <code>lastName</code> and <code>firstName</code> fields into a full
|
||
* name string to be displayed.</p>
|
||
*
|
||
* <p><strong>Note:</strong> The <code>labelField</code> property is not used
|
||
* if the <code>labelFunction</code> property is set to a callback function.</p>
|
||
*
|
||
* @default null
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get labelFunction():Function
|
||
{
|
||
return this._labelFunction;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set labelFunction(value:Function):void
|
||
{
|
||
if(this._labelFunction != value)
|
||
{
|
||
this._labelFunction = value;
|
||
this.invalidate();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
* Storage for the selectedIndex property.
|
||
*/
|
||
protected var _selectedIndex:int = 0;
|
||
|
||
/**
|
||
* Gets or sets the index of the tab that is selected. Only one item can be selected
|
||
* at a time.
|
||
*
|
||
* <p>A value of -1 indicates that no tab is selected.</p>
|
||
*
|
||
* <p>When ActionScript is used to set this property, the item at the specified index
|
||
* replaces the current selection. When the selection is changed programmatically,
|
||
* a <code>change</code> event object is not dispatched. </p>
|
||
*
|
||
* @see #selectedItem
|
||
*
|
||
* @default 0
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get selectedIndex():int
|
||
{
|
||
return this._selectedIndex;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set selectedIndex(value:int):void
|
||
{
|
||
if(value >= this._dataProvider.length) value = -1;
|
||
if(this._selectedIndex != value)
|
||
{
|
||
this._selectedIndex = value;
|
||
this.focusIndex = value;
|
||
this.invalidate();
|
||
this.dispatchEvent(new Event(Event.CHANGE));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Gets or sets the item that was selected.
|
||
*
|
||
* <p>If no selection is made, the value of this property is <code>null</code>.</p>
|
||
*
|
||
* @see #selectedIndex
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get selectedItem():Object
|
||
{
|
||
if(this.selectedIndex >= 0)
|
||
{
|
||
return this._dataProvider.getItemAt(this.selectedIndex);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set selectedItem(value:Object):void
|
||
{
|
||
var index:int = this._dataProvider.getItemIndex(value);
|
||
this.selectedIndex = index;
|
||
}
|
||
|
||
//--------------------------------------
|
||
// Public Methods
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* Returns the index of the given data object.
|
||
*
|
||
* @param item The object to be rendered.
|
||
* @return the index of the object in the data provider. -1 if it cannot be found.
|
||
*/
|
||
public function itemToIndex(item:Object):int
|
||
{
|
||
return this._dataProvider.getItemIndex(item);
|
||
}
|
||
|
||
/**
|
||
* Retrieves the string that the renderer displays for the given data object
|
||
* based on the <code>labelField</code> and <code>labelFunction</code> properties.
|
||
*
|
||
* <p><strong>Note:</strong> The <code>labelField</code> is not used
|
||
* if the <code>labelFunction</code> property is set to a callback function.</p>
|
||
*
|
||
* @param item The object to be rendered.
|
||
*
|
||
* @return The string to be displayed based on the data.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function itemToLabel(item:Object):String
|
||
{
|
||
if(this.labelFunction != null)
|
||
{
|
||
this.labelFunction(item, this.itemToIndex(item));
|
||
}
|
||
else if(this.labelField && item.hasOwnProperty(this.labelField))
|
||
{
|
||
return item[this.labelField];
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* Returns the data object corresponding to an index.
|
||
*
|
||
* @param index a zero-based index
|
||
* @return the item at the specified index within the data provider.
|
||
*/
|
||
public function indexToItem(index:int):Object
|
||
{
|
||
return this._dataProvider.getItemAt(index);
|
||
}
|
||
|
||
|
||
//--------------------------------------
|
||
// Protected Methods
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*
|
||
*/
|
||
//Placeholder - TB, does it need to even be here?
|
||
override protected function initializeAccessibility():void
|
||
{
|
||
if(AbstractButtonRow.createAccessibilityImplementation != null)
|
||
{
|
||
AbstractButtonRow.createAccessibilityImplementation(this);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override protected function draw():void
|
||
{
|
||
this.createCache();
|
||
if(this._dataProvider)
|
||
{
|
||
this.drawButtons();
|
||
}
|
||
this.clearCache();
|
||
this.drawBackground();
|
||
super.draw();
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* Updates the position and size of the buttons.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function drawButtons():void
|
||
{
|
||
//place holder must be overridden
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* Either retrieves a button from the cache or creates a new one.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function getButton():Button
|
||
{
|
||
//place holder must be overridden
|
||
return new Button();
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* Saves the buttons from the last redraw so that they may be reused.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function createCache():void
|
||
{
|
||
this._cachedButtons = this._buttons.concat();
|
||
this._buttons = [];
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* Removes unneeded buttons that were cached for a redraw.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function clearCache():void
|
||
{
|
||
//placeholder must be overridden
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* Requests a redraw when the data provider changes.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function dataChangeHandler(event:DataChangeEvent):void
|
||
{
|
||
this.invalidate();
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
* Listen for events to allow for keyboard navigation.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected function navigationKeyDownHandler(event:KeyboardEvent):void
|
||
{
|
||
//place holder must be overridden
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*/
|
||
protected function drawBackground():void{}
|
||
}
|
||
} |