]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Fixed themes, fixing DictionaryInfo, DictionaryVersion 2. Better
authorThad Hughes <thad.hughes@gmail.com>
Tue, 17 Jan 2012 20:58:42 +0000 (12:58 -0800)
committerThad Hughes <thad.hughes@gmail.com>
Tue, 17 Jan 2012 20:58:42 +0000 (12:58 -0800)
dictionary switching (just started).

res/layout/select_dictionary_dialog.xml [new file with mode: 0644]
res/values/themes.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/DictionaryInfo.java
src/com/hughes/android/dictionary/QuickDicConfig.java
src/com/hughes/android/dictionary/engine/Dictionary.java
src/com/hughes/android/dictionary/engine/Index.java

diff --git a/res/layout/select_dictionary_dialog.xml b/res/layout/select_dictionary_dialog.xml
new file mode 100644 (file)
index 0000000..54fe608
--- /dev/null
@@ -0,0 +1,18 @@
+<?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>
index 5ac84e691a0ce03f4d63dec797a5c954a586a19a..9963d6ae2c325cddb9fad71dce1a53f907f0d94c 100644 (file)
@@ -7,7 +7,7 @@
       <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>
   
index 4d8d6ed2f853718fea3fce55ce0976a4e2d4e63a..cb814f772272ad88c9e2bed400c837e7ce1b6380 100644 (file)
@@ -20,7 +20,9 @@ import java.io.IOException;
 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
@@ -28,6 +30,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 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
@@ -62,6 +66,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
 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
@@ -82,7 +87,7 @@ public class DictionaryActivity extends ListActivity {
 \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
@@ -258,6 +263,13 @@ public class DictionaryActivity extends ListActivity {
         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
@@ -368,7 +380,7 @@ public class DictionaryActivity extends ListActivity {
   }\r
   \r
   void updateLangButton() {\r
-    langButton.setText(index.shortName.toUpperCase());\r
+    langButton.setText(index.shortName);\r
   }\r
 \r
   void onLanguageButton() {\r
@@ -380,6 +392,72 @@ public class DictionaryActivity extends ListActivity {
     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
index 46aafead0216c9c1f9e4de2cab458280dcf8d46a..e965994a2251e3f294b09d294603896ea890a23c 100644 (file)
 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() {
index ac32748545d487e703fb268bfc11da98a40816b1..4574107f57a8ca3f3778365257e3c1c745f5c58b 100644 (file)
@@ -61,9 +61,9 @@ public final class QuickDicConfig implements Serializable {
         }
         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 += "-";
           }
index c6629989d77bf7b72ea9cf85e7194a61b7e80f68..b00868ecb8c1d43c95626ccbc4c31b70fdf88ad6 100644 (file)
@@ -20,6 +20,7 @@ import java.io.RandomAccessFile;
 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;
@@ -30,6 +31,7 @@ public class Dictionary implements RAFSerializable<Dictionary> {
   
   static final int CACHE_SIZE = 5000;
   
+  static final int CURRENT_DICT_VERSION = 2;
   static final String END_OF_DICTIONARY = "END OF DICTIONARY";
   
   // persisted
@@ -43,12 +45,14 @@ public class Dictionary implements RAFSerializable<Dictionary> {
   
   /**
    * 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>();
@@ -59,7 +63,7 @@ public class Dictionary implements RAFSerializable<Dictionary> {
 
   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();
@@ -110,5 +114,15 @@ public class Dictionary implements RAFSerializable<Dictionary> {
       }
     }
 
+    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
index 39fcab5d84e59ae5f3ed27f6bccd2019677bd9d1..19e0ecc8ed63d8285710596482950a26af45655d 100644 (file)
@@ -25,6 +25,8 @@ import java.util.Collection;
 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;
@@ -39,7 +41,7 @@ public final class Index implements RAFSerializable<Index> {
   
   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.
@@ -56,9 +58,11 @@ public final class Index implements RAFSerializable<Index> {
   // 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) {
@@ -92,6 +96,9 @@ public final class Index implements RAFSerializable<Index> {
     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);
   }
@@ -103,6 +110,9 @@ public final class Index implements RAFSerializable<Index> {
     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);
   }
@@ -168,8 +178,8 @@ public final class Index implements RAFSerializable<Index> {
   }
   
   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.
@@ -216,4 +226,8 @@ public final class Index implements RAFSerializable<Index> {
     return result;
   }
 
+  public IndexInfo getIndexInfo() {
+    return new DictionaryInfo.IndexInfo(shortName, sortedIndexEntries.size(), mainTokenCount);
+  }
+
 }
\ No newline at end of file