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);