blob: da01ffa43f3ae3fa95b8efac97426d34a24b7854 [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.supportClasses
{
import org.apache.royale.core.IBead;
import org.apache.royale.core.IBeadView;
import org.apache.royale.core.IChild;
import org.apache.royale.core.IParent;
import org.apache.royale.core.IStrand;
import org.apache.royale.events.Event;
import org.apache.royale.events.IEventDispatcher;
import org.apache.royale.events.MouseEvent;
import org.apache.royale.html.util.getLabelFromData;
import spark.components.supportClasses.ToggleButtonBase;
import mx.controls.listClasses.IListItemRenderer;
import mx.events.ListEvent;
import org.apache.royale.core.IHasLabelField;
/**
* The TextButtonItemRenderer is the default renderer for TabBar
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class SparkTextButtonItemRenderer extends ToggleButtonBase implements IListItemRenderer, IHasLabelField
{
public function SparkTextButtonItemRenderer()
{
super();
addEventListener("click", clickHandler);
COMPILE::JS
{
element.style.whiteSpace = "nowrap";
}
typeNames += " SparkTextButtonItemRenderer";
}
override public function set selected(value:Boolean):void
{
super.selected = value;
updateRenderer();
}
/**
* @private
*/
public function updateRenderer():void
{
COMPILE::SWF
{
// super.updateRenderer();
graphics.clear();
graphics.beginFill(0xFFFFFF, (down||selected||hovered)?1:0);
graphics.drawRect(0, 0, width, height);
graphics.endFill();
}
COMPILE::JS
{
if (selected)
element.style.backgroundColor = '#9C9C9C';
else if (hovered)
element.style.backgroundColor = '#ECECEC';
else
element.style.backgroundColor = 'transparent';
}
}
private var _down:Boolean;
/**
* Whether or not the itemRenderer is in a down (or pre-selected) state.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.7
*/
public function get down():Boolean
{
return _down;
}
public function set down(value:Boolean):void
{
_down = value;
updateRenderer();
}
private var _hovered:Boolean;
/**
* Whether or not the itemRenderer is in a hovered state.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.7
*/
public function get hovered():Boolean
{
return _hovered;
}
public function set hovered(value:Boolean):void
{
_hovered = value;
updateRenderer();
}
private var _rowIndex:int;
/**
* Whether or not the itemRenderer is in a down (or pre-selected) state.
*
* @langversion 3.0
*/
public function get rowIndex():int
{
return _rowIndex;
}
public function set rowIndex(value:int):void
{
_rowIndex = value;
}
/**
* @royaleignorecoercion mx.core.UIComponent
* @royaleignorecoercion org.apache.royale.events.IEventDispatcher
*/
private function clickHandler(event:MouseEvent):void
{
var le:ListEvent = new ListEvent("itemClick");
le.rowIndex = rowIndex;
le.columnIndex = 0;
le.itemRenderer = this;
getComponentDispatcher().dispatchEvent(le);
}
private var _itemRendererOwnerView:Object;
/**
* The parent container for the itemRenderer instance.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.7
*/
public function get itemRendererOwnerView():Object
{
return _itemRendererOwnerView;
}
public function set itemRendererOwnerView(value:Object):void
{
_itemRendererOwnerView = value;
}
private var _labelField:String = "label";
/**
* The name of the field within the data to use as a label. Some itemRenderers use this field to
* identify the value they should show while other itemRenderers ignore this if they are showing
* complex information.
*/
public function get labelField():String
{
return _labelField;
}
public function set labelField(value:String):void
{
_labelField = value;
}
protected function getComponentDispatcher():IEventDispatcher
{
var irp:Object = itemRendererOwnerView;
var p:IParent = parent;
while (p)
{
if (p is IStrand)
{
var b:IBead = (p as IStrand).getBeadByType(IBeadView);
if (b == irp) return p as IEventDispatcher;
}
p = (p as IChild).parent;
}
return null;
}
/**
* The text currently displayed by the itemRenderer instance.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.7
*/
public function get text():String
{
return label;
}
public function set text(value:String):void
{
label = value;
}
protected function dataToString(value:Object):String
{
if (value is XML)
{
var xml:XML = value as XML;
return xml[labelField];
}
return getLabelFromData(this,value);
}
private var _data:Object;
[Bindable("__NoChangeEvent__")]
/**
* The data being represented by this itemRenderer. This can be something simple like a String or
* a Number or something very complex.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9.7
*/
public function get data():Object
{
return _data;
}
public function set data(value:Object):void
{
_data = value;
if (_data is IEventDispatcher)
(_data as IEventDispatcher).addEventListener("labelChanged", labelChangedHandler);
text = dataToString(value);
}
private function labelChangedHandler(event:Event):void
{
text = dataToString(data);
}
public function get nestLevel():int
{
throw new Error("Method not implemented.");
}
public function set nestLevel(value:int):void
{
throw new Error("Method not implemented.");
}
/* public function get processedDescriptors():Boolean
{
throw new Error("Method not implemented.");
}
public function set processedDescriptors(value:Boolean):void
{
throw new Error("Method not implemented.");
}*/
public function get updateCompletePendingFlag():Boolean
{
throw new Error("Method not implemented.");
}
public function set updateCompletePendingFlag(value:Boolean):void
{
throw new Error("Method not implemented.");
}
COMPILE::JS
override public function get measuredWidth():Number
{
if (isNaN(_measuredWidth) || (!_measuredWidth && text != ""))
measure();
return super.measuredWidth;
}
COMPILE::JS
override public function get measuredHeight():Number
{
if (isNaN(_measuredHeight) || (!_measuredHeight && text != ""))
measure();
return super.measuredHeight;
}
COMPILE::JS
override protected function measure():void
{
var oldParent:Element = element.parentElement;
document.body.appendChild(element);
_measuredWidth = element.offsetWidth;
_measuredHeight = element.offsetHeight;
document.body.removeChild(element);
oldParent.appendChild(element);
}
}
}