blob: f170a5bac52a152db2df239c681a5e723aa15bda [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 mx.charts.chartClasses
{
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.geom.Rectangle;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.utils.Dictionary;
import mx.charts.HitData;
import mx.charts.styles.HaloDefaults;
import mx.core.IDataRenderer;
import mx.core.IUITextField;
import mx.core.UIComponent;
import mx.core.UITextField;
import mx.events.FlexEvent;
import mx.graphics.IFill;
import mx.graphics.SolidColor;
import mx.graphics.SolidColorStroke;
import mx.styles.CSSStyleDeclaration;
import mx.core.IFlexModuleFactory;
//--------------------------------------
// Events
//--------------------------------------
/**
* Dispatched when an object's state changes from visible to invisible.
*
* @eventType mx.events.FlexEvent.HIDE
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="hide", type="mx.events.FlexEvent")]
/**
* Dispatched when the component becomes visible.
*
* @eventType mx.events.FlexEvent.SHOW
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="show", type="mx.events.FlexEvent")]
//--------------------------------------
// Styles
//--------------------------------------
include "../../styles/metadata/LeadingStyle.as"
include "../../styles/metadata/PaddingStyles.as"
include "../../styles/metadata/TextStyles.as"
/**
* Background color of the component.
* You can either have a <code>backgroundColor</code>
* or a <code>backgroundImage</code>, but not both.
* Note that some components, like a Button, do not have a background
* because they are completely filled with the button face or other graphics.
* The DataGrid control also ignores this style.
* The default value is <code>undefined</code>.
* If both this style and the backgroundImage style are undefined,
* the control has a transparent background.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="backgroundColor", type="uint", format="Color", inherit="no")]
/**
* Black section of a three-dimensional border,
* or the color section of a two-dimensional border.
* The following components support this style: Button, CheckBox, ComboBox,
* MenuBar, NumericStepper, ProgressBar, RadioButton, ScrollBar, Slider,
* and all components that support the <code>borderStyle</code> style.
* The default value depends on the component class;
* if not overriden for the class, it is <code>0xAAB3B3</code>.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="borderColor", type="uint", format="Color", inherit="no")]
/**
* Bounding box style.
* The possible values are <code>"none"</code>, <code>"solid"</code>,
* <code>"inset"</code> and <code>"outset"</code>.
* The default value is <code>"inset"</code>.
*
* <p>Note: The <code>borderStyle</code> style is not supported by the
* Button control or the Panel container.
* To make solid border Panels, set the <code>borderThickness</code>
* property, and set the <code>dropShadow</code> property to
* <code>false</code> if desired.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="borderStyle", type="String", enumeration="inset,outset,solid,none", inherit="no")]
/**
* Number of pixels between the datatip's bottom border and its content area.
* The default value is 0.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="paddingBottom", type="Number", format="Length", inherit="no")]
/**
* Number of pixels between the datatip's top border and its content area.
* The default value is 0.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="paddingTop", type="Number", format="Length", inherit="no")]
/**
* Bottom inside color of a button's skin.
* A section of the three-dimensional border.
* The default value is <code>0xEEEEEE</code> (light gray).
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Style(name="shadowColor", type="uint", format="Color", inherit="yes")]
/**
* The DataTip control provides information
* about a data point to chart users.
* When a user moves their mouse over a graphical element, the DataTip
* control displays text that provides information about the element.
* You can use DataTip controls to guide users as they work with your
* application or customize the DataTips to provide additional functionality.
*
* <p>To enable DataTips on a chart, set its <code>showDataTips</code>
* property to <code>true</code>.</p>
*
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class DataTip extends UIComponent implements IDataRenderer
{
include "../../core/Version.as";
//--------------------------------------------------------------------------
//
// Class initialization
//
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//
// Class constnats
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static const HEX_DIGITS:String = "0123456789ABCDEF";
//--------------------------------------------------------------------------
//
// Class variables
//
//--------------------------------------------------------------------------
[Inspectable(environment="none")]
/**
* Specifies the maximum width of the bounding box, in pixels,
* for new DataTip controls.
*
* @default 300
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public static var maxTipWidth:Number = 300;
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function DataTip()
{
super();
mouseChildren = false;
mouseEnabled = false;
}
//--------------------------------------------------------------------------
//
// Variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static var _moduleFactoryInitialized:Dictionary = new Dictionary(true);
/**
* @private.
*/
private var _label:IUITextField;
/**
* @private.
*/
private var _format:TextFormat;
/**
* @private.
*/
private var _hitData:HitData;
/**
* @private.
*/
private var _labelWidth:Number;
/**
* @private.
*/
private var _labelHeight:Number;
/**
* @private.
*/
private var _shadowFill:IFill = IFill(new SolidColor(0xAAAAAA, 0.55));
/**
* @private.
*/
private var stroke:SolidColorStroke = new SolidColorStroke(0, 0, 1);
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// data
//----------------------------------
[Inspectable(environment="none")]
/**
* The HitData structure describing the data point
* that the DataTip is rendering.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get data():Object
{
return _hitData;
}
/**
* @private
*/
public function set data(value:Object):void
{
_hitData = HitData(value);
stroke = new SolidColorStroke(_hitData.contextColor, 0, 100);
setText(_hitData.displayText);
invalidateDisplayList();
}
//--------------------------------------------------------------------------
//
// Overridden methods: UIComponent
//
//--------------------------------------------------------------------------
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
override public function set moduleFactory(factory:IFlexModuleFactory):void
{
super.moduleFactory = factory;
if (_moduleFactoryInitialized[factory])
return;
_moduleFactoryInitialized[factory] = true;
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
override protected function createChildren():void
{
super.createChildren();
// Create the TextField that displays the DataTip text.
if (!_label)
{
_label = IUITextField(createInFontContext(UITextField));
_label.x = getStyle("paddingLeft")
_label.y = getStyle("paddingTop");
_label.autoSize = TextFieldAutoSize.LEFT;
_label.selectable = false;
_label.multiline = true;
addChild(DisplayObject(_label));
}
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
override protected function measure():void
{
super.measure();
var borderMetrics:Rectangle = new Rectangle(1, 1, 0, 0);
var leftInset:Number = borderMetrics.left + getStyle("paddingLeft");
var topInset:Number = borderMetrics.top + getStyle("paddingTop");
var rightInset:Number = borderMetrics.right + getStyle("paddingRight");
var bottomInset:Number = borderMetrics.bottom + getStyle("paddingBottom");
var widthSlop:Number = leftInset + rightInset;
var heightSlop:Number = topInset + bottomInset;
_label.wordWrap = false;
if (_label.textWidth + widthSlop > DataTip.maxTipWidth)
{
_label.width = DataTip.maxTipWidth - widthSlop;
_label.wordWrap = true;
_label.width = _label.textWidth + widthSlop;
}
_labelWidth = _label.width + widthSlop;
_labelHeight = _label.height + heightSlop;
measuredWidth = _labelWidth + 6;
measuredHeight = _labelHeight + 6;
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var g:Graphics = graphics;
g.clear();
var xpos:Number = 0;
var ypos:Number = 0;
g.moveTo(measuredWidth, 2);
_shadowFill.begin(g,
new Rectangle(xpos, ypos, measuredWidth, measuredHeight),null);
g.lineTo(measuredWidth + 2, 2);
g.lineTo(measuredWidth + 2, measuredHeight + 2);
g.lineTo(2,measuredHeight + 2);
g.lineTo(2,measuredHeight);
g.lineTo(measuredWidth - 2, measuredHeight - 2);
g.lineTo(measuredWidth - 2, 2);
_shadowFill.end(g);
var fill:IFill = IFill(new SolidColor(getStyle("backgroundColor"), 0.8));
GraphicsUtilities.fillRect(g, xpos, ypos, measuredWidth,
measuredHeight, fill, stroke);
_label.x = xpos + getStyle("paddingLeft")
_label.y = ypos + getStyle("paddingTop");
}
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
private function setText(t:String):void
{
// Make sure the text styles are applied.
// However, we don't want leftMargin and rightMargin
// of the TextField's TextFormat to be set to the
// paddingLeft and paddingRight of the ToolTip style.
// We want these styles to affect the space between the
// TextField and the border, but not the margins within
// the TextField.
var _format:TextFormat = _label.getTextFormat();
_format.leftMargin = 0;
_format.rightMargin = 0;
_label.defaultTextFormat = _format;
_label.htmlText = t;
invalidateSize();
}
/**
* @private
*/
private function decToColor(v:Number):String
{
var str:String = "#";
for (var i:int = 5; i >= 0; i--)
{
str += HEX_DIGITS.charAt((v >> i*4) & 0xF);
}
return str;
}
}
}