blob: c2b112b4f2c9822bdddf40c2b468558bfd16fe3d [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.Rectangle;
import mx.charts.chartClasses.GraphicsUtilities;
import mx.core.IDataRenderer;
import mx.graphics.IFill;
import mx.graphics.IStroke;
import mx.graphics.SolidColorStroke;
import mx.skins.ProgrammaticSkin;
/**
* The default class used to render the area
* beneath the dataPoints of an AreaSeries object.
* This class renders the area using the fill, stroke, and line type
* as specified by the AreaSeries object's <code>areaFill</code>, <code>areaStroke</code>,
* and <code>form</code> styles, respectively.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class AreaRenderer extends ProgrammaticSkin implements IDataRenderer
{
include "../../core/Version.as";
//--------------------------------------------------------------------------
//
// Class variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static var noStroke:SolidColorStroke = new SolidColorStroke(0, 0, 0);
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function AreaRenderer()
{
super();
}
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// data
//----------------------------------
/**
* @private
* Storage for the data property.
*/
private var _data:Object;
[Inspectable(environment="none")]
/**
* The data that the AreaRenderer renders.
* The AreaRenderer expects this property to be assigned an instance
* of mx.charts.series.renderData.AreaRenderData.
*
* @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 = value;
invalidateDisplayList();
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var fill:IFill = GraphicsUtilities.fillFromStyle(getStyle("areaFill"));
var stroke:IStroke = getStyle("areaStroke");
var form:String = getStyle("form");
var g:Graphics = graphics;
g.clear();
if (!_data)
return;
var boundary:Array /* of Object */ = _data.filteredCache;
var n:int = boundary.length;
if (n == 0)
return;
var xMin:Number;
var xMax:Number = xMin = boundary[0].x;
var yMin:Number;
var yMax:Number = yMin = boundary[0].y;
var v:Object;
for (var i:int = 0; i < n; i++)
{
v = boundary[i];
xMin = Math.min(xMin, v.x);
yMin = Math.min(yMin, v.y);
xMax = Math.max(xMax, v.x);
yMax = Math.max(yMax, v.y);
if (!isNaN(v.min))
{
yMin = Math.min(yMin, v.min);
yMax = Math.max(yMax, v.min);
}
}
if (fill)
fill.begin(g, new Rectangle(xMin, yMin, xMax - xMin, yMax - yMin),null);
GraphicsUtilities.drawPolyLine(g, boundary, 0, n,
"x", "y", stroke, form);
g.lineStyle(0,0,0);
if (boundary[0].element.minField != null && boundary[0].element.minField != "")
{
g.lineTo(boundary[n - 1].x, boundary[n - 1].min);
GraphicsUtilities.drawPolyLine(g, boundary, n - 1, -1,
"x", "min", noStroke, form, false);
}
else
{
g.lineTo(boundary[n - 1].x, _data.renderedBase);
g.lineTo(boundary[0].x, _data.renderedBase);
}
g.lineStyle(0, 0, 0);
g.lineTo(boundary[0].x, boundary[0].y);
g.endFill();
}
}
}