Subversion Repositories Applications.gtt

Rev

Rev 61 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/*
 * This work is hereby released into the Public Domain.
 * To view a copy of the public domain dedication,
 * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
 * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
 *
 */

require_once dirname(__FILE__)."/Plot.class.php";

/**
 * BarPlot
 *
 * @package Artichow
 */
class awBarPlot extends awPlot implements awLegendable {
        
        /**
         * Labels on your bar plot
         *
         * @var Label
         */
        public $label;
        
        /**
         * Bar plot identifier
         *
         * @var int
         */
        protected $identifier;
        
        /**
         * Bar plot number
         *
         * @var int
         */
        protected $number;
        
        /**
         * Bar plot depth
         *
         * @var int
         */
        protected $depth;
        
        /**
         * For moving bars
         *
         * @var int
         */
        protected $move;
        
        /**
         * Bars shadow
         *
         * @var Shadow
         */
        public $barShadow;
        
        /**
         * Bars border
         *
         * @var Border
         */
        public $barBorder;
        
        /**
         * Bars padding
         *
         * @var Side
         */
        protected $barPadding;
        
        /**
         * Bars space
         *
         * @var int
         */
        protected $barSpace = 0;
        
        /**
         * Bars background
         *
         * @var Color, Gradient
         */
        protected $barBackground;
                
        /**
         * Construct a new awBarPlot
         *
         * @param array $values Some numeric values for Y axis
         * @param int $identifier Plot identifier
         * @param int $number Bar plot number
         * @param int $depth Bar plot depth in pixels
         */
        public function __construct($values, $identifier = 1, $number = 1, $depth = 0) {
        
                parent::__construct();
                
                $this->label = new awLabel;
                
                $this->barPadding = new awSide(0.08, 0.08, 0, 0);
                $this->barShadow = new awShadow(awShadow::RIGHT_TOP);
                $this->barBorder = new awBorder;
                
                $this->setValues($values);
                
                $this->identifier = (int)$identifier;
                $this->number = (int)$number;
                $this->depth = (int)$depth;
                
                $this->move = new awSide;
                
                // Hide vertical grid
                $this->grid->hideVertical(TRUE);
        
        }
        
        /**
         * Change bars padding
         * This method is not compatible with awBarPlot::setBarPadding()
         *
         * @param float $left Left padding (between 0 and 1)
         * @param float $right Right padding (between 0 and 1)
         */
        public function setBarPadding($left = NULL, $right = NULL) {
                $this->barPadding->set($left, $right);
        }
        
        /**
         * Change bars size
         * This method is not compatible with awBarPlot::setBarPadding()
         *
         * @param int $width Bars size (between 0 and 1)
         */
        public function setBarSize($size) {
                $padding = (1 - $size) / 2;
                $this->barPadding->set($padding, $padding);
        }
        
        /**
         * Move bars
         *
         * @param int $x
         * @param int $y
         */
        public function move($x, $y) {
                $this->move->set($x, NULL, $y, NULL);
        }
        
        /**
         * Change bars space
         *
         * @param int $space Space in pixels
         */
        public function setBarSpace($space) {
                $this->barSpace = (int)$space;
        }
        
        /**
         * Change line background color
         *
         * @param awColor $color
         */
        public function setBarColor(awColor $color) {
                $this->barBackground = $color;
        }
        
        /**
         * Change line background gradient
         *
         * @param awGradient $gradient
         */
        public function setBarGradient(awGradient $gradient) {
                $this->barBackground = $gradient;
        }

        /**
         * Get the line thickness
         *
         * @return int
         */
        public function getLegendLineThickness() {
        }

        /**
         * Get the line type
         *
         * @return int
         */
        public function getLegendLineStyle() {
        }

        /**
         * Get the color of line
         *
         * @return Color
         */
        public function getLegendLineColor() {
        }

        /**
         * Get the background color or gradient of an element of the component
         *
         * @return Color, Gradient
         */
        public function getLegendBackground() {
                return $this->barBackground;
        }

        /**
         * Get a mark object
         *
         * @return Mark
         */
        public function getLegendMark() {
        }
        
        public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) {
                
                $count = count($this->datay);
                $max = $this->getRealYMax(NULL);
                $min = $this->getRealYMin(NULL);
                
                // Find zero for bars
                if($this->xAxisZero and $min <= 0 and $max >= 0) {
                        $zero = 0;
                } else if($max < 0) {
                        $zero = $max;
                } else {
                        $zero = $min;
                }
                
                // Get base position
                $zero = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint(0, $zero));
                
                // Distance between two values on the graph
                $distance = $this->xAxis->getDistance(0, 1);
                
                // Compute paddings
                $leftPadding = $this->barPadding->left * $distance;
                $rightPadding = $this->barPadding->right * $distance;
                
                $padding = $leftPadding + $rightPadding;
                $space = $this->barSpace * ($this->number - 1);
                
                $barSize = ($distance - $padding - $space) / $this->number;
                $barPosition = $leftPadding + $barSize * ($this->identifier - 1);
                
                for($key = 0; $key < $count; $key++) {
                
                        $value = $this->datay[$key];
                        
                        if($value !== NULL) {
                
                                $position = awAxis::toPosition(
                                        $this->xAxis,
                                        $this->yAxis,
                                        new awPoint($key, $value)
                                );
                        
                                $barStart = $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x;
                                $barStop = $barStart + $barSize;
                                
                                $t1 = min($zero->y, $position->y);
                                $t2 = max($zero->y, $position->y);
                                
                                if(round($t2 - $t1) == 0) {
                                        continue;
                                }
                                
                                $p1 = new awPoint(
                                        round($barStart) + $this->depth + $this->move->left,
                                        round($t1) - $this->depth + $this->move->top
                                );
                                
                                $p2 = new awPoint(
                                        round($barStop) + $this->depth + $this->move->left,
                                        round($t2) - $this->depth + $this->move->top
                                );
                                
                                $this->drawBar($driver, $p1, $p2);
                                
                        }
                
                }
                
                // Draw labels
                foreach($this->datay as $key => $value) {
                        
                        if($value !== NULL) {
                
                                $position = awAxis::toPosition(
                                        $this->xAxis,
                                        $this->yAxis,
                                        new awPoint($key, $value)
                                );
                        
                                $point = new awPoint(
                                        $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x + $barSize / 2 + 1 + $this->depth,
                                        $position->y - $this->depth
                                );
        
                                $this->label->draw($driver, $point, $key);
                                
                        }
                        
                }
                
        }
        
        public function getXAxisNumber() {
                return count($this->datay) + 1;
        }
        // ça bidouille à fond ici !
        public function getXMax() {
                return array_max($this->datax) + 1;
        }
        
        public function getXCenter() {
                return TRUE;
        }
        
        protected function drawBar(awDriver $driver, awPoint $p1, awPoint $p2) {
        
                // Draw shadow
                $this->barShadow->draw(
                        $driver,
                        $p1,
                        $p2,
                        awShadow::OUT
                );
                
                if(abs($p2->y - $p1->y) > 1) {
                        
                        $this->barBorder->rectangle(
                                $driver,
                                $p1,
                                $p2
                        );
                        
                        if($this->barBackground !== NULL) {
                        
                                $size = $this->barBorder->visible() ? 1 : 0;
                
                                $b1 = $p1->move($size, $size);
                                $b2 = $p2->move(-1 * $size, -1 * $size);
                                
                                // Draw background
                                $driver->filledRectangle(
                                        $this->barBackground,
                                        new awLine($b1, $b2)
                                );
                                
                        }
                
                }
        }

}

registerClass('BarPlot');
?>