#!/usr/bin/python
#
# Almost all of this code is from the pyGTK tutorial.
#

import pygtk
pygtk.require('2.0')
import gtk
import gobject
import copy

class App(gtk.Window):

    def __init__(self):
        gtk.Window.__init__(self)

        self.connect("delete_event", self.delete_event)
        self.connect("destroy", self.destroy)

        scrolled_window = gtk.ScrolledWindow()
        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.add(scrolled_window)

        model = gtk.TreeStore(gobject.TYPE_STRING)
        tree_view = gtk.TreeView(model)
        tree_view.set_rules_hint(True)

        tree_view.append_column(self._makeColumn())
        tree_view.append_column(self._makeColumn())
        tree_view.append_column(self._makeColumn())

        model.insert(None, 1, ("some content",) )
        for i in range(5):
            model.insert(None, i, ("some more content",) )

        scrolled_window.add(tree_view)
        self.set_default_size(500, 400)
        self.show_all()

        for column in tree_view.get_columns():
            column.set_widget(self._makeEntry()) # GTK+ bug; set_widget must be called after window.show()

        self.model = model
        self.tree_view = tree_view

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def _makeColumn(self):
        cell = gtk.CellRendererText()
        col = gtk.TreeViewColumn('spam', cell, text=0)
        col.set_resizable(True)

        # When set to True, if a column is dragged,
        # the custom widget set by set_widget() loses
        # focus permanently. Is there a way to regain
        # this focus? Can I listen to the "columns-changed"
        # signal of the TreeView object to which the columns
        # belong, or to the "clicked' signal of each column?
        col.set_reorderable(True)

        return col

    def _makeEntry(self):
        entry = gtk.Entry()
        entry.set_editable(True)
        entry.set_visibility(True)
        entry.set_width_chars(10)
        entry.set_text("text text")
        entry.show()

        return entry


if __name__ == '__main__':
    a=App()
    gtk.main()
