
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wx/wx.h>
#include <midiutil-wx.h>

const wxString key_names[] = {
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	"backspace",
	"tab",
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	"enter",
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	"escape",
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	"space",
	"exclamation",
	"double-quote",
	"number",
	"dollar",
	"percent",
	"ampersand",
	"single-quote",
	"open-paren",
	"close-paren",
	"asterisk",
	"plus",
	"comma",
	"minus",
	"period",
	"slash",
	"0",
	"1",
	"2",
	"3",
	"4",
	"5",
	"6",
	"7",
	"8",
	"9",
	"colon",
	"semicolon",
	"less-than",
	"equals",
	"greater-than",
	"question",
	"at",
	"A",
	"B",
	"C",
	"D",
	"E",
	"F",
	"G",
	"H",
	"I",
	"J",
	"K",
	"L",
	"M",
	"N",
	"O",
	"P",
	"Q",
	"R",
	"S",
	"T",
	"U",
	"V",
	"W",
	"X",
	"Y",
	"Z",
	"open-bracket",
	"backslash",
	"close-bracket",
	"caret",
	"underscore",
	"backtick",
	"a",
	"b",
	"c",
	"d",
	"e",
	"f",
	"g",
	"h",
	"i",
	"j",
	"k",
	"l",
	"m",
	"n",
	"o",
	"p",
	"q",
	"r",
	"s",
	"t",
	"u",
	"v",
	"w",
	"x",
	"y",
	"z",
	"open-brace",
	"pipe",
	"close-brace",
	"tilde",
	"delete",
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	wxEmptyString,
	"start",
	wxEmptyString,
	wxEmptyString,
	"cancel",
	wxEmptyString,
	"clear",
	"shift",
#ifdef __WXOSX__
	"option",
	"command",
#else
	"alt",
	"control",
#endif
	"menu",
	"pause",
	"caps-lock",
	"end",
	"home",
	"left",
	"up",
	"right",
	"down",
	"select",
	"print",
	"execute",
	"snapshot",
	"insert",
	"help",
	"numpad-0",
	"numpad-1",
	"numpad-2",
	"numpad-3",
	"numpad-4",
	"numpad-5",
	"numpad-6",
	"numpad-7",
	"numpad-8",
	"numpad-9",
	"multiply",
	"add",
	"separator",
	"subtract",
	"decimal",
	"divide",
	"f1",
	"f2",
	"f3",
	"f4",
	"f5",
	"f6",
	"f7",
	"f8",
	"f9",
	"f10",
	"f11",
	"f12",
	"f13",
	"f14",
	"f15",
	"f16",
	"f17",
	"f18",
	"f19",
	"f20",
	"f21",
	"f22",
	"f23",
	"f24",
	"num-lock",
	"scroll-lock",
	"page-up",
	"page-down",
	"numpad-space",
	"numpad-tab",
	"numpad-enter",
	"numpad-f1",
	"numpad-f2",
	"numpad-f3",
	"numpad-f4",
	"numpad-home",
	"numpad-left",
	"numpad-up",
	"numpad-right",
	"numpad-down",
	"numpad-page-up",
	"numpad-page-down",
	"numpad-end",
	"numpad-begin",
	"numpad-insert",
	"numpad-delete",
	"numpad-equal",
	"numpad-multiply",
	"numpad-add",
	"numpad-separator",
	"numpad-subtract",
	"numpad-decimal",
	"numpad-divide",
	"windows-left",
	"windows-right",
	"windows-menu",
#ifdef __WXOSX__
	"control",
#endif
};

#define NUMBER_OF_KEY_NAMES (sizeof (key_names) / sizeof (wxString))

wxString MidiUtil_getNameFromWxKeyCode(wxKeyCode key_code)
{
	wxString key_name = wxEmptyString;
	if (key_code < NUMBER_OF_KEY_NAMES) key_name = key_names[key_code];
	if (key_name == wxEmptyString) key_name = wxString::Format("key-%d", key_code);
	return key_name;
}

wxKeyCode MidiUtil_getWxKeyCodeFromName(wxString key_name)
{
	int key_code;

	for (key_code = 0; key_code < NUMBER_OF_KEY_NAMES; key_code++)
	{
		if (key_names[key_code] == key_name) return (wxKeyCode)(key_code);
	}

	if (sscanf(key_name.c_str(), "key-%d", &key_code) == 1) return (wxKeyCode)(key_code);
	return WXK_NONE;
}

