1 
2 <style>
3 
4 .package-label {
5 
6 }
7 
8 .class-label {
9   padding-left: 40px;
10 }
11 
12 .method-label {
13   padding-left: 80px;
14 }
15 
16 .package-entry {
17   background-color: #778899;
18 }
19 
20 .class-entry {
21   background-color: #a9a9a9;
22 }
23 
24 .method-entry {
25   background-color: #dcdcdc;
26 }
27 
28 .collapsed {
29 
30 }
31 
32 .handle {
33   width: 25px;
34   background-repeat: no-repeat;
35 }
36 
37 .handle-opened {
38   background-image: url("<?cs var:triangle.opened ?>");
39 }
40 
41 .handle-closed {
42   background-image: url("<?cs var:triangle.closed?>");
43 }
44 
45 .tbody {
46   padding: 0;
47   margin: 0;
48 }
49 
50 #hierarchy {
51   border-collapse:collapse;
52 }
53 
54 </style>
55 
56 <script type="text/javascript"
57     src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
58 
59 <script type="text/javascript">
60 function collapsePackage(tr) {
61   var table = $("#hierarchy")[0];
62 
63   if (!$(tr).hasClass("collapsable")) {
64     return;
65   }
66 
67   if ($(tr).hasClass("collapsed")) {
68     $(tr).removeClass("collapsed");
69     $(tr).children(".handle").addClass("handle-opened");
70     $(tr).children(".handle").removeClass("handle-closed");
71     if (tr.rowIndex + 1 < table.rows.length) {
72       var tbody = table.rows[tr.rowIndex + 1].parentNode;
73       $(tbody).show();
74     }
75   } else {
76     $(tr).addClass("collapsed");
77     $(tr).children(".handle").removeClass("handle-opened");
78     $(tr).children(".handle").addClass("handle-closed");
79     if (tr.rowIndex + 1 < table.rows.length
80         && $(table.rows[tr.rowIndex + 1]).hasClass("class-entry")) {
81       var tbody = table.rows[tr.rowIndex + 1].parentNode;
82       $(tbody).hide();
83     }
84   }
85 }
86 
87 function collapseClass(tr) {
88   var table = $("#hierarchy")[0];
89 
90   if (!$(tr).hasClass("collapsable")) {
91     return;
92   }
93 
94   if ($(tr).hasClass("collapsed")) {
95     $(tr).removeClass("collapsed");
96     $(tr).children(".handle").addClass("handle-opened");
97     $(tr).children(".handle").removeClass("handle-closed");
98     var i = tr.rowIndex + 1;
99     while (i < table.rows.length && $(table.rows[i]).hasClass("method-entry")) {
100       $(table.rows[i++]).show();
101     }
102   } else {
103     $(tr).addClass("collapsed");
104     $(tr).children(".handle").removeClass("handle-opened");
105     $(tr).children(".handle").addClass("handle-closed");
106     var i = tr.rowIndex + 1;
107     while (i < table.rows.length && $(table.rows[i]).hasClass("method-entry")) {
108       $(table.rows[i++]).hide();
109     }
110   }
111 }
112 
113 $(function() {
114   $(".package-entry").click(function() {
115     collapsePackage(this);
116   });
117 
118   $(".class-entry").click(function() {
119     collapseClass(this);
120   });
121 });
122 </script>
123 
124 <table border="0" id="hierarchy">
125 <tr>
126 <th> </th>
127 <?cs each:site = sites ?>
128 <th><?cs var:site.name ?></th>
129 <?cs /each ?>
130 </tr>
131 <?cs each:package = packages ?>
132   <?cs if:subcount(package.classes) ?>
133     <tr class="package-entry collapsable">
134     <td class="handle handle-opened">&nbsp;</td>
135   <?cs else ?>
136     <tr class="package-entry">
137     <td class="handle">&nbsp;</td>
138   <?cs /if ?>
139   <td class="package-label"><?cs var:package.name ?></td>
140   <?cs each:site = package.sites ?>
141     <td>
142     <?cs if:site.hasPackage ?>
143     <a href="<?cs var:site.link ?>">Link</a>
144     <?cs else ?>
145     N/A
146     <?cs /if ?>
147     </td>
148   <?cs /each ?>
149   </tr>
150   <tbody class="package-contents">
151   <?cs each:class = package.classes ?>
152     <?cs if:subcount(class.methods) ?>
153       <tr class="class-entry collapsable">
154       <td class="handle handle-opened">&nbsp;</td>
155     <?cs else ?>
156       <tr class="class-entry">
157       <td class="handle">&nbsp;</td>
158     <?cs /if ?>
159       <td class="class-label"><?cs var:class.qualifiedName ?></td>
160       <?cs each:site = class.sites ?>
161         <td>
162         <?cs if:site.hasClass ?>
163         <a href="<?cs var:site.link ?>">Link</a>
164         <?cs else ?>
165         N/A
166         <?cs /if ?>
167         </td>
168       <?cs /each ?>
169     </tr>
170     <?cs each:method = class.methods ?>
171     <tr class="method-entry">
172       <td class="handle">&nbsp;</td>
173       <td class="method-label"><?cs var:method.signature ?></td>
174       <?cs each:site = method.sites ?>
175         <td>
176         <?cs if:site.hasMethod ?>
177         <a href="<?cs var:site.link ?>">Link</a>
178         <?cs else ?>
179         N/A
180         <?cs /if ?>
181         </td>
182       <?cs /each ?>
183     </tr>
184     <?cs /each ?><?cs # methods ?>
185   <?cs /each ?><?cs # classes ?>
186   </tbody>
187 <?cs /each ?><?cs # packages ?>
188 </table>