##===-- statuswin.py -----------------------------------------*- Python -*-===##
##
# The LLVM Compiler Infrastructure
##
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
##
##===----------------------------------------------------------------------===##

import lldb
import lldbutil
import cui
import curses


class StatusWin(cui.TextWin):

    def __init__(self, x, y, w, h):
        super(StatusWin, self).__init__(x, y, w)

        self.keys = [  # ('F1', 'Help', curses.KEY_F1),
            ('F3', 'Cycle-focus', curses.KEY_F3),
            ('F10', 'Quit', curses.KEY_F10)]

    def draw(self):
        self.win.addstr(0, 0, '')
        for key in self.keys:
            self.win.addstr('{0}'.format(key[0]), curses.A_REVERSE)
            self.win.addstr(' {0} '.format(key[1]), curses.A_NORMAL)
        super(StatusWin, self).draw()

    def handleEvent(self, event):
        if isinstance(event, int):
            pass
        elif isinstance(event, lldb.SBEvent):
            if lldb.SBProcess.EventIsProcessEvent(event):
                state = lldb.SBProcess.GetStateFromEvent(event)
                status = lldbutil.state_type_to_str(state)
                self.win.erase()
                x = self.win.getmaxyx()[1] - len(status) - 1
                self.win.addstr(0, x, status)
        return
