"""
Recent_Files.py - A Jython macro for jEdit which displays
a list of recently used files, allowing one to quickly
open a recently used file.

Copyright (C) 2002 Ollie Rutherfurd <oliver@rutherfurd.net>

$Id: Recent_Files.py 37 2003-04-09 15:38:58Z oliver $
"""

from java.lang import Object
from java.awt import BorderLayout
from java.awt.event import ActionListener, KeyEvent, \
	KeyListener, MouseListener
from javax.swing import Box, BoxLayout, \
	DefaultListCellRenderer, JButton, JDialog, JLabel, \
	JList, JPanel, JScrollPane, ListSelectionModel
from javax.swing.border import EmptyBorder

from org.gjt.sp.jedit import BufferHistory
from org.gjt.sp.jedit.io import VFS, VFSManager
from org.gjt.sp.jedit.browser import FileCellRenderer


class RecentCellRenderer(DefaultListCellRenderer):
	def __init__(self):
		DefaultListCellRenderer.__init__(self)

	def getListCellRendererComponent(self, jlist, value, index, isSelected, cellHasFocus):
		DefaultListCellRenderer.getListCellRendererComponent(self, jlist, value, index, isSelected, cellHasFocus)
		self.setIcon(value.icon)
		self.setText(str(value))
		print dir(value.__class__)
		color = VFS.getDefaultColorFor(value.filename)
		if color:
			self.setForeground(color)
		return self


class RecentFileEntry(Object):
	icon = FileCellRenderer.fileIcon
	def __init__(self, path):
		self.path = path
		vfs = VFSManager.getVFSForPath(path)
		self.filename = vfs.getFileName(path)
		self.parent = vfs.getParentOfPath(path)
		self._str = '%s (%s)' % (self.filename, self.parent)
	def __str__(self):
		return self._str
	toString = __str__


class RecentFilesDialog(JDialog, ActionListener, KeyListener, MouseListener):

	def __init__(self,view,modal=1):
		JDialog.__init__(self,view,'Recent Files',modal)
		self.view = view

		panel = JPanel(BorderLayout(), border=EmptyBorder(12,12,12,12))
		self.contentPane=panel

		entries = [RecentFileEntry(e.path) for e in BufferHistory.getBufferHistory()]
		entries.reverse()
		fileList = JList(entries, keyListener=self, mouseListener=self)
		fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
		fileList.setCellRenderer(RecentCellRenderer())
		panel.add(JScrollPane(fileList), BorderLayout.CENTER)
		self.fileList = fileList

		buttons = JPanel(border=EmptyBorder(12,50,0,50))
		buttons.setLayout(BoxLayout(buttons, BoxLayout.X_AXIS))

		self.ok = JButton("OK",actionListener=self)
		close = JButton("Close",actionListener=self)
		self.ok.setPreferredSize(close.getPreferredSize())
		self.getRootPane().setDefaultButton(self.ok)
		buttons.add(Box.createGlue())
		buttons.add(self.ok)
		buttons.add(Box.createHorizontalStrut(6))
		buttons.add(close)
		buttons.add(Box.createGlue())
		panel.add(buttons, BorderLayout.SOUTH)

		self.addKeyListener(self)

		self.pack()
		self.fileList.setSelectedValue(entries[0], 1)
		self.setLocationRelativeTo(self.view)
		self.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)
		self.setVisible(1)

	def openRecent(self):
		b = self.fileList.getSelectedValue()
		if b is None:
			self.view.getToolkit().beep()
		else:
			jEdit.openFile(self.view, b.path)

	def close(self):
		self.view = None
		self.dispose()

	def actionPerformed(self,evt):
		if evt.source == self.ok:
			self.openRecent()
		self.close()

	def keyPressed(self,evt):
		if evt.getKeyCode() == KeyEvent.VK_ESCAPE:
			self.close()
		elif evt.getKeyCode() == KeyEvent.VK_SPACE:
			self.openRecent()

	def keyReleased(self,evt):
		selected = self.fileList.getSelectedIndex()
		if selected > -1:
			self.fileList.ensureIndexIsVisible(selected)

	def keyTyped(self,evt):
		pass

	def mouseClicked(self,evt):
		if evt.clickCount > 1:
			self.openRecent()
			self.close()

	mouseEntered = mouseExited = mousePressed = mouseReleased = lambda self,evt: None


if __name__ in ('__main__','main'):
	RecentFilesDialog(init.view)

# :indentSize=4:lineSeparator=\n:noTabs=false:tabSize=4:

