diff options
Diffstat (limited to 'lib/classes/TreeView.php')
| -rw-r--r-- | lib/classes/TreeView.php | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/lib/classes/TreeView.php b/lib/classes/TreeView.php new file mode 100644 index 0000000..0bc2810 --- /dev/null +++ b/lib/classes/TreeView.php @@ -0,0 +1,444 @@ +<?php +# Lifter001: TEST +# Lifter002: TODO +# Lifter007: TODO + +// +---------------------------------------------------------------------------+ +// This file is part of Stud.IP +// TreeView.php +// Class to print out html represantation of a tree object based on TreeAbstract.php +// +// Copyright (c) 2002 André Noack <noack@data-quest.de> +// Suchi & Berg GmbH <info@data-quest.de> +// +---------------------------------------------------------------------------+ +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or any later version. +// +---------------------------------------------------------------------------+ +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +---------------------------------------------------------------------------+ + +/** +* Class to print out html represantation of a tree object based on TreeAbstract.php +* +* @access public +* @author André Noack <noack@data-quest.de> +* @package +*/ +class TreeView { + + /** + * Reference to the tree structure + * + * @access private + * @var object StudipRangeTree $tree + */ + var $tree; + /** + * name of used tree class + * + * @access private + * @var string $tree_class_name + */ + var $tree_class_name; + /** + * contains the item with the current html anchor + * + * @access public + * @var string $anchor + */ + var $anchor; + /** + * array containing all open items + * + * this is a reference to a global session variable, managed by PHPLib + * @access public + * @var array $open_items + */ + var $open_items; + /** + * array containing all open item nodes + * + * this is a reference to a global session variable, managed by PHPLib + * @access public + * @var array $open_ranges + */ + var $open_ranges; + /** + * the item to start with + * + * @access private + * @var string $start_item_id + */ + var $start_item_id; + /** + * the content of the root element + * + * @access public + * @var string $root_content + */ + var $root_content; + + /** + * the maximum amount of columns in a title + * + * @access public + * @var string $max_cols + */ + var $max_cols = 80; + + /** + * draw red icons + * + * @access public + * @var boolean $use_aging + */ + var $use_aging = false; + var $pic_open; + var $pic_close; + + /** + * constructor + * + * @access public + * @param string $tree_class_name name of used tree class + * @param mixed $args argument passed to the tree class + */ + public function __construct($tree_class_name,$args = null) + { + $this->tree_class_name = $tree_class_name; + $this->tree = TreeAbstract::GetInstance($tree_class_name, $args); + // TODO Die Logik hinter forumgrau2 und forumgraurunt2 muss + // komplett erneuert werden; dann können auch Instanzen der + // Klasse "Icon" verwendet werden. + $this->pic_open = $this->use_aging + ? 'forumgraurunt2.png' + : 'icons/blue/arr_1down.svg'; + $this->pic_close = $this->use_aging + ? 'forumgrau2.png' + : 'icons/blue/arr_1right.svg'; + + URLHelper::bindLinkParam('open_ranges', $this->open_ranges); + URLHelper::bindLinkParam('open_items', $this->open_items); + + $this->handleOpenRanges(); + } + + /** + * manages the link parameters used for the open/close thing + * + * @access private + */ + private function handleOpenRanges() + { + $close_range = Request::option('close_range'); + if ($close_range) { + if ($close_range === 'root'){ + $this->open_ranges = null; + $this->open_items = null; + } else { + $kidskids = $this->tree->getKidsKids($close_range); + $kidskids[] = $close_range; + foreach ($kidskids as $kid) { + unset($this->open_ranges[$kid]); + unset($this->open_items[$kid]); + } + } + $this->anchor = $close_range; + } + + $open_range = Request::option('open_range'); + if ($open_range) { + $kidskids = $this->tree->getKidsKids($open_range); + $kidskids[] = $open_range; + foreach ($kidskids as $kid) { + $this->open_ranges[$kid] = true; + } + $this->anchor = $open_range; + } + + $toggle_item = Request::option('close_item') ?: Request::option('open_item'); + if ($toggle_item){ + if (!empty($this->open_items[$toggle_item])) { + unset($this->open_items[$toggle_item]); + } else { + $this->openItem($toggle_item); + $this->openRange($toggle_item); + } + $this->anchor = $toggle_item; + } + + if (Request::option('item_id')) { + $this->anchor = Request::option('item_id'); + } + } + + function openItem($item_id) + { + $this->open_items[$item_id] = true; + $this->openRange($this->tree->tree_data[$item_id]['parent_id']); + } + + function openRange($item_id) + { + $this->open_ranges[$item_id] = true; + + $parents = $this->tree->getParents($item_id); + foreach ($parents as $parent) { + $this->open_ranges[$parent] = true; + } + } + + /** + * prints out the tree beginning with a given item + * + * @access public + * @param string $item_id + */ + function showTree($item_id = "root"){ + $items = []; + if (!is_array($item_id)){ + $items[0] = $item_id; + $this->start_item_id = $item_id; + } else { + $items = $item_id; + } + $num_items = count($items); + for ($j = 0; $j < $num_items; ++$j){ + $this->printLevelOutput($items[$j]); + $this->printItemOutput($items[$j]); + if ($this->tree->hasKids($items[$j]) && !empty($this->open_ranges[$items[$j]])) { + $this->showTree($this->tree->tree_childs[$items[$j]]); + } + } + return; +} + + /** + * prints out the lines before an item ("Strichlogik" (c) rstockm) + * + * @access private + * @param string $item_id + */ + function printLevelOutput($item_id) + { + $level_output = ""; + if ($item_id != $this->start_item_id){ + if ($this->tree->isLastKid($item_id)) + $level_output = "<td class=\"blank tree-indent\" valign=\"top\" nowrap>" + . Assets::img('forumstrich2.gif') + . "</td>"; //last + else + $level_output = "<td class=\"blank tree-indent\" valign=\"top\" nowrap>" + . Assets::img('forumstrich3.gif') + . "</td>"; //crossing + $parent_id = $item_id; + while($this->tree->tree_data[$parent_id]['parent_id'] != $this->start_item_id){ + $parent_id = $this->tree->tree_data[$parent_id]['parent_id']; + if ($this->tree->isLastKid($parent_id)) + $level_output = "<td class=\"blank tree-indent\" valign=\"top\" width=\"10\" nowrap>" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; //nothing + else + $level_output = "<td class=\"blank tree-indent\" valign=\"top\" nowrap>" + . Assets::img('forumstrich.gif') + . "</td>" . $level_output; //vertical line + } + } + echo "\n<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>$level_output"; + return; + } + + /** + * prints out one item + * + * @access private + * @param string $item_id + */ + function printItemOutput($item_id) + { + echo $this->getItemHeadPics($item_id); + echo "\n<td class=\"printhead\" nowrap width=\"1\" valign=\"middle\">"; + if ($this->anchor == $item_id) + echo "<a name=\"anchor\">"; + echo Assets::img('forumleer.gif', ['size' => '1@20']); + if ($this->anchor == $item_id) + echo "</a>"; + echo "\n</td><td class=\"printhead\" align=\"left\" width=\"99%\" nowrap valign=\"bottom\">"; + echo $this->getItemHead($item_id); + echo "</td></tr></table>"; + if (!empty($this->open_items[$item_id])) { + $this->printItemDetails($item_id); + } + return; + } + + /** + * prints out the details for an item, if item is open + * + * @access private + * @param string $item_id + */ + function printItemDetails($item_id){ + $level_output = ''; + if (!$this->tree->hasKids($item_id) || !$this->open_ranges[$item_id] || $item_id == $this->start_item_id) + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumleer.gif') . "\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; + else + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumstrich.gif') . "\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; + + if (($this->tree->isLastKid($item_id) && !($item_id == $this->start_item_id)) || (!$this->open_ranges[$item_id] && $item_id == $this->start_item_id) || ($item_id == $this->start_item_id && !$this->tree->hasKids($item_id))) + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumleer.gif') . "\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; + else + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumstrich.gif') ."\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; + if ($item_id != $this->start_item_id){ + $parent_id = $item_id; + while($this->tree->tree_data[$parent_id]['parent_id'] != $this->start_item_id){ + $parent_id = $this->tree->tree_data[$parent_id]['parent_id']; + if ($this->tree->isLastKid($parent_id)) + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumleer.gif') . "\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . $level_output; //nothing + else + $level_output = "<td class=\"blank\" background=\"" . Assets::image_path('forumstrich.gif') . "\">" + . Assets::img('forumleer.gif', ['size' => '10@20']) + . "</td>" . ($level_output ?? ''); //vertical line + } + } + //$level_output = "<td class=\"blank\" background=\"".$GLOBALS['ASSETS_URL']."images/forumleer.gif\" ><img src=\"".$GLOBALS['ASSETS_URL']."images/forumleer.gif\" width=\"20\" height=\"20\" border=\"0\" ></td>" . $level_output; + + echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\"><tr>$level_output"; + echo "<td class=\"printcontent\" width=\"100%\"><br>"; + echo $this->getItemContent($item_id); + echo "<br></td></tr></table>"; + } + + /** + * returns html for the icons in front of the name of the item + * + * @access private + * @param string $item_id + * @return string + */ + function getItemHeadPics($item_id) + { + $head = $this->getItemHeadFrontPic($item_id); + $head .= "\n<td class=\"printhead\" nowrap align=\"left\" valign=\"bottom\">"; + if ($this->tree->hasKids($item_id)){ + $head .= "<a href=\""; + $head .= !empty($this->open_ranges[$item_id]) + ? URLHelper::getLink($this->getSelf("close_range={$item_id}")) + : URLHelper::getLink($this->getSelf("open_range={$item_id}")); + $head .= "\">"; + $head .= Icon::create('folder-full', 'clickable', ['title' => !empty($this->open_ranges[$item_id]) ? _('Alle Unterelemente schließen') : _('Alle Unterelemente öffnen')])->asImg(16, ['class' => 'text-top']); + $head .= "</a>"; + } else { + $head .= Icon::create('folder-empty', 'clickable', ['title' => _('Dieses Element hat keine Unterelemente')])->asImg(); + } + return $head . "</td>"; + } + + function getItemHeadFrontPic($item_id) + { + if ($this->use_aging){ + $head = "<td bgcolor=\"" . $this->getAgingColor($item_id) . "\" class=\"" + . (($this->open_items[$item_id]) ? 'printhead3' : 'printhead2') + . "\" nowrap width=\"1%\" align=\"left\" valign=\"top\">"; + } else { + $head = "<td class=\"printhead\" nowrap align=\"left\" valign=\"bottom\">"; + } + $head .= "<a href=\""; + $head .= !empty($this->open_items[$item_id]) + ? URLHelper::getLink($this->getSelf("close_item={$item_id}")) . "\"" . tooltip(_("Dieses Element schließen"),true) . ">" + : URLHelper::getLink($this->getSelf("open_item={$item_id}")) . "\"" . tooltip(_("Dieses Element öffnen"),true) . ">"; + $head .= Assets::img(!empty($this->open_items[$item_id]) ? $this->pic_open : $this->pic_close); + #$head .= (!$this->open_items[$item_id]) ? "<img src=\"".$GLOBALS['ASSETS_URL']."images/forumleer.gif\" width=\"5\" border=\"0\">" : ""; + $head .= "</a>"; + $head .= '</td>'; + return $head; + } + + /** + * returns html for the name of the item + * + * @access private + * @param string $item_id + * @return string + */ + function getItemHead($item_id){ + $head = ""; + $head .= " <a class=\"tree\" href=\""; + $head .= !empty($this->open_items[$item_id]) + ? URLHelper::getLink($this->getSelf("close_item={$item_id}")) . "\"" . tooltip(_("Dieses Element schließen"),true) . "><b>" + : URLHelper::getLink($this->getSelf("open_item={$item_id}")) . "\"" . tooltip(_("Dieses Element öffnen"),true) . ">"; + $head .= htmlReady(my_substr($this->tree->tree_data[$item_id]['name'],0,$this->max_cols)); + $head .= (!empty($this->open_items[$item_id])) ? "</b></a>" : "</a>"; + return $head; + } + + /** + * returns html for the content body of the item + * + * @access private + * @param string $item_id + * @return string + */ + function getItemContent($item_id){ + $content = "\n<table width=\"90%\" cellpadding=\"2\" cellspacing=\"2\" align=\"center\" style=\"font-size:10pt\">"; + if ($item_id == "root"){ + $content .= "\n<tr><td class=\"table_header_bold\" align=\"left\">" . htmlReady($this->tree->root_name) ." </td></tr>"; + $content .= "\n<tr><td class=\"blank\" align=\"left\">" . $this->root_content ." </td></tr>"; + $content .= "\n</table>"; + return $content; + } + $content .= "\n<tr><td class=\"blank\" align=\"left\">Inhalt für Element <b>{$this->tree->tree_data[$item_id]['name']} ($item_id)</b><br>".formatReady($this->tree->tree_data[$item_id]['description'])."</td></tr>"; + $content .= "</table>"; + return $content; + } + + function getAgingColor($item_id){ + $the_time = time(); + $chdate = $this->tree->tree_data[$item_id]['chdate']; + if ($chdate == 0){ + $timecolor = "#BBBBBB"; + } else { + if (($the_time - $chdate) < 86400){ + $timecolor = "#FF0000"; + } else { + $timediff = (int) log(($the_time - $chdate) / 86400 + 1) * 15; + if ($timediff >= 68){ + $timediff = 68; + } + $red = dechex(255 - $timediff); + $other = dechex(119 + $timediff); + $timecolor = "#" . $red . $other . $other; + } + } + return $timecolor; + } + + /** + * returns script name + * + * @access private + * @param string $param + * @return string + */ + function getSelf($param = ""){ + return "?" . $param . "#anchor"; + } +} |
