re-factor full pinyin editor
authorPeng Wu <alexepico@gmail.com>
Wed, 21 Sep 2011 03:39:17 +0000 (11:39 +0800)
committerPeng Wu <alexepico@gmail.com>
Thu, 22 Dec 2011 04:23:12 +0000 (12:23 +0800)
src/PYPFullPinyinEditor.cc
src/PYPFullPinyinEditor.h

index 0a05c5a..904064a 100644 (file)
@@ -83,43 +83,35 @@ LibPinyinFullPinyinEditor::removeCharAfter (void)
     return TRUE;
 }
 
-gboolean
-LibPinyinFullPinyinEditor::removeWordBefore (void)
+guint
+LibPinyinFullPinyinEditor::getCursorLeftByWord (void)
 {
-    if (G_UNLIKELY (m_cursor == 0))
-        return FALSE;
-
     guint cursor;
 
     if (G_UNLIKELY (m_cursor > m_pinyin_len)) {
         cursor = m_pinyin_len;
     } else {
+        PinyinKeyPosVector & pinyin_poses = m_instance->m_pinyin_poses;
         guint pinyin_cursor = getPinyinCursor ();
         PinyinKeyPos *pos = &g_array_index
-            (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor);
+            (pinyin_poses, PinyinKeyPos, pinyin_cursor);
         cursor = pos->m_pos;
+
         /* cursor at the begin of one pinyin */
-        g_return_val_if_fail (pinyin_cursor > 0, FALSE);
+        g_return_val_if_fail (pinyin_cursor > 0, 0);
         if ( cursor == m_cursor) {
             pos = &g_array_index
-                (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor - 1);
+                (pinyin_poses, PinyinKeyPos, pinyin_cursor - 1);
             cursor = pos->m_pos;
         }
     }
 
-    m_text.erase (cursor, m_cursor - cursor);
-    m_cursor = cursor;
-    updatePinyin ();
-    update ();
-    return TRUE;
+    return cursor;
 }
 
-gboolean
-LibPinyinFullPinyinEditor::removeWordAfter (void)
+guint
+LibPinyinFullPinyinEditor::getCursorRightByWord (void)
 {
-    if (G_UNLIKELY (m_cursor == m_text.length ()))
-        return FALSE;
-
     guint cursor;
 
     if (G_UNLIKELY (m_cursor > m_pinyin_len)) {
@@ -128,9 +120,33 @@ LibPinyinFullPinyinEditor::removeWordAfter (void)
         guint pinyin_cursor = getPinyinCursor ();
         PinyinKeyPos *pos = &g_array_index
             (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor);
-        cursor = pos->m_pos + pos->m_len;
+        cursor = pos->get_end_pos ();
     }
 
+    return cursor;
+}
+
+gboolean
+LibPinyinFullPinyinEditor::removeWordBefore (void)
+{
+    if (G_UNLIKELY (m_cursor == 0))
+        return FALSE;
+
+    guint cursor = getCursorLeftByWord ();
+    m_text.erase (cursor, m_cursor - cursor);
+    m_cursor = cursor;
+    updatePinyin ();
+    update ();
+    return TRUE;
+}
+
+gboolean
+LibPinyinFullPinyinEditor::removeWordAfter (void)
+{
+    if (G_UNLIKELY (m_cursor == m_text.length ()))
+        return FALSE;
+
+    guint cursor = getCursorRightByWord ();
     m_text.erase (m_cursor, cursor - m_cursor);
     updatePinyin ();
     update ();
@@ -165,23 +181,7 @@ LibPinyinFullPinyinEditor::moveCursorLeftByWord (void)
     if (G_UNLIKELY (m_cursor == 0))
         return FALSE;
 
-    guint cursor;
-
-    if (G_UNLIKELY (m_cursor > m_pinyin_len)) {
-        cursor = m_pinyin_len;
-    } else {
-        guint pinyin_cursor = getPinyinCursor ();
-        PinyinKeyPos *pos = &g_array_index
-            (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor);
-        cursor = pos->m_pos;
-        /* cursor at the begin of one pinyin */
-        g_return_val_if_fail (pinyin_cursor > 0, FALSE);
-        if ( cursor == m_cursor) {
-            pos = &g_array_index
-                (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor - 1);
-            cursor = pos->m_pos;
-        }
-    }
+    guint cursor = getCursorLeftByWord ();
 
     m_cursor = cursor;
     update ();
@@ -194,16 +194,7 @@ LibPinyinFullPinyinEditor::moveCursorRightByWord (void)
     if (G_UNLIKELY (m_cursor == m_text.length ()))
         return FALSE;
 
-    guint cursor;
-
-    if (G_UNLIKELY (m_cursor > m_pinyin_len)) {
-        cursor = m_text.length ();
-    } else {
-        guint pinyin_cursor = getPinyinCursor ();
-        PinyinKeyPos *pos = &g_array_index
-            (m_instance->m_pinyin_poses, PinyinKeyPos, pinyin_cursor);
-        cursor = pos->m_pos + pos->m_len;
-    }
+    guint cursor = getCursorRightByWord ();
 
     m_cursor = cursor;
     update ();
index afb52d5..11e53cb 100644 (file)
@@ -54,6 +54,9 @@ protected:
     /* TODO: to be implemented. */
     void updatePinyin (void);
 
+    guint getCursorLeftByWord (void);
+    guint getCursorRightByWord (void);
+
 };
 
 };