import wx

from Kernel import Module

_ = wx.GetTranslation


class Keymap(wx.Frame, Module):
    def __init__(self, *args, **kwds):
        # begin wxGlade: Keymap.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE | wx.FRAME_TOOL_WINDOW | wx.STAY_ON_TOP
        wx.Frame.__init__(self, *args, **kwds)
        Module.__init__(self)
        self.SetSize((500, 530))
        self.list_keymap = wx.ListCtrl(self, wx.ID_ANY, style=wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES)
        self.button_add = wx.Button(self, wx.ID_ANY, _("Add Hotkey"))
        self.text_key_name = wx.TextCtrl(self, wx.ID_ANY, "")
        self.text_command_name = wx.TextCtrl(self, wx.ID_ANY, "")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.on_button_add_hotkey, self.button_add)
        # end wxGlade
        self.Bind(wx.EVT_CLOSE, self.on_close, self)
        self.text_key_name.Bind(wx.EVT_KEY_DOWN, self.on_key_press)
        self.SetFocus()

    def on_close(self, event):
        self.device.remove('window', self.name)
        event.Skip()  # Call destroy.

    def initialize(self):
        self.device.close('window', self.name)
        self.Show()
        self.reload_keymap()

    def shutdown(self, channel):
        self.Close()

    def __set_properties(self):
        # begin wxGlade: Keymap.__set_properties
        self.SetTitle(_("Keymap Settings"))
        self.list_keymap.SetToolTip(_("What keys are bound to which actions?"))
        self.list_keymap.AppendColumn(_("Key"), format=wx.LIST_FORMAT_LEFT, width=114)
        self.list_keymap.AppendColumn(_("Command"), format=wx.LIST_FORMAT_LEFT, width=348)
        self.button_add.SetToolTip(_("Add a new hotkey"))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: Keymap.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(self.list_keymap, 1, wx.EXPAND, 0)
        sizer_2.Add(self.button_add, 0, 0, 0)
        sizer_2.Add(self.text_key_name, 1, 0, 0)
        sizer_2.Add(self.text_command_name, 2, 0, 0)
        sizer_1.Add(sizer_2, 0, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

    def reload_keymap(self):
        i = 0
        for key in self.device.device_root.keymap:
            value = self.device.device_root.keymap[key]
            m = self.list_keymap.InsertItem(i, str(key))
            i += 1
            if m != -1:
                self.list_keymap.SetItem(m, 1, str(value))

    def on_button_add_hotkey(self, event):  # wxGlade: Keymap.<event_handler>
        keystroke = self.text_key_name.GetValue()
        if len(keystroke) == 0:
            dlg = wx.MessageDialog(None, _("Missing Keystroke"),
                               _("No Keystroke for binding."), wx.OK | wx.ICON_WARNING)
            result = dlg.ShowModal()
            dlg.Destroy()
            return
        if len(self.text_key_name.GetValue()) == 0:
            dlg = wx.MessageDialog(None, _("Missing Command"),
                               _("No Command for binding."), wx.OK | wx.ICON_WARNING)
            result = dlg.ShowModal()
            dlg.Destroy()
            return
        self.device.device_root.keymap[self.text_key_name.GetValue()] = self.text_command_name.GetValue()
        self.text_key_name.SetValue('')
        self.text_command_name.SetValue('')
        self.reload_keymap()

    def on_key_press(self, event):
        from wxMeerK40t import get_key_name
        keyvalue = get_key_name(event)
        self.text_command_name.SetValue('')
        if keyvalue is None:
            self.text_key_name.SetValue('')
        else:
            self.text_key_name.SetValue(keyvalue)
            for i, key in enumerate(self.device.device_root.keymap):
                if key == keyvalue:
                    self.list_keymap.Select(i, True)
                    self.list_keymap.Focus(i)
                    self.text_command_name.SetValue(self.device.device_root.keymap[key])
                else:
                    self.list_keymap.Select(i, False)