Subversion Repositories Applications.gtt

Rev

Rev 60 | 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__)."/Graph.class.php";


/**
 * A graph can contain some groups of components
 *
 * @package Artichow
 */
abstract class awComponentGroup extends awComponent {

        /**
         * Components of this group
         *
         * @var array
         */
        protected $components;
        
        /**
         * Build the component group
         */
        public function __construct() {
                parent::__construct();
                $this->components = array();
        }

        /**
         * Add a component to the group
         *
         * @param awComponent $component A component
         */
        public function add(awComponent $component) {
                $this->components[] = $component;
        }

}

registerClass('ComponentGroup', TRUE);

abstract class awComponent {

        /**
         * Component driver
         *
         * @var Driver
         */
        protected $driver;

        /**
         * Component width
         *
         * @var float
         */
        public $width = 1.0;

        /**
         * Component height
         *
         * @var float
         */
        public $height = 1.0;

        /**
         * Position X of the center the graph (from 0 to 1)
         *
         * @var float
         */
        public $x = 0.5;

        /**
         * Position Y of the center the graph (from 0 to 1)
         *
         * @var float
         */
        public $y = 0.5;
        
        /**
         * Component absolute width (in pixels)
         *
         *
         * @var int
         */
        public $w;
        
        /**
         * Component absolute height (in pixels)
         *
         *
         * @var int
         */
        public $h;

        /**
         * Left-top corner Y position
         *
         * @var float
         */
        public $top;

        /**
         * Left-top corner X position
         *
         * @var float
         */
        public $left;
        
        /**
         * Component background color
         *
         * @var Color
         */
        protected $background;
        
        /**
         * Component padding
         *
         * @var Side
         */
        protected $padding;
        
        /**
         * Component space
         *
         * @var Side
         */
        protected $space;
        
        /**
         * Component title
         *
         * @var Label
         */
        public $title;
        
        /**
         * Adjust automatically the component ?
         *
         * @var bool
         */
        protected $auto = TRUE;
        
        /**
         * Legend
         *
         * @var Legend
         */
        public $legend;
        
        /**
         * Build the component
         */
        public function __construct() {
                
                // Component legend
                $this->legend = new awLegend();
                
                $this->padding = new awSide(25, 25, 25, 25);
                $this->space = new awSide(0, 0, 0, 0);
                
                // Component title
                $this->title = new awLabel(
                        NULL,
                        new awTuffy(10),
                        NULL,
                        0
                );
                $this->title->setAlign(awLabel::CENTER, awLabel::TOP);
                
        }
        
        /**
         * Adjust automatically the component ?
         *
         * @param bool $auto
         */
        public function auto($auto) {
                $this->auto = (bool)$auto;
        }
        
        /**
         * Change the size of the component
         *
         * @param int $width Component width (from 0 to 1)
         * @param int $height Component height (from 0 to 1)
         */
        public function setSize($width, $height) {
        
                $this->width = (float)$width;
                $this->height = (float)$height;
                
        }
        
        /**
         * Change the absolute size of the component
         *
         * @param int $w Component width (in pixels)
         * @param int $h Component height (in pixels)
         */
        public function setAbsSize($w, $h) {
        
                $this->w = (int)$w;
                $this->h = (int)$h;
                
        }
        
        /**
         * Change component background color
         *
         * @param awColor $color (can be null)
         */
        public function setBackgroundColor($color) {
                if($color === NULL or $color instanceof awColor) {
                        $this->background = $color;
                }
        }
        
        /**
         * Change component background gradient
         *
         * @param awGradient $gradient (can be null)
         */
        public function setBackgroundGradient($gradient) {
                if($gradient === NULL or $gradient instanceof awGradient) {
                        $this->background = $gradient;
                }
        }
        
        /**
         * Change component background image
         *
         * @param awImage $image (can be null)
         */
        public function setBackgroundImage($image) {
                if($image === NULL or $image instanceof awImage) {
                        $this->background = $image;
                }
        }
        
        /**
         * Return the component background
         *
         * @return Color, Gradient
         */
        public function getBackground() {
                return $this->background;
        }
        
        /**
         * Change component padding
         *
         * @param int $left Padding in pixels (NULL to keep old value)
         * @param int $right Padding in pixels (NULL to keep old value)
         * @param int $top Padding in pixels (NULL to keep old value)
         * @param int $bottom Padding in pixels (NULL to keep old value)
         */
        public function setPadding($left = NULL, $right = NULL, $top = NULL, $bottom = NULL) {
                $this->padding->set($left, $right, $top, $bottom);
        }
        
        /**
         * Change component space
         *
         * @param float $left Space in % (NULL to keep old value)
         * @param float $right Space in % (NULL to keep old value)
         * @param float $bottom Space in % (NULL to keep old value)
         * @param float $top Space in % (NULL to keep old value)
         */
        public function setSpace($left = NULL, $right = NULL, $bottom = NULL, $top = NULL) {
                $this->space->set($left, $right, $bottom, $top);
        }
        
        /**
         * Change the absolute position of the component on the graph
         *
         * @var int $x Left-top corner X position
         * @var int $y Left-top corner Y position
         */
        public function setAbsPosition($left, $top) {
        
                $this->left = (int)$left;
                $this->top = (int)$top;
                
        }
        
        /**
         * Set the center of the component
         *
         * @param int $x Position X of the center of the component
         * @param int $y Position Y of the center of the component
         */
        public function setCenter($x, $y) {
        
                $this->x = (float)$x;
                $this->y = (float)$y;
                
        }
        
        /**
         * Get component coords with its padding
         *
         * @return array Coords of the component
         */
        public function getPosition() {
                
                // Get component coords
                $x1 = $this->padding->left;
                $y1 = $this->padding->top;
                $x2 = $this->w - $this->padding->right;
                $y2 = $this->h - $this->padding->bottom;
        
                return array($x1, $y1, $x2, $y2);
        
        }
        
        /**
         * Init the drawing of the component
         */
        public function init(awDriver $driver) {

                // Set component background
                $background = $this->getBackground();
                
                if($background !== NULL) {
                        
                        $p1 = new awPoint(0, 0);
                        $p2 = new awPoint($this->w - 1, $this->h - 1);
                        
                        if($background instanceof awImage) {
        
                                $driver->copyImage(
                                        $background,
                                        $p1,
                                        $p2
                                );
                                
                        } else {
                        
                                $driver->filledRectangle(
                                        $background,
                                        new awLine($p1, $p2)
                                );
                                
                        }
                        
                }
        }
        
        /**
         * Finalize the drawing of the component
         */
        public function finalize(awDriver $driver) {
                
                // Draw component title
                $point = new awPoint(
                        $this->w / 2,
                        $this->padding->top - 8
                );
                $this->title->draw($driver, $point);
                
                // Draw legend
                $this->legend->draw($driver);
                
        }
        
        /**
         * Draw the grid around your component
         *
         * @param Driver A driver
         * @return array Coords for the component
         */
        abstract public function drawEnvelope(awDriver $driver);
        
        /**
         * Draw the component on the graph
         * Component should be drawed into specified coords
         *
         * @param Driver A driver
         * @param int $x1
         * @param int $y1
         * @param int $x2
         * @param int $y2
         * @param bool $aliasing Use anti-aliasing to draw the component ?
         */
        abstract public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing);
        
        /**
         * Get space width in pixels
         *
         * @param int $width Component width
         * @param int $height Component height
         * @return array
         */
        protected function getSpace($width, $height) {
                
                $left = (int)($width * $this->space->left / 100);
                $right = (int)($width * $this->space->right / 100);
                $top = (int)($height * $this->space->top / 100);
                $bottom = (int)($height * $this->space->bottom / 100);
                
                return array($left, $right, $top, $bottom);
                
        }
        
}

registerClass('Component', TRUE);
?>