OSDN Git Service

フリックのモード追加
authorHiromitsu Shioya <hiroshica@gmail.com>
Sun, 25 Oct 2009 17:55:45 +0000 (02:55 +0900)
committerHiromitsu Shioya <hiroshica@gmail.com>
Sun, 25 Oct 2009 17:55:45 +0000 (02:55 +0900)
ユーザー辞書のimport/export追加

AndroidManifest.xml
res/values-ja/string.xml
res/values/arrays.xml
res/values/strings.xml
res/xml/nicownn_pref_ja.xml
src/com/hiroshica/android/input/nicownn2/EN/UserDictionaryToolsListEN.java
src/com/hiroshica/android/input/nicownn2/JAJP/DefaultSoftKeyboardJAJP.java
src/com/hiroshica/android/input/nicownn2/JAJP/UserDictionaryToolsListJAJP.java
src/com/hiroshica/android/input/nicownn2/UserDicImportExport.java [new file with mode: 0644]
src/com/hiroshica/android/input/nicownn2/UserDictionaryToolsList.java

index e2bf07b..4c7d912 100644 (file)
@@ -16,7 +16,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.hiroshica.android.input.nicownn2"
-         android:versionCode="14" android:versionName="1.0.14">
+         android:versionCode="15" android:versionName="1.0.15">
   <uses-permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="android.permission.VIBRATE"/>
     <application android:icon="@drawable/icon" android:label="NicoWnn">
 
@@ -62,8 +62,6 @@
 
        <activity android:name="com.hiroshica.android.input.nicownn2.EN.UserDictionaryToolsEditEN" android:label="@string/user_dictionary_edit_words" /> 
 
-
-
        <!--
        <activity android:name="com.hiroshica.android.input.nicownn2.NicoWnnMushUp">
          <intent-filter>
index c6e75c8..dc1277f 100644 (file)
     <string name="preference_nicownn_is_skip_space">英語変換時スペース</string>
     <string name="preference_nicownn_is_skip_space_summary_ja">チェックを外すと英語変換で「 」が挿入されなくなります</string>
     <string name="preference_nicownn_is_flick">ニコタッチフリック</string>
-    <string name="preference_nicownn_is_flick_summary_ja">チェックを入れるとニコタッチ入力をフリックの様にスライド入力します</string>
-
+    <string name="preference_nicownn_is_flick_dialog">モード選択</string>
+    <string name="preference_nicownn_is_flick_summary_ja">ニコタッチフリックのモード選択</string>
+    <string name="preference_flick_none">フリック無効</string>
+    <string name="preference_flick_1stroke">1ストロークタイプ</string>
+    <string name="preference_flick_nicostroke">ニコタッチ/1ストローク混合タイプ</string>
 
     <!-- Dialog Messages -->
     <string name="dialog_button_ok">OK</string>
     <string name="dialog_clear_user_dictionary_done">ユーザー辞書の内容をすべて消去しました。</string>
     <string name="dialog_clear_learning_dictionary_done">学習辞書の内容をすべて消去しました。</string>
 
+    <string name="dialog_import_dic_message">SDカードからユーザー辞書を読み込みます。</string>
+    <string name="dialog_import_dic_message_done">ユーザー辞書を読み込みました。</string>
+    <string name="dialog_import_dic_message_failed">ユーザー辞書の読み込みに失敗しました。</string>
+    <string name="dialog_export_dic_message">ユーザー辞書をSDカードへ出力します。\n保存先は\n\"/sdcard/com.hiroshica.android.input.nicownn2\"\nになります</string>
+    <string name="dialog_export_dic_message_done">SDカードへ出力しました。</string>
+    <string name="dialog_export_dic_message_failed">SDカードへの出力に失敗しました。</string>
+
     <!-- user dictionary -->
     <string name="user_dictionary_list_words">単語一覧</string>
     <string name="user_dictionary_list_words_en">英語ユーザー辞書 単語一覧</string>
     <string name="user_dictionary_over_max_text_size_message">登録できる最大文字数を超えています。</string>
     <string name="user_dictionary_creating_wordlist">生成中</string>
     <string name="user_dictionary_init">ユーザー辞書全消去</string>
+    <string name="user_dictionary_import">SDカードから読み込み</string>
+    <string name="user_dictionary_export">SDカードへ保存</string>
 
   <!-- IME dependency -->
     <!-- OpenWnn English -->
-    <string name="nicownn_english_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.14\nオムロン ソフトウェア(株)/hiroshica</string>
+    <string name="nicownn_english_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.15\nオムロン ソフトウェア(株)/hiroshica</string>
 
     <!-- OpenWnn Japanese -->
-    <string name="nicownn_japanese_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.14\nオムロン ソフトウェア(株)/hiroshica</string>
+    <string name="nicownn_japanese_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.15\nオムロン ソフトウェア(株)/hiroshica</string>
 
     <!-- OpenWnn Chinese -->
-    <string name="nicownn_china_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.14\nオムロン ソフトウェア(株)/hiroshica</string>
+    <string name="nicownn_china_copyright">OpenWnn Ver.1.3.1/NicoWnn Ver.1.0.15\nオムロン ソフトウェア(株)/hiroshica</string>
 
   <!-- Candidate Delete -->
       <string name="button_candidate_select">選 択</string>
index 740668a..2fc164a 100644 (file)
 -->
 <resources>
 
+    <string-array name="flick_entries">
+      <item>@string/preference_flick_none</item>
+      <item>@string/preference_flick_1stroke</item>
+      <item>@string/preference_flick_nicostroke</item>
+    </string-array>
+    
+    <string-array name="flick_values">
+      <item>none_flick</item>
+      <item>normal_stroke</item>
+      <item>nico_stroke</item>
+    </string-array>
+
     <string-array name="keyboard_skin">
         <item>@string/preference_keyboard_android_default</item>
         <item>@string/preference_keyboard_simple</item>
@@ -29,4 +41,5 @@
         <item>keyboard_simple</item>
         <item>keyboard_metal</item>
     </string-array>
+    
 </resources>
index 8598854..e4c5eb0 100644 (file)
   <string name="dialog_clear_user_dictionary_done">Cleared.</string>
   <string name="dialog_clear_learning_dictionary_done">Cleared.</string>
 
+  <string name="dialog_import_dic_message">Import SDCard</string>
+  <string name="dialog_import_dic_message_done">success Import.</string>
+  <string name="dialog_import_dic_message_failed">failed Import.</string>
+  <string name="dialog_export_dic_message">Export SDCard</string>
+  <string name="dialog_export_dic_message_done">success Export.</string>
+  <string name="dialog_export_dic_message_failed">failed Export.</string>
+
   <!-- user dictionary -->
   <string name="user_dictionary_list_words">Registered words</string>
   <string name="user_dictionary_list_words_en">Registered words in English User Dic</string>
   <string name="user_dictionary_over_max_text_size_message">Length of the string exceeds the limit.</string>
   <string name="user_dictionary_creating_wordlist">Loading</string>
   <string name="user_dictionary_init">Initialize?</string>
+  <string name="user_dictionary_import">Import SDCard</string>
+  <string name="user_dictionary_export">Export SDCard</string>
   <string name="user_dictionary_prev_button"> ≪ </string>
   <string name="user_dictionary_next_button"> ≫ </string>
 
   <string name="preference_nicownn_is_skip_space">convert English</string>
   <string name="preference_nicownn_is_skip_space_summary_ja">uncheck, skip space.</string>
   <string name="preference_nicownn_is_flick">flick Nico mode</string>
-  <string name="preference_nicownn_is_flick_summary_ja">check, flick nico input mode.</string>
+  <string name="preference_nicownn_is_flick_dialog">select flick mode</string>
+  <string name="preference_nicownn_is_flick_summary_ja">select flick mode.</string>
+  <string name="preference_flick_none">none flick type.</string>
+  <string name="preference_flick_1stroke">1stroke flick type.</string>
+  <string name="preference_flick_nicostroke">nicoTouch/1stroke type.</string>
 
 
   <!-- IME dependency -->
   <!-- OpenWnn English -->
-  <string name="nicownn_english_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.14</string>
+  <string name="nicownn_english_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.15</string>
   <string name="nicownn_english">nicoWnn English</string>
   <string name="nicownn_english_system_dictionary">/data/data/com.hiroshica.android.input.nicownn2/lib/libWnnEngDic.so</string>
   <string name="nicownn_english_writable_dictionary">/data/data/com.hiroshica.android.input.nicownn2/writableEN.dic</string>
   <string name="en_word_separators">.,;:!?</string>
 
   <!-- OpenWnn Japanese -->
-  <string name="nicownn_japanese_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.14</string>
+  <string name="nicownn_japanese_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.15</string>
   <string name="nicownn_japanese">nicoWnn IME</string>
   <string name="openwnn_japanese_system_dictionary">/data/data/com.hiroshica.android.input.nicownn2/lib/libWnnJpnDic.so</string>
   <string name="nicownn_japanese_writable_dictionary">/data/data/com.hiroshica.android.input.nicownn2/writableJAJP.dic</string>
 
   <!-- OpenWnn Chinese -->
-  <string name="nicownn_china_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.14</string>
+  <string name="nicownn_china_copyright">Ver.1.3.1\nOMRON SOFTWARE Co., Ltd.\nNicoWnn Ver.1.0.15</string>
   <string name="nicownn_china">nicoWnn Chinese</string>
   <string name="openwnn_china_system_dictionary">/data/data/com.hiroshica.android.input.nicownn2/lib/libWnnZHCNDic.so</string>
   <!-- After Config Change -->
index 276fc9a..99d3aaa 100644 (file)
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                  android:key="nicownn_pref_ja">
 
+  <PreferenceCategory android:title="@string/preference_nicownn_menu">
+    <PreferenceScreen android:title="@string/preference_nicownn_menu">
+      <CheckBoxPreference android:key="change_keitaimode"
+                         android:title="@string/preference_nicownn_change_keitaimode"
+                         android:summary="@string/preference_nicownn_change_keitaimode_ja"
+                         android:defaultValue="false" />
+      <CheckBoxPreference android:key="change_12key_qwerty"
+                         android:title="@string/preference_nicownn_change_12key_qwerty"
+                         android:summary="@string/preference_nicownn_change_12key_summary_ja"
+                         android:defaultValue="false" />
+      <CheckBoxPreference android:key="change_bellmode"
+                         android:title="@string/preference_nicownn_change_bellmode"
+                         android:summary="@string/preference_nicownn_change_bellmode_summary_ja"
+                         android:defaultValue="false" />
+      <CheckBoxPreference android:key="change_y_bellmode"
+                         android:title="@string/preference_nicownn_change_y_bellmode"
+                         android:summary="@string/preference_nicownn_change_y_bellmode_summary_ja"
+                         android:defaultValue="false" />
+      <CheckBoxPreference android:key="is_skip_space"
+                         android:title="@string/preference_nicownn_is_skip_space"
+                         android:summary="@string/preference_nicownn_is_skip_space_summary_ja"
+                         android:defaultValue="true" />
+      <ListPreference
+        android:key="nicoflick_mode"
+        android:title="@string/preference_nicownn_is_flick"
+        android:summary="@string/preference_nicownn_is_flick_summary_ja"
+
+        android:entries="@array/flick_entries"
+        android:entryValues="@array/flick_values"
+        android:defaultValue="none_flick" />
+
+    </PreferenceScreen>
+  </PreferenceCategory>
+
   <PreferenceCategory android:title="@string/preference_key_setting_menu">
     <CheckBoxPreference android:key="key_sound"
                        android:title="@string/preference_key_sound_title"
                        android:dependency="opt_prediction" />
   </PreferenceCategory>
     
-  <PreferenceCategory android:title="@string/preference_nicownn_menu">
-    <CheckBoxPreference android:key="change_keitaimode"
-                       android:title="@string/preference_nicownn_change_keitaimode"
-                       android:summary="@string/preference_nicownn_change_keitaimode_ja"
-                       android:defaultValue="false" />
-    <CheckBoxPreference android:key="change_12key_qwerty"
-                       android:title="@string/preference_nicownn_change_12key_qwerty"
-                       android:summary="@string/preference_nicownn_change_12key_summary_ja"
-                       android:defaultValue="false" />
-    <CheckBoxPreference android:key="change_bellmode"
-                       android:title="@string/preference_nicownn_change_bellmode"
-                       android:summary="@string/preference_nicownn_change_bellmode_summary_ja"
-                       android:defaultValue="false" />
-    <CheckBoxPreference android:key="change_y_bellmode"
-                       android:title="@string/preference_nicownn_change_y_bellmode"
-                       android:summary="@string/preference_nicownn_change_y_bellmode_summary_ja"
-                       android:defaultValue="false" />
-    <CheckBoxPreference android:key="is_skip_space"
-                       android:title="@string/preference_nicownn_is_skip_space"
-                       android:summary="@string/preference_nicownn_is_skip_space_summary_ja"
-                       android:defaultValue="true" />
-    <CheckBoxPreference android:key="is_flick_nico_input"
-                       android:title="@string/preference_nicownn_is_flick"
-                       android:summary="@string/preference_nicownn_is_flick_summary_ja"
-                       android:defaultValue="false" />
-  </PreferenceCategory>
-  
 
   <PreferenceCategory android:title="@string/preference_dictionary_menu">
     <PreferenceScreen android:key="user_dictionary_edit_words"
index a80286a..aa141e6 100644 (file)
@@ -37,6 +37,7 @@ public class UserDictionaryToolsListEN extends UserDictionaryToolsList {
                }
         mListViewName = "com.hiroshica.android.input.nicownn2.EN.UserDictionaryToolsListEN";
         mEditViewName = "com.hiroshica.android.input.nicownn2.EN.UserDictionaryToolsEditEN";
+               mImportExportName = "UserDicEN.xml";
         mPackageName  = "com.hiroshica.android.input.nicownn2";
     }
 
index f554429..ee3f663 100644 (file)
@@ -384,7 +384,18 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
        private int mPrevInputKeyCode = 0;
 
        /** flick nicoinput **/
-       private boolean mFlickNicoInput = false;
+       private static final int NICOFLICK_NONE       = 0;
+       private static final int NICOFLICK_1STROKE    = 1;
+       private static final int NICOFLICK_NICOSTROKE = 2;
+
+       private int mFlickNicoInput = 0;
+       private boolean mNicoFlick = false;
+       private static final HashMap<String, Integer> flickModeTable = new HashMap<String, Integer>() {{
+                       put("none_flick", 0);
+                       put("normal_stroke", 1);
+                       put("nico_stroke", 2);
+               }};
+
        /** **/
        private int mFlickLimitX;
        private int mFlickLimitY;
@@ -459,8 +470,8 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                mChange12keyQwertyMode = pref.getBoolean("change_12key_qwerty", false);
                mChangeYLineBellMode   = pref.getBoolean("change_y_bellmode", false);
                mChangeBellMode        = pref.getBoolean("change_bellmode", false);
-               mFlickNicoInput        = pref.getBoolean("is_flick_nico_input", false);
-
+               mFlickNicoInput        = flickModeTable.get(pref.getString("nicoflick_mode", "none_flick"));
+               
                /* Create the suitable keyboard object */
                if (mDisplayMode == DefaultSoftKeyboard.PORTRAIT) {
                        //mCurrentKeyboardType = KEYBOARD_12KEY;
@@ -567,6 +578,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                        mInputType = INPUT_TYPE_TOGGLE;
                        mode = NicoWnnEvent.Mode.DEFAULT;
                        mNikoFirst = false;
+                       mNicoFlick = false;
                        break;
 
                default:
@@ -713,7 +725,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                mChange12keyQwertyMode = pref.getBoolean("change_12key_qwerty", false);
                mChangeYLineBellMode   = pref.getBoolean("change_y_bellmode", false);
                mChangeBellMode        = pref.getBoolean("change_bellmode", false);
-               mFlickNicoInput        = pref.getBoolean("is_flick_nico_input", false);
+               mFlickNicoInput        = flickModeTable.get(pref.getString("nicoflick_mode", "none_flick"));
                if (old12keyqwerty != mChange12keyQwertyMode) {
                        restartkey = true;
                        if (false == mChange12keyQwertyMode) {
@@ -1598,6 +1610,9 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
        private boolean onKeyNiko(int primaryCode, int[] keyCodes) {
                Keyboard newKeyboard = null;
                boolean retcode = false;
+
+               Log.v("key", "onkey event!!\n");
+
                switch (primaryCode) {
                case DefaultSoftKeyboard.KEYCODE_QWERTY_BACKSPACE:
                case KEYCODE_JP12_BACKSPACE:
@@ -1657,10 +1672,16 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                case KEYCODE_JP12_8:
                case KEYCODE_JP12_9:
                case KEYCODE_JP12_0:
-                       if (true == mFlickNicoInput && false == mNikoFirst) {
+                       if ((NICOFLICK_1STROKE == mFlickNicoInput) && (false == mNikoFirst)) {
+                               retcode = true;
+                               break;
+                       }
+                       if ((NICOFLICK_NICOSTROKE == mFlickNicoInput) && (true == mNicoFlick) && (mPrevInputKeyCode == primaryCode)) {
+                               mNicoFlick = false;
                                retcode = true;
                                break;
                        }
+
                        if (mNikoFirst == false) {
                                mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOUCH_OTHER_KEY));
                                /* change keymap */
@@ -1701,6 +1722,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                                        changeKeyboard(newKeyboard);
                                }
                                mNikoFirst = false;
+                               mNicoFlick = false;
                        }
                        retcode = true;
                        break;
@@ -1767,6 +1789,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                        changeKeyboard(newKeyboard);
                }
                mNikoFirst = false;
+               mNicoFlick = false;
        } // resetNikoKeyboard
        private void setLastNikoChar(int keycode) {
                int col = getTableIndex(keycode);
@@ -1874,7 +1897,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
 
                mStockFlickCode = primaryCode;
                if (mCurrentKeyMode == KEYMODE_JA_FULL_NIKO) {
-                       if (false == mFlickNicoInput) {
+                       if (NICOFLICK_NONE == mFlickNicoInput) {
                                return;
                        }
                        switch (primaryCode) {
@@ -1888,7 +1911,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                        case KEYCODE_JP12_8:
                        case KEYCODE_JP12_9:
                        case KEYCODE_JP12_0:
-                               if (mNikoFirst == false) {
+                               if ((false == mNikoFirst) && (false == mNicoFlick)) {
                                        mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOUCH_OTHER_KEY));
                                        /* change keymap */
                                        int index = getTableIndex(primaryCode);
@@ -1911,6 +1934,7 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
                                        }
                                        mPrevInputKeyCode = primaryCode;
                                        mNikoFirst = true;
+                                       mNicoFlick = true;
                                }
                                break;
                        }
@@ -1920,83 +1944,6 @@ public class DefaultSoftKeyboardJAJP extends DefaultSoftKeyboard {
         */
        @Override public void onRelease(int primaryCode) {
                super.onRelease(primaryCode);
-
-               if (false == mIsEnableFlick) {
-                       return;
-               }
-               if (mCurrentKeyMode == KEYMODE_JA_FULL_NIKO) {
-                       return;
-               }
-
-               if (true == mIsHookFlick) {
-                       onKey(mStockFlickCode, null);
-                       return;
-               }
-
-               float getx = mReleaseX - mPressX;
-               float gety = mReleaseY - mPressY;
-               float limx = getx;
-               float limy = gety;
-               if (limx < 0.0f)  limx *= -1.0f;
-               if (limy < 0.0f)  limy *= -1.0f;
-               
-               if (limx < mFlickLimitX) {
-                       limx = 0.0f;
-               }
-               if (limy < mFlickLimitY) {
-                       limy = 0.0f;
-               }
-               int offset = 0;
-               if (limx > limy) {
-                       // move left/right
-                       if (getx < mFlickLimitX) {
-                               offset = 1;
-                       }
-                       else {
-                               offset = 3;
-                       }
-               }
-               else if (limy > limx) {
-                       // move up/down
-                       if (gety < mFlickLimitY) {
-                               offset = 2;
-                       }
-                       else {
-                               offset = 4;
-                       }
-               }
-
-
-
-               switch (mStockFlickCode) {
-               case KEYCODE_JP12_1:
-               case KEYCODE_JP12_2:
-               case KEYCODE_JP12_3:
-               case KEYCODE_JP12_4:
-               case KEYCODE_JP12_5:
-               case KEYCODE_JP12_6:
-               case KEYCODE_JP12_7:
-               case KEYCODE_JP12_8:
-               case KEYCODE_JP12_9:
-               case KEYCODE_JP12_0:
-                       int col = getTableIndex(mStockFlickCode);
-                       String[][] cycleTable = getCycleTable();
-                       if (cycleTable == null) {
-                               Log.e("NicoWnn", "not founds cycle table");
-                       }
-                       else{
-                               mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOGGLE_CHAR, cycleTable[col * 10 + offset]));
-                       }
-                       mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOUCH_OTHER_KEY));
-                       break;
-               default:
-                       onKey(mStockFlickCode, null);
-                       return;
-               }
-               /* update shift key's state */
-               if (!mCapsLock && (primaryCode != DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT)) {
-                       setShiftByEditorInfo();
-               }
        } // onRelease
 
 }
index 5b44299..5d1da72 100644 (file)
@@ -34,6 +34,7 @@ public class UserDictionaryToolsListJAJP extends UserDictionaryToolsList {
     public UserDictionaryToolsListJAJP() {
         mListViewName = "com.hiroshica.android.input.nicownn2.JAJP.UserDictionaryToolsListJAJP";
         mEditViewName = "com.hiroshica.android.input.nicownn2.JAJP.UserDictionaryToolsEditJAJP";
+               mImportExportName = "UserDicJAJP.xml";
         mPackageName  = "com.hiroshica.android.input.nicownn2";
     }
 
diff --git a/src/com/hiroshica/android/input/nicownn2/UserDicImportExport.java b/src/com/hiroshica/android/input/nicownn2/UserDicImportExport.java
new file mode 100644 (file)
index 0000000..8b54d17
--- /dev/null
@@ -0,0 +1,185 @@
+package com.hiroshica.android.input.nicownn2;
+
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.util.Log;
+
+import java.util.ArrayList;
+//import java.io.File;
+//import java.io.FileInputStream;
+//import java.io.FileOutputStream;
+import java.io.*;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+
+
+
+public class UserDicImportExport extends AsyncTask<String, String, String[]>{
+       private UserDictionaryToolsList mActivity;
+       
+       public UserDicImportExport(UserDictionaryToolsList activity) {
+               mActivity  = activity;
+       }
+       @Override
+       protected void onPreExecute() {
+               super.onPreExecute();
+               mActivity.createProgressDialog();
+       }
+
+       @Override
+       protected String[] doInBackground(String... params)  {
+               boolean result = false;
+               String[]  resultString = new String[2];
+               if (params[0].equals("import")) {
+                       result = importUserDic(params[1]);
+                       if (true == result) {
+                               resultString[0] = "true";
+                               resultString[1] = mActivity.getString(R.string.dialog_import_dic_message_done);
+                       }
+                       else{
+                               resultString[0] = "false";
+                               resultString[1] = mActivity.getString(R.string.dialog_import_dic_message_failed);
+                       }
+               }
+               else{
+                       result = exportUserDic(params[1]);
+                       if (true == result) {
+                               resultString[0] = "true";
+                               resultString[1] = mActivity.getString(R.string.dialog_export_dic_message_done);
+                       }
+                       else{
+                               resultString[0] = "false";
+                               resultString[1] = mActivity.getString(R.string.dialog_export_dic_message_failed);
+                       }
+               }
+               return resultString;
+       }
+       @Override
+       protected void onPostExecute(String[] result) {
+               mActivity.removeProgressDialog(result);
+       }
+       @Override
+       protected void onCancelled() {
+               super.onCancelled();
+       }
+
+       /*
+        *
+        */
+       private boolean importUserDic(String file) {
+               File fileSdCard = getExternalStorageDirectory();
+               File fileBase = null;
+               if (fileSdCard != null) {
+                       fileBase = new File(fileSdCard, mActivity.getPackageName());
+                       if (!fileBase.exists()) {
+                               return false;
+                       }
+               }
+               ArrayList<WnnWord> importList = new ArrayList<WnnWord>();
+               try {
+                       File fileLoad = new File(fileBase, file);
+                       Log.d("load", "create fileload\n");
+                       FileInputStream fin = new FileInputStream(fileLoad);
+                       Log.d("load", "create inputstream\n");
+                       final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+                       final XmlPullParser parser = factory.newPullParser();
+                       parser.setInput(fin, "UTF8");
+                       Log.d("load", "create XML parser\n");
+                       int eventType;                  
+                       String tagName;
+                       String tagText;
+                       for(eventType = parser.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = parser.next()){
+                               tagName = parser.getName();
+                               if (eventType != XmlPullParser.START_TAG)    continue;
+                               if (tagName == null)    continue;
+                               if (!tagName.equals("dicword"))    continue;
+                               // entry word
+                               WnnWord newword = new WnnWord();
+                               newword.stroke    = parser.getAttributeValue(null,"stroke").replaceAll("\"", "");
+                               Log.d("load", "get stroke = "+newword.stroke+"\n");
+                               do {
+                                       eventType = parser.next();
+                                       if (eventType == XmlPullParser.TEXT) {
+                                               newword.candidate = parser.getText().replaceAll("\"", "");;
+                                               Log.d("load", "get candidate = "+newword.candidate+"\n");
+                                               break;
+                                       }
+                               } while (eventType == XmlPullParser.END_DOCUMENT);
+                               if (eventType == XmlPullParser.END_DOCUMENT) {
+                                       break;
+                               }
+                               importList.add(importList.size(), newword);
+                       }
+               } catch (Exception e) {
+                       return false;
+               } finally {
+                       //
+               }
+               // set new wordlist
+               Log.d("load", "set new wordlist\n");
+               int size = importList.size();
+               for (int iI = 0; iI < size; ++iI) {
+                       WnnWord getword = importList.get(iI);
+                       boolean result = mActivity.addImportWord(getword);
+                       if (false == result) {
+                               return false;
+                       }
+               }
+               Log.d("load", "finish import!!\n");
+               return true;
+       }
+       /*
+        *
+        */
+       private boolean exportUserDic(String file) {
+               File fileSdCard = getExternalStorageDirectory();
+               File fileBase = null;
+               if (fileSdCard != null) {
+                       fileBase = new File(fileSdCard, mActivity.getPackageName());
+                       if (!fileBase.exists()) {
+                               if (!fileBase.mkdir()) {
+                                       return false;
+                               } // mkdir
+                       } // exists
+               } // sd card
+
+               try {
+                       File fileSave = new File(fileBase, file);
+                       FileOutputStream fout = new FileOutputStream(fileSave);
+                       // output XML header
+                       String header = new String("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
+                       String top    = new String("<wordlist>\n");
+                       String end    = new String("</wordlist>\n");
+
+                       fout.write(header.getBytes());
+                       fout.write(top.getBytes());
+                       // create data
+                       int size = mActivity.getWordListSize();
+                       WnnWord getword;
+                       for (int iI = 0; iI < size; ++iI) {
+                               getword = mActivity.getWnnWord(iI);
+                               String outstring = new String("  <dicword stroke=\"" + getword.stroke + "\">\"" + getword.candidate + "\"</dicword>\n");
+                               fout.write(outstring.getBytes());
+                       }
+                       fout.write(end.getBytes());
+               } catch (Exception e) {
+                       return false;
+               } finally {
+                       //
+               }
+               return true;
+       }
+       /*************************************************************************************/
+    /* file load/save                                                                    */
+    /*************************************************************************************/
+       /*
+        * 
+        */
+       private File getExternalStorageDirectory() {
+               if (!Environment.getExternalStorageState().contains("mounted")) {
+                       return null;
+               }
+               return Environment.getExternalStorageDirectory();
+       }
+}
\ No newline at end of file
index 136ff76..aa9170a 100644 (file)
@@ -19,6 +19,7 @@ package com.hiroshica.android.input.nicownn2;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.app.ProgressDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.graphics.Color;
@@ -28,6 +29,9 @@ import android.util.Log;
 import android.view.Display;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.View.OnCreateContextMenuListener;
 import android.view.MotionEvent;
 import android.view.KeyEvent;
 import android.view.View;
@@ -41,6 +45,7 @@ import android.widget.TableRow;
 import android.widget.TextView;
 import android.widget.Toast;
 import android.widget.Button;
+import android.widget.ScrollView;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -71,12 +76,19 @@ public abstract class UserDictionaryToolsList extends Activity
     private final int MENU_ITEM_DELETE = 2;
     /** ID of the menu item (initialize) */
     private final int MENU_ITEM_INIT = 3;
+    /** ID of the menu item (import) */
+    private final int MENU_ITEM_IMPORT = 4;
+    /** ID of the menu item (export) */
+    private final int MENU_ITEM_EXPORT = 5;
     
     /** ID of the dialog control (confirm deletion) */
     private final int DIALOG_CONTROL_DELETE_CONFIRM = 0;
     /** ID of the dialog control (confirm initialize) */
     private final int DIALOG_CONTROL_INIT_CONFIRM = 1;
 
+    private final int DIALOG_CONTROL_IMPORT_CONFIRM = 2;
+    private final int DIALOG_CONTROL_EXPORT_CONFIRM = 3;
+
     /** The size of font*/
     private final int WORD_TEXT_SIZE = 16;
 
@@ -132,6 +144,7 @@ public abstract class UserDictionaryToolsList extends Activity
 
     /** List of the words in the user dictionary */
     private ArrayList<WnnWord> mWordList = null;
+    private ArrayList<WnnWord> mImportWordList = null;
 
     /** Work area for sorting the word list */
     private WnnWord[] mSortData;
@@ -145,6 +158,10 @@ public abstract class UserDictionaryToolsList extends Activity
     /** Page right button */
     private Button mRightButton = null;
 
+       protected ProgressDialog              mProgressDialogTop;
+       UserDictionaryToolsList               mThis;
+       protected String                      mImportExportName;
+
     /**
      * Send the specified event to IME
      *
@@ -166,6 +183,8 @@ public abstract class UserDictionaryToolsList extends Activity
 
         super.onCreate(savedInstanceState);
 
+               mThis = this;
+
         /* create XML layout */
         requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
         setContentView(R.layout.user_dictionary_tools_list);
@@ -196,7 +215,6 @@ public abstract class UserDictionaryToolsList extends Activity
                 }
             });
         mRightButton = b;
-
     }
 
     /** @see android.app.Activity#onStart */
@@ -249,6 +267,14 @@ public abstract class UserDictionaryToolsList extends Activity
             .setIcon(android.R.drawable.ic_menu_delete)
             .setEnabled(mInitMenuEnabled);
 
+        menu.add(2, MENU_ITEM_IMPORT, 0, R.string.user_dictionary_import)
+            .setIcon(android.R.drawable.ic_menu_upload)
+            .setEnabled(mInitMenuEnabled);
+               
+        menu.add(2, MENU_ITEM_EXPORT, 0, R.string.user_dictionary_export)
+            .setIcon(android.R.drawable.ic_menu_save)
+            .setEnabled(mInitMenuEnabled);
+               
         mMenu = menu;
         mInitializedMenu = true;
 
@@ -317,6 +343,17 @@ public abstract class UserDictionaryToolsList extends Activity
             showDialog(DIALOG_CONTROL_INIT_CONFIRM);
             ret = true;
             break;
+        case MENU_ITEM_IMPORT:
+            /* clear the dictionary (show dialog) */
+            showDialog(DIALOG_CONTROL_IMPORT_CONFIRM);
+            ret = true;
+            break;
+        case MENU_ITEM_EXPORT:
+            /* clear the dictionary (show dialog) */
+            showDialog(DIALOG_CONTROL_EXPORT_CONFIRM);
+            ret = true;
+            break;
+
 
         default:
             ret = false;
@@ -354,6 +391,22 @@ public abstract class UserDictionaryToolsList extends Activity
                 .setCancelable(true)
                 .create();
 
+        case DIALOG_CONTROL_IMPORT_CONFIRM:
+            return new AlertDialog.Builder(UserDictionaryToolsList.this)
+                .setMessage(R.string.dialog_import_dic_message)
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(android.R.string.ok, mImportDic)
+                .setCancelable(true)
+                .create();
+
+        case DIALOG_CONTROL_EXPORT_CONFIRM:
+            return new AlertDialog.Builder(UserDictionaryToolsList.this)
+                .setMessage(R.string.dialog_export_dic_message)
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(android.R.string.ok, mExportDic)
+                .setCancelable(true)
+                .create();
+
         default:
             Log.e("NicoWnn", "onCreateDialog : Invaled Get DialogID. ID=" + id);
             break;
@@ -441,6 +494,36 @@ public abstract class UserDictionaryToolsList extends Activity
                 }
             }
         };
+    /**
+     * @param  dialog    The information of the dialog
+     * @param  button    The button that is pushed
+     */
+    private DialogInterface.OnClickListener mImportDic =
+        new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int button) {
+                               mImportWordList = null;
+                               UserDicImportExport task = new UserDicImportExport(mThis);
+                               String[] params = new String[2];
+                               params[0] = "import";
+                               params[1] = mImportExportName;
+                               task.execute(params);
+                       }
+               };
+    /**
+     * @param  dialog    The information of the dialog
+     * @param  button    The button that is pushed
+     */
+    private DialogInterface.OnClickListener mExportDic =
+        new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int button) {
+                               UserDicImportExport task = new UserDicImportExport(mThis);
+                               String[] params = new String[2];
+                               params[0] = "export";
+                               params[1] = mImportExportName;
+                               task.execute(params);
+                       }
+               };
+
 
     
     /** @see android.view.View.OnClickListener#onClick */
@@ -727,4 +810,66 @@ public abstract class UserDictionaryToolsList extends Activity
         }
         mTableLayout.requestLayout();
     }
+    /*************************************************************************************/
+    /* access wordlist                                                                   */
+    /*************************************************************************************/
+       public ArrayList<WnnWord> getWordList() {
+               return mWordList;
+       }
+       public int getWordListSize() {
+               return mWordList.size();
+       }
+       public WnnWord getWnnWord(int index) {
+               return mWordList.get(index);
+       }
+
+    /*************************************************************************************/
+    /* progress                                                                          */
+    /*************************************************************************************/
+       /*
+     * 
+     */
+       public void createProgressDialog() {
+               mProgressDialogTop = new ProgressDialog(this);
+               mProgressDialogTop.setTitle("import/export");
+               mProgressDialogTop.setMessage("import/export... ");
+               mProgressDialogTop.setIndeterminate(false);
+               mProgressDialogTop.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+               mProgressDialogTop.setIndeterminate(true);
+               mProgressDialogTop.setCancelable(false);
+               mProgressDialogTop.show();
+       }
+       /*
+        *
+        */
+       public void removeProgressDialog(String[] result) {
+               mWordList = getWords();
+               int size = mWordList.size();
+               if (size <= mWordCount) {
+                       int newPos = (mWordCount - MAX_LIST_WORD_COUNT);
+                       mWordCount = (0 <= newPos) ? newPos : 0;
+               }
+               updateWordList();
+
+               TextView leftText = (TextView) findViewById(R.id.user_dictionary_tools_list_title_words_count);
+               leftText.setText(size + "/" + MAX_WORD_COUNT);
+
+               if (mInitializedMenu) {
+                       onCreateOptionsMenu(mMenu);
+               }
+
+               // remove dialog & set finish message
+               mProgressDialogTop.dismiss();
+               Toast.makeText(getApplicationContext(), result[1], Toast.LENGTH_LONG).show();
+       }
+    public boolean addImportWord(WnnWord wnnWordAdd) {
+        boolean ret;
+        /* add word event */
+        NicoWnnEvent event = new NicoWnnEvent(NicoWnnEvent.ADD_WORD,
+                                  WnnEngine.DICTIONARY_TYPE_USER,
+                                  wnnWordAdd);
+        /* notify the event to IME */
+        ret = sendEventToIME(event);
+        return ret;
+    }
 }