[ Index ]
 

Code source de vtiger CRM 5.0.2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/Image/Graph/ -> Plotarea.php (source)

   1  <?php
   2  
   3  /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
   4  
   5  /**
   6   * Image_Graph - PEAR PHP OO Graph Rendering Utility.
   7   *
   8   * PHP versions 4 and 5
   9   *
  10   * LICENSE: This library is free software; you can redistribute it and/or modify
  11   * it under the terms of the GNU Lesser General Public License as published by
  12   * the Free Software Foundation; either version 2.1 of the License, or (at your
  13   * option) any later version. This library is distributed in the hope that it
  14   * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  15   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
  16   * General Public License for more details. You should have received a copy of
  17   * the GNU Lesser General Public License along with this library; if not, write
  18   * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  19   * 02111-1307 USA
  20   *
  21   * @category   Images
  22   * @package    Image_Graph
  23   * @subpackage Plotarea
  24   * @author     Jesper Veggerby <pear.nosey@veggerby.dk>
  25   * @copyright  Copyright (C) 2003, 2004 Jesper Veggerby Hansen
  26   * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  27   * @version    CVS: $Id: Plotarea.php,v 1.23 2006/02/28 22:48:07 nosey Exp $
  28   * @link       http://pear.php.net/package/Image_Graph
  29   */
  30  
  31  /**
  32   * Include file Image/Graph/Layout.php
  33   */
  34  require_once  'Image/Graph/Layout.php';
  35  
  36  /**
  37   * Plot area used for drawing plots.
  38   *
  39   * The plotarea consists of an x-axis and an y-axis, the plotarea can plot multiple
  40   * charts within one plotares, by simply adding them (the axis' will scale to the
  41   * plots automatically). A graph can consist of more plotareas
  42   *
  43   * @category   Images
  44   * @package    Image_Graph
  45   * @subpackage Plotarea
  46   * @author     Jesper Veggerby <pear.nosey@veggerby.dk>
  47   * @copyright  Copyright (C) 2003, 2004 Jesper Veggerby Hansen
  48   * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  49   * @version    Release: 0.7.2
  50   * @link       http://pear.php.net/package/Image_Graph
  51   */
  52  class Image_Graph_Plotarea extends Image_Graph_Layout
  53  {
  54      
  55      /**
  56       * The left most pixel of the 'real' plot area on the canvas
  57       * @var int
  58       * @access private
  59       */
  60      var $_plotLeft = 0;
  61  
  62      /**
  63       * The top most pixel of the 'real' plot area on the canvas
  64       * @var int
  65       * @access private
  66       */
  67      var $_plotTop = 0;
  68  
  69      /**
  70       * The right most pixel of the 'real' plot area on the canvas
  71       * @var int
  72       * @access private
  73       */
  74      var $_plotRight = 0;
  75  
  76      /**
  77       * The bottom most pixel of the 'real' plot area on the canvas
  78       * @var int
  79       * @access private
  80       */
  81      var $_plotBottom = 0;
  82  
  83      /**
  84       * The X axis
  85       * @var Axis
  86       * @access private
  87       */
  88      var $_axisX = null;
  89  
  90      /**
  91       * The Y axis
  92       * @var Axis
  93       * @access private
  94       */
  95      var $_axisY = null;
  96  
  97      /**
  98       * The secondary Y axis
  99       * @var Axis
 100       * @access private
 101       */
 102      var $_axisYSecondary = null;
 103  
 104      /**
 105       * The border style of the 'real' plot area
 106       * @var LineStyle
 107       * @access private
 108       */
 109      var $_plotBorderStyle = null;
 110  
 111      /**
 112       * Does any plot have any data?
 113       * @var bool
 114       * @access private
 115       */
 116      var $_hasData = false;
 117      
 118      /**
 119       * Is the plotarea horizontal?
 120       * @var bool
 121       * @access private
 122       */
 123      var $_horizontal = false;
 124  
 125      /**
 126       * Image_Graph_Plotarea [Constructor]
 127       *
 128       * @param string $axisX The class of the X axis (if omitted a std. axis is created)
 129       * @param string $axisY The class of the Y axis (if omitted a std. axis is created)
 130       * @param string $direction The direction of the plotarea - 'horizontal' or 'vertical' (default)
 131       */
 132      function Image_Graph_Plotarea($axisX = 'Image_Graph_Axis_Category', $axisY = 'Image_Graph_Axis', $direction = 'vertical')
 133      {
 134          parent::Image_Graph_Layout();
 135  
 136          $this->_padding = array('left' => 5, 'top' => 5, 'right' => 5, 'bottom' => 5);;
 137  
 138          include_once  'Image/Graph.php';
 139  
 140          $this->_axisX =& Image_Graph::factory($axisX, IMAGE_GRAPH_AXIS_X);
 141          $this->_axisX->_setParent($this);
 142  
 143          $this->_axisY =& Image_Graph::factory($axisY, IMAGE_GRAPH_AXIS_Y);
 144          $this->_axisY->_setParent($this);
 145          $this->_axisY->_setMinimum(0);
 146  
 147          $this->_fillStyle = false;
 148          
 149          if ($direction == 'horizontal') {
 150              $this->_horizontal = true;
 151              $this->_axisX->_transpose = true;
 152              $this->_axisY->_transpose = true;
 153          }
 154      }
 155  
 156      /**
 157       * Sets the parent. The parent chain should ultimately be a GraPHP object
 158       *
 159       * @see Image_Graph_Common
 160       * @param Image_Graph_Common $parent The parent
 161       * @access private
 162       */
 163      function _setParent(& $parent)
 164      {
 165          parent::_setParent($parent);
 166          if ($this->_axisX !== null) {
 167              $this->_axisX->_setParent($this);
 168          }
 169          if ($this->_axisY !== null) {
 170              $this->_axisY->_setParent($this);
 171          }
 172          if ($this->_axisYSecondary !== null) {
 173              $this->_axisYSecondary->_setParent($this);
 174          }
 175      }
 176  
 177      /**
 178       * Sets the plot border line style of the element.
 179       *
 180       * @param Image_Graph_Line $lineStyle The line style of the border
 181       * @deprecated 0.3.0dev2 - 2004-12-16
 182       */
 183      function setPlotBorderStyle(& $plotBorderStyle)
 184      {        
 185      }
 186  
 187      /**
 188       * Adds an element to the plotarea
 189       *
 190       * @param Image_Graph_Element $element The element to add
 191       * @param int $axis The axis to associate the element with, either
 192       * IMAGE_GRAPH_AXIS_X, IMAGE_GRAPH_AXIS_Y, IMAGE_GRAPH_AXIS_Y_SECONDARY
 193       * or the shorter string notations 'x', 'y' or 'ysec' (defaults to
 194       * IMAGE_GRAPH_AXIS_Y)
 195       * @return Image_Graph_Element The added element
 196       * @see Image_Graph_Common::add()
 197       */
 198      function &add(& $element, $axis = IMAGE_GRAPH_AXIS_Y)    
 199      {
 200          if ($axis == 'x') {
 201              $axis = IMAGE_GRAPH_AXIS_X;
 202          }
 203          if ($axis == 'y') {
 204              $axis = IMAGE_GRAPH_AXIS_Y;
 205          }
 206          if ($axis == 'ysec') {
 207              $axis = IMAGE_GRAPH_AXIS_Y_SECONDARY;
 208          }
 209          if (($axis == IMAGE_GRAPH_AXIS_Y_SECONDARY) &&
 210              ($this->_axisYSecondary == null))
 211          {
 212              $this->_axisYSecondary =& Image_Graph::factory('axis', IMAGE_GRAPH_AXIS_Y_SECONDARY);
 213              $this->_axisYSecondary->_setMinimum(0);
 214              if ($this->_horizontal) {
 215                  $this->_axisYSecondary->_transpose = true;
 216              }
 217          }
 218  
 219          parent::add($element);
 220  
 221          if (is_a($element, 'Image_Graph_Plot')) {
 222              $element->_setAxisY($axis);
 223              // postpone extrema calculation until we calculate coordinates
 224              //$this->_setExtrema($element);
 225          } elseif (is_a($element, 'Image_Graph_Grid')) {
 226              switch ($axis) {
 227              case IMAGE_GRAPH_AXIS_X:
 228                  if ($this->_axisX != null) {
 229                      $element->_setPrimaryAxis($this->_axisX);
 230                      if ($this->_axisY != null) {
 231                          $element->_setSecondaryAxis($this->_axisY);
 232                      }
 233                  }
 234                  break;
 235              case IMAGE_GRAPH_AXIS_Y:
 236                  if ($this->_axisY != null) {
 237                      $element->_setPrimaryAxis($this->_axisY);
 238                      if ($this->_axisX != null) {
 239                          $element->_setSecondaryAxis($this->_axisX);
 240                      }
 241                  }
 242                  break;
 243              case IMAGE_GRAPH_AXIS_Y_SECONDARY:
 244                  if ($this->_axisYSecondary != null) {
 245                      $element->_setPrimaryAxis($this->_axisYSecondary);
 246                      if ($this->_axisX != null) {
 247                          $element->_setSecondaryAxis($this->_axisX);
 248                      }
 249                  }
 250                  break;
 251              }
 252          } elseif (is_a($element, 'Image_Graph_Axis')) {
 253              switch ($element->_type) {
 254              case IMAGE_GRAPH_AXIS_X:
 255                  $this->_axisX =& $element;
 256                  break;
 257  
 258              case IMAGE_GRAPH_AXIS_Y:
 259                  $this->_axisY =& $element;
 260                  break;
 261  
 262              case IMAGE_GRAPH_AXIS_Y_SECONDARY:
 263                  $this->_axisYSecondary =& $element;
 264                  break;
 265  
 266              }
 267              if ($element->_getMinimum() == $element->_getMaximum()) {
 268                  $element->_setMinimum(0);
 269                  $element->_setMaximum(1);
 270              }
 271          }
 272          return $element;
 273      }    
 274  
 275      /**
 276       * Get the width of the 'real' plotarea
 277       *
 278       * @return int The width of the 'real' plotarea, ie not including space occupied by padding and axis
 279       * @access private
 280       */
 281      function _plotWidth()
 282      {
 283          return abs($this->_plotRight - $this->_plotLeft);
 284      }
 285  
 286      /**
 287       * Get the height of the 'real' plotarea
 288       *
 289       * @return int The height of the 'real' plotarea, ie not including space
 290       *   occupied by padding and axis
 291       * @access private
 292       */
 293      function _plotHeight()
 294      {
 295          return abs($this->_plotBottom - $this->_plotTop);
 296      }
 297  
 298      /**
 299       * Set the extrema of the axis
 300       *
 301       * @param Image_Graph_Plot $plot The plot that 'hold' the values
 302       * @access private
 303       */
 304      function _setExtrema(& $plot)
 305      {
 306          if (($this->_axisX != null) && ($this->_axisX->_isNumeric())) {
 307              $this->_axisX->_setMinimum($plot->_minimumX());
 308              $this->_axisX->_setMaximum($plot->_maximumX());
 309          }
 310  
 311          if (($plot->_axisY == IMAGE_GRAPH_AXIS_Y_SECONDARY) &&
 312              ($this->_axisYSecondary !== null) &&
 313              ($this->_axisYSecondary->_isNumeric()))
 314          {
 315              $this->_axisYSecondary->_setMinimum($plot->_minimumY());
 316              $this->_axisYSecondary->_setMaximum($plot->_maximumY());
 317          } elseif (($this->_axisY != null) && ($this->_axisY->_isNumeric())) {
 318              $this->_axisY->_setMinimum($plot->_minimumY());
 319              $this->_axisY->_setMaximum($plot->_maximumY());
 320          }
 321  
 322          $datasets =& $plot->dataset();
 323          if (!is_array($datasets)) {
 324              $datasets = array($datasets);
 325          }
 326          
 327          $keys = array_keys($datasets);
 328          foreach ($keys as $key) {
 329              $dataset =& $datasets[$key];
 330              if ($dataset->count() > 0) {
 331                  $this->_hasData = true;
 332              }
 333              
 334              if (is_a($dataset, 'Image_Graph_Dataset')) {
 335                  if (($this->_axisX != null) && (!$this->_axisX->_isNumeric())) {
 336                      $this->_axisX->_applyDataset($dataset);
 337                  }
 338  
 339                  if (($plot->_axisY == IMAGE_GRAPH_AXIS_Y_SECONDARY) &&
 340                      ($this->_axisYSecondary !== null) &&
 341                      (!$this->_axisYSecondary->_isNumeric()))
 342                  {
 343                      $this->_axisYSecondary->_applyDataset($dataset);
 344                  } elseif (($this->_axisY != null) && (!$this->_axisY->_isNumeric())) {
 345                      $this->_axisY->_applyDataset($dataset);
 346                  }
 347              }
 348          }
 349          unset($keys);
 350      }
 351  
 352      /**
 353       * Left boundary of the background fill area
 354       *
 355       * @return int Leftmost position on the canvas
 356       * @access private
 357       */
 358      function _fillLeft()
 359      {
 360          return $this->_plotLeft;
 361      }
 362  
 363      /**
 364       * Top boundary of the background fill area
 365       *
 366       * @return int Topmost position on the canvas
 367       * @access private
 368       */
 369      function _fillTop()
 370      {
 371          return $this->_plotTop;
 372      }
 373  
 374      /**
 375       * Right boundary of the background fill area
 376       *
 377       * @return int Rightmost position on the canvas
 378       * @access private
 379       */
 380      function _fillRight()
 381      {
 382          return $this->_plotRight;
 383      }
 384  
 385      /**
 386       * Bottom boundary of the background fill area
 387       *
 388       * @return int Bottommost position on the canvas
 389       * @access private
 390       */
 391      function _fillBottom()
 392      {
 393          return $this->_plotBottom;
 394      }
 395  
 396      /**
 397       * Get the point from the x-axis
 398       * @param array $value The value array
 399       * @param int $min The minimum pixel position possible
 400       * @param int $max The maximum pixel position possible
 401       * @return int The pixel position from the axis
 402       * @access private
 403       */
 404      function _axisPointX($value, $min, $max)
 405      {
 406          if (($this->_axisX == null) || (!isset($value['X']))) {
 407              return false;
 408          }
 409  
 410          if ($value['X'] === '#min#') {
 411              return $min;
 412          }
 413          if ($value['X'] === '#max#') {
 414              return $max;
 415          }
 416  
 417          return $this->_axisX->_point($value['X']);
 418      }
 419      
 420      /**
 421       * Get the point from the x-axis
 422       * @param array $value The value array
 423       * @param int $min The minimum pixel position possible
 424       * @param int $max The maximum pixel position possible
 425       * @return int The pixel position from the axis
 426       * @access private
 427       */
 428      function _axisPointY($value, $min, $max)
 429      {
 430          if (!isset($value['Y'])) {
 431              return false;
 432          }
 433      
 434          if (($value['Y'] === '#min_pos#') || ($value['Y'] === '#max_nex#')) {
 435              // return the minimum (bottom) position or if negative then zero
 436              // or the maxmum (top) position or if positive then zero
 437              if ((isset($value['AXIS_Y'])) &&
 438                  ($value['AXIS_Y'] == IMAGE_GRAPH_AXIS_Y_SECONDARY) &&
 439                  ($this->_axisYSecondary !== null)
 440              ) {
 441                  $axisY =& $this->_axisYSecondary;
 442              } else {
 443                  $axisY =& $this->_axisY;
 444              }
 445              if ($value['Y'] === '#min_pos#') {
 446                  return $axisY->_point(max(0, $axisY->_getMinimum()));
 447              } else {
 448                  return $axisY->_point(min(0, $axisY->_getMaximum()));
 449              }
 450          }
 451      
 452          if ($value['Y'] === '#min#') {
 453              return $min;
 454          }
 455          if ($value['Y'] === '#max#') {
 456              return $max;
 457          }
 458      
 459          if ((isset($value['AXIS_Y'])) &&
 460              ($value['AXIS_Y'] == IMAGE_GRAPH_AXIS_Y_SECONDARY)
 461          ) {
 462              if ($this->_axisYSecondary !== null) {
 463                  return $this->_axisYSecondary->_point($value['Y']);
 464              }
 465          } else {
 466              if ($this->_axisY !== null) {
 467                  return $this->_axisY->_point($value['Y']);
 468              }
 469          }
 470          return false;      
 471      }
 472  
 473      /**
 474       * Get the X pixel position represented by a value
 475       *
 476       * @param double Value the value to get the pixel-point for
 477       * @return double The pixel position along the axis
 478       * @access private
 479       */
 480      function _pointX($value)
 481      {
 482          if ($this->_horizontal) {
 483              return $this->_axisPointY($value, $this->_plotLeft, $this->_plotRight);
 484          }
 485          else {
 486              return $this->_axisPointX($value, $this->_plotLeft, $this->_plotRight);
 487          }
 488      }
 489  
 490      /**
 491       * Get the Y pixel position represented by a value
 492       *
 493       * @param double Value the value to get the pixel-point for
 494       * @return double The pixel position along the axis
 495       * @access private
 496       */
 497      function _pointY($value)
 498      {
 499          if ($this->_horizontal) {
 500              return $this->_axisPointX($value, $this->_plotBottom, $this->_plotTop);
 501          }
 502          else {
 503              return $this->_axisPointY($value, $this->_plotBottom, $this->_plotTop);
 504          }
 505      }
 506  
 507      /**
 508       * Return the minimum value of the specified axis
 509       *
 510       * @param int $axis The axis to return the minimum value of (see {$link
 511       * Image_Graph_Plotarea::getAxis()})
 512       * @return double The minimum value of the axis
 513       * @access private
 514       */
 515      function _getMinimum($axis = IMAGE_GRAPH_AXIS_Y)
 516      {
 517          $axis =& $this->getAxis($axis);
 518          if ($axis !== null) {
 519              return $axis->_getMinimum();
 520          } else {
 521              return 0;
 522          }
 523      }
 524  
 525      /**
 526       * Return the maximum value of the specified axis
 527       *
 528       * @param int $axis The axis to return the maximum value of(see {$link
 529       * Image_Graph_Plotarea::getAxis()})
 530       * @return double The maximum value of the axis
 531       * @access private
 532       */
 533      function _getMaximum($axis = IMAGE_GRAPH_AXIS_Y)
 534      {
 535          $axis =& $this->getAxis($axis);
 536          if ($axis !== null) {
 537              return $axis->_getMaximum();
 538          } else {
 539              return 0;
 540          }
 541      }
 542  
 543      /**
 544       * Return the label distance for the specified axis.
 545       *
 546       * @param int $axis The axis to return the label distance for
 547       * @return int The distance between 2 adjacent labels
 548       * @access private
 549       */
 550      function _labelDistance($axis)
 551      {
 552          $axis =& $this->getAxis($axis);
 553          if ($axis !== null) {
 554              return $axis->_labelDistance();
 555          }
 556  
 557          return false;
 558      }
 559  
 560      /**
 561       * Hides the axis
 562       */
 563      function hideAxis($axis = false)
 564      {
 565          if (((!$axis) || ($axis === $this->_axisX) || ($axis === 'x')) && ($this->_axisX != null)) {
 566              $this->_axisX->hide();
 567          }            
 568          if (((!$axis) || ($axis === $this->_axisY) || ($axis === 'y')) && ($this->_axisY != null)) {
 569              $this->_axisY->hide();
 570          }            
 571          if (((!$axis) || ($axis === $this->_axisYSecondary) || ($axis === 'y_sec')) && ($this->_axisYSecondary != null)) {
 572              $this->_axisYSecondary->hide();
 573          }            
 574      }
 575  
 576      /**
 577       * Clears/removes the axis
 578       */
 579      function clearAxis()
 580      {
 581          $this->_axisX = $this->_axisY = $this->_axisYSecondary = null;
 582      }
 583          
 584      /**
 585       * Get axis.
 586       * 
 587       * Possible values are IMAGE_GRAPH_AXIS_X, IMAGE_GRAPH_AXIS_Y,
 588       * IMAGE_GRAPH_AXIS_Y_SECONDARY or a short hand notation using
 589       * string identifiers: 'x', 'y', 'ysec'
 590       * 
 591       * @param int $axis The axis to return
 592       * @return Image_Graph_Axis The axis
 593       */
 594      function &getAxis($axis = IMAGE_GRAPH_AXIS_X)
 595      {
 596          switch ($axis) {
 597          case IMAGE_GRAPH_AXIS_X:
 598          case 'x':
 599              return $this->_axisX;
 600  
 601          case IMAGE_GRAPH_AXIS_Y:
 602          case 'y':
 603              return $this->_axisY;
 604  
 605          case IMAGE_GRAPH_AXIS_Y_SECONDARY:
 606          case 'ysec':
 607              return $this->_axisYSecondary;
 608  
 609          }
 610          return null;
 611      }
 612  
 613      /**
 614       * Update coordinates
 615       *
 616       * @access private
 617       */
 618      function _updateCoords()
 619      {               
 620          if (is_array($this->_elements)) {
 621              $keys = array_keys($this->_elements);
 622              foreach ($keys as $key) {
 623                  $element =& $this->_elements[$key];
 624                  if (is_a($element, 'Image_Graph_Plot')) { 
 625                      if (((is_a($element, 'Image_Graph_Plot_Bar')) ||
 626                          (is_a($element, 'Image_Graph_Plot_Step')) ||
 627                          (is_a($element, 'Image_Graph_Plot_Dot')) ||
 628                          (is_a($element, 'Image_Graph_Plot_CandleStick')) ||
 629                          (is_a($element, 'Image_Graph_Plot_BoxWhisker')) ||
 630                          (is_a($element, 'Image_Graph_Plot_Impulse'))) &&
 631                          ($this->_axisX != null) &&
 632                          (strtolower(get_class($this->_axisX)) != 'image_graph_axis') // do not push plot if x-axis is linear
 633                          )
 634                      {
 635                         $this->_axisX->_pushValues();
 636                      }
 637                      $this->_setExtrema($element);
 638                  }
 639              }
 640              unset($keys);
 641          }
 642  
 643          $this->_calcEdges();
 644  
 645          $pctWidth = (int) ($this->width() * 0.05);
 646          $pctHeight = (int) ($this->height() * 0.05);
 647  
 648          $left = $this->_left + $this->_padding['left'];
 649          $top = $this->_top + $this->_padding['top'];
 650          $right = $this->_right - $this->_padding['right'];
 651          $bottom = $this->_bottom - $this->_padding['bottom'];
 652          
 653          // temporary place holder for axis point calculations
 654          $axisPoints['x'] = array($left, $top, $right, $bottom);
 655          $axisPoints['y'] = $axisPoints['x'];
 656          $axisPoints['y2'] = $axisPoints['x'];
 657                  
 658          if ($this->_axisX !== null) {
 659              $intersectX = $this->_axisX->_getAxisIntersection();
 660              $sizeX = $this->_axisX->_size();
 661              $this->_axisX->_setCoords($left, $top, $right, $bottom);
 662              $this->_axisX->_updateCoords();            
 663          }
 664          
 665          if ($this->_axisY !== null) {
 666              $intersectY = $this->_axisY->_getAxisIntersection();
 667              $sizeY = $this->_axisY->_size();
 668              $this->_axisY->_setCoords($left, $top, $right, $bottom);
 669              $this->_axisY->_updateCoords();
 670          }
 671  
 672          if ($this->_axisYSecondary !== null) {
 673              $intersectYsec = $this->_axisYSecondary->_getAxisIntersection();
 674              $sizeYsec = $this->_axisYSecondary->_size();
 675              $this->_axisYSecondary->_setCoords($left, $top, $right, $bottom);
 676              $this->_axisYSecondary->_updateCoords();
 677          }   
 678          
 679          $axisCoordAdd = array('left' => 0, 'right' => 0, 'top' => 0, 'bottom' => 0);
 680               
 681          if ($this->_axisY != null) {
 682              if ($this->_axisX != null) {                
 683                  $pos = $this->_axisX->_intersectPoint($intersectY['value']);                
 684              } else {
 685                  $pos = ($this->_horizontal ? $bottom : $left);
 686              }
 687  
 688              if ($this->_horizontal) {
 689                  if (($pos + $sizeY) > $bottom) {
 690                      $axisCoordAdd['bottom'] = ($pos + $sizeY) - $bottom;                    
 691                      // the y-axis position needs to be recalculated!                
 692                  } else {            
 693                      // top & bottom may need to be adjusted when the x-axis has been
 694                      // calculated!
 695                      $this->_axisY->_setCoords(
 696                          $left,
 697                          $pos,
 698                          $right,
 699                          $pos + $sizeY
 700                      );
 701                      $this->_axisY->_updateCoords();
 702                  }
 703              }
 704              else {
 705                  if (($pos - $sizeY) < $left) {
 706                      $axisCoordAdd['left'] = $left - ($pos - $sizeY);
 707                      // the y-axis position needs to be recalculated!                
 708                  } else {            
 709                      // top & bottom may need to be adjusted when the x-axis has been
 710                      // calculated!
 711                      $this->_axisY->_setCoords(
 712                          $pos - $sizeY,
 713                          $top,
 714                          $pos,
 715                          $bottom
 716                      );
 717                      $this->_axisY->_updateCoords();
 718                  }
 719              }      
 720          }      
 721  
 722          if ($this->_axisYSecondary != null) {
 723              if ($this->_axisX != null) {
 724                  $pos = $this->_axisX->_intersectPoint($intersectYsec['value']);
 725              } else {
 726                  $pos = ($this->_horizontal ? $top : $right);
 727              }
 728              
 729              if ($this->_horizontal) {
 730                  if (($pos - $sizeYsec) < $top) {
 731                      $axisCoordAdd['top'] = $top - ($pos - $sizeYsec);
 732                      // the secondary y-axis position need to be recalculated
 733                  } else {
 734                      // top & bottom may need to be adjusted when the x-axis has been
 735                      // calculated!
 736                      $this->_axisYSecondary->_setCoords(
 737                          $left,
 738                          $pos - $sizeY,
 739                          $right,
 740                          $pos
 741                      );
 742                      $this->_axisYSecondary->_updateCoords();
 743                  }
 744              }
 745              else {
 746                  if (($pos + $sizeYsec) > $right) {
 747                      $axisCoordAdd['right'] = ($pos + $sizeYsec) - $right;
 748                      // the secondary y-axis position need to be recalculated
 749                  } else {
 750                      // top & bottom may need to be adjusted when the x-axis has been
 751                      // calculated!
 752                      $this->_axisYSecondary->_setCoords(
 753                          $pos,
 754                          $top,
 755                          $pos + $sizeY,
 756                          $bottom
 757                      );
 758                      $this->_axisYSecondary->_updateCoords();
 759                  }
 760              }      
 761          }      
 762          
 763          if ($this->_axisX != null) {
 764              if (($intersectX['axis'] == IMAGE_GRAPH_AXIS_Y_SECONDARY) &&
 765                  ($this->_axisYSecondary !== null)
 766              ) {
 767                  $axis =& $this->_axisYSecondary;
 768              } elseif ($this->_axisY !== null) {
 769                  $axis =& $this->_axisY;
 770              } else {
 771                  $axis = false;
 772              }
 773              
 774              if ($axis !== false) {
 775                  $pos = $axis->_intersectPoint($intersectX['value']);
 776              } else {
 777                  $pos = ($this->_horizontal ? $left : $bottom);
 778              }
 779               
 780              if ($this->_horizontal) {
 781                  if (($pos - $sizeX) < $left) {
 782                      $axisCoordAdd['left'] = $left - ($pos - $sizeX);
 783                      $pos = $left + $sizeX;
 784                  }
 785                            
 786                  $this->_axisX->_setCoords(
 787                      $pos - $sizeX,
 788                      $top + $axisCoordAdd['top'],
 789                      $pos,
 790                      $bottom - $axisCoordAdd['bottom']
 791                  );
 792                  $this->_axisX->_updateCoords();
 793              }
 794              else {
 795                  if (($pos + $sizeX) > $bottom) {
 796                      $axisCoordAdd['bottom'] = ($pos + $sizeX) - $bottom;
 797                      $pos = $bottom - $sizeX;
 798                  }
 799                            
 800                  $this->_axisX->_setCoords(
 801                      $left + $axisCoordAdd['left'],
 802                      $pos,
 803                      $right - $axisCoordAdd['right'],
 804                      $pos + $sizeX
 805                  );
 806                  $this->_axisX->_updateCoords();
 807              }
 808          }
 809          
 810          if ($this->_horizontal) {
 811              if (($this->_axisX !== null) && 
 812                  (($axisCoordAdd['top'] != 0) ||
 813                  ($axisCoordAdd['bottom'] != 0))
 814              ) {
 815                  // readjust y-axis for better estimate of position
 816                  if ($this->_axisY !== null) {
 817                      $pos = $this->_axisX->_intersectPoint($intersectY['value']);
 818                      $this->_axisY->_setCoords(
 819                          false,
 820                          $pos,
 821                          false,
 822                          $pos + $sizeY
 823                      );
 824                      $this->_axisY->_updateCoords();
 825                  }
 826      
 827                  if ($this->_axisYSecondary !== null) {
 828                      $pos = $this->_axisX->_intersectPoint($intersectYsec['value']);
 829                      $this->_axisYSecondary->_setCoords(
 830                          false,
 831                          $pos - $sizeYsec,
 832                          false,
 833                          $pos
 834                      );
 835                      $this->_axisYSecondary->_updateCoords();
 836                  }
 837              }        
 838              
 839              // adjust top and bottom of y-axis
 840              if ($this->_axisY !== null) {
 841                  $this->_axisY->_setCoords(
 842                      $left + $axisCoordAdd['left'],
 843                      false, 
 844                      $right - $axisCoordAdd['right'],
 845                      false                   
 846                  );
 847                  $this->_axisY->_updateCoords();
 848              } 
 849      
 850              // adjust top and bottom of y-axis
 851              if ($this->_axisYSecondary !== null) {
 852                  $this->_axisYSecondary->_setCoords(
 853                      $left + $axisCoordAdd['left'], 
 854                      false, 
 855                      $right - $axisCoordAdd['right'],
 856                      false                    
 857                  );
 858                  $this->_axisYSecondary->_updateCoords();            
 859              } 
 860          
 861              if ($this->_axisX !== null) {
 862                  $this->_plotTop = $this->_axisX->_top;
 863                  $this->_plotBottom = $this->_axisX->_bottom;
 864              } else {
 865                  $this->_plotTop = $top;
 866                  $this->_plotBottom = $bottom;
 867              }
 868              
 869              if ($this->_axisY !== null) {
 870                  $this->_plotLeft = $this->_axisY->_left;
 871                  $this->_plotRight = $this->_axisY->_right;
 872              } elseif ($this->_axisYSecondary !== null) {
 873                  $this->_plotLeft = $this->_axisYSecondary->_left;
 874                  $this->_plotRight = $this->_axisYSecondary->_right;
 875              } else {
 876                  $this->_plotLeft = $this->_left;
 877                  $this->_plotRight = $this->_right;
 878              }
 879          }
 880          else {
 881              if (($this->_axisX !== null) && 
 882                  (($axisCoordAdd['left'] != 0) ||
 883                  ($axisCoordAdd['right'] != 0))
 884              ) {
 885                  // readjust y-axis for better estimate of position
 886                  if ($this->_axisY !== null) {
 887                      $pos = $this->_axisX->_intersectPoint($intersectY['value']);
 888                      $this->_axisY->_setCoords(
 889                          $pos - $sizeY,
 890                          false,
 891                          $pos,
 892                          false
 893                      );
 894                      $this->_axisY->_updateCoords();
 895                  }
 896      
 897                  if ($this->_axisYSecondary !== null) {
 898                      $pos = $this->_axisX->_intersectPoint($intersectYsec['value']);
 899                      $this->_axisYSecondary->_setCoords(
 900                          $pos,
 901                          false,
 902                          $pos + $sizeYsec,
 903                          false
 904                      );
 905                      $this->_axisYSecondary->_updateCoords();
 906                  }
 907              }        
 908              
 909              // adjust top and bottom of y-axis
 910              if ($this->_axisY !== null) {
 911                  $this->_axisY->_setCoords(
 912                      false, 
 913                      $top + $axisCoordAdd['top'], 
 914                      false, 
 915                      $bottom - $axisCoordAdd['bottom']
 916                  );
 917                  $this->_axisY->_updateCoords();
 918              } 
 919      
 920              // adjust top and bottom of y-axis
 921              if ($this->_axisYSecondary !== null) {
 922                  $this->_axisYSecondary->_setCoords(
 923                      false, 
 924                      $top + $axisCoordAdd['top'], 
 925                      false, 
 926                      $bottom - $axisCoordAdd['bottom']
 927                  );
 928                  $this->_axisYSecondary->_updateCoords();            
 929              } 
 930          
 931              if ($this->_axisX !== null) {
 932                  $this->_plotLeft = $this->_axisX->_left;
 933                  $this->_plotRight = $this->_axisX->_right;
 934              } else {
 935                  $this->_plotLeft = $left;
 936                  $this->_plotRight = $right;
 937              }
 938              
 939              if ($this->_axisY !== null) {
 940                  $this->_plotTop = $this->_axisY->_top;
 941                  $this->_plotBottom = $this->_axisY->_bottom;
 942              } elseif ($this->_axisYSecondary !== null) {
 943                  $this->_plotTop = $this->_axisYSecondary->_top;
 944                  $this->_plotBottom = $this->_axisYSecondary->_bottom;
 945              } else {
 946                  $this->_plotTop = $this->_top;
 947                  $this->_plotBottom = $this->_bottom;
 948              }
 949          }
 950          
 951          Image_Graph_Element::_updateCoords();
 952  /*
 953          if ($this->_axisX != null) {
 954              $this->_axisX->_updateCoords();
 955          }
 956          if ($this->_axisY != null) {
 957              $this->_axisY->_updateCoords();
 958          }
 959          if ($this->_axisYSecondary != null) {
 960              $this->_axisYSecondary->_updateCoords();
 961          }*/
 962      }
 963      
 964      /**
 965       * Set the axis padding for a specified position.
 966       * 
 967       * The axis padding is padding "inside" the plotarea (i.e. to put some space
 968       * between the axis line and the actual plot).
 969       * 
 970       * This can be specified in a number of ways:
 971       * 
 972       * 1) Specify an associated array with 'left', 'top', 'right' and 'bottom'
 973       * indices with values for the paddings. Leave out 2nd parameter.
 974       * 
 975       * 2) Specify an overall padding as the first parameter
 976       * 
 977       * 3) Specify the padding and position with position values as mentioned
 978       * above
 979       * 
 980       * Normally you'd only consider applying axis padding to a category x-axis.
 981       * 
 982       * @param mixed $value The value/padding
 983       * @param mixed $position The "position" of the padding
 984       */
 985      function setAxisPadding($value, $position = false)
 986      {
 987          if ($position === false) {
 988              if (is_array($value)) {
 989                  if ($this->_horizontal) {
 990                      if ((isset($value['top'])) && ($this->_axisX !== null)) {
 991                          $this->_axisX->_setAxisPadding('low', $value['top']);
 992                      }
 993                      if ((isset($value['bottom'])) && ($this->_axisX !== null)) {
 994                          $this->_axisX->_setAxisPadding('high', $value['bottom']);
 995                      }
 996                      if ((isset($value['left'])) && ($this->_axisY !== null)) {
 997                          $this->_axisY->_setAxisPadding('low', $value['left']);
 998                      }
 999                      if ((isset($value['right'])) && ($this->_axisY !== null)) {               
1000                          $this->_axisY->_setAxisPadding('high', $value['right']);
1001                      }
1002                      if ((isset($value['left'])) && ($this->_axisYSecondary !== null)) {
1003                          $this->_axisYSecondary->_setAxisPadding('low', $value['left']);
1004                      }
1005                      if ((isset($value['right'])) && ($this->_axisYSecondary !== null)) {               
1006                          $this->_axisYSecondary->_setAxisPadding('high', $value['right']);
1007                      }
1008                  }
1009                  else {
1010                      if ((isset($value['left'])) && ($this->_axisX !== null)) {
1011                          $this->_axisX->_setAxisPadding('low', $value['left']);
1012                      }
1013                      if ((isset($value['right'])) && ($this->_axisX !== null)) {
1014                          $this->_axisX->_setAxisPadding('high', $value['right']);
1015                      }
1016                      if ((isset($value['bottom'])) && ($this->_axisY !== null)) {
1017                          $this->_axisY->_setAxisPadding('low', $value['bottom']);
1018                      }
1019                      if ((isset($value['top'])) && ($this->_axisY !== null)) {               
1020                          $this->_axisY->_setAxisPadding('high', $value['top']);
1021                      }
1022                      if ((isset($value['bottom'])) && ($this->_axisYSecondary !== null)) {
1023                          $this->_axisYSecondary->_setAxisPadding('low', $value['bottom']);
1024                      }
1025                      if ((isset($value['top'])) && ($this->_axisYSecondary !== null)) {               
1026                          $this->_axisYSecondary->_setAxisPadding('high', $value['top']);
1027                      }
1028                  }
1029              } else {
1030                  if ($this->_axisX !== null) {
1031                      $this->_axisX->_setAxisPadding('low', $value);
1032                      $this->_axisX->_setAxisPadding('high', $value);
1033                  }
1034                  if ($this->_axisY !== null) {
1035                      $this->_axisY->_setAxisPadding('low', $value);
1036                      $this->_axisY->_setAxisPadding('high', $value);
1037                  }
1038                  if ($this->_axisYSecondary !== null) {
1039                      $this->_axisYSecondary->_setAxisPadding('low', $value);
1040                      $this->_axisYSecondary->_setAxisPadding('high', $value);
1041                  }
1042              }
1043          } else {
1044              switch ($position) {
1045              case 'left': 
1046                  if ($this->_horizontal) {
1047                      if ($this->_axisY !== null) {
1048                          $this->_axisY->_setAxisPadding('low', $value);
1049                      }
1050                      if ($this->_axisYSecondary !== null) {
1051                          $this->_axisYSecondary->_setAxisPadding('low', $value);
1052                      }
1053                  }
1054                  else if ($this->_axisX !== null) {
1055                     $this->_axisX->_setAxisPadding('low', $value);
1056                  }
1057                  break;
1058  
1059              case 'right': 
1060                  if ($this->_horizontal) {
1061                      if ($this->_axisY !== null) {
1062                          $this->_axisY->_setAxisPadding('high', $value);
1063                      }
1064                      if ($this->_axisYSecondary !== null) {
1065                          $this->_axisYSecondary->_setAxisPadding('high', $value);
1066                      }
1067                  }
1068                  else if ($this->_axisX !== null) {
1069                     $this->_axisX->_setAxisPadding('high', $value);
1070                  }
1071                  break;
1072  
1073              case 'top': 
1074                  if (!$this->_horizontal) {
1075                      if ($this->_axisY !== null) {
1076                          $this->_axisY->_setAxisPadding('high', $value);
1077                      }
1078                      if ($this->_axisYSecondary !== null) {
1079                          $this->_axisYSecondary->_setAxisPadding('high', $value);
1080                      }
1081                  }
1082                  else if ($this->_axisX !== null) {
1083                     $this->_axisX->_setAxisPadding('high', $value);
1084                  }               
1085                  break;
1086  
1087              case 'bottom': 
1088                  if (!$this->_horizontal) {
1089                      if ($this->_axisY !== null) {
1090                          $this->_axisY->_setAxisPadding('low', $value);
1091                      }
1092                      if ($this->_axisYSecondary !== null) {
1093                          $this->_axisYSecondary->_setAxisPadding('low', $value);
1094                      }
1095                  }
1096                  else if ($this->_axisX !== null) {
1097                     $this->_axisX->_setAxisPadding('low', $value);
1098                  }
1099                  break;
1100              }
1101          }
1102      }
1103      
1104      /**
1105       * Output the plotarea to the canvas
1106       *
1107       * @return bool Was the output 'good' (true) or 'bad' (false).
1108       * @access private
1109       */
1110      function _done()
1111      {
1112          if ($this->_hasData) {        
1113              $this->_canvas->startGroup(get_class($this));
1114          
1115              if ($this->_axisX != null) {
1116                  $this->add($this->_axisX);
1117              }
1118              if ($this->_axisY != null) {
1119                  $this->add($this->_axisY);
1120              }
1121              if ($this->_axisYSecondary != null) {
1122                  $this->add($this->_axisYSecondary);
1123              }
1124      
1125              $this->_getFillStyle();
1126              $this->_canvas->rectangle(
1127                  array(
1128                      'x0' => $this->_plotLeft,
1129                      'y0' => $this->_plotTop,
1130                      'x1' => $this->_plotRight,
1131                      'y1' => $this->_plotBottom
1132                  )
1133              );
1134              $result = parent::_done();
1135              $this->_canvas->endGroup();            
1136              return $result;
1137          } else {
1138              // no data -> do nothing at all!
1139              return true;
1140          }        
1141      }
1142  
1143  }
1144  
1145  ?>


Généré le : Sun Feb 25 10:22:19 2007 par Balluche grâce à PHPXref 0.7