1.1 --- a/viewer.py Mon Oct 16 00:39:44 2006 +0200
1.2 +++ b/viewer.py Mon Oct 16 23:39:35 2006 +0200
1.3 @@ -116,16 +116,20 @@
1.4 .ref { color: cyan; }
1.5 .ref a { color: cyan; text-decoration: none; }
1.6
1.7 - .types {
1.8 + .popup {
1.9 display: none; z-index: 2;
1.10 - position: absolute; top: 1em; left: 7.5em;
1.11 + position: absolute; top: 1em; left: 0.5em;
1.12 + padding: 0.5em; background-color: #000000;
1.13 + }
1.14 +
1.15 + .types {
1.16 padding: 0.5em; background-color: #0000FF;
1.17 + float: right;
1.18 }
1.19
1.20 .scopes {
1.21 - display: none; z-index: 2;
1.22 - position: absolute; top: 1em; left: 0.5em;
1.23 padding: 0.5em; background-color: #007700;
1.24 + float: left;
1.25 }
1.26
1.27 .name,
1.28 @@ -134,10 +138,8 @@
1.29 position: relative;
1.30 }
1.31
1.32 - .name:hover > .types,
1.33 - .name:hover > .scopes,
1.34 - .attr:hover > .types,
1.35 - .attr:hover > .scopes
1.36 + .name:hover > .popup,
1.37 + .attr:hover > .popup
1.38 {
1.39 display: block;
1.40 }
1.41 @@ -191,7 +193,9 @@
1.42 self.stream.write("<p>\n")
1.43 self._keyword("class")
1.44 self._name_start(structure.name)
1.45 + self._popup_start()
1.46 self._scopes(definition)
1.47 + self._popup_end()
1.48 self._name_end()
1.49 bases = structure.bases
1.50 if bases:
1.51 @@ -201,8 +205,10 @@
1.52 if not first:
1.53 self.stream.write(",\n")
1.54 self._name_start(base.name)
1.55 + self._popup_start()
1.56 self._types(base)
1.57 self._scopes(base)
1.58 + self._popup_end()
1.59 self._name_end()
1.60 first = 0
1.61 self.stream.write(")")
1.62 @@ -223,7 +229,9 @@
1.63 self.stream.write("<p>\n")
1.64 self._keyword("def")
1.65 self._name_start(subprogram.name)
1.66 + self._popup_start()
1.67 self._scopes(definition)
1.68 + self._popup_end()
1.69 self._name_end()
1.70 self.stream.write("(")
1.71 first = 1
1.72 @@ -232,7 +240,9 @@
1.73 self.stream.write(",\n")
1.74 self._name_start(param)
1.75 if hasattr(subprogram, "paramtypes"):
1.76 + self._popup_start()
1.77 self._types_list(subprogram.paramtypes[param])
1.78 + self._popup_end()
1.79 self._name_end()
1.80 first = 0
1.81 self.stream.write(")")
1.82 @@ -281,14 +291,18 @@
1.83
1.84 def visitName(self, node):
1.85 self._name_start(node._node.name)
1.86 + self._popup_start()
1.87 self._types(node._node)
1.88 self._scopes(node._node)
1.89 + self._popup_end()
1.90 self._name_end()
1.91
1.92 def visitAssName(self, node):
1.93 self._name_start(node._node.name)
1.94 + self._popup_start()
1.95 self._types(node._node.expr)
1.96 self._scopes(node._node)
1.97 + self._popup_end()
1.98 self._name_end()
1.99
1.100 def visitConst(self, node):
1.101 @@ -299,8 +313,10 @@
1.102 self.dispatch(node.expr)
1.103 self.stream.write("<span class='attr'>\n")
1.104 self.stream.write(".%s\n" % self._text(node.attrname))
1.105 + self._popup_start()
1.106 self._types(node._node)
1.107 self._scopes(node._node)
1.108 + self._popup_end()
1.109 self.stream.write("</span>\n")
1.110 self.stream.write("</span>\n")
1.111
1.112 @@ -309,8 +325,10 @@
1.113 self.dispatch(node.expr)
1.114 self.stream.write("<span class='attr'>\n")
1.115 self.stream.write(".%s\n" % self._text(node.attrname))
1.116 + self._popup_start()
1.117 self._types(node._node)
1.118 self._scopes(node._node)
1.119 + self._popup_end()
1.120 self.stream.write("</span>\n")
1.121 self.stream.write("</span>\n")
1.122
1.123 @@ -352,13 +370,23 @@
1.124 def _name_end(self):
1.125 self.stream.write("</span>\n")
1.126
1.127 + def _popup_start(self):
1.128 + self.stream.write("<span class='popup'>\n")
1.129 +
1.130 + def _popup_end(self):
1.131 + self.stream.write("</span>\n")
1.132 +
1.133 def _types(self, node):
1.134 - if not hasattr(node, "types"):
1.135 + if hasattr(node, "types"):
1.136 + self._types_list(node.types)
1.137 + elif hasattr(node, "writes"):
1.138 + self._types_list(flatten(node.writes.values()))
1.139 + elif hasattr(node, "accesses"):
1.140 + self._types_list(flatten(node.accesses.values()))
1.141 + else:
1.142 self.stream.write("<div class='types'>\n")
1.143 self.stream.write("No types!\n")
1.144 self.stream.write("</div>\n")
1.145 - else:
1.146 - self._types_list(node.types)
1.147
1.148 def _types_list(self, types):
1.149 self.stream.write("<div class='types'>\n")
1.150 @@ -382,6 +410,16 @@
1.151 self.stream.write("</div>\n")
1.152 self.stream.write("</div>\n")
1.153
1.154 +# Utility functions.
1.155 +
1.156 +def flatten(lists):
1.157 + result = []
1.158 + for l in lists:
1.159 + for attr in l:
1.160 + if attr not in result:
1.161 + result.append(attr)
1.162 + return result
1.163 +
1.164 # Convenience functions.
1.165
1.166 def view(module, stream=None):