]> wagnertech.de Git - timetracker.git/blobdiff - WEB-INF/lib/libchart/classes/view/chart/BarChart.php
Initial repo created
[timetracker.git] / WEB-INF / lib / libchart / classes / view / chart / BarChart.php
diff --git a/WEB-INF/lib/libchart/classes/view/chart/BarChart.php b/WEB-INF/lib/libchart/classes/view/chart/BarChart.php
new file mode 100644 (file)
index 0000000..c5d9b82
--- /dev/null
@@ -0,0 +1,183 @@
+<?php
+       /* Libchart - PHP chart library
+        * Copyright (C) 2005-2008 Jean-Marc Trémeaux (jm.tremeaux at gmail.com)
+        * 
+        * This program is free software: you can redistribute it and/or modify
+        * it under the terms of the GNU General Public License as published by
+        * the Free Software Foundation, either version 3 of the License, or
+        * (at your option) any later version.
+        * 
+        * This program is distributed in the hope that it will be useful,
+        * but WITHOUT ANY WARRANTY; without even the implied warranty of
+        * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+        * GNU General Public License for more details.
+        *
+        * You should have received a copy of the GNU General Public License
+        * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+        * 
+        */
+       
+       /**
+        * Base abstract class for rendering both horizontal and vertical bar charts.
+        *
+        * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com)
+        */
+       abstract class BarChart extends Chart {
+               protected $bound;
+               protected $axis;
+               protected $hasSeveralSerie;
+               
+               /**
+                * Creates a new bar chart.
+                *
+                * @param integer width of the image
+                * @param integer height of the image
+                */
+               protected function BarChart($width, $height) {
+                       parent::Chart($width, $height);
+
+                       // Initialize the bounds
+                       $this->bound = new Bound();
+                       $this->bound->setLowerBound(0);
+               }
+
+               /**
+                * Compute the axis.
+                */
+               protected function computeAxis() {
+                       $this->axis = new Axis($this->bound->getYMinValue(), $this->bound->getYMaxValue());
+                       $this->axis->computeBoundaries();
+               }
+
+               /**
+                * Create the image.
+                */
+               protected function createImage() {
+                       parent::createImage();
+
+                       // Get graphical obects
+                       $img = $this->plot->getImg();
+                       $palette = $this->plot->getPalette();
+                       $text = $this->plot->getText();
+                       $primitive = $this->plot->getPrimitive();
+                       
+                       // Get the graph area
+                       $graphArea = $this->plot->getGraphArea();
+
+                       // Aqua-like background
+                       for ($i = $graphArea->y1; $i < $graphArea->y2; $i++) {
+                               $color = $palette->aquaColor[($i + 3) % 4];
+                               $primitive->line($graphArea->x1, $i, $graphArea->x2, $i, $color);
+                       }
+
+                       // Axis
+                       imagerectangle($img, $graphArea->x1 - 1, $graphArea->y1, $graphArea->x1, $graphArea->y2, $palette->axisColor[0]->getColor($img));
+                       imagerectangle($img, $graphArea->x1 - 1, $graphArea->y2, $graphArea->x2, $graphArea->y2 + 1, $palette->axisColor[0]->getColor($img));
+               }
+
+               /**
+                * Returns true if the data set has some data.
+                * @param minNumberOfPoint Minimum number of points (1 for bars, 2 for lines).
+                *
+                * @return true if data set empty
+                */
+               protected function isEmptyDataSet($minNumberOfPoint) {
+                       if ($this->dataSet instanceof XYDataSet) {
+                               $pointList = $this->dataSet->getPointList();
+                               $pointCount = count($pointList);
+                               return $pointCount < $minNumberOfPoint;
+                       } else if ($this->dataSet instanceof XYSeriesDataSet) {
+                               $serieList = $this->dataSet->getSerieList();
+                               reset($serieList);
+                               if (count($serieList) > 0) {
+                                       $serie = current($serieList);
+                                       $pointList = $serie->getPointList();
+                                       $pointCount = count($pointList);
+                                       return $pointCount < $minNumberOfPoint;
+                               }
+                       } else {
+                               die("Error: unknown dataset type");
+                       }
+               }
+
+               /**
+                * Checks the data model before rendering the graph.
+                */
+               protected function checkDataModel() {
+                       // Check if a dataset was defined
+                       if (!$this->dataSet) {
+                               die("Error: No dataset defined.");
+                       }
+                       
+                       // Bar charts accept both XYDataSet and XYSeriesDataSet
+                       if ($this->dataSet instanceof XYDataSet) {
+                               // The dataset contains only one serie
+                               $this->hasSeveralSerie = false;
+                       } else if ($this->dataSet instanceof XYSeriesDataSet) {
+                               // Check if each series has the same number of points
+                               unset($lastPointCount);
+                               $serieList = $this->dataSet->getSerieList();
+                               for ($i = 0; $i < count($serieList); $i++) {
+                                       $serie = $serieList[$i];
+                                       $pointCount = count($serie->getPointList());
+                                       if (isset($lastPointCount) && $pointCount != $lastPointCount) {
+                                               die("Error: serie <" . $i . "> doesn't have the same number of points as last serie (last one: <" . $lastPointCount. ">, this one: <" . $pointCount. ">).");
+                                       }
+                                       $lastPointCount = $pointCount;
+                               }
+                               
+                               // The dataset contains several series
+                               $this->hasSeveralSerie = true;
+                       } else {
+                               die("Error: Bar chart accept only XYDataSet and XYSeriesDataSet");
+                       }
+               }
+
+               /**
+                * Return the data as a series list (for consistency).
+                *
+                * @return List of series
+                */
+               protected function getDataAsSerieList() {
+                       // Get the data as a series list
+                       $serieList = null;
+                       if ($this->dataSet instanceof XYSeriesDataSet) {
+                               $serieList = $this->dataSet->getSerieList();
+                       } else if ($this->dataSet instanceof XYDataSet) {
+                               $serieList = array();
+                               array_push($serieList, $this->dataSet);
+                       }
+                       
+                       return $serieList;
+               }
+               
+               /**
+                * Return the first serie of the list, or the dataSet itself if there is no serie.
+                *
+                * @return XYDataSet
+                */
+               protected function getFirstSerieOfList() {
+                       $pointList = null;
+                       if ($this->dataSet instanceof XYSeriesDataSet) {
+                               // For a series dataset, print the legend from the first serie
+                               $serieList = $this->dataSet->getSerieList();
+                               reset($serieList);
+                               $serie = current($serieList);
+                               $pointList = $serie->getPointList();
+                       } else if ($this->dataSet instanceof XYDataSet) {
+                               $pointList = $this->dataSet->getPointList();
+                       }
+                       
+                       return $pointList;
+               }
+               
+               /**
+                * Retourns the bound.
+                *
+                * @return bound Bound
+                */
+               public function getBound() {
+                       return $this->bound;
+               }
+       }
+?>
\ No newline at end of file