*/ define("LABEL_LEFT", 1); define("LABEL_RIGHT", 2); define("LABEL_CENTER", 3); define("LABEL_TOP", 4); define("LABEL_BOTTOM", 5); define("LABEL_MIDDLE", 6); /* */ /** * Draw labels * * @package Artichow */ class awLabel { /** * Label border * * @var int */ var $border; /** * Label texts * * @var array */ var $texts; /** * Text font * * @var int */ var $font; /** * Text angle * * @var int */ var $angle = 0; /** * Text color * * @var Color */ var $color; /** * Text background * * @var Color, Gradient */ var $background; /** * Callback function * * @var string */ var $function; /** * Padding * * @var int */ var $padding; /** * Move position from this vector * * @var Point */ var $move; /** * Label interval * * @var int */ var $interval = 1; /** * Horizontal align * * @var int */ var $hAlign = LABEL_CENTER; /** * Vertical align * * @var int */ var $vAlign = LABEL_MIDDLE; /** * Hide all labels ? * * @var bool */ var $hide = FALSE; /** * Keys to hide * * @var array */ var $hideKey = array(); /** * Values to hide * * @var array */ var $hideValue = array(); /** * Hide first label * * @var bool */ var $hideFirst = FALSE; /** * Hide last label * * @var bool */ var $hideLast = FALSE; /** * Build the label * * @param string $label First label */ function awLabel($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(is_a($color, '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 */ function get($key) { return array_key_exists($key, $this->texts) ? $this->texts[$key] : NULL; } /** * Get all labels * * @return array */ function all() { return $this->texts; } /** * Set one or several labels * * @param array $labels Array of string or a string */ function set($labels) { if(is_string($labels)) { $this->texts = array($labels); } else if(is_array($labels)) { $this->texts = $labels; } } /** * Count number of texts in the label * * @return int */ function count() { return is_array($this->texts) ? count($this->texts) : 0; } /** * Set a callback function for labels * * @param string $function */ function setCallbackFunction($function) { $this->function = is_null($function) ? $function : (string)$function; } /** * Return the callback function for labels * * @return string */ function getCallbackFunction() { return $this->function; } /** * Change labels format * * @param string $format New format (printf style: %.2f for example) */ 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 &$font New font * @param $color Font color (can be NULL) */ function setFont(&$font, $color = NULL) { $this->font = $font; if(is_a($color, 'awColor')) { $this->setColor($color); } } /** * Change font angle * * @param int $angle New angle */ function setAngle($angle) { $this->angle = (int)$angle; } /** * Change font color * * @param $color */ function setColor($color) { $this->color = $color; } /** * Change text background * * @param mixed $background */ function setBackground($background) { $this->background = $background; } /** * Change text background color * * @param Color */ function setBackgroundColor($color) { $this->background = $color; } /** * Change text background gradient * * @param Gradient */ function setBackgroundGradient($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 */ function setPadding($left, $right, $top, $bottom) { $this->padding = array((int)$left, (int)$right, (int)$top, (int)$bottom); } /** * Hide all labels ? * * @param bool $hide */ function hide($hide = TRUE) { $this->hide = (bool)$hide; } /** * Show all labels ? * * @param bool $show */ function show($show = TRUE) { $this->hide = (bool)!$show; } /** * Hide a key * * @param int $key The key to hide */ function hideKey($key) { $this->hideKey[$key] = TRUE; } /** * Hide a value * * @param int $value The value to hide */ function hideValue($value) { $this->hideValue[] = $value; } /** * Hide first label * * @param bool $hide */ function hideFirst($hide) { $this->hideFirst = (bool)$hide; } /** * Hide last label * * @param bool $hide */ function hideLast($hide) { $this->hideLast = (bool)$hide; } /** * Set label interval * * @param int */ 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 */ function move($x, $y) { $this->move = $this->move->move($x, $y); } /** * Change alignment * * @param int $h Horizontal alignment * @param int $v Vertical alignment */ 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 */ 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(is_a($this->background, 'awColor')) { $text->setBackgroundColor($this->background); } else if(is_a($this->background, '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 $drawer A drawer * @return int */ function getMaxWidth($drawer) { return $this->getMax($drawer, 'getTextWidth'); } /** * Get max height of all texts * * @param $drawer A drawer * @return int */ function getMaxHeight($drawer) { return $this->getMax($drawer, 'getTextHeight'); } /** * Draw the label * * @param $drawer * @param $p Label center * @param int $key Text position in the array of texts (default to zero) */ function draw($drawer, $p, $key = 0) { if(($key % $this->interval) !== 0) { return; } // Hide all labels if($this->hide) { return; } // Key is hidden if(array_key_exists($key, $this->hideKey)) { return; } // Hide first label if($key === 0 and $this->hideFirst) { return; } // Hide last label if($key === count($this->texts) - 1 and $this->hideLast) { return; } $text = $this->getText($key); if($text !== NULL) { // Value must be hidden if(in_array($text->getText(), $this->hideValue)) { return; } $x = $p->x; $y = $p->y; // Get padding list($left, $right, $top, $bottom) = $text->getPadding(); $font = $text->getFont(); $width = $font->getTextWidth($text); $height = $font->getTextHeight($text); switch($this->hAlign) { case LABEL_RIGHT : $x -= ($width + $right); break; case LABEL_CENTER : $x -= ($width - $left + $right) / 2; break; case LABEL_LEFT : $x += $left; break; } switch($this->vAlign) { case LABEL_TOP : $y -= ($height + $bottom); break; case LABEL_MIDDLE : $y -= ($height - $top + $bottom) / 2; break; case LABEL_BOTTOM : $y += $top; break; } $drawer->string($text, $this->move->move($x, $y)); } } function getMax($drawer, $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'); ?>