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";/*** Draw labels** @package Artichow*/class awLabel implements awPositionable {/*** Label border** @var int*/public $border;/*** Label texts** @var array*/protected $texts;/*** Text font** @var int*/protected $font;/*** Text angle** @var int*/protected $angle = 0;/*** Text color** @var Color*/protected $color;/*** Text background** @var Color, Gradient*/private $background;/*** Callback function** @var string*/private $function;/*** Padding** @var int*/private $padding;/*** Move position from this vector** @var Point*/protected $move;/*** Label interval** @var int*/protected $interval = 1;/*** Horizontal align** @var int*/protected $hAlign = awLabel::CENTER;/*** Vertical align** @var int*/protected $vAlign = awLabel::MIDDLE;/*** Hide all labels ?** @var bool*/protected $hide = FALSE;/*** Keys to hide** @var array*/protected $hideKey = array();/*** Values to hide** @var array*/protected $hideValue = array();/*** Hide first label** @var bool*/protected $hideFirst = FALSE;/*** Hide last label** @var bool*/protected $hideLast = FALSE;/*** Build the label** @param string $label First label*/public function __construct($label = NULL, $font = NULL, $color = NULL, $angle = 0) {if(is_array($label)) {$this->set($label);} else if(is_string($label)) {$this->set(array($label));}if($font === NULL) {$font = new awFont2;}$this->setFont($font);$this->setAngle($angle);if($color instanceof awColor) {$this->setColor($color);} else {$this->setColor(new awColor(0, 0, 0));}$this->move = new awPoint(0, 0);$this->border = new awBorder;$this->border->hide();}/*** Get an element of the label from its key** @param int $key Element key* @return string A value*/public function get($key) {return array_key_exists($key, $this->texts) ? $this->texts[$key] : NULL;}/*** Get all labels** @return array*/public function all() {return $this->texts;}/*** Set one or several labels** @param array $labels Array of string or a string*/public function set($labels) {if(is_array($labels)) {$this->texts = $labels;} else {$this->texts = array((string)$labels);}}/*** Count number of texts in the label** @return int*/public function count() {return is_array($this->texts) ? count($this->texts) : 0;}/*** Set a callback function for labels** @param string $function*/public function setCallbackFunction($function) {$this->function = is_null($function) ? $function : (string)$function;}/*** Return the callback function for labels** @return string*/public function getCallbackFunction() {return $this->function;}/*** Change labels format** @param string $format New format (printf style: %.2f for example)*/public function setFormat($format) {$function = 'label'.time().'_'.(microtime() * 1000000);eval('function '.$function.'($value) {return sprintf("'.addcslashes($format, '"').'", $value);}');$this->setCallbackFunction($function);}/*** Change font for label** @param awFont $font New font* @param awColor $color Font color (can be NULL)*/public function setFont(awFont $font, $color = NULL) {$this->font = $font;if($color instanceof awColor) {$this->setColor($color);}}/*** Change font angle** @param int $angle New angle*/public function setAngle($angle) {$this->angle = (int)$angle;}/*** Change font color** @param awColor $color*/public function setColor(awColor $color) {$this->color = $color;}/*** Change text background** @param mixed $background*/public function setBackground($background) {$this->background = $background;}/*** Change text background color** @param Color*/public function setBackgroundColor(awColor $color) {$this->background = $color;}/*** Change text background gradient** @param Gradient*/public function setBackgroundGradient(awGradient $gradient) {$this->background = $gradient;}/*** Change padding** @param int $left Left padding* @param int $right Right padding* @param int $top Top padding* @param int $bottom Bottom padding*/public function setPadding($left, $right, $top, $bottom) {$this->padding = array((int)$left, (int)$right, (int)$top, (int)$bottom);}/*** Hide all labels ?** @param bool $hide*/public function hide($hide = TRUE) {$this->hide = (bool)$hide;}/*** Show all labels ?** @param bool $show*/public function show($show = TRUE) {$this->hide = (bool)!$show;}/*** Hide a key** @param int $key The key to hide*/public function hideKey($key) {$this->hideKey[$key] = TRUE;}/*** Hide a value** @param int $value The value to hide*/public function hideValue($value) {$this->hideValue[] = $value;}/*** Hide first label** @param bool $hide*/public function hideFirst($hide) {$this->hideFirst = (bool)$hide;}/*** Hide last label** @param bool $hide*/public function hideLast($hide) {$this->hideLast = (bool)$hide;}/*** Set label interval** @param int*/public function setInterval($interval) {$this->interval = (int)$interval;}/*** Change label position** @param int $x Add this interval to X coord* @param int $y Add this interval to Y coord*/public function move($x, $y) {$this->move = $this->move->move($x, $y);}/*** Change alignment** @param int $h Horizontal alignment* @param int $v Vertical alignment*/public function setAlign($h = NULL, $v = NULL) {if($h !== NULL) {$this->hAlign = (int)$h;}if($v !== NULL) {$this->vAlign = (int)$v;}}/*** Get a text from the labele** @param mixed $key Key in the array text* @return Text*/public function getText($key) {if(is_array($this->texts) and array_key_exists($key, $this->texts)) {$value = $this->texts[$key];if(is_string($this->function)) {$value = call_user_func($this->function, $value);}$text = new awText($value);$text->setFont($this->font);$text->setAngle($this->angle);$text->setColor($this->color);if($this->background instanceof awColor) {$text->setBackgroundColor($this->background);} else if($this->background instanceof awGradient) {$text->setBackgroundGradient($this->background);}$text->border = $this->border;if($this->padding !== NULL) {call_user_func_array(array($text, 'setPadding'), $this->padding);}return $text;} else {return NULL;}}/*** Get max width of all texts** @param awDriver $driver A driver* @return int*/public function getMaxWidth(awDriver $driver) {return $this->getMax($driver, 'getTextWidth');}/*** Get max height of all texts** @param awDriver $driver A driver* @return int*/public function getMaxHeight(awDriver $driver) {return $this->getMax($driver, 'getTextHeight');}/*** Draw the label** @param awDriver $driver* @param awPoint $p Label center* @param int $key Text position in the array of texts (default to zero)*/public function draw(awDriver $driver, awPoint $p, $key = 0) {if(($key % $this->interval) !== 0) {return;}// Hide all labelsif($this->hide) {return;}// Key is hiddenif(array_key_exists($key, $this->hideKey)) {return;}// Hide first labelif($key === 0 and $this->hideFirst) {return;}// Hide last labelif($key === count($this->texts) - 1 and $this->hideLast) {return;}$text = $this->getText($key);if($text !== NULL) {// Value must be hiddenif(in_array($text->getText(), $this->hideValue)) {return;}$x = $p->x;$y = $p->y;// Get paddinglist($left, $right, $top, $bottom) = $text->getPadding();// $font = $text->getFont();$width = $driver->getTextWidth($text);$height = $driver->getTextHeight($text);switch($this->hAlign) {case awLabel::RIGHT :$x -= ($width + $right);break;case awLabel::CENTER :$x -= ($width - $left + $right) / 2;break;case awLabel::LEFT :$x += $left;break;}switch($this->vAlign) {case awLabel::TOP :$y -= ($height + $bottom);break;case awLabel::MIDDLE :$y -= ($height - $top + $bottom) / 2;break;case awLabel::BOTTOM :$y += $top;break;}$driver->string($text, $this->move->move($x, $y));}}protected function getMax(awDriver $driver, $function) {$max = NULL;foreach($this->texts as $key => $text) {$text = $this->getText($key);$font = $text->getFont();if(is_null($max)) {$max = $font->{$function}($text);} else {$max = max($max, $font->{$function}($text));}}return $max;}}registerClass('Label');?>