from Page import Page


class SidebarPage(Page):
	"""WebKit page template class for pages with a sidebar.

	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
	* More consequent use style sheets; get rid of tables completely.
	* The header, corner and colors are not easy to customize via subclasses.

	"""


	## StyleSheet ##

	_styleSheet = '''
<!--
body {
	background-color: white;
	color: #080810;
	font-size: 11pt;
	font-family: Tahoma,Verdana,Arial,Helvetica,sans-serif;
	margin: 0pt;
	padding: 0pt;
}

h1 { font-size: 18pt; }
h2 { font-size: 16pt; }
h3 { font-size: 14pt; }
h4 { font-size: 12pt; }
h5 { font-size: 11pt; }
table#PageTable {
	border-collapse: collapse;
}
td#CornerTitle {
	background-color: #101040;
	color: white;
	padding: 6pt 6pt;
	font-size: 14pt;
	text-align: center;
	vertical-align: middle;
}
td#Banner {
	background-color: #202080;
	color: white;
	padding: 8pt 6pt;
	font-size: 16pt;
	font-weight: bold;
	text-align: center;
	vertical-align: middle;
}
td#Sidebar {
	background-color: #E8E8F0;
	padding: 4pt;
	font-size: 10pt;
	line-height: 13pt;
	vertical-align: top;
	white-space: nowrap;
	height: 100%;
}
td#Sidebar div {
	margin-bottom: 1pt;
}
td#Sidebar div.MenuHeading {
	font-weight: bold;
	margin-top: 6pt;
	margin-bottom: 3pt;
	width: 12em;
}
td#Content {
	padding: 8pt;
	vertical-align: top;
	width: 100%;
}
table.NiceTable {
	margin-bottom: 4pt;
}
table.NiceTable td, .Data {
	background-color: #EEE;
	color: #111;
}
table tr th, .SubHeading {
	background-color: #CCC;
	color: black;
}
table tr.TopHeading th, .TopHeading {
background-color: #555;
color: white;
}
td#Content table tr.NoTable td {
	background-color: white;
	color: #080810;
}
table.NiceTable th a:link, table.NiceTable th a:visited {
	color: #101040;
}
-->
'''

	def writeStyleSheet(self):
		"""We're using a simple internal style sheet.

		This way we avoid having to care about where an external style
		sheet should be located when this class is used in another context.

		"""
		self.writeln('<style type="text/css">%s</style>' % self._styleSheet)


	## Content methods ##

	def writeBodyParts(self):
		wr = self.writeln
		wr('<table id="PageTable">')
		self.writeBanner()
		wr('<tr><td id="Sidebar">')
		self.writeSidebar()
		wr('</td>')
		wr('<td id="Content">')
		self.writeContent()
		wr('</td>')
		wr('</tr></table>')

	def writeBanner(self):
		self.writeln('<tr><td id="CornerTitle">%s</td>' % self.cornerTitle(),
			'<td id="Banner">%s</td></tr>' % self.title())

	def writeSidebar(self):
		self.writeWebKitSidebarSections()

	def cornerTitle(self):
		return ''


	## Menu ##

	def menuHeading(self, title):
		self.writeln('<div class="MenuHeading">%s</div>' % title)

	def menuItem(self, title, url=None, suffix=None, indentLevel=1):
		if suffix:
			suffix = ' ' + suffix
		else:
			suffix = ''
		if url is not None:
			title = '<a href="%s">%s</a>' % (url, title)
		self.writeln('<div style="margin-left:%dpt">%s%s</div>'
			% (4*indentLevel, title, suffix))


	## WebKit sidebar sections ##

	def writeWebKitSidebarSections(self):
		"""Write sidebar sections.

		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')
		servletPath = self.request().servletPath()
		ctxs = self.application().contexts().keys()
		ctxs = filter(lambda ctx: ctx != 'default' and not '/' in ctx, ctxs)
		ctxs.sort()
		for ctx in ctxs:
			self.menuItem(ctx, '%s/%s/' % (servletPath, 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://www.webwareforpython.org')
		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())
		from sys import version
		self.menuItem('Python ' + version.split(' ', 1)[0])

	def writeContent(self):
		self.writeln('Woops, someone forgot to override writeContent().')
