WindTheBusiness/com/yahoo/astra/fl/charts/DataTipRenderer.as
2020-10-20 00:58:15 +02:00

220 lines
4.9 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.charts
{
import com.yahoo.astra.fl.utils.UIComponentUtil;
import fl.core.InvalidationType;
import fl.core.UIComponent;
import flash.display.DisplayObject;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
//--------------------------------------
// Styles
//--------------------------------------
/**
* The padding that separates the border of the component from its contents,
* in pixels.
*
* @default 6
*/
[Style(name="contentPadding", type="Number")]
/**
* The DisplayObject subclass used to display the background.
*/
[Style(name="backgroundSkin", type="Class")]
/**
* The default renderer for mouse-over data tips.
*
* @author Josh Tynjala
*/
public class DataTipRenderer extends UIComponent implements IDataTipRenderer
{
//--------------------------------------
// Class Variables
//--------------------------------------
/**
* @private
*/
private static var defaultStyles:Object =
{
contentPadding: 6,
backgroundSkin: "ChartDataTipBackground",
embedFonts: false
}
//--------------------------------------
// Class Methods
//--------------------------------------
/**
* @private
* @copy fl.core.UIComponent#getStyleDefinition()
*/
public static function getStyleDefinition():Object
{
return mergeStyles(defaultStyles, UIComponent.getStyleDefinition());
}
//--------------------------------------
// Constructor
//--------------------------------------
/**
* Constructor.
*/
public function DataTipRenderer()
{
super();
this.mouseEnabled = false;
this.mouseChildren = false;
}
//--------------------------------------
// Properties
//--------------------------------------
/**
* @private
*/
protected var label:TextField;
/**
* @private
*/
protected var background:DisplayObject;
/**
* @private
* Storage for the text property.
*/
private var _text:String = "";
/**
* @copy com.yahoo.astra.fl.charts.IDataTipRenderer#text
*/
public function get text():String
{
return this._text;
}
/**
* @private
*/
public function set text(value:String):void
{
if(value == null) value = "";
if(this._text != value)
{
this._text = value;
this.invalidate(InvalidationType.DATA);
}
}
/**
* @private
* Storage for the data property.
*/
private var _data:Object;
/**
* @copy com.yahoo.astra.fl.charts.IDataTipRenderer#data
*/
public function get data():Object
{
return this._data;
}
/**
* @private
*/
public function set data(value:Object):void
{
if(this._data != value)
{
this._data = value;
this.invalidate(InvalidationType.DATA);
}
}
//--------------------------------------
// Protected Methods
//--------------------------------------
/**
* @private
*/
override protected function configUI():void
{
super.configUI();
this.label = new TextField();
this.label.autoSize = TextFieldAutoSize.LEFT;
this.label.selectable = false;
this.addChild(this.label);
}
/**
* @private
*/
override protected function draw():void
{
var stylesInvalid:Boolean = this.isInvalid(InvalidationType.STYLES);
var dataInvalid:Boolean = this.isInvalid(InvalidationType.DATA);
var contentPadding:Number = this.getStyleValue("contentPadding") as Number;
if(stylesInvalid)
{
if(this.background)
{
this.removeChild(this.background);
this.background = null;
}
var skinClass:Object = this.getStyleValue("backgroundSkin");
this.background = UIComponentUtil.getDisplayObjectInstance(this, skinClass);
this.addChildAt(this.background, 0);
var format:TextFormat = this.getStyleValue("textFormat") as TextFormat;
var embedFonts:Boolean = this.getStyleValue("embedFonts") as Boolean;
this.label.defaultTextFormat = format;
this.label.embedFonts = embedFonts;
this.label.x = contentPadding;
this.label.y = contentPadding;
}
if(dataInvalid)
{
this.label.text = this.text;
}
//the datatip sizes itself!
this._width = this.label.width + 2 * contentPadding;
this._height = this.label.height + 2 * contentPadding;
if(this.background)
{
this.background.width = this._width;
this.background.height = this._height;
if(this.background is UIComponent)
{
UIComponent(this.background).drawNow();
}
}
super.draw();
}
}
}