diff --git a/scim-wnn/src/preeditor.cpp b/scim-wnn/src/preeditor.cpp index a77ca11..6333f51 100644 --- a/scim-wnn/src/preeditor.cpp +++ b/scim-wnn/src/preeditor.cpp @@ -199,3 +199,12 @@ String s; return(s); } + + +/*! + \fn PreEditor::cancelEvent() + */ +bool PreEditor::cancelEvent() +{ + return(false); +} diff --git a/scim-wnn/src/preeditor.h b/scim-wnn/src/preeditor.h index 6fe25e6..57af0ba 100644 --- a/scim-wnn/src/preeditor.h +++ b/scim-wnn/src/preeditor.h @@ -56,6 +56,7 @@ virtual String getModeName(); static void convHiraKata(WideString &t); static void convKataHira(WideString &t); + virtual bool cancelEvent(); protected: static WideString text; diff --git a/scim-wnn/src/romkan.cpp b/scim-wnn/src/romkan.cpp index f645231..0152bfb 100644 --- a/scim-wnn/src/romkan.cpp +++ b/scim-wnn/src/romkan.cpp @@ -37,10 +37,11 @@ #define bind_textdomain_codeset(domain,codeset) #endif -Romkan::Romkan() +Romkan::Romkan() : PreEditor() { reset(); iconvert.set_encoding ("EUC-JP"); + mode = ROMA; } @@ -78,11 +79,22 @@ WideString Romkan::insert(char k) { if (k == 0) return(text); + if ((mode == ROMA) && (k == 'q')) { + mode = LATIN; + buf.clear(); + return(text); + } buf += k; String s; s = k; text = text.substr(0,pos) + utf8_mbstowcs(s) + text.substr(pos); pos ++; + if (mode == LATIN) { + buf.clear(); + return(text); + } + + //return(text); return(eval()); } @@ -162,10 +174,12 @@ WideString Romkan::getText(bool hosei) { if (hosei) { - if (text.substr(pos - 1,1) == utf8_mbstowcs("n")) { - WideString w; - iconvert.convert(w,String("��")); - text = text.substr(0,pos - 1) + w; + if (buf.length()) { + if (buf.substr(buf.length() - 1,1) == "n") { + WideString w; + iconvert.convert(w,String("��")); + text = text.substr(0,pos - 1) + w; + } } } return(text); @@ -220,6 +234,13 @@ */ bool Romkan::keyEventHook(const KeyEvent &key) { + if ((isprint(key.code)) && (mode == LATIN)) { + if (!(key.mask & (SCIM_KEY_AltMask | SCIM_KEY_ControlMask))) { + insert(key.get_ascii_code()); + return(true); + } + } + if (!buf.length()) return(false); if (buf[buf.length() - 1] == 'Z') { if (key.code == SCIM_KEY_space) { @@ -236,5 +257,30 @@ */ String Romkan::getModeName() { - return(String(_("Roma-Kana"))); + switch(mode) { + case ROMA: { + return(String(_("Roma-Kana"))); + break; + } + case LATIN: { + return(String(_("Latin"))); + break; + } + case WLATIN: { + return(String(_("Wide Latin"))); + break; + } + } +} + + +/*! + \fn Romkan::cancelEvent() + */ +bool Romkan::cancelEvent() +{ + if ((mode == LATIN) || (mode == WLATIN)) { + mode = ROMA; + return(true); + } } diff --git a/scim-wnn/src/romkan.h b/scim-wnn/src/romkan.h index bf853d1..f726019 100644 --- a/scim-wnn/src/romkan.h +++ b/scim-wnn/src/romkan.h @@ -49,12 +49,16 @@ virtual void kataHira(); virtual bool keyEventHook(const KeyEvent &key); virtual String getModeName(); + virtual bool cancelEvent(); protected: WideString eval(); protected: String buf; + String modeName; + enum inputMode {ROMA,LATIN,WLATIN}; + inputMode mode; }; #endif diff --git a/scim-wnn/src/scim_wnn_imengine.cpp b/scim-wnn/src/scim_wnn_imengine.cpp index acbf8ce..20dc1dd 100644 --- a/scim-wnn/src/scim_wnn_imengine.cpp +++ b/scim-wnn/src/scim_wnn_imengine.cpp @@ -178,7 +178,8 @@ { m_iconv.set_encoding ("EUC-JP"); m_connected = false; - m_preeditor = new Romkan; + preeditors.push_back(new Romkan); + m_preeditor = preeditors.at(0); init(); } @@ -262,6 +263,20 @@ +/*! + \fn WnnInstance::updatePreEditor() + */ +void WnnInstance::updatePreEditor() +{ + if (m_preeditor->getTextLength()) { + show_preedit_string(); + update_preedit_string(m_preeditor->getText()); + update_preedit_caret(m_preeditor->getPos()); + } +} + + + bool WnnInstance::process_key_event (const KeyEvent& key) { if (key.is_key_release()) return false; @@ -276,9 +291,7 @@ bool WnnInstance::process_preedit_key_event(const KeyEvent &key) { if (m_preeditor->keyEventHook(key)) { - show_preedit_string(); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } else if (m_preeditor->getTextLength()) { @@ -295,37 +308,36 @@ } else if (k_forward.comp(key) || k_backward.comp(key)) { k_backward.comp(key) ? m_preeditor->setPos(m_preeditor->getPos() - 1) : m_preeditor->setPos(m_preeditor->getPos() + 1); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } else if (k_backspace.comp(key)) { m_preeditor->backspace(); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } else if (k_delete.comp(key)) { m_preeditor->del(); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } else if (k_cancel.comp(key)) { + if (m_preeditor->cancelEvent()) { + updatePreEditor(); + return(true); + } m_preeditor->reset(); hide_preedit_string(); return(true); } else if (k_convert_hiragana.comp(key)) { m_preeditor->kataHira(); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } else if (k_convert_katakana.comp(key)) { m_preeditor->hiraKata(); - update_preedit_string(m_preeditor->getText()); - update_preedit_caret(m_preeditor->getPos()); + updatePreEditor(); return(true); } } @@ -335,8 +347,8 @@ if ((key.code == SCIM_KEY_space) && (!m_preeditor->getTextLength())) return(false); show_preedit_string(); SCIM_DEBUG_IMENGINE(1) << key.get_key_string() << "\n"; - update_preedit_string(m_preeditor->insert(key.get_ascii_code())); - update_preedit_caret(m_preeditor->getPos()); + m_preeditor->insert(key.get_ascii_code()); + updatePreEditor(); return(true); } return(false); @@ -664,3 +676,4 @@ + diff --git a/scim-wnn/src/scim_wnn_imengine.h b/scim-wnn/src/scim_wnn_imengine.h index aa175ba..1f8ff89 100644 --- a/scim-wnn/src/scim_wnn_imengine.h +++ b/scim-wnn/src/scim_wnn_imengine.h @@ -22,6 +22,7 @@ #include #include +#include #include #include #define Uses_SCIM_ICONV @@ -92,12 +93,14 @@ String rc; bool m_connected; IConvert m_iconv; + vector preeditors; protected: bool process_preedit_key_event(const KeyEvent &key); bool process_conversion_key_event(const KeyEvent &key); void startConversion(WideString s); void createLookupTable(WnnConversionList cList); void init(); + void updatePreEditor(); private: WnnKeyEventList