from WebKit.SidebarPage import SidebarPage
import os


class ExamplePage(SidebarPage):
	"""WebKit page template class for displaying examples.

	The convention for picking up examples from WebKit plug-ins is:
		* Properties.py must have at least this:
			WebKitConfig = {
				'examplePages': [],
			}

		  But usually specifies various pages:
		    WebKitConfig = {
		    	'examplesPages': [
		    		'foo',
		    		'bar',
		    	]
		    }
		* The plug-in must have an Examples/ directory.
		* That directory must have an index.* or Main.* which
		  inherits from ExamplePage.
		* The implementation can pass in which case a menu of
		  the pages for that plug-in is written:
		    # Main.py
		    from WebKit.Examples.ExamplePage import ExamplePage
		    class Main(ExamplePage):
		    	pass

	If WebKitConfig['examplesPages'] is non-existant or None, then
	no examples will be available for the plug-in.

	If the WebKit Examples context is not present in the first place,
	then there is no access to the plug-in examples.

	"""

	def cornerTitle(self):
		return 'WebKit Examples'

	def isDebugging(self):
		return 0

	def examplePages(self, plugInName=None):
		"""Get a list of all example pages.

		Returns a list of all the example pages for our particular plug-in.
		These can be used in the sidebar or in the main content area to
		give easy access to the other example pages.

		"""
		if plugInName is None:
			# Special case: We're in WebKit examples
			from WebKit.Properties import WebKitConfig
			return WebKitConfig['examplePages']
		else:
			# Any other plug-in:
			plugIn = self.application().server().plugIn(plugInName)
			return plugIn.examplePages()

	def writeSidebar(self):
		self.writeExamplesMenu()
		self.writeOtherMenu()
		self.writeWebKitSidebarSections()

	def writeExamplesMenu(self):
		servletPath = self.request().servletPath()
		self.menuHeading('Examples')
		ctx = self.request().contextName().split('/', 2)
		plugIns = self.application().server().plugIns()
		plugInName = len(ctx) > 1 and ctx[1] == 'Examples' and ctx[0]
		# WebKit
		self.menuItem('WebKit', '%s/Examples/' % servletPath)
		if not plugInName:
			self.writeExamplePagesItems()
		# Other plug-ins
		for plugIn in plugIns:
			if plugIn.hasExamplePages():
				name = plugIn.name()
				link = '%s/%s/' % (servletPath, plugIn.examplePagesContext())
				self.menuItem(name, link)
				if name == plugInName:
					self.writeExamplePagesItems(name)

	def writeExamplePagesItems(self, pluginName=None):
		for page in self.examplePages(pluginName):
			self.menuItem(page, page, indentLevel=2)

	def writeOtherMenu(self):
		self.menuHeading('Other')
		viewPath = self.request().uriWebKitRoot() + "Examples/View"
		self.menuItem(
			'View source of<br>%s' % self.title(),
			self.request().uriWebKitRoot() + 'Examples/View?filename=%s' \
				% os.path.basename(self.request().serverSidePath()))
		if self.application().hasContext('Documentation'):
			filename = 'Documentation/WebKit.html'
			if os.path.exists(filename):
				self.menuItem('Local WebKit docs',
					self.request().servletPath() + '/' + filename)

	def writeContent(self):
		wr = self.writeln
		wr('<div style="padding-left:2em"><table>')
		for page in self.examplePages(
				self.request().contextName().split('/', 1)[0]):
			wr('<tr><td bgcolor="#E8E8F0"><a href=%s>%s</a>'
				'</td></tr>' % (page, page))
		wr('</table></div>')
