#!/usr/bin/env python

import os, stat, time
import pygtk
pygtk.require('2.0')
import gtk

class FileListingCellDataExample:
    column_names = ['Name', 'Size', 'Mode', 'Last Changed']

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False
 
    def __init__(self, dname = None):
        cell_data_funcs = (None, self.file_size, self.file_mode,
                           self.file_last_changed)
 
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
 
        self.window.set_size_request(400, 300)
 
        self.window.connect("delete_event", self.delete_event)
 
        listmodel = self.make_list(dname)
 
        # create the TreeView
        self.treeview = gtk.TreeView()
 
        # create the TreeViewColumns to display the data
        self.tvcolumn = [None] * len(self.column_names)

        

        cell = gtk.CellRendererText()
        self.tvcolumn[0] = gtk.TreeViewColumn(self.column_names[0], cell)        
        self.tvcolumn[0].set_cell_data_func(cell, self.file_name)
        self.treeview.append_column(self.tvcolumn[0])
        for n in range(1, len(self.column_names)):
            cell = gtk.CellRendererText()
            self.tvcolumn[n] = gtk.TreeViewColumn(self.column_names[n], cell)
            if n == 1:
                cell.set_property('xalign', 1.0)
            self.tvcolumn[n].set_cell_data_func(cell, cell_data_funcs[n])
            self.treeview.append_column(self.tvcolumn[n])

        #self.treeview.connect('row-activated', self.open_file)
        self.scrolledwindow = gtk.ScrolledWindow()
        self.scrolledwindow.add(self.treeview)
        self.window.add(self.scrolledwindow)
        self.treeview.set_model(listmodel)
 
        self.window.show_all()
        return

    def make_list(self, dname=None):
        if not dname:
            self.dirname = os.path.expanduser('~')
        else:
            self.dirname = os.path.abspath(dname)
        self.window.set_title(self.dirname)
        files = [f for f in os.listdir(self.dirname) if f[0] <> '.']
        files.sort()
        files = ['..'] + files
        listmodel = gtk.ListStore(object)
        for f in files:
            listmodel.append([f])
        return listmodel

#     def open_file(self, treeview, path, column):
#         model = treeview.get_model()
#         iter = model.get_iter(path)
#         filename = os.path.join(self.dirname, model.get_value(iter, 0))
#         filestat = os.stat(filename)
#         if stat.S_ISDIR(filestat.st_mode):
#             new_model = self.make_list(filename)
#             treeview.set_model(new_model)
#         return

#     def file_pixbuf(self, column, cell, model, iter):
#         filename = os.path.join(self.dirname, model.get_value(iter, 0))
#         filestat = os.stat(filename)
#         if stat.S_ISDIR(filestat.st_mode):
#             pb = folderpb
#         else:
#             pb = filepb
#         cell.set_property('pixbuf', pb)
#         return

    def file_name(self, column, cell, model, iter):
        cell.set_property('text', model.get_value(iter, 0))
        return

    def file_size(self, column, cell, model, iter):
        filename = os.path.join(self.dirname, model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', filestat.st_size)
        return

    def file_mode(self, column, cell, model, iter):
        filename = os.path.join(self.dirname, model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', oct(stat.S_IMODE(filestat.st_mode)))
        return

    def file_last_changed(self, column, cell, model, iter):
        filename = os.path.join(self.dirname, model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', time.ctime(filestat.st_mtime))
        return

def main():
    gtk.main()

if __name__ == "__main__":
    flcdexample = FileListingCellDataExample()
    main()

