update template for new events system
[diogenes.git] / include / phplayersmenu / treemenu.inc.php
1 <?php
2 // PHP Layers Menu 3.1.1 (C) 2001-2003 Marco Pratesi (marco at telug dot it)
3
4 /**
5 * This file contains the code of the TreeMenu class.
6 * @package PHPLayersMenu
7 */
8
9 /**
10 * This is the TreeMenu class of the PHP Layers Menu library.
11 *
12 * This class depends on the LayersMenuCommon class and on the PEAR conforming version of the PHPLib Template class, i.e. on HTML_Template_PHPLIB
13 *
14 * @version 3.1.1
15 * @package PHPLayersMenu
16 */
17 class TreeMenu extends LayersMenuCommon {
18
19 /**
20 * Type of images used for the Tree Menu
21 * @access private
22 * @var string
23 */
24 var $treeMenuImagesType;
25 /**
26 * An array where we store the Tree Menu code for each menu
27 * @access private
28 * @var array
29 */
30 var $_treeMenu;
31
32 /**
33 * The constructor method; it initializates the menu system
34 * @return void
35 */
36 function TreeMenu() {
37 $this->LayersMenuCommon();
38
39 $this->treeMenuImagesType = "png";
40 $this->_treeMenu = array();
41
42 $this->_nodesCount = 0;
43 $this->tree = array();
44 $this->_maxLevel = array();
45 $this->_firstLevelCnt = array();
46 $this->_firstItem = array();
47 $this->_lastItem = array();
48 }
49
50 /**
51 * The method to set the dirroot directory
52 * @access public
53 * @return boolean
54 */
55 function setDirroot($dirroot) {
56 return $this->setDirrootCommon($dirroot);
57 }
58
59 /**
60 * The method to set the type of images used for the Tree Menu
61 * @access public
62 * @return void
63 */
64 function setTreeMenuImagesType($treeMenuImagesType) {
65 $this->treeMenuImagesType = $treeMenuImagesType;
66 }
67
68 /**
69 * Method to prepare a new Tree Menu.
70 *
71 * This method processes items of a menu to prepare and return
72 * the corresponding Tree Menu code.
73 *
74 * @access public
75 * @param string $menu_name the name of the menu whose items have to be processed
76 * @return string
77 */
78 function newTreeMenu(
79 $menu_name = "" // non consistent default...
80 ) {
81 if (!isset($this->_firstItem[$menu_name]) || !isset($this->_lastItem[$menu_name])) {
82 $this->error("newTreeMenu: the first/last item of the menu '$menu_name' is not defined; please check if you have parsed its menu data.");
83 return 0;
84 }
85
86 $this->_treeMenu[$menu_name] = "";
87
88 $img_space = $this->imgwww . "tree_space." . $this->treeMenuImagesType;
89 $alt_space = " ";
90 $img_vertline = $this->imgwww . "tree_vertline." . $this->treeMenuImagesType;
91 $alt_vertline = "| ";
92 $img_expand = $this->imgwww . "tree_expand." . $this->treeMenuImagesType;
93 $alt_expand = "+-";
94 $img_expand_first = $this->imgwww . "tree_expand_first." . $this->treeMenuImagesType;
95 $alt_expand_first = "+-";
96 $img_expand_corner = $this->imgwww . "tree_expand_corner." . $this->treeMenuImagesType;
97 $alt_expand_corner = "+-";
98 $img_collapse = $this->imgwww . "tree_collapse." . $this->treeMenuImagesType;
99 $alt_collapse = "--";
100 $img_collapse_first = $this->imgwww . "tree_collapse_first." . $this->treeMenuImagesType;
101 $alt_collapse_first = "--";
102 $img_collapse_corner = $this->imgwww . "tree_collapse_corner." . $this->treeMenuImagesType;
103 $alt_collapse_corner = "--";
104 $img_split = $this->imgwww . "tree_split." . $this->treeMenuImagesType;
105 $alt_split = "|-";
106 $img_split_first = $this->imgwww . "tree_split_first." . $this->treeMenuImagesType;
107 $alt_split_first = "|-";
108 $img_corner = $this->imgwww . "tree_corner." . $this->treeMenuImagesType;
109 $alt_corner = "`-";
110 $img_folder_closed = $this->imgwww . "tree_folder_closed." . $this->treeMenuImagesType;
111 $alt_folder_closed = "->";
112 $img_folder_open = $this->imgwww . "tree_folder_open." . $this->treeMenuImagesType;
113 $alt_folder_open = "->";
114 $img_leaf = $this->imgwww . "tree_leaf." . $this->treeMenuImagesType;
115 $alt_leaf = "->";
116
117 for ($i=0; $i<=$this->_maxLevel[$menu_name]; $i++) {
118 $levels[$i] = 0;
119 }
120
121 // Find last nodes of subtrees
122 $last_level = $this->_maxLevel[$menu_name];
123 for ($i=$this->_lastItem[$menu_name]; $i>=$this->_firstItem[$menu_name]; $i--) {
124 if ($this->tree[$i]["level"] < $last_level) {
125 for ($j=$this->tree[$i]["level"]+1; $j<=$this->_maxLevel[$menu_name]; $j++) {
126 $levels[$j] = 0;
127 }
128 }
129 if ($levels[$this->tree[$i]["level"]] == 0) {
130 $levels[$this->tree[$i]["level"]] = 1;
131 $this->tree[$i]["last_item"] = 1;
132 } else {
133 $this->tree[$i]["last_item"] = 0;
134 }
135 $last_level = $this->tree[$i]["level"];
136 }
137
138 $toggle = "";
139 $toggle_function_name = "toggle" . $menu_name;
140
141 for ($cnt=$this->_firstItem[$menu_name]; $cnt<=$this->_lastItem[$menu_name]; $cnt++) {
142 $this->_treeMenu[$menu_name] .= "<div id=\"jt" . $cnt . "\" class=\"treemenudiv\">\n";
143
144 // vertical lines from higher levels
145 for ($i=0; $i<$this->tree[$cnt]["level"]-1; $i++) {
146 if ($levels[$i] == 1) {
147 $img = $img_vertline;
148 $alt = $alt_vertline;
149 } else {
150 $img = $img_space;
151 $alt = $alt_space;
152 }
153 $this->_treeMenu[$menu_name] .= "<img class=\"imgs\" src=\"" . $img . "\" alt=\"" . $alt . "\" />";
154 }
155
156 $not_a_leaf = $cnt<$this->_lastItem[$menu_name] && $this->tree[$cnt+1]["level"]>$this->tree[$cnt]["level"];
157
158 if ($this->tree[$cnt]["last_item"] == 1) {
159 // corner at end of subtree or t-split
160 if ($not_a_leaf) {
161 $this->_treeMenu[$menu_name] .= "<a onmousedown=\"". $toggle_function_name . "('" . $cnt . "')\"><img class=\"imgs\" id=\"jt" . $cnt . "node\" src=\"" . $img_collapse_corner . "\" alt=\"" . $alt_collapse_corner . "\" /></a>";
162 } else {
163 $this->_treeMenu[$menu_name] .= "<img class=\"imgs\" src=\"" . $img_corner . "\" alt=\"" . $alt_corner . "\" />";
164 }
165 $levels[$this->tree[$cnt]["level"]-1] = 0;
166 } else {
167 if ($not_a_leaf) {
168 if ($cnt == $this->_firstItem[$menu_name]) {
169 $img = $img_collapse_first;
170 $alt = $alt_collapse_first;
171 } else {
172 $img = $img_collapse;
173 $alt = $alt_collapse;
174 }
175 $this->_treeMenu[$menu_name] .= "<a onmousedown=\"". $toggle_function_name . "('" . $cnt . "');\"><img class=\"imgs\" id=\"jt" . $cnt . "node\" src=\"" . $img . "\" alt=\"" . $alt . "\" /></a>";
176 } else {
177 if ($cnt == $this->_firstItem[$menu_name]) {
178 $img = $img_split_first;
179 $alt = $alt_split_first;
180 } else {
181 $img = $img_split;
182 $alt = $alt_split;
183 }
184 $this->_treeMenu[$menu_name] .= "<a onmousedown=\"". $toggle_function_name . "('" . $cnt . "');\"><img class=\"imgs\" id=\"jt" . $cnt . "node\" src=\"" . $img . "\" alt=\"" . $alt . "\" /></a>";
185 }
186 $levels[$this->tree[$cnt]["level"]-1] = 1;
187 }
188
189 if ($this->tree[$cnt]["parsed_href"] == "" || $this->tree[$cnt]["parsed_href"] == "#") {
190 $a_href_open_img = "";
191 $a_href_close_img = "";
192 $a_href_open = "<a class=\"phplmnormal\">";
193 $a_href_close = "</a>";
194 } else {
195 $a_href_open_img = "<a href=\"" . $this->tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . ">";
196 $a_href_close_img = "</a>";
197 $a_href_open = "<a href=\"" . $this->tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . " class=\"phplm\">";
198 $a_href_close = "</a>";
199 }
200
201 if ($not_a_leaf) {
202 $this->_treeMenu[$menu_name] .= $a_href_open_img . "<img class=\"imgs\" id=\"jt" . $cnt . "folder\" src=\"" . $img_folder_open . "\" alt=\"" . $alt_folder_open . "\" />" . $a_href_close_img;
203 } else {
204 if ($this->tree[$cnt]["parsed_icon"] != "") {
205 $this->_treeMenu[$menu_name] .= $a_href_open_img . "<img class=\"imgs\" src=\"" . $this->imgwww . $this->tree[$cnt]["parsed_icon"] . "\" width=\"" . $this->tree[$cnt]["iconwidth"] . "\" height=\"" . $this->tree[$cnt]["iconheight"] . "\" alt=\"" . $alt_leaf . "\" />" . $a_href_close_img;
206 } else {
207 $this->_treeMenu[$menu_name] .= $a_href_open_img . "<img class=\"imgs\" src=\"" . $img_leaf . "\" alt=\"" . $alt_leaf . "\" />" . $a_href_close_img;
208 }
209 }
210 $this->_treeMenu[$menu_name] .= "&nbsp;" . $a_href_open . $this->tree[$cnt]["text"] . $a_href_close . "\n";
211 $this->_treeMenu[$menu_name] .= "</div>\n";
212
213 if ($cnt<$this->_lastItem[$menu_name] && $this->tree[$cnt]["level"]<$this->tree[$cnt+1]["level"]) {
214 $this->_treeMenu[$menu_name] .= "<div id=\"jt" . $cnt . "son\" class=\"treemenudiv\">\n";
215 if ($this->tree[$cnt]["expanded"] != 1) {
216 $toggle .= "if (expand[" . $cnt . "] != 1) " . $toggle_function_name . "('" . $cnt . "');\n";
217 } else {
218 $toggle .= "if (collapse[" . $cnt . "] == 1) " . $toggle_function_name . "('" . $cnt . "');\n";
219 }
220 }
221
222 if ($cnt>$this->_firstItem[$menu_name] && $this->tree[$cnt]["level"]>$this->tree[$cnt+1]["level"]) {
223 for ($i=max(1, $this->tree[$cnt+1]["level"]); $i<$this->tree[$cnt]["level"]; $i++) {
224 $this->_treeMenu[$menu_name] .= "</div>\n";
225 }
226 }
227 }
228
229 /*
230 $this->_treeMenu[$menu_name] =
231 "<div class=\"phplmnormal\">\n" .
232 $this->_treeMenu[$menu_name] .
233 "</div>\n";
234 */
235 // Some (old) browsers do not support the "white-space: nowrap;" CSS property...
236 $this->_treeMenu[$menu_name] =
237 "<table cellspacing=\"0\" cellpadding=\"0\" style=\"border: 0;\">\n" .
238 "<tr>\n" .
239 "<td class=\"phplmnormal\" style=\"white-space: nowrap;\">\n" .
240 $this->_treeMenu[$menu_name] .
241 "</td>\n" .
242 "</tr>\n" .
243 "</table>\n";
244
245 $t = new Template_PHPLIB();
246 $t->setFile("tplfile", $this->libjsdir . "layerstreemenu.ijs");
247 $t->setVar(array(
248 "toggle_function_name" => $toggle_function_name,
249 "img_expand" => $img_expand,
250 "img_expand_first" => $img_expand_first,
251 "img_collapse" => $img_collapse,
252 "img_collapse_first" => $img_collapse_first,
253 "img_collapse_corner" => $img_collapse_corner,
254 "img_folder_open" => $img_folder_open,
255 "img_expand_corner" => $img_expand_corner,
256 "img_folder_closed" => $img_folder_closed
257 ));
258 $toggle_function = $t->parse("out", "tplfile");
259 $toggle_function =
260 "<script type=\"text/javascript\">\n" .
261 "<!--\n" .
262 $toggle_function .
263 "// -->\n" .
264 "</script>\n";
265
266 $toggle =
267 "<script type=\"text/javascript\">\n" .
268 "<!--\n" .
269 "if ((DOM && !Opera56 && !Konqueror22) || IE4) {\n" .
270 $toggle .
271 "}\n" .
272 "if (NS4) alert('Only the accessibility is provided to Netscape 4 on the JavaScript Tree Menu.\\nWe *strongly* suggest you to upgrade your browser.');\n" .
273 "// -->\n" .
274 "</script>\n";
275
276 $this->_treeMenu[$menu_name] = $toggle_function . "\n" . $this->_treeMenu[$menu_name] . "\n" . $toggle;
277
278 return $this->_treeMenu[$menu_name];
279 }
280
281 /**
282 * Method that returns the code of the requested Tree Menu
283 * @access public
284 * @param string $menu_name the name of the menu whose Tree Menu code
285 * has to be returned
286 * @return string
287 */
288 function getTreeMenu($menu_name) {
289 return $this->_treeMenu[$menu_name];
290 }
291
292 /**
293 * Method that prints the code of the requested Tree Menu
294 * @access public
295 * @param string $menu_name the name of the menu whose Tree Menu code
296 * has to be printed
297 * @return void
298 */
299 function printTreeMenu($menu_name) {
300 print $this->_treeMenu[$menu_name];
301 }
302
303 } /* END OF CLASS */
304
305 ?>