/**
* Draws the legend
*/
public function Draw()
{
$entry_count = count($this->entries);
if ($entry_count < 1) {
return '';
}
$encoding = $this->graph->encoding;
// find the largest width / height
$font_size = $this->legend_font_size;
$max_width = $max_height = 0;
foreach ($this->entries as $entry) {
list($w, $h) = $this->graph->TextSize($entry->text, $font_size, $this->legend_font_adjust, $encoding, 0, $font_size);
if ($w > $max_width) {
$max_width = $w;
}
if ($h > $max_height) {
$max_height = $h;
}
$entry->width = $w;
$entry->height = $h;
}
$title = '';
$title_width = $entries_x = 0;
$text_columns = $entry_columns = array();
$start_y = $padding = $this->legend_padding;
$w = $this->legend_entry_width;
$x = 0;
$entry_height = max($max_height, $this->legend_entry_height);
// make room for title
if ($this->legend_title != '') {
$title_font = Graph::GetFirst($this->legend_title_font, $this->legend_font);
$title_font_size = Graph::GetFirst($this->legend_title_font_size, $this->legend_font_size);
$title_font_adjust = Graph::GetFirst($this->legend_title_font_adjust, $this->legend_font_adjust);
$title_colour = Graph::GetFirst($this->legend_title_colour, $this->legend_colour);
list($tw, $th) = $this->graph->TextSize($this->legend_title, $title_font_size, $title_font_adjust, $encoding, 0, $title_font_size);
$title_width = $tw + $padding * 2;
$start_y += $th + $padding;
}
$columns = max(1, min(ceil($this->legend_columns), $entry_count));
$per_column = ceil($entry_count / $columns);
$columns = ceil($entry_count / $per_column);
$column = 0;
$text = array('x' => 0);
$entries = $this->reverse ? array_reverse($this->entries, true) : $this->entries;
$column_entry = 0;
$y = $start_y;
foreach ($entries as $entry) {
// position the graph element
$e_y = $y + ($entry_height - $this->legend_entry_height) / 2;
$element = $this->graph->DrawLegendEntry($x, $e_y, $w, $this->legend_entry_height, $entry);
if (!empty($element)) {
// position the text element
$text['y'] = $y + $font_size * 0.75 + ($entry_height - $entry->height) / 2;
$text_element = $this->graph->Text($entry->text, $font_size, $text);
if (isset($text_columns[$column])) {
$text_columns[$column] .= $text_element;
} else {
$text_columns[$column] = $text_element;
}
if (isset($entry_columns[$column])) {
$entry_columns[$column] .= $element;
} else {
$entry_columns[$column] = $element;
}
$y += $entry_height + $padding;
if (++$column_entry == $per_column) {
$column_entry = 0;
$y = $start_y;
++$column;
}
}
}
// if there's nothing to go in the legend, stop now
if (empty($entry_columns)) {
return '';
}
if ($this->legend_text_side == 'left') {
$text_x_offset = $max_width + $padding;
$entries_x_offset = $max_width + $padding * 2;
} else {
$text_x_offset = $w + $padding * 2;
$entries_x_offset = $padding;
}
$longest_width = $padding * (2 * $columns + 1) + ($this->legend_entry_width + $max_width) * $columns;
$column_width = $padding * 2 + $this->legend_entry_width + $max_width;
$width = max($title_width, $longest_width);
$height = $start_y + $per_column * ($entry_height + $padding);
// centre the entries if the title makes the box bigger
if ($width > $longest_width) {
$offset = ($width - $longest_width) / 2;
$entries_x_offset += $offset;
$text_x_offset += $offset;
}
$text_group = array('transform' => "translate({$text_x_offset},0)");
if ($this->legend_text_side == 'left') {
$text_group['text-anchor'] = 'end';
}
$entries_group = array('transform' => "translate({$entries_x_offset},0)");
$parts = '';
foreach ($entry_columns as $col) {
$parts .= $this->graph->Element('g', $entries_group, null, $col);
$entries_x_offset += $column_width;
$entries_group['transform'] = "translate({$entries_x_offset},0)";
}
foreach ($text_columns as $col) {
$parts .= $this->graph->Element('g', $text_group, null, $col);
$text_x_offset += $column_width;
$text_group['transform'] = "translate({$text_x_offset},0)";
}
// create box and title
$box = array('fill' => $this->graph->ParseColour($this->legend_back_colour), 'width' => $width, 'height' => $height);
if ($this->legend_round > 0) {
$box['rx'] = $box['ry'] = $this->legend_round;
}
if ($this->legend_stroke_width) {
$box['stroke-width'] = $this->legend_stroke_width;
$box['stroke'] = $this->legend_stroke_colour;
}
$rect = $this->graph->Element('rect', $box);
if ($this->legend_title != '') {
$text['x'] = $width / 2;
$text['y'] = $padding + $title_font_size * 0.75;
$text['text-anchor'] = 'middle';
if ($title_font != $this->legend_font) {
$text['font-family'] = $title_font;
}
if ($title_font_size != $font_size) {
$text['font-size'] = $title_font_size;
}
if ($this->legend_title_font_weight != $this->legend_font_weight) {
$text['font-weight'] = $this->legend_title_font_weight;
}
if ($title_colour != $this->legend_colour) {
$text['fill'] = $title_colour;
}
$title = $this->graph->Text($this->legend_title, $title_font_size, $text);
}
// create group to contain whole legend
list($left, $top) = $this->graph->ParsePosition($this->legend_position, $width, $height);
$group = array('font-family' => $this->legend_font, 'font-size' => $font_size, 'fill' => $this->legend_colour, 'transform' => "translate({$left},{$top})");
if ($this->legend_font_weight != 'normal') {
$group['font-weight'] = $this->legend_font_weight;
}
// add shadow if not completely transparent
if ($this->legend_shadow_opacity > 0) {
$box['x'] = $box['y'] = 2 + $this->legend_stroke_width / 2;
$box['fill'] = '#000';
$box['opacity'] = $this->legend_shadow_opacity;
unset($box['stroke'], $box['stroke-width']);
$rect = $this->graph->Element('rect', $box) . $rect;
}
if ($this->legend_autohide) {
$this->graph->AutoHide($group);
}
if ($this->legend_draggable) {
$this->graph->SetDraggable($group);
}
return $this->graph->Element('g', $group, NULL, $rect . $title . $parts);
}