
__title__ = "Startup"
__description__ = "A way to manage commands that get run when X starts."

import gtk, gobject
from elementtree.ElementTree import Element

commands = []
__lstore = None

def _sanitize(value):
    return str(value).strip()

def _commit(lstore):
    global commands

    commands[:] = []

    for i, row in enumerate(lstore):
        commands.append((i + 1, _sanitize(row[0])))

def init(tree):
    global commands
    commands = []

    if tree:
        for c in tree.findall('command'):
            commands.append((c.attrib['order'], _sanitize(c.text)))

    commands.sort()

def save(root):
    global commands

    for order, command in commands:
        e = Element('command', order=str(order))
        e.text = _sanitize(command)
        root.append(e)

def guiClose():
    _commit(__lstore)

def gui():

    global __lstore
    import time

    def edited(cell, path_string, new_text, user_data):
        model, = user_data
        model[path_string][0] = _sanitize(new_text)
        _commit(model)

    def deleteItem(menuitem, user_data):
        path, widget = user_data
        model = widget.get_model()
        del model[path]
        _commit(model)

    def popup(widget, event):
        if event.button > 1:
            # Get treeview path.
            path, _, _, _ = widget.get_path_at_pos(int(event.x), int(event.y))

            m = gtk.Menu()
            item = gtk.MenuItem("Delete")
            item.connect('activate', deleteItem, (path, widget))
            m.append(item)
            m.show_all()
            m.popup(None, None, None, event.button, event.time)

    def addItem(button, textbox, treeview):
        model = treeview.get_model()
        value = _sanitize(textbox.get_text())
        textbox.set_text('')

        if value:
            model.append([value])
            _commit(model)

    vbox = gtk.VBox(False, 10)
    sw = gtk.ScrolledWindow()
    sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
    sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

    __lstore = gtk.ListStore(gobject.TYPE_STRING)
    for order, command in commands:
        iter = __lstore.append()
        __lstore.set(iter, 0, command)

    treeview = gtk.TreeView(__lstore)
    treeview.set_rules_hint(True)
    treeview.set_reorderable(True)

    treeview.connect('button-release-event', popup)

    sw.add(treeview)

    renderer = gtk.CellRendererText()
    renderer.connect('edited', edited, (__lstore,))
    renderer.set_property('editable', True)

    col = gtk.TreeViewColumn('Command', renderer, text=0)
    treeview.append_column(col)

    # Entry.
    entry = gtk.Entry()
    entry.connect('activate', addItem, entry, treeview)

    add_button = gtk.Button('Add')
    add_button.connect('clicked', addItem, entry, treeview)

    # Box for entry and 'Add' button.
    hbox = gtk.HBox(False, 5)

    # Pack up.
    hbox.pack_start(entry, True, True)
    hbox.pack_start(add_button, False, False)

    vbox.pack_start(sw, True, True)
    vbox.pack_start(hbox, False, False)

    return vbox

def run():
    global commands

    import subprocess

    for order, c in commands:
        print c
        subprocess.Popen(c.split())
