from Page import Page
class SidebarPage(Page):
"""
SidebarPage is an abstract superclass for pages that have a sidebar (as well as a header and "content well"). Sidebars are normally used for navigation (e.g., a menu or list of links), showing small bits of info and occasionally a simple form (such as login or search).
Subclasses should override cornerTitle(), writeSidebar() and writeContent() (and title() if necessary; see Page).
The utility methods menuHeading() and menuItem() can be used by subclasses, typically in their implementation of writeSidebar().
WebKit itself uses this class: Examples/ExamplePage and Admin/AdminPage both inherit from it.
TO DO
-----
* Use of MenuBar.gif needs reconsideration.
* Consider using a DIV tag to set the min width of the menu bar.
* Use style sheets.
* After style sheets, consider removal of startMenu() and endMenu().
* It's not easy to customize, via subclasses:
* what's between <head> and </head>
* the corner
* the colors
* the spacer
"""
## Init ##
def __init__(self):
Page.__init__(self)
self._indentBase = ' ' # used in menuItem()
## Content methods ##
def writeBodyParts(self):
# begin
wr = self.writeln
wr('<table border=0 cellpadding=0 cellspacing=0 width=100%>')
# banner
self.writeBanner()
# sidebar
wr('<tr> <td bgcolor="#EEEEEF" valign=top nowrap>')
self.writeSidebar()
wr('</td>')
# spacer
wr('<td> </td>')
# content
wr('<td valign=top width=90%><p><br>')
self.writeContent()
wr('</td>')
# end
wr('</tr> </table>')
def writeBanner(self):
# header
title = self.title()
startFont1 = '<font face="Tahoma, Arial, Helvetica, sans-serif" color=white size=+1>'
endFont1 = '</font>'
startFont2 = '<font face="Tahoma, Arial, Helvetica, sans-serif" color=white size=+2><b>'
endFont2 = '</b></font>'
cornerTitle = self.cornerTitle()
self.writeln('''
<tr>
<td align=center bgcolor="#000000">%(startFont1)s%(cornerTitle)s%(endFont1)s</td>
<td align=center bgcolor="#00008B" colspan=2> <br>%(startFont2)s%(title)s%(endFont2)s<br> </td>
</tr>''' % locals())
def writeSidebar(self):
self.startMenu()
self.writeln('Woops. Someone forgot to override writeSidebar().')
self.endMenu()
def cornerTitle(self):
return ''
## Menu ##
def startMenu(self):
self.writeln('<table border=0 cellpadding=0 cellspacing=4><tr><td nowrap><font face=Arial size=-1>')
self._wroteHeading = 0
def menuHeading(self, title):
if self._wroteHeading:
self.write('<br>')
self.writeln('<b>%s</b><br>' % title)
self._wroteHeading = 1
def menuItem(self, title, url=None, suffix=None, indentLevel=1):
if suffix:
suffix = suffix + ' '
else:
suffix = ''
indent = self._indentBase*indentLevel
if url is not None:
self.writeln(' %s<a href="%s">%s</a> %s<br>' % (
indent, url, title, suffix))
else:
self.writeln(' %s%s %s<br>' % (indent, title, suffix))
def endMenu(self):
self.writeln('</font></td></tr></table>')
## WebKit sidebar sections ##
def writeWebKitSidebarSections(self):
""" This method (and consequently the methods it invokes) are provided for WebKit's example and admin pages. It writes sections such as contexts, e-mails, exits and versions. """
self.writeContextsMenu()
self.writeWebwareEmailMenu()
self.writeWebwareExitsMenu()
self.writeVersions()
def writeContextsMenu(self):
self.menuHeading('Contexts')
adapterName = self.request().adapterName()
ctxs = self.application().contexts().keys()
ctxs = filter(lambda ctx: ctx!='default', ctxs)
ctxs.sort()
for ctx in ctxs:
self.menuItem(ctx, '%s/%s/' % (adapterName, ctx))
def writeWebwareEmailMenu(self):
self.menuHeading('E-mail')
self.menuItem('webware-discuss', 'mailto:webware-discuss@lists.sourceforge.net')
def writeWebwareExitsMenu(self):
self.menuHeading('Exits')
self.menuItem('Webware', 'http://webware.sourceforge.net')
self.menuItem('Python', 'http://www.python.org')
def writeVersions(self):
app = self.application()
self.menuHeading('Versions')
self.menuItem('WebKit ' + app.webKitVersionString())
self.menuItem('Webware ' + app.webwareVersionString())
import string, sys
self.menuItem('Python ' + string.split(sys.version)[0])
def writeContent(self):
self.writeln('Woops, someone forgot to override writeContent().')
## Deprecated ##
def writeMenuBarMinWidthImage(self):
""" DEPRECATED: SidebarPage.writeMenuBarMinWidthImage() deprecated on 1/26/01 in ver 0.5. HTML's nowrap is used instead. """
# To ensure a minimum width of the sidebar
# Technique learned from www.python.org in 6/2000
self.deprecated(self.writeMenuBarMinWidthImage)
self.writeln('<img width=175 height=1 src=MenuBar.gif>')