1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn.JAJP;
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
19f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport java.util.ArrayList;
20f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport java.util.HashMap;
21f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport java.util.Iterator;
22f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport java.util.List;
23f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport java.util.Arrays;
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
25f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport jp.co.omronsoft.openwnn.CandidateFilter;
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.ComposingText;
27f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport jp.co.omronsoft.openwnn.OpenWnn;
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.OpenWnnDictionaryImpl;
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.StrSegmentClause;
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.WnnClause;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.WnnDictionary;
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.WnnEngine;
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.WnnSentence;
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.WnnWord;
35f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport android.content.SharedPreferences;
36f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawaimport android.util.Log;
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
39d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa * The OpenWnn engine class for Japanese IME.
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnnEngineJAJP implements WnnEngine {
442d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Current dictionary type */
452d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private int mDictType = DIC_LANG_INIT;
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (default) */
472d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_INIT = 0;
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (Japanese standard) */
492d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_JP = 0;
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (English standard) */
512d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_EN = 1;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (Japanese person's name) */
532d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_JP_PERSON_NAME = 2;
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (User dictionary) */
552d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_USERDIC = 3;
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (Japanese EISU-KANA conversion) */
572d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_JP_EISUKANA = 4;
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (e-mail/URI) */
592d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_EN_EMAIL_ADDRESS = 5;
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Dictionary type (Japanese postal address) */
612d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int DIC_LANG_JP_POSTAL_ADDRESS = 6;
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Type of the keyboard */
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mKeyboardType = KEYBOARD_UNDEF;
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Keyboard type (not defined) */
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int KEYBOARD_UNDEF = 0;
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Keyboard type (12-keys) */
682d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int KEYBOARD_KEYPAD12 = 1;
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Keyboard type (Qwerty) */
702d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    public static final int KEYBOARD_QWERTY = 2;
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
72f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    /** Score(frequency value) of word in the learning dictionary */
73f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    public static final int FREQ_LEARN = 600;
74f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    /** Score(frequency value) of word in the user dictionary */
75f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    public static final int FREQ_USER = 500;
76f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Maximum limit length of output */
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int MAX_OUTPUT_LENGTH = 50;
79654af752f3635f59b5b4b0daea50c3decae0b69fDaisuke Miyakawa    /** Limitation of predicted candidates */
80654af752f3635f59b5b4b0daea50c3decae0b69fDaisuke Miyakawa    public static final int PREDICT_LIMIT = 100;
8159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
8259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Limitation of candidates one-line */
8359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static final int LIMIT_OF_CANDIDATES_1LINE = 500;
8459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** OpenWnn dictionary */
862d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private WnnDictionary mDictionaryJP;
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
882d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Word list */
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private ArrayList<WnnWord> mConvResult;
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** HashMap for checking duplicate word */
922d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private HashMap<String, WnnWord> mCandTable;
932d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
942d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Input string (Hiragana) */
952d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private String mInputHiragana;
962d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
972d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Input string (Romaji) */
982d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private String mInputRomaji;
992d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
1002d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Number of output candidates */
1012d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private int mOutputNum;
1022d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Where to get the next candidates from.<br>
105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * (0:prefix search from the dictionary, 1:single clause converter, 2:Kana converter)
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mGetCandidateFrom;
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Previously selected word */
110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnWord mPreviousWord;
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Converter for single/consecutive clause conversion */
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private OpenWnnClauseConverterJAJP mClauseConverter;
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Kana converter (for EISU-KANA conversion) */
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private KanaConverter mKanaConverter;
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether exact match search or prefix match search */
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mExactMatchMode;
120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether displaying single clause candidates or not */
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mSingleClauseMode;
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** A result of consecutive clause conversion */
125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnSentence mConvertSentence;
126f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa
127f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    /** The candidate filter */
128f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    private CandidateFilter mFilter = null;
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
132d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa     *
1332d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param writableDictionaryName    Writable dictionary file name(null if not use)
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public OpenWnnEngineJAJP(String writableDictionaryName) {
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* load Japanese dictionary library */
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP = new OpenWnnDictionaryImpl(
1382d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                "/data/data/jp.co.omronsoft.openwnn/lib/libWnnJpnDic.so",
1392d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                writableDictionaryName );
140d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa        if (!mDictionaryJP.isActive()) {
1412d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mDictionaryJP = new OpenWnnDictionaryImpl(
1422d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    "/system/lib/libWnnJpnDic.so",
1432d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    writableDictionaryName );
144d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa        }
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* clear dictionary settings */
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.clearDictionary();
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.clearApproxPattern();
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState(false);
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* work buffers */
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvResult = new ArrayList<WnnWord>();
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandTable = new HashMap<String, WnnWord>();
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* converters */
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mClauseConverter = new OpenWnnClauseConverterJAJP();
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mKanaConverter = new KanaConverter();
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set dictionary for prediction.
162d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa     *
1632d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param strlen        Length of input string
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void setDictionaryForPrediction(int strlen) {
166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionaryJP;
167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dict.clearDictionary();
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mDictType != DIC_LANG_JP_EISUKANA) {
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dict.clearApproxPattern();
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (strlen == 0) {
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dict.setDictionary(2, 245, 245);
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dict.setDictionary(3, 100, 244);
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
176f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                dict.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dict.setDictionary(0, 100, 400);
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (strlen > 1) {
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    dict.setDictionary(1, 100, 400);
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dict.setDictionary(2, 245, 245);
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                dict.setDictionary(3, 100, 244);
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
185f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                dict.setDictionary(WnnDictionary.INDEX_USER_DICTIONARY, FREQ_USER, FREQ_USER);
186f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa                dict.setDictionary(WnnDictionary.INDEX_LEARN_DICTIONARY, FREQ_LEARN, FREQ_LEARN);
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mKeyboardType != KEYBOARD_QWERTY) {
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    dict.setApproxPattern(WnnDictionary.APPROX_PATTERN_JAJP_12KEY_NORMAL);
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Get a candidate.
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
1972d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param index     Index of a candidate.
1982d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @return          The candidate; {@code null} if there is no candidate.
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnWord getCandidate(int index) {
2012d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        WnnWord word;
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2032d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (mGetCandidateFrom == 0) {
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mDictType == OpenWnnEngineJAJP.DIC_LANG_JP_EISUKANA) {
205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* skip to Kana conversion if EISU-KANA conversion mode */
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mGetCandidateFrom = 2;
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else if (mSingleClauseMode) {
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* skip to single clause conversion if single clause conversion mode */
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mGetCandidateFrom = 1;
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2112d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                if (mConvResult.size() < PREDICT_LIMIT) {
2122d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    /* get prefix matching words from the dictionaries */
2132d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    while (index >= mConvResult.size()) {
2142d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        if ((word = mDictionaryJP.getNextWord()) == null) {
2152d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                            mGetCandidateFrom = 1;
2162d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                            break;
2172d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        }
2182d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        if (!mExactMatchMode || mInputHiragana.equals(word.stroke)) {
2192d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                            addCandidate(word);
2202d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                            if (mConvResult.size() >= PREDICT_LIMIT) {
2212d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                                mGetCandidateFrom = 1;
2222d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                                break;
2232d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                            }
2242d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        }
2252d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    }
2262d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                } else {
2272d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    mGetCandidateFrom = 1;
2282d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                }
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* get candidates by single clause conversion */
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mGetCandidateFrom == 1) {
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Iterator<?> convResult = mClauseConverter.convert(mInputHiragana);
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (convResult != null) {
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                while (convResult.hasNext()) {
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    addCandidate((WnnWord)convResult.next());
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* end of candidates by single clause conversion */
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mGetCandidateFrom = 2;
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* get candidates from Kana converter */
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mGetCandidateFrom == 2) {
2462d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            List<WnnWord> addCandidateList
2472d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            = mKanaConverter.createPseudoCandidateList(mInputHiragana, mInputRomaji, mKeyboardType);
2482d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
2492d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            Iterator<WnnWord> it = addCandidateList.iterator();
2502d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            while(it.hasNext()) {
2512d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                addCandidate(it.next());
2522d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            }
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mGetCandidateFrom = 3;
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (index >= mConvResult.size()) {
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return null;
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return (WnnWord)mConvResult.get(index);
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Add a candidate to the conversion result buffer.
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * This method adds a word to the result buffer if there is not
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * the same one in the buffer and the length of the candidate
268f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa     * string is not longer than {@code MAX_OUTPUT_LENGTH}.
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
2702d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param word      A word to be add
2712d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @return          {@code true} if the word added; {@code false} if not.
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean addCandidate(WnnWord word) {
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word.candidate == null || mCandTable.containsKey(word.candidate)
2752d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                || word.candidate.length() > MAX_OUTPUT_LENGTH) {
2762d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            return false;
2772d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
278f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa        if (mFilter != null && !mFilter.isAllowed(word)) {
2792d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            return false;
280f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa        }
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandTable.put(word.candidate, word);
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvResult.add(word);
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Clear work area that hold candidates information.
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void clearCandidates() {
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvResult.clear();
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandTable.clear();
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mOutputNum = 0;
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputHiragana = null;
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputRomaji = null;
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mGetCandidateFrom = 0;
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSingleClauseMode = false;
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set dictionary type.
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
3022d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param type      Type of dictionary
3032d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @return          {@code true} if the dictionary is changed; {@code false} if not.
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean setDictionary(int type) {
3062d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        mDictType = type;
3072d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        return true;
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
311f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa     * Set the search key and the search mode from {@link ComposingText}.
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
3132d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param text      Input text
3142d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param maxLen    Maximum length to convert
3152d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @return          Length of the search key
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int setSearchKey(ComposingText text, int maxLen) {
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        String input = text.toString(ComposingText.LAYER1);
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (0 <= maxLen && maxLen <= input.length()) {
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            input = input.substring(0, maxLen);
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mExactMatchMode = true;
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mExactMatchMode = false;
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (input.length() == 0) {
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mInputHiragana = "";
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mInputRomaji = "";
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputHiragana = input;
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputRomaji = text.toString(ComposingText.LAYER0);
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return input.length();
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Clear the previous word's information.
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void clearPreviousWord() {
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mPreviousWord = null;
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set keyboard type.
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
3482d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param keyboardType      Type of keyboard
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setKeyboardType(int keyboardType) {
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mKeyboardType = keyboardType;
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
354f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    /**
355f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa     * Set the candidate filter
356d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa     *
3572d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * @param filter    The candidate filter
358f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa     */
359f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    public void setFilter(CandidateFilter filter) {
3602d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        mFilter = filter;
3612d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        mClauseConverter.setFilter(filter);
362f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    }
363f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /***********************************************************************
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * WnnEngine's interface
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     **********************************************************************/
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#init */
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void init() {
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearPreviousWord();
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mClauseConverter.setDictionary(mDictionaryJP);
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mKanaConverter.setDictionary(mDictionaryJP);
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#close */
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void close() {}
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#predict */
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int predict(ComposingText text, int minLen, int maxLen) {
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (text == null) { return 0; }
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set mInputHiragana and mInputRomaji */
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int len = setSearchKey(text, maxLen);
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set dictionaries by the length of input */
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setDictionaryForPrediction(len);
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* search dictionaries */
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( true );
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (len == 0) {
392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* search by previously selected word */
393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return mDictionaryJP.searchWord(WnnDictionary.SEARCH_LINK, WnnDictionary.ORDER_BY_FREQUENCY,
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                            mInputHiragana, mPreviousWord);
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mExactMatchMode) {
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* exact matching */
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mDictionaryJP.searchWord(WnnDictionary.SEARCH_EXACT, WnnDictionary.ORDER_BY_FREQUENCY,
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         mInputHiragana);
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* prefix matching */
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mDictionaryJP.searchWord(WnnDictionary.SEARCH_PREFIX, WnnDictionary.ORDER_BY_FREQUENCY,
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         mInputHiragana);
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 1;
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#convert */
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int convert(ComposingText text) {
4112d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        clearCandidates();
412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4132d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (text == null) {
4142d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            return 0;
4152d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( true );
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int cursor = text.getCursor(ComposingText.LAYER1);
420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        String input;
421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnClause head = null;
422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (cursor > 0) {
423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* convert previous part from cursor */
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            input = text.toString(ComposingText.LAYER1, 0, cursor - 1);
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Iterator headCandidates = mClauseConverter.convert(input);
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((headCandidates == null) || (!headCandidates.hasNext())) {
427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return 0;
428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            head = new WnnClause(input, (WnnWord)headCandidates.next());
430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* set the rest of input string */
432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            input = text.toString(ComposingText.LAYER1, cursor, text.size(ComposingText.LAYER1) - 1);
433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* set whole of input string */
435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            input = text.toString(ComposingText.LAYER1);
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnSentence sentence = null;
439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (input.length() != 0) {
440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sentence = mClauseConverter.consecutiveClauseConvert(input);
441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (head != null) {
443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sentence = new WnnSentence(head, sentence);
444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (sentence == null) {
4462d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            return 0;
4472d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
4482d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
4492d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        StrSegmentClause[] ss = new StrSegmentClause[sentence.elements.size()];
4502d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        int pos = 0;
4512d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        int idx = 0;
4522d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        Iterator<WnnClause> it = sentence.elements.iterator();
4532d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        while(it.hasNext()) {
4542d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            WnnClause clause = (WnnClause)it.next();
4552d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            int len = clause.stroke.length();
4562d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            ss[idx] = new StrSegmentClause(clause, pos, pos + len - 1);
4572d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            pos += len;
4582d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            idx += 1;
4592d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
4602d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        text.setCursor(ComposingText.LAYER2, text.size(ComposingText.LAYER2));
4612d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        text.replaceStrSegment(ComposingText.LAYER2, ss,
462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                               text.getCursor(ComposingText.LAYER2));
463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConvertSentence = sentence;
464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4652d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        return 0;
466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int searchWords(String key) {
470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */
475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int searchWords(WnnWord word) {
476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#getNextCandidate */
481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public WnnWord getNextCandidate() {
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputHiragana == null) {
483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return null;
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord word = getCandidate(mOutputNum);
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word != null) {
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mOutputNum++;
488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return word;
490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#learn */
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean learn(WnnWord word) {
494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int ret = -1;
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word.partOfSpeech.right == 0) {
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            word.partOfSpeech = mDictionaryJP.getPOS(WnnDictionary.POS_TYPE_MEISI);
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnDictionary dict = mDictionaryJP;
500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (word instanceof WnnSentence) {
501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Iterator<WnnClause> clauses = ((WnnSentence)word).elements.iterator();
502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            while (clauses.hasNext()) {
503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                WnnWord wd = clauses.next();
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mPreviousWord != null) {
505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    ret = dict.learnWord(wd, mPreviousWord);
506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    ret = dict.learnWord(wd);
508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mPreviousWord = wd;
510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (ret != 0) {
511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mPreviousWord != null) {
516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = dict.learnWord(word, mPreviousWord);
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = dict.learnWord(word);
519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreviousWord = word;
521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mClauseConverter.setDictionary(dict);
522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return (ret == 0);
525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#addWord */
528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int addWord(WnnWord word) {
529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( true );
5302d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (word.partOfSpeech.right == 0) {
5312d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            word.partOfSpeech = mDictionaryJP.getPOS(WnnDictionary.POS_TYPE_MEISI);
5322d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.addWordToUserDictionary(word);
534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( false );
535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#deleteWord */
539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean deleteWord(WnnWord word) {
540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( true );
541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.removeWordFromUserDictionary(word);
542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState( false );
543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
545053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#setPreferences */
547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setPreferences(SharedPreferences pref) {}
548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#breakSequence */
550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void breakSequence()  {
551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearPreviousWord();
552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#makeCandidateListOf */
555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int makeCandidateListOf(int clausePosition)  {
556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        clearCandidates();
557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((mConvertSentence == null) || (mConvertSentence.elements.size() <= clausePosition)) {
559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
560053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSingleClauseMode = true;
562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnClause clause = mConvertSentence.elements.get(clausePosition);
563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputHiragana = clause.stroke;
564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputRomaji = clause.candidate;
565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 1;
567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean initializeDictionary(int dictionary)  {
571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch( dictionary ) {
572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case WnnEngine.DICTIONARY_TYPE_LEARN:
573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.setInUseState( true );
574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.clearLearnDictionary();
575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.setInUseState( false );
576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case WnnEngine.DICTIONARY_TYPE_USER:
579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.setInUseState( true );
580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.clearUserDictionary();
581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDictionaryJP.setInUseState( false );
582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
587d56eddfd5e0f193359f93e7ef665338cace9e2e9Daisuke Miyakawa    /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */
588f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    public boolean initializeDictionary(int dictionary, int type) {
5892d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        return initializeDictionary(dictionary);
590f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    }
591f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa
592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.WnnEngine#getUserDictionaryWords */
593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public WnnWord[] getUserDictionaryWords( ) {
594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* get words in the user dictionary */
595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState(true);
596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord[] result = mDictionaryJP.getUserDictionaryWords( );
597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDictionaryJP.setInUseState(false);
598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* sort the array of words */
600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        Arrays.sort(result, new WnnWordComparator());
601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return result;
603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
605f96267ad0d85ede52c300ae5456d7e4ecb50915cDaisuke Miyakawa    /* {@link WnnWord} comparator for listing up words in the user dictionary */
606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private class WnnWordComparator implements java.util.Comparator {
607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int compare(Object object1, Object object2) {
608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            WnnWord wnnWord1 = (WnnWord) object1;
609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            WnnWord wnnWord2 = (WnnWord) object2;
610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return wnnWord1.stroke.compareTo(wnnWord2.stroke);
611053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
612053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
613053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
614