2
0
forked from Wavyzz/dolibarr
Files
dolibarr-fork/htdocs/includes/artichow/php4/inc/Label.class.php

596 lines
9.3 KiB
PHP

<?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.
*
*/
/* <php4> */
define("LABEL_LEFT", 1);
define("LABEL_RIGHT", 2);
define("LABEL_CENTER", 3);
define("LABEL_TOP", 4);
define("LABEL_BOTTOM", 5);
define("LABEL_MIDDLE", 6);
/* </php4> */
/**
* 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');
?>