Insert+Unicode keyboard feature added

This commit is contained in:
Simon Rozman 2016-04-30 15:37:06 +02:00
parent 3ff9459198
commit 99a4b2e6c8
2 changed files with 62 additions and 2 deletions

View File

@ -24,7 +24,9 @@
// wxZRColaKeyHandler // wxZRColaKeyHandler
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
wxZRColaKeyHandler::wxZRColaKeyHandler() : wxEvtHandler() wxZRColaKeyHandler::wxZRColaKeyHandler() :
m_is_insert(false),
wxEvtHandler()
{ {
std::fstream dat((LPCTSTR)((ZRColaApp*)wxTheApp)->GetDatabasePath(), std::ios_base::in | std::ios_base::binary); std::fstream dat((LPCTSTR)((ZRColaApp*)wxTheApp)->GetDatabasePath(), std::ios_base::in | std::ios_base::binary);
if (dat.good()) { if (dat.good()) {
@ -55,7 +57,33 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
if (event.GetEventType() == wxEVT_KEY_DOWN) { if (event.GetEventType() == wxEVT_KEY_DOWN) {
// The character event occured. // The character event occured.
wxKeyEvent &e = (wxKeyEvent&)event; wxKeyEvent &e = (wxKeyEvent&)event;
if (e.GetUnicodeKey() || !e.HasAnyModifiers()) { if (e.GetKeyCode() == WXK_INSERT) {
// Insert key has been pressed.
m_is_insert = true;
wxFrame *pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
if (pFrame && pFrame->GetStatusBar())
pFrame->SetStatusText(_("INS"));
} else if (m_is_insert) {
wxChar chr = e.GetUnicodeKey();
wxFrame *pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
if (('0' <= chr && chr <= '9' || 'A' <= chr && chr <= 'F') && m_insert_seq.size() < 4) {
// A hex-digit pressed. Save it.
m_insert_seq.push_back((char)chr);
if (pFrame && pFrame->GetStatusBar())
pFrame->SetStatusText(wxString::Format(wxT("%s+%s"), (const wxStringCharType*)_("INS"), (const wxStringCharType*)wxString(m_insert_seq.data(), m_insert_seq.size())));
event.StopPropagation();
return true;
} else {
// Not a hex-digit.
m_is_insert = false;
m_insert_seq.clear();
if (pFrame && pFrame->GetStatusBar())
pFrame->SetStatusText(wxEmptyString);
}
} else if (e.GetUnicodeKey() || !e.HasAnyModifiers()) {
ZRCola::keyseq_db::indexKey::size_type start, end; ZRCola::keyseq_db::indexKey::size_type start, end;
bool found; bool found;
wxFrame *pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); wxFrame *pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
@ -113,6 +141,36 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
pFrame->SetStatusText(wxEmptyString); pFrame->SetStatusText(wxEmptyString);
} }
} }
} else if (event.GetEventType() == wxEVT_KEY_UP) {
wxKeyEvent &e = (wxKeyEvent&)event;
if (e.GetKeyCode() == WXK_INSERT && m_is_insert) {
// Insert key has been depressed.
wxFrame *pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
if (pFrame && pFrame->GetStatusBar())
pFrame->SetStatusText(wxEmptyString);
std::vector<char>::size_type count = m_insert_seq.size();
if (count) {
// Zero terminate sequence and parse the Unicode value.
m_insert_seq.push_back(0);
wchar_t chr = strtoul(m_insert_seq.data(), NULL, 16);
if (chr) {
wxObject *obj = event.GetEventObject();
if (obj && obj->IsKindOf(wxCLASSINFO(wxTextCtrl))) {
// Push text to source control.
((wxTextCtrl*)obj)->WriteText(chr);
}
}
m_insert_seq.clear();
}
m_is_insert = false;
event.StopPropagation();
return true;
}
} }
return wxEvtHandler::ProcessEvent(event); return wxEvtHandler::ProcessEvent(event);

View File

@ -43,4 +43,6 @@ public:
protected: protected:
ZRCola::keyseq_db m_ks_db; ///< Key sequence database ZRCola::keyseq_db m_ks_db; ///< Key sequence database
std::vector<ZRCola::keyseq_db::keyseq::key_t> m_seq; ///< Key sequence std::vector<ZRCola::keyseq_db::keyseq::key_t> m_seq; ///< Key sequence
bool m_is_insert; ///< Is Insert key pressed?
std::vector<char> m_insert_seq; ///< The Insert char sequence
}; };