1 /* 2 * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package jp.co.omronsoft.openwnn; 18 19 import java.io.IOException; 20 import java.util.ArrayList; 21 import java.util.HashMap; 22 import java.util.Iterator; 23 import org.xmlpull.v1.XmlPullParserException; 24 import android.content.SharedPreferences; 25 import android.content.res.XmlResourceParser; 26 import android.util.Log; 27 28 /** 29 * The generator class of symbol list. 30 * <br> 31 * This class is used for generating lists of symbols. 32 * 33 * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved. 34 */ 35 public class SymbolList implements WnnEngine { 36 /* 37 * DEFINITION OF CONSTANTS 38 */ 39 /** Language definition (English) */ 40 public static final int LANG_EN = 0; 41 42 /** Language definition (Japanese) */ 43 public static final int LANG_JA = 1; 44 45 /** Language definition (Chinese) */ 46 public static final int LANG_ZHCN = 2; 47 48 49 /** Key string to get normal symbol list for Japanese */ 50 public static final String SYMBOL_JAPANESE = "j"; 51 52 /** Key string to get normal symbol list for English */ 53 public static final String SYMBOL_ENGLISH = "e"; 54 55 /** Key string to get normal symbol list for Chinese */ 56 public static final String SYMBOL_CHINESE = "c1"; 57 58 /** Key string to get face mark list for Japanese */ 59 public static final String SYMBOL_JAPANESE_FACE = "j_face"; 60 61 /** The name of XML tag key */ 62 private static final String XMLTAG_KEY = "string"; 63 64 /* 65 * DEFINITION OF VARIABLES 66 */ 67 /** Symbols data */ 68 protected HashMap<String,ArrayList<String>> mSymbols; 69 70 /** OpenWnn which has this instance */ 71 private OpenWnn mWnn; 72 73 /** current list of symbols */ 74 private ArrayList<String> mCurrentList; 75 76 /** Iterator for getting symbols from the list */ 77 private Iterator<String> mCurrentListIterator; 78 79 /* 80 * DEFINITION OF METHODS 81 */ 82 /** 83 * Constructor 84 * 85 * @param parent OpenWnn instance which uses this. 86 * @param lang Language ({@code LANG_EN}, {@code LANG_JA} or {@code LANG_ZHCN}) 87 */ 88 public SymbolList(OpenWnn parent, int lang) { 89 mWnn = parent; 90 mSymbols = new HashMap<String, ArrayList<String>>(); 91 92 switch (lang) { 93 case LANG_EN: 94 /* symbols for English IME */ 95 mSymbols.put(SYMBOL_ENGLISH, getXmlfile(R.xml.symbols_latin12_list)); 96 mCurrentList = mSymbols.get(SYMBOL_ENGLISH); 97 break; 98 99 case LANG_JA: 100 /* symbols for Japanese IME */ 101 mSymbols.put(SYMBOL_JAPANESE, getXmlfile(R.xml.symbols_japan_list)); 102 mSymbols.put(SYMBOL_JAPANESE_FACE, getXmlfile(R.xml.symbols_japan_face_list)); 103 mSymbols.put(SYMBOL_ENGLISH, getXmlfile(R.xml.symbols_latin1_list)); 104 mCurrentList = mSymbols.get(SYMBOL_JAPANESE); 105 break; 106 107 case LANG_ZHCN: 108 /* symbols for Chinese IME */ 109 mSymbols.put(SYMBOL_CHINESE, getXmlfile(R.xml.symbols_china_list)); 110 mSymbols.put(SYMBOL_ENGLISH, getXmlfile(R.xml.symbols_latin1_list)); 111 mCurrentList = mSymbols.get(SYMBOL_CHINESE); 112 break; 113 } 114 115 mCurrentList = null; 116 } 117 118 /** 119 * Get a attribute value from a XML resource. 120 * 121 * @param xrp XML resource 122 * @param name The attribute name 123 * 124 * @return The value of the attribute 125 */ 126 private String getXmlAttribute(XmlResourceParser xrp, String name) { 127 int resId = xrp.getAttributeResourceValue(null, name, 0); 128 if (resId == 0) { 129 return xrp.getAttributeValue(null, name); 130 } else { 131 return mWnn.getString(resId); 132 } 133 } 134 135 /** 136 * Load a symbols list from XML resource. 137 * 138 * @param id XML resource ID 139 * @return The symbols list 140 */ 141 private ArrayList<String> getXmlfile(int id) { 142 ArrayList<String> list = new ArrayList<String>(); 143 144 XmlResourceParser xrp = mWnn.getResources().getXml(id); 145 try { 146 int xmlEventType; 147 while ((xmlEventType = xrp.next()) != XmlResourceParser.END_DOCUMENT) { 148 if (xmlEventType == XmlResourceParser.START_TAG) { 149 String attribute = xrp.getName(); 150 if (XMLTAG_KEY.equals(attribute)) { 151 String value = getXmlAttribute(xrp, "value"); 152 if (value != null) { 153 list.add(value); 154 } 155 } 156 } 157 } 158 xrp.close(); 159 } catch (XmlPullParserException e) { 160 Log.e("OpenWnn", "Ill-formatted keybaord resource file"); 161 } catch (IOException e) { 162 Log.e("OpenWnn", "Unable to read keyboard resource file"); 163 } 164 165 return list; 166 } 167 168 /** 169 * Set the dictionary 170 * 171 * @param listType The list of symbol 172 * @return {@code true} if valid type is specified; {@code false} if not; 173 */ 174 public boolean setDictionary(String listType) { 175 mCurrentList = mSymbols.get(listType); 176 return (mCurrentList != null); 177 } 178 179 /*********************************************************************** 180 * WnnEngine's interface 181 **********************************************************************/ 182 /** @see jp.co.omronsoft.openwnn.WnnEngine#init */ 183 public void init() {} 184 185 /** @see jp.co.omronsoft.openwnn.WnnEngine#close */ 186 public void close() {} 187 188 /** @see jp.co.omronsoft.openwnn.WnnEngine#predict */ 189 public int predict(ComposingText text, int minLen, int maxLen) { 190 /* ignore if there is no list for the type */ 191 if (mCurrentList == null) { 192 mCurrentListIterator = null; 193 return 0; 194 } 195 196 /* return the iterator of the list */ 197 mCurrentListIterator = mCurrentList.iterator(); 198 return 1; 199 } 200 201 /** @see jp.co.omronsoft.openwnn.WnnEngine#convert */ 202 public int convert(ComposingText text) { 203 return 0; 204 } 205 206 /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */ 207 public int searchWords(String key) {return 0;} 208 209 /** @see jp.co.omronsoft.openwnn.WnnEngine#searchWords */ 210 public int searchWords(WnnWord word) {return 0;} 211 212 /** @see jp.co.omronsoft.openwnn.WnnEngine#getNextCandidate */ 213 public WnnWord getNextCandidate() { 214 if (mCurrentListIterator == null || !mCurrentListIterator.hasNext()) { 215 return null; 216 } 217 String str = mCurrentListIterator.next(); 218 WnnWord word = new WnnWord(str, str); 219 return word; 220 } 221 222 /** @see jp.co.omronsoft.openwnn.WnnEngine#learn */ 223 public boolean learn(WnnWord word) {return false;} 224 225 /** @see jp.co.omronsoft.openwnn.WnnEngine#addWord */ 226 public int addWord(WnnWord word) {return 0;} 227 228 /** @see jp.co.omronsoft.openwnn.WnnEngine#deleteWord */ 229 public boolean deleteWord(WnnWord word) {return false;} 230 231 /** @see jp.co.omronsoft.openwnn.WnnEngine#setPreferences */ 232 public void setPreferences(SharedPreferences pref) {} 233 234 /** @see jp.co.omronsoft.openwnn.WnnEngine#breakSequence */ 235 public void breakSequence() {} 236 237 /** @see jp.co.omronsoft.openwnn.WnnEngine#makeCandidateListOf */ 238 public int makeCandidateListOf(int clausePosition) {return 0;} 239 240 /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */ 241 public boolean initializeDictionary(int dictionary) {return true;} 242 243 /** @see jp.co.omronsoft.openwnn.WnnEngine#initializeDictionary */ 244 public boolean initializeDictionary(int dictionary, int type) {return true;} 245 246 /** @see jp.co.omronsoft.openwnn.WnnEngine#getUserDictionaryWords */ 247 public WnnWord[] getUserDictionaryWords() {return null;} 248 } 249