455 lines
13 KiB
ActionScript
Executable File
455 lines
13 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.treeClasses {
|
||
|
||
import com.yahoo.astra.fl.controls.Tree;
|
||
import fl.controls.ButtonLabelPlacement;
|
||
import fl.controls.listClasses.ListData;
|
||
import fl.controls.listClasses.ICellRenderer;
|
||
import fl.controls.LabelButton;
|
||
import fl.core.UIComponent;
|
||
import flash.events.Event;
|
||
import flash.events.MouseEvent;
|
||
import flash.text.TextFormat;
|
||
import fl.core.InvalidationType;
|
||
import flash.display.Sprite;
|
||
|
||
|
||
//--------------------------------------
|
||
// Styles
|
||
//--------------------------------------
|
||
|
||
/**
|
||
* Name of the class to use as the skin for the icon associated
|
||
* with a closed branch of the tree.
|
||
*
|
||
* @default TreeCellRenderer_closedBranchIcon
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="closedBranchIcon", type="Class")]
|
||
|
||
/**
|
||
* Name of the class to use as the skin for the icon associated
|
||
* with an open branch of the tree.
|
||
*
|
||
* @default TreeCellRenderer_openBranchIcon
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="openBranchIcon", type="Class")]
|
||
|
||
/**
|
||
* Name of the class to use as the skin for the icon associated
|
||
* with a leaf node of the tree.
|
||
*
|
||
* @default TreeCellRenderer_leafIcon
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="leafIcon", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:upSkin
|
||
*
|
||
* @default CellRenderer_upSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="upSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:downSkin
|
||
*
|
||
* @default CellRenderer_downSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="downSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:overSkin
|
||
*
|
||
* @default CellRenderer_overSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="overSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:disabledSkin
|
||
*
|
||
* @default CellRenderer_disabledSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="disabledSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:selectedDisabledSkin
|
||
*
|
||
* @default CellRenderer_selectedDisabledSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="selectedDisabledSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:selectedUpSkin
|
||
*
|
||
* @default CellRenderer_selectedUpSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="selectedUpSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:selectedDownSkin
|
||
*
|
||
* @default CellRenderer_selectedDownSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="selectedDownSkin", type="Class")]
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:selectedOverSkin
|
||
*
|
||
* @default CellRenderer_selectedOverSkin
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="selectedOverSkin", type="Class")]
|
||
|
||
|
||
/**
|
||
* @copy fl.core.UIComponent#style:textFormat
|
||
*
|
||
* @default null
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="textFormat", type="flash.text.TextFormat")]
|
||
|
||
|
||
/**
|
||
* @copy fl.core.UIComponent#style:disabledTextFormat
|
||
*
|
||
* @default null
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="disabledTextFormat", type="flash.text.TextFormat")]
|
||
|
||
|
||
/**
|
||
* @copy fl.controls.LabelButton#style:textPadding
|
||
*
|
||
* @default 5
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="textPadding", type="Number", format="Length")]
|
||
|
||
|
||
/**
|
||
* Number of pixels to use as offset when rendering nested tree nodes.
|
||
*
|
||
* @default 5
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="nodeIndent", type="Number", format="Length")]
|
||
|
||
/**
|
||
* Left margin width in pixels
|
||
*
|
||
* @default 5
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
[Style(name="leftMargin", type="Number", format="Length")]
|
||
|
||
//--------------------------------------
|
||
// Class description
|
||
//--------------------------------------
|
||
/**
|
||
* The TreeCellRenderer class defines methods and properties for
|
||
* Tree component to manipulate and display custom
|
||
* cell content in each of its rows. TreeCellRenderer relies on
|
||
* properties contained in the TreeDataProvider objects to set
|
||
* appropriate icons and offsets for individual cells.
|
||
* The TreeCellRenderer implements ICellRenderer and extends
|
||
* the LabelButton.
|
||
*
|
||
* @see com.yahoo.astra.fl.controls.treeClasses.TreeDataProvider
|
||
* @see ICellRenderer
|
||
* @see fl.controls.LabelButton
|
||
*
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public class TreeCellRenderer extends LabelButton implements ICellRenderer {
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected var _listData:ListData;
|
||
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
protected var _data:Object;
|
||
|
||
|
||
/**
|
||
* Creates a new TreeCellRenderer instance.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function TreeCellRenderer():void {
|
||
super();
|
||
toggle = true;
|
||
focusEnabled = false;
|
||
|
||
this.addEventListener(MouseEvent.CLICK, handleClickEvent, false, 0, true);
|
||
}
|
||
|
||
|
||
private function handleClickEvent(evt:MouseEvent) : void {
|
||
var currentNode:TNode = data as TNode;
|
||
if (this.icon != null && currentNode is BranchNode &&
|
||
this.icon.x <= this.mouseX &&
|
||
this.mouseX <= (this.icon.x + this.icon.width) &&
|
||
this.icon.y <= this.mouseY &&
|
||
this.mouseY <= (this.icon.y + this.icon.height)) {
|
||
evt.stopImmediatePropagation();
|
||
if (currentNode.isOpen()) {
|
||
currentNode.closeNode();
|
||
}
|
||
else {
|
||
currentNode.openNode();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
private static var defaultStyles:Object = {upSkin:"TreeCellRenderer_upSkin",downSkin:"TreeCellRenderer_downSkin",overSkin:"TreeCellRenderer_overSkin",
|
||
disabledSkin:"TreeCellRenderer_disabledSkin",
|
||
selectedDisabledSkin:"TreeCellRenderer_selectedDisabledSkin",
|
||
selectedUpSkin:"TreeCellRenderer_selectedUpSkin",selectedDownSkin:"TreeCellRenderer_selectedDownSkin",selectedOverSkin:"TreeCellRenderer_selectedOverSkin",
|
||
closedBranchIcon:"TreeCellRenderer_closedBranchIcon",
|
||
openBranchIcon:"TreeCellRenderer_openBranchIcon",
|
||
leafIcon:"TreeCellRenderer_leafIcon",
|
||
textFormat:null,
|
||
disabledTextFormat:null,
|
||
embedFonts:null,
|
||
textPadding:5,
|
||
nodeIndent:5,
|
||
leftMargin:5};
|
||
/**
|
||
* @copy fl.core.UIComponent#getStyleDefinition()
|
||
*
|
||
* @includeExample ../../core/examples/UIComponent.getStyleDefinition.1.as -noswf
|
||
*
|
||
* @see fl.core.UIComponent#getStyle()
|
||
* @see fl.core.UIComponent#setStyle()
|
||
* @see fl.managers.StyleManager
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public static function getStyleDefinition():Object {
|
||
return mergeStyles(defaultStyles, LabelButton.getStyleDefinition());
|
||
}
|
||
|
||
/**
|
||
* Specifies the dimensions at which the data should be rendered.
|
||
* These dimensions affect both the data and the cell that contains it;
|
||
* the cell renderer uses them to ensure that the data fits the cell and
|
||
* does not bleed into adjacent cells.
|
||
*
|
||
* @param width The width of the object, in pixels.
|
||
*
|
||
* @param height The height of the object, in pixels.
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override public function setSize(width:Number,height:Number):void {
|
||
super.setSize(width, height);
|
||
}
|
||
|
||
/**
|
||
* @copy fl.controls.listClasses.ICellRenderer#listData
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get listData():ListData {
|
||
return _listData;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
* When listData is set, we determine the appropriate icon to use
|
||
* with the particular type of Tree node (open branch, closed branch,
|
||
* or leaf).
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set listData(value:ListData):void {
|
||
_listData = value;
|
||
label = _listData.label;
|
||
var parentTree:Tree = _listData.owner as Tree;
|
||
if (data.nodeType == TreeDataProvider.BRANCH_NODE) {
|
||
if (data.nodeState == TreeDataProvider.OPEN_NODE) {
|
||
if (parentTree.iconFunction != null) {
|
||
setStyle("icon", parentTree.iconFunction(data));
|
||
} else if (parentTree.openBranchIconField != null && data[parentTree.openBranchIconField] != null) {
|
||
setStyle("icon", data[parentTree.openBranchIconField]);
|
||
} else {
|
||
setStyle("icon", getStyleValue("openBranchIcon"));
|
||
}
|
||
} else {
|
||
if (parentTree.iconFunction != null) {
|
||
setStyle("icon", parentTree.iconFunction(data));
|
||
} else if (parentTree.closedBranchIconField != null && data[parentTree.closedBranchIconField] != null) {
|
||
setStyle("icon", data[parentTree.closedBranchIconField]);
|
||
} else {
|
||
setStyle("icon", getStyleValue("closedBranchIcon"));
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
if (parentTree.iconFunction != null) {
|
||
setStyle("icon", parentTree.iconFunction(data));
|
||
} else if (parentTree.openBranchIconField != null && data[parentTree.leafIconField] != null) {
|
||
setStyle("icon", data[parentTree.leafIconField]);
|
||
} else {
|
||
setStyle("icon", getStyleValue("leafIcon"));
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @copy fl.controls.listClasses.ICellRenderer#data
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function get data():Object {
|
||
return _data;
|
||
}
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
public function set data(value:Object):void {
|
||
_data = value;
|
||
}
|
||
|
||
/**
|
||
* @copy fl.controls.listClasses.ICellRenderer#selected
|
||
*
|
||
* @default false
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override public function get selected():Boolean {
|
||
return super.selected;
|
||
}
|
||
|
||
/**
|
||
* @private (setter)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override public function set selected(value:Boolean):void {
|
||
super.selected = value;
|
||
}
|
||
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override protected function toggleSelected(event:MouseEvent):void {
|
||
// don't set selected or dispatch change event.
|
||
}
|
||
/**
|
||
* @private (protected)
|
||
*
|
||
* @langversion 3.0
|
||
* @playerversion Flash 9.0.28.0
|
||
*/
|
||
override protected function drawLayout():void {
|
||
var textPadding:Number = Number(getStyleValue("textPadding"));
|
||
var nodeIndent:Number = Number(getStyleValue("nodeIndent"));
|
||
var leftMargin:Number = Number(getStyleValue("leftMargin"));
|
||
var textFieldX:Number = 0;
|
||
|
||
// Align icon and add the indent derived from node's level
|
||
if (icon != null) {
|
||
icon.x = leftMargin + data.nodeLevel * nodeIndent;
|
||
icon.y = Math.round((height-icon.height)>>1);
|
||
textFieldX = icon.x + icon.width + textPadding;
|
||
}
|
||
|
||
|
||
// Align text and add the indent derived from node's level
|
||
if (label.length > 0) {
|
||
textField.visible = true;
|
||
var textWidth:Number = Math.max(0, width - textFieldX - textPadding*2);
|
||
textField.width = textWidth;
|
||
textField.height = textField.textHeight + 4;
|
||
textField.x = textFieldX;
|
||
textField.y = Math.round((height-textField.height)>>1);
|
||
} else {
|
||
textField.visible = false;
|
||
}
|
||
|
||
// Size background
|
||
background.width = width;
|
||
background.height = height;
|
||
}
|
||
|
||
}
|
||
} |