blob: 217b6287f8b494a79937aeb0a7d7d1350ca35bfc [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.renderers
{
import flash.display.Graphics;
import flash.geom.Point;
import flash.geom.Rectangle;
import mx.charts.chartClasses.GraphicsUtilities;
import mx.charts.series.items.PieSeriesItem;
import mx.core.IDataRenderer;
import mx.graphics.IFill;
import mx.graphics.IStroke;
import mx.graphics.SolidColor;
import mx.skins.ProgrammaticSkin;
import mx.utils.ColorUtil;
import mx.charts.ChartItem;
/**
* The default itemRenderer for a PieSeries object.
* This class renders a wedge using the <code>stroke</code> and <code>radialStroke</code> styles
* of the owning series to draw the inner and outer edges and side edges
* of the wedge, respectively.
* The wedge is filled using the value of the <code>fill</code> property
* of the associated chart item.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class WedgeItemRenderer extends ProgrammaticSkin implements IDataRenderer
{
include "../../core/Version.as";
//--------------------------------------------------------------------------
//
// Class constants
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static const SHADOW_INSET:Number = 8;
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function WedgeItemRenderer()
{
super();
}
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// data
//----------------------------------
/**
* @private
* Storage for the data property.
*/
private var _data:PieSeriesItem;
[Inspectable(environment="none")]
/**
* The chart item that this renderer represents.
* WedgeItemRenderers assume that this value
* is an instance of PieSeriesItem.
* This value is assigned by the owning series.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get data():Object
{
return _data;
}
/**
* @private
*/
public function set data(value:Object):void
{
_data = PieSeriesItem(value);
invalidateDisplayList();
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var g:Graphics = graphics;
g.clear();
if (!_data)
return;
var stroke:IStroke = getStyle("stroke");
var radialStroke:IStroke = getStyle("radialStroke");
var outerRadius:Number = _data.outerRadius;
var innerRadius:Number = _data.innerRadius;
var origin:Point = _data.origin;
var angle:Number = _data.angle;
var startAngle:Number = _data.startAngle;
if (stroke && !isNaN(stroke.weight))
outerRadius -= Math.max(stroke.weight/2,SHADOW_INSET);
else
outerRadius -= SHADOW_INSET;
outerRadius = Math.max(outerRadius, innerRadius);
var rc:Rectangle = new Rectangle(origin.x - outerRadius,
origin.y - outerRadius,
2 * outerRadius, 2 * outerRadius);
var fill:IFill = _data.fill;
var state:String = _data.currentState;
var color:uint;
switch (state)
{
case ChartItem.FOCUSED:
case ChartItem.ROLLOVER:
if (styleManager.isValidStyleValue(getStyle('itemRollOverColor')))
color = getStyle('itemRollOverColor');
else
color = ColorUtil.adjustBrightness2(GraphicsUtilities.colorFromFill(fill),-20);
fill = new SolidColor(color);
break;
case ChartItem.DISABLED:
if (styleManager.isValidStyleValue(getStyle('itemDisabledColor')))
color = getStyle('itemDisabledColor');
else
color = ColorUtil.adjustBrightness2(GraphicsUtilities.colorFromFill(fill),20);
fill = new SolidColor(GraphicsUtilities.colorFromFill(color));
break;
case ChartItem.FOCUSEDSELECTED:
case ChartItem.SELECTED:
if (styleManager.isValidStyleValue(getStyle('itemSelectionColor')))
color = getStyle('itemSelectionColor');
else
color = ColorUtil.adjustBrightness2(GraphicsUtilities.colorFromFill(fill),-30);
fill = new SolidColor(color);
break;
}
var startPt:Point = new Point(
origin.x + Math.cos(startAngle) * outerRadius,
origin.y - Math.sin(startAngle) * outerRadius);
var endPt:Point = new Point(
origin.x + Math.cos(startAngle + angle) * outerRadius,
origin.y - Math.sin(startAngle + angle) * outerRadius);
g.moveTo(endPt.x, endPt.y);
fill.begin(g,rc,null);
GraphicsUtilities.setLineStyle(g, radialStroke);
if (innerRadius == 0)
{
g.lineTo(origin.x, origin.y);
g.lineTo(startPt.x, startPt.y);
}
else
{
var innerStart:Point = new Point(
origin.x + Math.cos(startAngle + angle) * innerRadius,
origin.y - Math.sin(startAngle + angle) * innerRadius);
g.lineTo(innerStart.x, innerStart.y);
GraphicsUtilities.setLineStyle(g, stroke);
GraphicsUtilities.drawArc(g, origin.x, origin.y,
startAngle + angle, -angle,
innerRadius, innerRadius, true);
GraphicsUtilities.setLineStyle(g, radialStroke);
g.lineTo(startPt.x, startPt.y);
}
GraphicsUtilities.setLineStyle(g, stroke);
GraphicsUtilities.drawArc(g, origin.x, origin.y,
startAngle, angle,
outerRadius, outerRadius, true);
fill.end(g);
}
}
}