File: Synopsis/Formatters/HTML/Views/Tree.py
 1#
 2# Copyright (C) 2000 Stephen Davies
 3# Copyright (C) 2000 Stefan Seefeld
 4# All rights reserved.
 5# Licensed to the public under the terms of the GNU LGPL (>= 2),
 6# see the file COPYING for details.
 7#
 8
 9from Synopsis import config
10from Synopsis.Processor import Parameter
11from Synopsis.Formatters.HTML.View import View
12from Synopsis.Formatters.HTML.Tags import *
13import os
14
15class Tree(View):
16    """View that makes Javascript trees. The trees have expanding and
17    collapsing nodes. call js_init() with the button images and default
18    open/close policy during process"""
19
20    def register(self, frame):
21
22        super(Tree, self).register(frame)
23        self.__id = 0
24        share = config.datadir
25        open_img = os.path.join(share, 'syn-down.png')
26        close_img = os.path.join(share, 'syn-right.png')
27        leaf_img = os.path.join(share, 'syn-dot.png')
28        js = os.path.join(share, 'html.js')
29        self.tree_open = 'tree_open.png'
30        self.tree_close = 'tree_close.png'
31        self.tree_leaf = 'tree_leaf.png'
32        # Copy resources across
33        self.directory_layout.copy_file(open_img, self.tree_open)
34        self.directory_layout.copy_file(open_img, self.tree_open)
35        self.directory_layout.copy_file(close_img, self.tree_close)
36        self.directory_layout.copy_file(leaf_img, self.tree_leaf)
37        self.directory_layout.copy_file(js, 'synopsis.js')
38
39    def get_id(self):
40
41        self.__id += 1
42        return 'tree%d'%self.__id
43
44    def start_file(self):
45
46        js = '<script type="text/javascript" src="synopsis.js"></script>'
47        View.start_file(self, headextra=js)
48
49    def write_leaf(self, text):
50        """Write a leaf node to the output at the current tree level."""
51        i = img(src=self.tree_leaf, alt='leaf')
52        self.write(div('module-section', i + text) + '\n')
53
54    def write_node_start(self, text):
55        """Write a non-leaf node to the output at the current tree level, and
56        start a new level."""
57        # Get a unique id for this node
58        id = self.get_id()
59        # Get the image for this node
60        node = img(id='%s_img'%id, src=self.tree_close, alt='node', border='0')
61        # Get the scripted link for the image
62        link = href("javascript:toggle('%s');"%id, node)
63        # Write the item
64        self.write('<div class="module-section">%s%s'%(link, text))
65        # Start the (collapsible) section for the child nodes
66        self.write('<div id="%s" style="display:none;">\n'%id)
67
68    def write_node_end(self):
69        """Finish a non-leaf node, and close the current tree level."""
70
71        self.write('</div>\n</div>\n')
72
73    def end_tree(self):
74        """Writes the end of the tree."""
75
76        js_end = """<script type="text/javascript" language="JavaScript1.2"><!--
77        tree_max_node = %d; // --></script>"""
78
79        self.write(js_end%self.__id)
80
81        self.write(div('tree-navigation',
82                       href('javascript:open_all()', 'Open All') +
83                       href('javascript:close_all()', 'Close All')))
84
85