blob: 5884beb3b83d3c82575dc0b482f7f4826ccf6ed2 [file] [log] [blame]
<?php
/**
* File containing the ezcGraphOdometerChart class
*
* 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 Graph
* @version //autogentag//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Class for odometer charts. Can only use one dataset which will be dispalyed
* as a odometer chart.
*
* <code>
* $graph = new ezcGraphOdometerChart();
* $graph->title = 'Custom odometer';
*
* $graph->data['data'] = new ezcGraphArrayDataSet(
* array( 87 )
* );
*
* // Set the marker color
* $graph->data['data']->color[0] = '#A0000055';
*
* // Set colors for the background gradient
* $graph->options->startColor = '#2E3436';
* $graph->options->endColor = '#EEEEEC';
*
* // Define a border for the odometer
* $graph->options->borderWidth = 2;
* $graph->options->borderColor = '#BABDB6';
*
* // Set marker width
* $graph->options->markerWidth = 5;
*
* // Set space, which the odometer may consume
* $graph->options->odometerHeight = .7;
*
* // Set axis span and label
* $graph->axis->min = 0;
* $graph->axis->max = 100;
* $graph->axis->label = 'Coverage ';
*
* $graph->render( 400, 150, 'custom_odometer_chart.svg' );
* </code>
*
* Each chart consists of several chart elements which represents logical parts
* of the chart and can be formatted independently. The odometer chart consists
* of:
* - title ( {@link ezcGraphChartElementText} )
* - background ( {@link ezcGraphChartElementBackground} )
*
* All elements can be configured by accessing them as properties of the chart:
*
* <code>
* $chart->title->position = ezcGraph::BOTTOM;
* </code>
*
* The chart itself also offers several options to configure the appearance.
* The extended configure options are available in
* {@link ezcGraphOdometerChartOptions} extending the {@link
* ezcGraphChartOptions}.
*
* @property ezcGraphOdometerChartOptions $options
* Chart options class
*
* @version //autogentag//
* @package Graph
* @mainclass
*/
class ezcGraphOdometerChart extends ezcGraphChart
{
/**
* Constructor
*
* @param array $options Default option array
* @return void
* @ignore
*/
public function __construct( array $options = array() )
{
$this->options = new ezcGraphOdometerChartOptions( $options );
parent::__construct( $options );
$this->data = new ezcGraphChartSingleDataContainer( $this );
$this->addElement( 'axis', new ezcGraphChartElementNumericAxis());
$this->elements['axis']->axisLabelRenderer = new ezcGraphAxisCenteredLabelRenderer();
$this->elements['axis']->axisLabelRenderer->showZeroValue = true;
$this->elements['axis']->position = ezcGraph::LEFT;
$this->elements['axis']->axisSpace = .05;
}
/**
* Property write access
*
* @throws ezcBasePropertyNotFoundException
* If Option could not be found
* @throws ezcBaseValueException
* If value is out of range
* @param string $propertyName Option name
* @param mixed $propertyValue Option value;
* @return void
* @ignore
*/
public function __set( $propertyName, $propertyValue )
{
switch ( $propertyName ) {
case 'axis':
if ( $propertyValue instanceof ezcGraphChartElementAxis )
{
$this->addElement( 'axis', $propertyValue );
$this->elements['axis']->axisLabelRenderer = new ezcGraphAxisCenteredLabelRenderer();
$this->elements['axis']->axisLabelRenderer->showZeroValue = true;
$this->elements['axis']->position = ezcGraph::LEFT;
$this->elements['axis']->axisSpace = .05;
}
else
{
throw new ezcBaseValueException( $propertyName, $propertyValue, 'ezcGraphChartElementAxis' );
}
break;
case 'renderer':
if ( $propertyValue instanceof ezcGraphOdometerRenderer )
{
parent::__set( $propertyName, $propertyValue );
}
else
{
throw new ezcBaseValueException( $propertyName, $propertyValue, 'ezcGraphOdometerRenderer' );
}
break;
default:
parent::__set( $propertyName, $propertyValue );
}
}
/**
* Render the assigned data
*
* Will renderer all charts data in the remaining boundings after drawing
* all other chart elements. The data will be rendered depending on the
* settings in the dataset.
*
* @param ezcGraphRenderer $renderer Renderer
* @param ezcGraphBoundings $boundings Remaining boundings
* @return void
*/
protected function renderData( ezcGraphRenderer $renderer, ezcGraphBoundings $boundings )
{
// Draw the odometer data
$dataset = $this->data->rewind();
foreach ( $dataset as $key => $value )
{
$renderer->drawOdometerMarker(
$boundings,
$this->elements['axis']->axisLabelRenderer->modifyChartDataPosition(
new ezcGraphCoordinate(
$this->elements['axis']->getCoordinate( $value ),
0
)
),
$dataset->symbol[$key],
$dataset->color[$key],
$this->options->markerWidth
);
}
}
/**
* Returns the default display type of the current chart type.
*
* @return int Display type
*/
public function getDefaultDisplayType()
{
return ezcGraph::ODOMETER;
}
/**
* Renders the basic elements of this chart type
*
* @param int $width
* @param int $height
* @return void
*/
protected function renderElements( $width, $height )
{
if ( !count( $this->data ) )
{
throw new ezcGraphNoDataException();
}
// Set image properties in driver
$this->driver->options->width = $width;
$this->driver->options->height = $height;
// no legend
$this->renderElement['legend'] = false;
// Get boundings from parameters
$this->options->width = $width;
$this->options->height = $height;
$boundings = new ezcGraphBoundings();
$boundings->x1 = $this->options->width;
$boundings->y1 = $this->options->height;
// Get values out the single used dataset to calculate axis boundings
$values = array();
foreach ( $this->data->rewind() as $value )
{
$values[] = $value;
}
// Set values for Axis
$this->elements['axis']->addData( $values );
$this->elements['axis']->nullPosition = 0.5 + $this->options->odometerHeight / 2;
$this->elements['axis']->calculateAxisBoundings();
// Render subelements exept axis, which will be drawn together with the
// odometer bar
foreach ( $this->elements as $name => $element )
{
// Skip element, if it should not get rendered
if ( $this->renderElement[$name] === false ||
$name === 'axis' )
{
continue;
}
$this->driver->options->font = $element->font;
$boundings = $element->render( $this->renderer, $boundings );
}
// Draw basic odometer
$this->driver->options->font = $this->elements['axis']->font;
$boundings = $this->renderer->drawOdometer(
$boundings,
$this->elements['axis'],
$this->options
);
// Render graph
$this->renderData( $this->renderer, $boundings );
}
/**
* Render the pie chart
*
* Renders the chart into a file or stream. The width and height are
* needed to specify the dimensions of the resulting image. For direct
* output use 'php://stdout' as output file.
*
* @param int $width Image width
* @param int $height Image height
* @param string $file Output file
* @apichange
* @return void
*/
public function render( $width, $height, $file = null )
{
$this->renderElements( $width, $height );
if ( !empty( $file ) )
{
$this->renderer->render( $file );
}
$this->renderedFile = $file;
}
/**
* Renders this chart to direct output
*
* Does the same as ezcGraphChart::render(), but renders directly to
* output and not into a file.
*
* @param int $width
* @param int $height
* @apichange
* @return void
*/
public function renderToOutput( $width, $height )
{
// @TODO: merge this function with render an deprecate ommit of third
// argument in render() when API break is possible
$this->renderElements( $width, $height );
$this->renderer->render( null );
}
}
?>