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>')