dictionary switching (just started).
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <ListView
+ android:id="@id/android:list"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:choiceMode="singleChoice"
+ android:clickable="true"
+ android:focusable="true"
+ android:layout_weight="1.0"
+ />
+
+</LinearLayout>
<item name="android:textColorLink">#FFFFFF</item>
</style>
- <style name="Theme.Default.TokenRow.Fg" parent="@style/Theme.Light">
+ <style name="Theme.Default.TokenRow.Fg" parent="@style/Theme.Default">
<item name="android:textColor">#FFFFFF</item>
</style>
import java.io.PrintWriter;\r
import java.io.RandomAccessFile;\r
import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
import java.util.Date;\r
+import java.util.List;\r
import java.util.concurrent.Executor;\r
import java.util.concurrent.Executors;\r
import java.util.concurrent.ThreadFactory;\r
import java.util.regex.Matcher;\r
import java.util.regex.Pattern;\r
\r
+import android.app.Activity;\r
+import android.app.Dialog;\r
import android.app.ListActivity;\r
import android.content.Context;\r
import android.content.Intent;\r
import android.widget.BaseAdapter;\r
import android.widget.Button;\r
import android.widget.EditText;\r
+import android.widget.LinearLayout;\r
import android.widget.ListAdapter;\r
import android.widget.ListView;\r
import android.widget.TableLayout;\r
\r
static final String LOG = "QuickDic";\r
\r
- int dictIndex = 0;\r
+ String dictFile = null;\r
RandomAccessFile dictRaf = null;\r
Dictionary dictionary = null;\r
int indexIndex = 0;\r
onLanguageButton();\r
}\r
});\r
+ langButton.setOnLongClickListener(new OnLongClickListener() {\r
+ @Override\r
+ public boolean onLongClick(View v) {\r
+ onLanguageButtonLongClick();\r
+ return true;\r
+ }\r
+ });\r
updateLangButton();\r
\r
final Button upButton = (Button) findViewById(R.id.UpButton);\r
}\r
\r
void updateLangButton() {\r
- langButton.setText(index.shortName.toUpperCase());\r
+ langButton.setText(index.shortName);\r
}\r
\r
void onLanguageButton() {\r
changeIndex((indexIndex + 1)% dictionary.indices.size());\r
onSearchTextChange(searchText.getText().toString());\r
}\r
+ \r
+ static class OpenIndexButton extends Button implements OnClickListener {\r
+\r
+ final Activity activity;\r
+ final int dictionaryIndex;\r
+ final int indexIndex;\r
+\r
+ public OpenIndexButton(final Context context, final Activity activity, final String text, final int dictionaryIndex, final int indexIndex) {\r
+ super(context);\r
+ this.activity = activity;\r
+ this.dictionaryIndex = dictionaryIndex;\r
+ this.indexIndex = indexIndex;\r
+ setOnClickListener(this);\r
+ setText(text, BufferType.NORMAL);\r
+ }\r
+\r
+ @Override\r
+ public void onClick(View v) {\r
+ activity.finish();\r
+ getContext().startActivity(DictionaryActivity.getIntent(getContext(), dictionaryIndex, indexIndex, ""));\r
+ }\r
+ \r
+ }\r
+\r
+ void onLanguageButtonLongClick() {\r
+ Context mContext = getApplicationContext();\r
+ Dialog dialog = new Dialog(mContext);\r
+ \r
+ dialog.setContentView(R.layout.select_dictionary_dialog);\r
+ dialog.setTitle(R.string.selectADictionary);\r
+\r
+ ListView listView = (ListView) dialog.findViewById(android.R.id.list);\r
+\r
+ QuickDicConfig quickDicConfig = PersistentObjectCache.init(\r
+ this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);\r
+ final List<DictionaryInfo> dictionaryInfos = new ArrayList<DictionaryInfo>();\r
+ for (final DictionaryInfo dictionaryInfo : quickDicConfig.dictionaryInfos) {\r
+ if (new File(dictionaryInfo.localFile).canRead()) {\r
+ dictionaryInfos.add(dictionaryInfo);\r
+ }\r
+ }\r
+ listView.setAdapter(new BaseAdapter() {\r
+ \r
+ @Override\r
+ public View getView(int position, View convertView, ViewGroup parent) {\r
+ final LinearLayout result = new LinearLayout(parent.getContext());\r
+ result.addView(new Butt)\r
+ }\r
+ \r
+ @Override\r
+ public long getItemId(int position) {\r
+ return position;\r
+ }\r
+ \r
+ @Override\r
+ public Object getItem(int position) {\r
+ return dictionaryInfos.get(position);\r
+ }\r
+ \r
+ @Override\r
+ public int getCount() {\r
+ return dictionaryInfos.size();\r
+ }\r
+ });\r
+ }\r
+\r
\r
private void changeIndex(final int newIndex) {\r
indexIndex = newIndex;\r
package com.hughes.android.dictionary;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
public class DictionaryInfo implements Serializable {
private static final long serialVersionUID = -6850863377577700388L;
+ public static final class IndexInfo {
+ public IndexInfo(String langIso, int allTokenCount, int mainTokenCount) {
+ this.langIso = langIso;
+ this.allTokenCount = allTokenCount;
+ this.mainTokenCount = mainTokenCount;
+ }
+ public final String langIso;
+ public final int allTokenCount;
+ public final int mainTokenCount;
+
+ public static final int SIZE = 3;
+
+ public StringBuilder append(StringBuilder result) {
+ result.append("\t").append(langIso);
+ result.append("\t").append(allTokenCount);
+ result.append("\t").append(mainTokenCount);
+ return result;
+ }
+
+ public IndexInfo(final String[] fields, int i) {
+ langIso = fields[i++];
+ allTokenCount = Integer.parseInt(fields[i++]);
+ mainTokenCount = Integer.parseInt(fields[i++]);
+ }
+
+ }
+
// Stuff populated from the text file.
- public final String[] langIsos = new String[2];
public String uncompressedFilename;
public String downloadUrl;
public long uncompressedSize;
public long creationMillis;
- public final int[] allTokenCounts = new int[2];
- public final int[] mainTokenCounts = new int[2];
+ public String dictInfo;
+ public final List<IndexInfo> indexInfos = new ArrayList<DictionaryInfo.IndexInfo>();
- String name; // Determined at runtime based on locale on device--user editable.
+ String name; // Determined at runtime based on locale on device--user editable?
String localFile; // Determined based on device's Environment.
- public String toTabSeparatedString() {
- return String.format("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d", langIsos[0],
- langIsos[1], uncompressedFilename, downloadUrl, creationMillis, uncompressedSize,
- mainTokenCounts[0], mainTokenCounts[1], allTokenCounts[0],
- allTokenCounts[1]);
+ public StringBuilder append(final StringBuilder result) {
+ result.append(uncompressedFilename).append("\t");
+ result.append(downloadUrl).append("\t");
+ result.append(creationMillis).append("\t");
+ result.append(uncompressedSize).append("\t");
+ result.append(dictInfo).append("\t");
+ result.append(indexInfos.size()).append("\t");
+ for (final IndexInfo indexInfo : indexInfos) {
+ indexInfo.append(result);
+ }
+ return result;
}
public DictionaryInfo(final String line) {
final String[] fields = line.split("\t");
int i = 0;
- langIsos[0] = fields[i++];
- langIsos[1] = fields[i++];
uncompressedFilename = fields[i++];
downloadUrl = fields[i++];
creationMillis = Long.parseLong(fields[i++]);
uncompressedSize = Long.parseLong(fields[i++]);
- mainTokenCounts[0] = Integer.parseInt(fields[i++]);
- mainTokenCounts[1] = Integer.parseInt(fields[i++]);
- allTokenCounts[0] = Integer.parseInt(fields[i++]);
- allTokenCounts[1] = Integer.parseInt(fields[i++]);
+ dictInfo = fields[i++];
+ final int size = Integer.parseInt(fields[i++]);
+ for (int j = 0; j < size; ++j) {
+ indexInfos.add(new IndexInfo(fields, i));
+ i += IndexInfo.SIZE;
+ }
}
public DictionaryInfo() {
}
final DictionaryInfo dictionaryInfo = new DictionaryInfo(line);
String name = "";
- for (int i = 0; i < dictionaryInfo.langIsos.length; ++i) {
- final Integer langCode = Language.isoCodeToResourceId.get(dictionaryInfo.langIsos[i]);
- final String lang = langCode != null ? context.getString(langCode) : dictionaryInfo.langIsos[i];
+ for (int i = 0; i < dictionaryInfo.indexInfos.size(); ++i) {
+ final Integer langCode = Language.isoCodeToResourceId.get(dictionaryInfo.indexInfos.get(i).langIso);
+ final String lang = langCode != null ? context.getString(langCode) : dictionaryInfo.indexInfos.get(i).langIso;
if (i > 0) {
name += "-";
}
import java.util.ArrayList;
import java.util.List;
+import com.hughes.android.dictionary.DictionaryInfo;
import com.hughes.util.CachingList;
import com.hughes.util.raf.RAFList;
import com.hughes.util.raf.RAFListSerializer;
static final int CACHE_SIZE = 5000;
+ static final int CURRENT_DICT_VERSION = 2;
static final String END_OF_DICTIONARY = "END OF DICTIONARY";
// persisted
/**
* dictFileVersion 1 adds:
- * <li> counts of tokens in indices.
* <li> links to sources?
+ *
+ * dictFileVersion 2 adds:
+ * <li> counts of tokens in indices.
*/
public Dictionary(final String dictInfo) {
- this.dictFileVersion = 1;
+ this.dictFileVersion = CURRENT_DICT_VERSION;
this.creationMillis = System.currentTimeMillis();
this.dictInfo = dictInfo;
pairEntries = new ArrayList<PairEntry>();
public Dictionary(final RandomAccessFile raf) throws IOException {
dictFileVersion = raf.readInt();
- if (dictFileVersion < 0 || dictFileVersion > 1) {
+ if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) {
throw new IOException("Invalid dictionary version: " + dictFileVersion);
}
creationMillis = raf.readLong();
}
}
+ public DictionaryInfo getDictionaryInfo() {
+ final DictionaryInfo result = new DictionaryInfo();
+ result.creationMillis = this.creationMillis;
+ result.dictInfo = this.dictInfo;
+ for (final Index index : indices) {
+ result.indexInfos.add(index.getIndexInfo());
+ }
+ return result;
+ }
+
}
\ No newline at end of file
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
+import com.hughes.android.dictionary.DictionaryInfo;
+import com.hughes.android.dictionary.DictionaryInfo.IndexInfo;
import com.hughes.util.CachingList;
import com.hughes.util.raf.RAFList;
import com.hughes.util.raf.RAFSerializable;
final Dictionary dict;
- public final String shortName;
+ public final String shortName; // Typically the ISO code for the language.
public final String longName;
// persisted: tells how the entries are sorted.
// Various sub-types.
// persisted
public final List<RowBase> rows;
-
public final boolean swapPairEntries;
+ // Version 2:
+ int mainTokenCount = -1;
+
// --------------------------------------------------------------------------
public Index(final Dictionary dict, final String shortName, final String longName, final Language sortLanguage, final String normalizerRules, final boolean swapPairEntries) {
if (sortLanguage == null) {
throw new IOException("Unsupported language: " + languageCode);
}
+ if (dict.dictFileVersion >= 2) {
+ mainTokenCount = raf.readInt();
+ }
sortedIndexEntries = CachingList.create(RAFList.create(raf, IndexEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE);
rows = CachingList.create(UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer()), CACHE_SIZE);
}
raf.writeUTF(sortLanguage.getIsoCode());
raf.writeUTF(normalizerRules);
raf.writeBoolean(swapPairEntries);
+ if (dict.dictFileVersion >= 2) {
+ raf.writeInt(mainTokenCount);
+ }
RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER);
UniformRAFList.write(raf, (Collection<RowBase>) rows, new RowBase.Serializer(this), 5);
}
}
public IndexEntry findInsertionPoint(String token, final AtomicBoolean interrupted) {
- final Transliterator normalizer = normalizer();
if (TransliteratorManager.init(null)) {
+ final Transliterator normalizer = normalizer();
token = normalizer.transliterate(token);
} else {
// Do our best since the Transliterators aren't up yet.
return result;
}
+ public IndexInfo getIndexInfo() {
+ return new DictionaryInfo.IndexInfo(shortName, sortedIndexEntries.size(), mainTokenCount);
+ }
+
}
\ No newline at end of file