# DirList -- Directory Listing widget

# XXX Displays messy paths when following '..'

try:
	import posix, path
	os = posix
except ImportError:
	import mac, macpath
	os = mac
	path = macpath

import stdwin, rect
from stdwinevents import *
from Buttons import PushButton
from WindowParent import WindowParent
from HVSplit import HSplit, VSplit

class DirList(VSplit):
	#
	def create(self, (parent, dirname)):
		self = VSplit.create(self, parent)
		names = os.listdir(dirname)
		for name in names:
			if path.isdir(path.join(dirname, name)):
				fullname = path.join(dirname, name)
				btn = SubdirButton().definetext(self, fullname)
			elif name[-3:] == '.py':
				btn = ModuleButton().definetext(self, name)
			else:
				btn = FileButton().definetext(self, name)
		return self
	#

class DirListWindow(WindowParent):
	#
	def create(self, dirname):
		self = WindowParent.create(self, (dirname, (0, 0)))
		child = DirList().create(self, dirname)
		self.realize()
		return self
	#

class SubdirButton(PushButton):
	#
	def drawpict(self, d):
		PushButton.drawpict(self, d)
		d.box(rect.inset(self.bounds, (3, 1)))
	#
	def up_trigger(self):
		window = DirListWindow().create(self.text)
	#

class FileButton(PushButton):
	#
	def up_trigger(self):
		stdwin.fleep()
	#

class ModuleButton(FileButton):
	#
	def drawpict(self, d):
		PushButton.drawpict(self, d)
		d.box(rect.inset(self.bounds, (1, 3)))
	#
