#!/usr/bin/env python
##===-- sandbox.py -------------------------------------------*- Python -*-===##
##
# The LLVM Compiler Infrastructure
##
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
##
##===----------------------------------------------------------------------===##


import curses

import os
import signal
import sys

import Queue

import cui

event_queue = None


class SandboxUI(cui.CursesUI):

    def __init__(self, screen, event_queue):
        super(SandboxUI, self).__init__(screen, event_queue)

        height, width = self.screen.getmaxyx()
        w2 = width / 2
        h2 = height / 2

        self.wins = []
        #self.wins.append(cui.TitledWin(w2, h2, w2, h2, "Test Window 4"))
        list_win = cui.ListWin(w2, h2, w2, h2)
        for i in range(0, 40):
            list_win.addItem('Item %s' % i)
        self.wins.append(list_win)
        self.wins.append(cui.TitledWin(0, 0, w2, h2, "Test Window 1"))
        self.wins.append(cui.TitledWin(w2, 0, w2, h2, "Test Window 2"))
        self.wins.append(cui.TitledWin(0, h2, w2, h2, "Test Window 3"))

        # def callback(s, content):
        #  self.wins[0].win.scroll(1)
        #  self.wins[0].win.addstr(10, 0, '%s: %s' % (s, content))
        #  self.wins[0].win.scroll(1)
        #  self.el.showPrompt(10, 0)

        # self.wins[0].win.scrollok(1)
        # self.el = cui.CursesEditLine(self.wins[0].win, None,
        #  lambda c: callback('got', c), lambda c: callback('tab', c))
        #self.el.prompt = '>>> '
        #self.el.showPrompt(10, 0)

    def handleEvent(self, event):
        if isinstance(event, int):
            if event == ord('q'):
                sys.exit(0)
            # self.el.handleEvent(event)
        super(SandboxUI, self).handleEvent(event)


def main(screen):
    global event_queue
    event_queue = Queue.Queue()

    sandbox = SandboxUI(screen, event_queue)
    sandbox.eventLoop()

if __name__ == "__main__":
    try:
        curses.wrapper(main)
    except KeyboardInterrupt:
        exit()
