diff options
author | Peng Wu <alexepico@gmail.com> | 2012-07-24 15:31:27 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2012-07-24 15:31:27 +0800 |
commit | e11dd04794b63a956cc388e9a6494b29ad026545 (patch) | |
tree | 036f7f8338d7257ceea82f50fa38d3adc4545a59 | |
parent | 513c1bef69ad0813f31bf9b8cf0287bb266035ef (diff) | |
download | ibus-libpinyin-e11dd04794b63a956cc388e9a6494b29ad026545.tar.gz ibus-libpinyin-e11dd04794b63a956cc388e9a6494b29ad026545.tar.xz ibus-libpinyin-e11dd04794b63a956cc388e9a6494b29ad026545.zip |
begin to write stroke editor
-rw-r--r-- | src/PYEnglishEditor.cc | 8 | ||||
-rw-r--r-- | src/PYStrokeEditor.cc | 188 |
2 files changed, 192 insertions, 4 deletions
diff --git a/src/PYEnglishEditor.cc b/src/PYEnglishEditor.cc index 5b49f63..77407f2 100644 --- a/src/PYEnglishEditor.cc +++ b/src/PYEnglishEditor.cc @@ -419,13 +419,12 @@ EnglishEditor::processKeyEvent (guint keyval, guint keycode, guint modifiers) g_return_val_if_fail ('v' == keyval, FALSE); m_text = "v"; m_cursor ++; - } - else { + } else { g_return_val_if_fail ('v' == m_text[0], FALSE); if ((keyval >= 'a' && keyval <= 'z') || (keyval >= 'A' && keyval <= 'Z')) { m_text.insert (m_cursor, keyval); - m_cursor++; + m_cursor ++; } } @@ -524,7 +523,8 @@ EnglishEditor::processLabelKey (guint keyval) } gboolean -EnglishEditor::processEnter (guint keyval){ +EnglishEditor::processEnter (guint keyval) +{ if (keyval != IBUS_Return) return FALSE; diff --git a/src/PYStrokeEditor.cc b/src/PYStrokeEditor.cc index 694fd64..69ad88a 100644 --- a/src/PYStrokeEditor.cc +++ b/src/PYStrokeEditor.cc @@ -134,6 +134,194 @@ private: String m_sql; }; +StrokeEditor::StrokeEditor (PinyinProperties &props, Config &config) + : Editor (props, config) +{ + m_stroke_database = new StrokeDatabase; + + gboolean result = m_stroke_database->openDatabase + (".." G_DIR_SEPARATOR_S "data" G_DIR_SEPARATOR_S "strokes.db") || + m_stroke_database->openDatabase + (PKGDATADIR G_DIR_SEPARATOR_S "db" G_DIR_SEPARATOR_S "strokes.db"); + + if (!result) + g_warning ("can't open strokes database.\n"); +} + +StrokeEditor::~StrokeEditor () +{ + delete m_stroke_database; + m_stroke_database = NULL; +} + +gboolean +StrokeEditor::processKeyEvent (guint keyval, guint keycode, guint modifiers) +{ + //IBUS_SHIFT_MASK is removed. + modifiers &= (IBUS_CONTROL_MASK | + IBUS_MOD1_MASK | + IBUS_SUPER_MASK | + IBUS_HYPER_MASK | + IBUS_META_MASK | + IBUS_LOCK_MASK); + if (modifiers) + return FALSE; + + //handle backspace/delete here. + if (processEditKey (keyval)) + return TRUE; + + //handle page/cursor up/down here. + if (processPageKey (keyval)) + return TRUE; + + //handle label key select here. + if (processLabelKey (keyval)) + return TRUE; + + if (processSpace (keyval)) + return TRUE; + + if (processEnter (keyval)) + return TRUE; + + m_cursor = std::min (m_cursor, (guint)m_text.length ()); + + /* Remember the input string. */ + if (m_cursor == 0) { + g_return_val_if_fail ('u' == keyval, FALSE); + m_text = "u"; + m_cursor ++; + } else { + g_return_val_if_fail ('u' == m_text[0], FALSE); + if (keyval >= 'a' && keyval <= 'z') { + /* only lower case characters here */ + m_text.insert (m_cursor, keyval); + m_cursor ++; + } + } + + /* Deal other staff with updateStateFromInput (). */ + updateStateFromInput (); + update (); + return TRUE; +} + +gboolean +StrokeEditor::processEditKey (guint keyval) +{ + switch (keyval) { + case IBUS_Delete: + case IBUS_KP_Delete: + removeCharAfter (); + updateStateFromInput (); + update (); + return TRUE; + case IBUS_BackSpace: + removeCharBefore (); + updateStateFromInput (); + update (); + return TRUE; + } + return FALSE; +} + +gboolean +StrokeEditor::processPageKey (guint keyval) +{ + switch (keyval) { + case IBUS_comma: + if (m_config.commaPeriodPage ()) { + pageUp (); + return TRUE; + } + break; + case IBUS_minus: + if (m_config.minusEqualPage ()) { + pageUp (); + return TRUE; + } + break; + case IBUS_period: + if (m_config.commaPeriodPage ()) { + pageDown (); + return TRUE; + } + break; + case IBUS_equal: + if (m_config.minusEqualPage ()) { + pageDown (); + return TRUE; + } + break; + + case IBUS_Up: + case IBUS_KP_Up: + cursorUp (); + return TRUE; + + case IBUS_Down: + case IBUS_KP_Down: + cursorDown (); + return TRUE; + + case IBUS_Page_Up: + case IBUS_KP_Page_Up: + pageUp (); + return TRUE; + + case IBUS_Page_Down: + case IBUS_KP_Page_Down: + pageDown (); + return TRUE; + + case IBUS_Escape: + reset (); + return TRUE; + } + return FALSE; +} + +gboolean +StrokeEditor::processLabelKey (guint keyval) +{ + switch (keyval) { + case '1' ... '9': + return selectCandidateInPage (keyval - '1'); + break; + case '0': + return selectCandidateInPage (9); + break; + } + return FALSE; +} + +gboolean +StrokeEditor::processEnter (guint keyval) +{ + if (keyval != IBUS_Return) + return FALSE; + + if (m_text.length () == 0) + return FALSE; + + String preedit = m_text.substr (1); + Text text (preedit); + commitText (text); + reset (); + return TRUE; +} + +gboolean +StrokeEditor::processSpace (guint keyval) +{ + if (!(keyval == IBUS_space || keyval == IBUS_KP_Space)) + return FALSE; + + guint cursor_pos = m_lookup_table.cursorPos (); + return selectCandidate (cursor_pos); +} + #if 0 /* using static initializor to test stroke database here. */ |