#!/usr/bin/env python
##===-- sandbox.py -------------------------------------------*- Python -*-===##
##
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
##
##===----------------------------------------------------------------------===##


import curses

import os
import signal
import sys

try:
    import queue
except ImportError:
    import Queue as 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()
