blob: 38e338185ec47885d4f1ab164471c62335bee5db [file] [log] [blame]
<?php
/**
* File containing the ezcGraphAxisBoxedLabelRenderer 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
*/
/**
* Renders axis labels centered between two axis steps like normally used for
* bar charts. Used with other chart types this axis label renderer may cause
* unexpected results. You may use this renderer by assigning it to one of the
* charts axis.
*
* <code>
* $chart->xAxis->axisLabelRenderer = new ezcGraphAxisBoxedLabelRenderer();
* </code>
*
* @version //autogentag//
* @package Graph
* @mainclass
*/
class ezcGraphAxisBoxedLabelRenderer extends ezcGraphAxisLabelRenderer
{
/**
* Store step array for later coordinate modifications
*
* @var array(ezcGraphStep)
*/
protected $steps;
/**
* Store direction for later coordinate modifications
*
* @var ezcGraphVector
*/
protected $direction;
/**
* Store coordinate width modifier for later coordinate modifications
*
* @var float
*/
protected $widthModifier;
/**
* Constructor
*
* @param array $options Default option array
* @return void
* @ignore
*/
public function __construct( array $options = array() )
{
parent::__construct( $options );
$this->properties['outerStep'] = true;
}
/**
* Render Axis labels
*
* Render labels for an axis.
*
* @param ezcGraphRenderer $renderer Renderer used to draw the chart
* @param ezcGraphBoundings $boundings Boundings of the axis
* @param ezcGraphCoordinate $start Axis starting point
* @param ezcGraphCoordinate $end Axis ending point
* @param ezcGraphChartElementAxis $axis Axis instance
* @return void
*/
public function renderLabels(
ezcGraphRenderer $renderer,
ezcGraphBoundings $boundings,
ezcGraphCoordinate $start,
ezcGraphCoordinate $end,
ezcGraphChartElementAxis $axis,
ezcGraphBoundings $innerBoundings = null )
{
// receive rendering parameters from axis
$steps = $axis->getSteps();
$this->steps = $steps;
$axisBoundings = new ezcGraphBoundings(
$start->x, $start->y,
$end->x, $end->y
);
// Determine normalized axis direction
$this->direction = new ezcGraphVector(
$end->x - $start->x,
$end->y - $start->y
);
$this->direction->unify();
// Get axis space
$gridBoundings = null;
list( $xSpace, $ySpace ) = $this->getAxisSpace( $renderer, $boundings, $axis, $innerBoundings, $gridBoundings );
// Determine additional required axis space by boxes
$firstStep = reset( $steps );
$lastStep = end( $steps );
$this->widthModifier = 1 + $firstStep->width / 2 + $lastStep->width / 2;
// Draw steps and grid
foreach ( $steps as $nr => $step )
{
$position = new ezcGraphCoordinate(
$start->x + ( $end->x - $start->x ) * ( $step->position + $step->width ) / $this->widthModifier,
$start->y + ( $end->y - $start->y ) * ( $step->position + $step->width ) / $this->widthModifier
);
$stepWidth = $step->width / $this->widthModifier;
$stepSize = new ezcGraphCoordinate(
$axisBoundings->width * $stepWidth,
$axisBoundings->height * $stepWidth
);
if ( $this->showLabels )
{
// Calculate label boundings
switch ( true )
{
case ( abs( $this->direction->x ) > abs( $this->direction->y ) ) &&
( $this->direction->x > 0 ):
$labelBoundings = new ezcGraphBoundings(
$position->x - $stepSize->x + $this->labelPadding,
$position->y + $this->labelPadding,
$position->x - $this->labelPadding,
$position->y + $ySpace - $this->labelPadding
);
$alignement = ezcGraph::CENTER | ezcGraph::TOP;
break;
case ( abs( $this->direction->x ) > abs( $this->direction->y ) ) &&
( $this->direction->x < 0 ):
$labelBoundings = new ezcGraphBoundings(
$position->x + $this->labelPadding,
$position->y + $this->labelPadding,
$position->x + $stepSize->x - $this->labelPadding,
$position->y + $ySpace - $this->labelPadding
);
$alignement = ezcGraph::CENTER | ezcGraph::TOP;
break;
case ( $this->direction->y > 0 ):
$labelBoundings = new ezcGraphBoundings(
$position->x - $xSpace + $this->labelPadding,
$position->y - $stepSize->y + $this->labelPadding,
$position->x - $this->labelPadding,
$position->y - $this->labelPadding
);
$alignement = ezcGraph::MIDDLE | ezcGraph::RIGHT;
break;
case ( $this->direction->y < 0 ):
$labelBoundings = new ezcGraphBoundings(
$position->x - $xSpace + $this->labelPadding,
$position->y + $this->labelPadding,
$position->x - $this->labelPadding,
$position->y + $stepSize->y - $this->labelPadding
);
$alignement = ezcGraph::MIDDLE | ezcGraph::RIGHT;
break;
}
$renderer->drawText( $labelBoundings, $step->label, $alignement );
}
// major grid
if ( $axis->majorGrid )
{
$this->drawGrid(
$renderer,
$gridBoundings,
$position,
$stepSize,
$axis->majorGrid
);
}
// major step
$this->drawStep(
$renderer,
$position,
$this->direction,
$axis->position,
$this->majorStepSize,
$axis->border
);
}
}
/**
* Modify chart data position
*
* Optionally additionally modify the coodinate of a data point
*
* @param ezcGraphCoordinate $coordinate Data point coordinate
* @return ezcGraphCoordinate Modified coordinate
*/
public function modifyChartDataPosition( ezcGraphCoordinate $coordinate )
{
$firstStep = reset( $this->steps );
$offset = $firstStep->width / 2 / $this->widthModifier;
return new ezcGraphCoordinate(
$coordinate->x * abs( $this->direction->y ) +
( $coordinate->x / $this->widthModifier + $offset ) * abs( $this->direction->x ),
$coordinate->y * abs( $this->direction->x ) +
( $coordinate->y / $this->widthModifier + $offset ) * abs( $this->direction->y )
);
}
}
?>