#!/usr/bin/env python3

import wx


class Example(wx.Dialog):

    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(480, 320))

        self.key_input = wx.UIActionSimulator()
        self.InitUI()
        self.Show()

    def InitUI(self):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        button1 = wx.Button(panel, label='A', size=(50, 50))
        button2 = wx.Button(panel, label='B', size=(50, 50))
        button3 = wx.Button(panel, label='C', size=(50, 50))
        button4 = wx.Button(panel, label='D', size=(50, 50))
        button5 = wx.Button(panel, label='E', size=(50, 50))
        button6 = wx.Button(panel, label='Delete', size=(80, 50))

        line1 = wx.BoxSizer(wx.HORIZONTAL)
        line1.AddMany([(button1, 0, wx.ALL, 10),
                       (button2, 0, wx.ALL, 10),
                       (button3, 0, wx.ALL, 10),
                       (button4, 0, wx.ALL, 10),
                       (button5, 0, wx.ALL, 10),
                       (button6, 0, wx.ALL, 10)])

        self.text_box = wx.TextCtrl(panel)
        font = self.text_box.GetFont()
        font.SetPointSize(60)
        self.text_box.SetFont(font)

        line2 = wx.BoxSizer(wx.HORIZONTAL)
        line2.Add(self.text_box, -1, wx.ALL | wx.EXPAND, 30)

        vbox.AddMany([(line1, 0, wx.ALIGN_CENTER),
                      (line2, -1, wx.EXPAND)])

        panel.SetSizer(vbox)

        # Events.
        for button in (button1, button2, button3, button4, button5, button6):
            button.Bind(wx.EVT_BUTTON, self.on_button)

    def on_button(self, event):
        # Clicking on keyboard button causes the text widget to loose
        # focus... and as setting the focus looses the current
        # selection/insertion point state, it must be saved and reset.
        if getattr(self.text_box, 'GetTextSelection', None):
            selection = self.text_box.GetTextSelection()
            set_selection = self.text_box.SetTextSelection
        else:
            selection = self.text_box.GetSelection()
            set_selection = self.text_box.SetSelection
        self.text_box.SetFocus()
        set_selection(*selection)

        key = event.GetEventObject().Label
        key = 8 if key == 'Delete' else key

        if type(key) is str:
            self.key_input.Text(key.encode('ASCII'))
        elif type(key) is int:
            self.key_input.Char(key)
        else:
            raise RuntimeError('unknown key type: ' + type(key))
        event.Skip()


def main():
    app = wx.App()
    Example(None, title='wx.UIActionSimulator demo')
    app.MainLoop()


if __name__ == '__main__':
    main()
