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