]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
UI changes, (experiments), Arabic rendering changes, changing the way
authorThad Hughes <thad.hughes@gmail.com>
Mon, 16 Jan 2012 00:07:26 +0000 (16:07 -0800)
committerThad Hughes <thad.hughes@gmail.com>
Mon, 16 Jan 2012 00:07:26 +0000 (16:07 -0800)
dictionaries are indexed (listed), new type of TokenRow (to distinguish
major from minor entries).

16 files changed:
AndroidManifest.xml
res/drawable/token_row_drawable.xml [new file with mode: 0644]
res/raw/dictionary_info.txt [new file with mode: 0644]
res/values/languages.xml [new file with mode: 0644]
res/values/strings.xml
res/values/themeLight.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/DictionaryEditActivity.java
src/com/hughes/android/dictionary/DictionaryInfo.java [moved from src/com/hughes/android/dictionary/DictionaryConfig.java with 51% similarity]
src/com/hughes/android/dictionary/DictionaryManagerActivity.java [moved from src/com/hughes/android/dictionary/DictionaryListActivity.java with 91% similarity]
src/com/hughes/android/dictionary/PreferenceActivity.java
src/com/hughes/android/dictionary/QuickDicConfig.java
src/com/hughes/android/dictionary/engine/Index.java
src/com/hughes/android/dictionary/engine/Language.java
src/com/hughes/android/dictionary/engine/RowBase.java
src/com/hughes/android/dictionary/engine/TokenRow.java

index 871f3b5f28ff59afc6d908a97d64deb476e3756b..5496c76a49b29415fd2e7352b97a4086ea45c5d8 100644 (file)
@@ -43,7 +43,7 @@
   <meta-data android:name="com.google.android.backup.api_key"
       android:value="AEdPqrEAAAAIUa0cU0ZHbBpYXJqm0vVUP5IAjr5D4iUeX7UwiQ" />
 
-  <activity android:name=".DictionaryListActivity"
+  <activity android:name=".DictionaryManagerActivity"
       android:label="@string/app_name">
 
     <intent-filter>
diff --git a/res/drawable/token_row_drawable.xml b/res/drawable/token_row_drawable.xml
new file mode 100644 (file)
index 0000000..fc581cb
--- /dev/null
@@ -0,0 +1,6 @@
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_window_focused="false" android:state_selected="true" android:drawable="@android:color/transparent" /> 
+  <item android:state_selected="true" android:drawable="@android:color/transparent" /> 
+  <item android:state_pressed="true" android:state_selected="false" android:drawable="@android:color/background_dark" /> 
+  <item android:state_selected="false" android:drawable="@android:color/background_dark" /> 
+</selector>
\ No newline at end of file
diff --git a/res/raw/dictionary_info.txt b/res/raw/dictionary_info.txt
new file mode 100644 (file)
index 0000000..9d32762
--- /dev/null
@@ -0,0 +1,62 @@
+# LANG_1       %LANG_2 FILENAME        FILESIZE        NUM_MAIN_WORDS_1        NUM_MAIN_WORDS_2        NUM_ALL_WORDS_1 NUM_ALL_WORDS_2
+DE     EN      DE-EN_chemnitz_enwiktionary.quickdic    50207808        262726  119111  262726  119111
+EN     af      EN-AF_enwiktionary.quickdic     524028  4864    2757    4864    2757
+EN     ar      EN-AR_enwiktionary.quickdic     4012835 16522   23357   16522   23357
+EN     be      EN-BE_enwiktionary.quickdic     711212  4481    5325    4481    5325
+EN     bg      EN-BG_enwiktionary.quickdic     12913407        19530   54724   19530   54724
+EN     bn      EN-BN_enwiktionary.quickdic     709473  4479    1867    4479    1867
+EN     bo      EN-BO_enwiktionary.quickdic     82371   767     424     767     424
+EN     bs      EN-BS_enwiktionary.quickdic     532886  5031    2947    5031    2947
+EN     ca      EN-CA_enwiktionary.quickdic     8983841 16662   50054   16662   50054
+EN     ci      EN-CI_enwiktionary.quickdic     749721  5884    3779    5884    3779
+EN     cs      EN-CS_enwiktionary.quickdic     5819580 24351   23142   24351   23142
+EN     da      EN-DA_enwiktionary.quickdic     5279379 17460   30597   17460   30597
+EN     el      EN-EL_enwiktionary.quickdic     12106155        24424   48789   24424   48789
+EN     eo      EN-EO_enwiktionary.quickdic     11600016        16907   100765  16907   100765
+EN     es      EN-ES_enwiktionary.quickdic     66315884        37676   240847  37676   240847
+EN     et      EN-ET_enwiktionary.quickdic     1447664 9818    7697    9818    7697
+EN     fa      EN-FA_enwiktionary.quickdic     2266032 11292   11565   11292   11565
+EN     fi      EN-FI_enwiktionary.quickdic     24362077        51150   126697  51150   126697
+EN     FR      EN-FR_enwiktionary.quickdic     37999114        44540   208469  44540   208469
+EN     ga      EN-GA_enwiktionary.quickdic     2146063 11870   8649    11870   8649
+EN     iw      EN-HE_enwiktionary.quickdic     3655803 15703   18853   15703   18853
+EN     hi      EN-HI_enwiktionary.quickdic     1578419 8494    5673    8494    5673
+EN     hr      EN-HR_enwiktionary.quickdic     11994054        21291   45181   21291   45181
+EN     hu      EN-HU_enwiktionary.quickdic     6648136 22700   36369   22700   36369
+EN     hy      EN-HY_enwiktionary.quickdic     4635747 16697   20671   16697   20671
+EN     in      EN-ID_enwiktionary.quickdic     855320  6919    4384    6919    4384
+EN     is      EN-IS_enwiktionary.quickdic     3539828 16781   16584   16781   16584
+EN     IT      EN-IT_enwiktionary.quickdic     66258996        82955   458534  82955   458534
+EN     ja      EN-JA_enwiktionary.quickdic     14160233        32116   74666   32116   74666
+EN     ko      EN-KO_enwiktionary.quickdic     3798948 18780   24154   18780   24154
+EN     ku      EN-KU_enwiktionary.quickdic     950213  5853    5266    5853    5266
+EN     la      EN-LA_enwiktionary.quickdic     97577095        22517   515727  22517   515727
+EN     lt      EN-LT_enwiktionary.quickdic     2947045 7970    18146   7970    18146
+EN     lv      EN-LV_enwiktionary.quickdic     895714  6533    4709    6533    4709
+EN     mi      EN-MI_enwiktionary.quickdic     122547  1316    637     1316    637
+EN     mn      EN-MN_enwiktionary.quickdic     299861  2238    2295    2238    2295
+EN     ms      EN-MS_enwiktionary.quickdic     664757  5026    3483    5026    3483
+EN     ne      EN-NE_enwiktionary.quickdic     55115   494     305     494     305
+EN     nl      EN-NL_enwiktionary.quickdic     12882227        32296   65344   32296   65344
+EN     no      EN-NO_enwiktionary.quickdic     3793263 16740   19398   16740   19398
+EN     pa      EN-PA_enwiktionary.quickdic     79473   721     418     721     418
+EN     pl      EN-PL_enwiktionary.quickdic     8265972 22429   42112   22429   42112
+EN     pt      EN-PT_enwiktionary.quickdic     10595199        21951   49188   21951   49188
+EN     ro      EN-RO_enwiktionary.quickdic     4100603 17827   18709   17827   18709
+EN     ru      EN-RU_enwiktionary.quickdic     13197074        37230   70018   37230   70018
+EN     sa      EN-SA_enwiktionary.quickdic     1514085 7958    3667    7958    3667
+EN     sk      EN-SK_enwiktionary.quickdic     1022589 7895    5040    7895    5040
+EN     so      EN-SO_enwiktionary.quickdic     29794   326     169     326     169
+EN     sq      EN-SQ_enwiktionary.quickdic     820891  6153    4112    6153    4112
+EN     sr      EN-SR_enwiktionary.quickdic     1363176 8002    9261    8002    9261
+EN     sv      EN-SV_enwiktionary.quickdic     15275508        26455   98329   26455   98329
+EN     sw      EN-SW_enwiktionary.quickdic     1192717 7864    3526    7864    3526
+EN     tg      EN-TG_enwiktionary.quickdic     326521  2034    1788    2034    1788
+EN     th      EN-TH_enwiktionary.quickdic     1394582 7647    8766    7647    8766
+EN     tr      EN-TR_enwiktionary.quickdic     3420079 15760   17996   15760   17996
+EN     uk      EN-UK_enwiktionary.quickdic     1332001 7512    9448    7512    9448
+EN     vi      EN-VI_enwiktionary.quickdic     1225627 9074    4767    9074    4767
+EN     ji      EN-YI_enwiktionary.quickdic     421569  2955    2807    2955    2807
+EN     zh      EN-ZH_enwiktionary.quickdic     13270167        28253   73329   28253   73329
+EN     zu      EN-ZU_enwiktionary.quickdic     41213   484     224     484     224
+EN     haw     EN-haw_enwiktionary.quickdic    228760  1791    961     1791    961
diff --git a/res/values/languages.xml b/res/values/languages.xml
new file mode 100644 (file)
index 0000000..80b2fcb
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+  <string name="AF">Afrikaans</string>
+  <string name="SQ">Albanian</string>
+  <string name="AR">Arabic</string>
+  <string name="HY">Armenian</string>
+  <string name="BE">Belarusian</string>
+  <string name="BN">Bengali</string>
+  <string name="BS">Bosnian</string>
+  <string name="BG">Bulgarian</string>
+  <string name="CA">Catalan</string>
+  <string name="HR">Croatian</string>
+  <string name="CS">Czech</string>
+  <string name="ZH">Chinese|Mandarin|Cantonese</string>
+  <string name="DA">Danish</string>
+  <string name="NL">Dutch</string>
+  <string name="EN">English</string>
+  <string name="EO">Esperanto</string>
+  <string name="ET">Estonian</string>
+  <string name="FI">Finnish</string>
+  <string name="FR">French</string>
+  <string name="DE">German</string>
+  <string name="EL">Greek</string>
+  <string name="haw">Hawaiian</string>
+  <string name="HE">Hebrew</string>
+  <string name="HI">Hindi</string>
+  <string name="HU">Hungarian</string>
+  <string name="IS">Icelandic</string>
+  <string name="ID">Indonesian</string>
+  <string name="GA">Irish</string>
+  <string name="IT">Italian</string>
+  <string name="LA">Latin</string>
+  <string name="LV">Latvian</string>
+  <string name="LT">Lithuanian</string>
+  <string name="JA">Japanese</string>
+  <string name="KO">Korean</string>
+  <string name="KU">Kurdish</string>
+  <string name="MS">Malay</string>
+  <string name="MI">Maori</string>
+  <string name="MN">Mongolian</string>
+  <string name="NE">Nepali</string>
+  <string name="NO">Norwegian</string>
+  <string name="FA">Persian</string>
+  <string name="PL">Polish</string>
+  <string name="PT">Portuguese</string>
+  <string name="PA">Punjabi</string>
+  <string name="RO">Romanian</string>
+  <string name="RU">Russian</string>
+  <string name="SA">Sanskrit</string>
+  <string name="SR">Serbian</string>
+  <string name="SK">Slovak</string>
+  <string name="SO">Somali</string>
+  <string name="ES">Spanish</string>
+  <string name="SW">Swahili</string>
+  <string name="SV">Swedish</string>
+  <string name="TG">Tajik</string>
+  <string name="TH">Thai</string>
+  <string name="BO">Tibetan</string>
+  <string name="TR">Turkish</string>
+  <string name="UK">Ukrainian</string>
+  <string name="VI">Vietnamese</string>
+  <string name="CI">Welsh</string>
+  <string name="YI">Yiddish</string>
+  <string name="ZU">Zulu</string>
+
+</resources>
\ No newline at end of file
index eded2086642cbda053c0cb10d44f10e5c138726f..3a90f6bcccbc76d2e63ccbc3e414b064f52ebd05 100644 (file)
@@ -4,16 +4,11 @@
        <string name="app_name">QuickDic</string>
  
   <!-- DictionaryListActivity -->
-  <string name="dictionaryList">Dictionary list</string>
+  <string name="dictionaryManager">Dictionary manager</string>
   <string name="selectADictionary"><![CDATA[Select a dictionary.
 \nLong-press to edit the dictionary config. Press "menu" to add a new dictionary.]]></string>
-  <string name="addDictionary">Add dictionary</string>
-  <string name="addDefaultDictionaries">Add default dictionaries</string>
-  <string name="removeAllDictionaries">Remove all dictionaries</string>
-  <string name="editDictionary">Edit dictionary config</string>
-  <string name="deleteDictionary">Delete dictionary</string>
+  <string name="dictionaryConfig">Dictionary config</string>
   <string name="moveToTop">Move to top</string>
-  <string name="newDictionary">New dictionary</string>
   <string name="notOnDevice">%s (not on device)</string>
 
   <string name="thanksForUpdatingVersion">3.0.1h</string>
index 59f3d410a550702ae4d97fcbdf28cc80910a0280..2b75000571cb506c2aabcf933f37e1e883d8b0d1 100644 (file)
@@ -9,7 +9,13 @@
   <item name="android:colorBackground">#FFFFFF</item>
 
   <item name="android:textColorPrimary">#000000</item>
+  
  -->
  
  </style>
+
+ <style name="Theme.Light.Token" parent="@style/Theme.Light">
+  <item name="android:textColor">@android:color/primary_text_dark</item>
+</style>
 </resources>
index d217c8191b1010ac7053f7e337cd47821a75882d..a3cc390e3991936423de0427d6dd5177d219606f 100644 (file)
@@ -66,6 +66,7 @@ import android.widget.Toast;
 \r
 import com.hughes.android.dictionary.engine.Dictionary;\r
 import com.hughes.android.dictionary.engine.Index;\r
+import com.hughes.android.dictionary.engine.Language;\r
 import com.hughes.android.dictionary.engine.PairEntry;\r
 import com.hughes.android.dictionary.engine.PairEntry.Pair;\r
 import com.hughes.android.dictionary.engine.RowBase;\r
@@ -116,11 +117,19 @@ public class DictionaryActivity extends ListActivity {
   \r
   public static Intent getIntent(final Context context, final int dictIndex, final int indexIndex, final String searchToken) {\r
     setDictionaryPrefs(context, dictIndex, indexIndex, searchToken);\r
-    \r
     final Intent intent = new Intent();\r
     intent.setClassName(DictionaryActivity.class.getPackage().getName(), DictionaryActivity.class.getName());\r
     return intent;\r
   }\r
+  \r
+  // TODO: Can we trigger an App restart when the preferences activity gets opened?\r
+  // TODO: fix these...\r
+\r
+  @Override\r
+  protected void onSaveInstanceState(final Bundle outState) {\r
+    super.onSaveInstanceState(outState);\r
+    setDictionaryPrefs(this, dictIndex, indexIndex, searchText.getText().toString());\r
+  }\r
 \r
   public static void setDictionaryPrefs(final Context context,\r
       final int dictIndex, final int indexIndex, final String searchToken) {\r
@@ -130,9 +139,10 @@ public class DictionaryActivity extends ListActivity {
     prefs.putString(C.SEARCH_TOKEN, searchToken);\r
     prefs.commit();\r
   }\r
-\r
+  \r
   public static void clearDictionaryPrefs(final Context context) {\r
-    final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(context).edit();\r
+    final SharedPreferences.Editor prefs = PreferenceManager\r
+        .getDefaultSharedPreferences(context).edit();\r
     prefs.remove(C.DICT_INDEX);\r
     prefs.remove(C.INDEX_INDEX);\r
     prefs.remove(C.SEARCH_TOKEN);\r
@@ -153,7 +163,7 @@ public class DictionaryActivity extends ListActivity {
       QuickDicConfig quickDicConfig = PersistentObjectCache.init(\r
           this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);\r
       dictIndex = prefs.getInt(C.DICT_INDEX, 0) ;\r
-      final DictionaryConfig dictionaryConfig = quickDicConfig.dictionaryConfigs.get(dictIndex);\r
+      final DictionaryInfo dictionaryConfig = quickDicConfig.dictionaryConfigs.get(dictIndex);\r
       this.setTitle("QuickDic: " + dictionaryConfig.name);\r
       dictRaf = new RandomAccessFile(dictionaryConfig.localFile, "r");\r
       dictionary = new Dictionary(dictRaf); \r
@@ -168,7 +178,7 @@ public class DictionaryActivity extends ListActivity {
         dictRaf = null;\r
       }\r
       Toast.makeText(this, getString(R.string.invalidDictionary, "", e.getMessage()), Toast.LENGTH_LONG);\r
-      startActivity(DictionaryEditActivity.getIntent(dictIndex));\r
+      startActivity(DictionaryManagerActivity.getIntent(this));\r
       finish();\r
       return;\r
     }\r
@@ -196,7 +206,7 @@ public class DictionaryActivity extends ListActivity {
         });\r
         \r
         for (final Index index : dictionary.indices) {\r
-          Log.d(LOG, "Starting collator load for lang=" + index.sortLanguage.getSymbol());\r
+          Log.d(LOG, "Starting collator load for lang=" + index.sortLanguage.getIsoCode());\r
           \r
           final com.ibm.icu.text.Collator c = index.sortLanguage.getCollator();          \r
           if (c.compare("pre-print", "preppy") >= 0) {\r
@@ -295,6 +305,11 @@ public class DictionaryActivity extends ListActivity {
   @Override\r
   protected void onResume() {\r
     super.onResume();\r
+    if (PreferenceActivity.prefsMightHaveChanged) {\r
+      PreferenceActivity.prefsMightHaveChanged = false;\r
+      finish();\r
+      startActivity(getIntent());\r
+    }\r
   }\r
   \r
   @Override\r
@@ -402,6 +417,7 @@ public class DictionaryActivity extends ListActivity {
       final MenuItem preferences = menu.add(getString(R.string.preferences));\r
       preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
         public boolean onMenuItemClick(final MenuItem menuItem) {\r
+          PreferenceActivity.prefsMightHaveChanged = true;\r
           startActivity(new Intent(DictionaryActivity.this,\r
               PreferenceActivity.class));\r
           return false;\r
@@ -413,7 +429,7 @@ public class DictionaryActivity extends ListActivity {
       final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryList));\r
       dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
         public boolean onMenuItemClick(final MenuItem menuItem) {\r
-          startActivity(DictionaryListActivity.getIntent(DictionaryActivity.this));\r
+          startActivity(DictionaryManagerActivity.getIntent(DictionaryActivity.this));\r
           finish();\r
           return false;\r
         }\r
@@ -545,14 +561,12 @@ public class DictionaryActivity extends ListActivity {
       return true;\r
     }\r
     if (keyCode == KeyEvent.KEYCODE_BACK) {\r
-      Log.d(LOG, "Clearing dictionary prefs.");\r
-      DictionaryActivity.clearDictionaryPrefs(this);\r
     }\r
     if (keyCode == KeyEvent.KEYCODE_ENTER) {\r
-//      Log.d(LOG, "Trying to hide soft keyboard.");\r
-//      final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
-//      manager.hideSoftInputFromWindow(searchText, InputMethodManager.SHOW_FORCED);\r
-\r
+      Log.d(LOG, "Trying to hide soft keyboard.");\r
+      final InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
+      inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);\r
+      return true;\r
     }\r
     return super.onKeyDown(keyCode, event);\r
   }\r
@@ -720,7 +734,7 @@ public class DictionaryActivity extends ListActivity {
 \r
         // TODO: color words by gender\r
         final Pair pair = entry.pairs.get(r);\r
-        final String col1Text = index.swapPairEntries ? pair.lang2 : pair.lang1;\r
+        final String col1Text = Language.fixBidiText(index.swapPairEntries ? pair.lang2 : pair.lang1);\r
         column1.setText(col1Text, TextView.BufferType.SPANNABLE);\r
         final Spannable col1Spannable = (Spannable) column1.getText();\r
         \r
@@ -732,7 +746,8 @@ public class DictionaryActivity extends ListActivity {
           startPos += token.length();\r
         }\r
 \r
-        final String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2;\r
+        String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2;\r
+        col2Text = Language.fixBidiText(col2Text);\r
         column2.setText(col2Text, TextView.BufferType.NORMAL);\r
         \r
         column1.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);\r
@@ -745,8 +760,13 @@ public class DictionaryActivity extends ListActivity {
     }\r
 \r
     private View getView(TokenRow row, ViewGroup parent) {\r
-      final TextView textView = new TextView(parent.getContext());\r
+      final Context context = parent.getContext();\r
+      final TextView textView = new TextView(context);\r
       textView.setText(row.getToken());\r
+      textView.setBackgroundResource(R.drawable.token_row_drawable);\r
+      // Doesn't work:\r
+      //textView.setTextColor(android.R.color.secondary_text_light);\r
+      textView.setTextAppearance(context, R.style.Theme_Light_Token);\r
       textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 5 * fontSizeSp / 4);\r
       return textView;\r
     }\r
index 12d3ae2e8ab44ad3b17302d16ea323fe41bd038d..7d8e1a862d422f5e6405892fa3b830f6b46652b6 100644 (file)
@@ -32,6 +32,7 @@ import android.view.MenuItem;
 import android.view.View;
 import android.view.MenuItem.OnMenuItemClickListener;
 import android.view.View.OnClickListener;
+import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -45,7 +46,7 @@ public class DictionaryEditActivity extends Activity {
   static final String LOG = "QuickDic";
 
   QuickDicConfig quickDicConfig;
-  private DictionaryConfig dictionaryConfig;
+  private DictionaryInfo dictionaryConfig;
   
   final Handler uiHandler = new Handler();
 
@@ -127,6 +128,9 @@ public class DictionaryEditActivity extends Activity {
         startActivity(intent);
       }
     });
+    
+    // Don't show the keyboard when this opens up:
+    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 
   }
   
@@ -170,7 +174,7 @@ public class DictionaryEditActivity extends Activity {
     final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryList));
     dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {
       public boolean onMenuItemClick(final MenuItem menuItem) {
-        startActivity(DictionaryListActivity.getIntent(DictionaryEditActivity.this));
+        startActivity(DictionaryManagerActivity.getIntent(DictionaryEditActivity.this));
         return false;
       }
     });
@@ -225,20 +229,11 @@ public class DictionaryEditActivity extends Activity {
   }
 
   static void startDownloadDictActivity(final Context context,
-      final DictionaryConfig dictionaryConfig) {
+      final DictionaryInfo dictionaryConfig) {
     final Intent intent = new Intent(context, DownloadActivity.class);
     intent.putExtra(DownloadActivity.SOURCE, dictionaryConfig.downloadUrl);
     intent.putExtra(DownloadActivity.DEST, dictionaryConfig.localFile + ".zip");
     context.startActivity(intent);
   }
   
-  @Override
-  public boolean onKeyDown(final int keyCode, final KeyEvent event) {
-    if (keyCode == KeyEvent.KEYCODE_BACK) {
-      Log.d(LOG, "Clearing dictionary prefs.");
-      DictionaryActivity.clearDictionaryPrefs(this);
-    }
-    return super.onKeyDown(keyCode, event);
-  }
-
 }
similarity index 51%
rename from src/com/hughes/android/dictionary/DictionaryConfig.java
rename to src/com/hughes/android/dictionary/DictionaryInfo.java
index 5dcd03d1c46d0d7bf15052dea4f36a1d22234cb9..088dcf6703ed9532d53f97254d48d1bdadb5cd15 100644 (file)
@@ -16,21 +16,32 @@ package com.hughes.android.dictionary;
 
 import java.io.Serializable;
 
-public class DictionaryConfig implements Serializable {
+public class DictionaryInfo implements Serializable {
   
-  private static final long serialVersionUID = -6850863377577700387L;
-
-  String name = "";
-  String localFile = "/sdcard/quickDic/";
-  String downloadUrl = "http://";
+  private static final long serialVersionUID = -6850863377577700388L;
   
-  int openIndex = 0;
-  String openWord = "";
+  // Stuff populated from the text file.
+  public final String[] langIsos = new String[2];
+  public String uncompressedFilename;
+  public long uncompressedSize;
+  public final int[] allTokenCounts = new int[2];
+  public final int[] mainTokenCounts = new int[2];
+
+  String name;  // Determined at runtime based on locale on device--user editable.
+  String localFile;  // Determined based on device's Environment.
+  String downloadUrl;
   
   @Override
   public String toString() {
     return name;
   }
+
+  public String toTabSeparatedString() {
+    return String.format("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d", langIsos[0],
+        langIsos[1], uncompressedFilename, uncompressedSize,
+        mainTokenCounts[0], mainTokenCounts[1], allTokenCounts[0],
+        allTokenCounts[1]);
+  }
   
   
 }
similarity index 91%
rename from src/com/hughes/android/dictionary/DictionaryListActivity.java
rename to src/com/hughes/android/dictionary/DictionaryManagerActivity.java
index 1c4015ed960120c59f086d52911fbea0fc30b57e..b1d2398f3af8ccdf587b64580a98df50674131ce 100644 (file)
@@ -44,7 +44,7 @@ import android.widget.AdapterView.OnItemClickListener;
 
 import com.hughes.android.util.PersistentObjectCache;
 
-public class DictionaryListActivity extends ListActivity {
+public class DictionaryManagerActivity extends ListActivity {
 
   static final String LOG = "QuickDic";
   
@@ -104,6 +104,12 @@ public class DictionaryListActivity extends ListActivity {
   protected void onResume() {
     super.onResume();
     
+    if (PreferenceActivity.prefsMightHaveChanged) {
+      PreferenceActivity.prefsMightHaveChanged = false;
+      finish();
+      startActivity(getIntent());
+    }
+    
     final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
     if (prefs.contains(C.DICT_INDEX) && prefs.contains(C.INDEX_INDEX)) {
       Log.d(LOG, "Skipping Dictionary List, going straight to dictionary.");
@@ -122,7 +128,7 @@ public class DictionaryListActivity extends ListActivity {
       
       // Replace <-> with -
       if (quickDicConfig.currentVersion < 5) {
-        for (final DictionaryConfig config : quickDicConfig.dictionaryConfigs) {
+        for (final DictionaryInfo config : quickDicConfig.dictionaryConfigs) {
           config.name = config.name.replace("<->", "-");
         }
       }
@@ -140,7 +146,7 @@ public class DictionaryListActivity extends ListActivity {
     final MenuItem newDictionaryMenuItem = menu.add(R.string.addDictionary);
     newDictionaryMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
           public boolean onMenuItemClick(final MenuItem menuItem) {
-            final DictionaryConfig dictionaryConfig = new DictionaryConfig();
+            final DictionaryInfo dictionaryConfig = new DictionaryInfo();
             dictionaryConfig.name = getString(R.string.newDictionary);
             quickDicConfig.dictionaryConfigs.add(0, dictionaryConfig);
             dictionaryConfigsChanged();
@@ -179,7 +185,8 @@ public class DictionaryListActivity extends ListActivity {
     final MenuItem preferences = menu.add(getString(R.string.preferences));
     preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {
       public boolean onMenuItemClick(final MenuItem menuItem) {
-        startActivity(new Intent(DictionaryListActivity.this,
+        PreferenceActivity.prefsMightHaveChanged = true;
+        startActivity(new Intent(DictionaryManagerActivity.this,
             PreferenceActivity.class));
         return false;
       }
@@ -210,7 +217,7 @@ public class DictionaryListActivity extends ListActivity {
       moveToTopMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
         @Override
         public boolean onMenuItemClick(MenuItem item) {
-          final DictionaryConfig dictionaryConfig = quickDicConfig.dictionaryConfigs.remove(adapterContextMenuInfo.position);
+          final DictionaryInfo dictionaryConfig = quickDicConfig.dictionaryConfigs.remove(adapterContextMenuInfo.position);
           quickDicConfig.dictionaryConfigs.add(0, dictionaryConfig);
           dictionaryConfigsChanged();
           return true;
@@ -243,7 +250,7 @@ public class DictionaryListActivity extends ListActivity {
     }
 
     @Override
-    public DictionaryConfig getItem(int position) {
+    public DictionaryInfo getItem(int position) {
       return quickDicConfig.dictionaryConfigs.get(position);
     }
 
@@ -254,7 +261,7 @@ public class DictionaryListActivity extends ListActivity {
     
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
-      final DictionaryConfig dictionaryConfig = getItem(position);
+      final DictionaryInfo dictionaryConfig = getItem(position);
       final TableLayout tableLayout = new TableLayout(parent.getContext());
       final TextView view = new TextView(parent.getContext());
       
@@ -275,8 +282,8 @@ public class DictionaryListActivity extends ListActivity {
   public static Intent getIntent(final Context context) {
     DictionaryActivity.clearDictionaryPrefs(context);
     final Intent intent = new Intent();
-    intent.setClassName(DictionaryListActivity.class.getPackage().getName(),
-        DictionaryListActivity.class.getName());
+    intent.setClassName(DictionaryManagerActivity.class.getPackage().getName(),
+        DictionaryManagerActivity.class.getName());
     return intent;
   }
 
index 858be19958ee79a521b197b54310d1ccb9a499a0..2ac21188ec4e8c89a4fd3b15c12218415e71921b 100644 (file)
@@ -17,6 +17,9 @@ package com.hughes.android.dictionary;
 import android.os.Bundle;\r
 \r
 public class PreferenceActivity extends android.preference.PreferenceActivity {\r
+  \r
+  static boolean prefsMightHaveChanged = false;\r
+  \r
   @Override\r
   public void onCreate(Bundle savedInstanceState) {\r
     ((DictionaryApplication)getApplication()).applyTheme(this);\r
index 1923ccc66d5525c9c1ad9ebf6c66acbee827e223..414ae2ddf88667f04b5ce57f9be8c20965ccf40f 100644 (file)
@@ -18,6 +18,8 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
+import android.os.Environment;
+
 import com.hughes.android.dictionary.engine.Language;
 
 public final class QuickDicConfig implements Serializable {
@@ -27,7 +29,7 @@ public final class QuickDicConfig implements Serializable {
   // Just increment this to have them all update...
   static final int LATEST_VERSION = 6;
   
-  final List<DictionaryConfig> dictionaryConfigs = new ArrayList<DictionaryConfig>();
+  final List<DictionaryInfo> dictionaryConfigs = new ArrayList<DictionaryInfo>();
   int currentVersion = LATEST_VERSION;
   
   public QuickDicConfig() {
@@ -35,30 +37,31 @@ public final class QuickDicConfig implements Serializable {
   }
   
   static final String BASE_URL = "http://quickdic-dictionary.googlecode.com/files/";
-  static final String VERSION_SUFFIX = "v002";
 
+  // TODO: read this from a resource file....
+  
   public void addDefaultDictionaries() {
     {
-      final DictionaryConfig config = new DictionaryConfig();
+      final DictionaryInfo config = new DictionaryInfo();
       config.name = "German-English";
       config.downloadUrl = String.format("%sDE-EN_chemnitz_enwiktionary.quickdic.%s.zip", BASE_URL, VERSION_SUFFIX);
-      config.localFile = "/sdcard/quickDic/DE-EN_chemnitz_enwiktionary.quickdic";
+      config.localFile = String.format("%s/quickDic/DE-EN_chemnitz_enwiktionary.quickdic", Environment.getExternalStorageDirectory());
       addOrReplace(config);
     }
     
-    for (final String iso : Language.isoCodeToWikiName.keySet()) {
+    for (final String iso : Language.isoCodeToResourceName.keySet()) {
       if (iso.equals("EN") || iso.equals("DE")) {
         continue;
       }
-      final DictionaryConfig config = new DictionaryConfig();
+      final DictionaryInfo config = new DictionaryInfo();
       config.name = String.format("English-%s", Language.isoCodeToWikiName.get(iso));
       config.downloadUrl = String.format("%sEN-%s_enwiktionary.quickdic.%s.zip", BASE_URL, iso, VERSION_SUFFIX);
-      config.localFile = String.format("/sdcard/quickDic/EN-%s_enwiktionary.quickdic", iso);
+      config.localFile = String.format("%s/quickDic/EN-%s_enwiktionary.quickdic", Environment.getExternalStorageDirectory(), iso);
       addOrReplace(config);
     }
   }
 
-  private void addOrReplace(final DictionaryConfig dictionaryConfig) {
+  private void addOrReplace(final DictionaryInfo dictionaryConfig) {
     for (int i = 0; i < dictionaryConfigs.size(); ++i) {
       if (dictionaryConfigs.get(i).name.equals(dictionaryConfig.name)) {
         dictionaryConfigs.set(i, dictionaryConfig);
index 8e9ca9628ac70db5e002b0d4df751520e0e5bb48..39fcab5d84e59ae5f3ed27f6bccd2019677bd9d1 100644 (file)
@@ -100,7 +100,7 @@ public final class Index implements RAFSerializable<Index> {
   public void write(final RandomAccessFile raf) throws IOException {
     raf.writeUTF(shortName);
     raf.writeUTF(longName);
-    raf.writeUTF(sortLanguage.getSymbol());
+    raf.writeUTF(sortLanguage.getIsoCode());
     raf.writeUTF(normalizerRules);
     raf.writeBoolean(swapPairEntries);
     RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER);
@@ -205,52 +205,7 @@ public final class Index implements RAFSerializable<Index> {
     result = windBackCase(sortedIndexEntries.get(result).normalizedToken(), result, interrupted);
     return sortedIndexEntries.get(result);
   }
-  
-  public static final class SearchResult {
-    public final IndexEntry insertionPoint;
-    public final IndexEntry longestPrefix;
-    public final String longestPrefixString;
-    public final boolean success;
-    
-    public SearchResult(IndexEntry insertionPoint, IndexEntry longestPrefix,
-        String longestPrefixString, boolean success) {
-      this.insertionPoint = insertionPoint;
-      this.longestPrefix = longestPrefix;
-      this.longestPrefixString = longestPrefixString;
-      this.success = success;
-    }
     
-    @Override
-    public String toString() {
-      return String.format("inerstionPoint=%s,longestPrefix=%s,longestPrefixString=%s,success=%b", insertionPoint.toString(), longestPrefix.toString(), longestPrefixString, success);
-    }
-  }
-  
-//  public SearchResult findLongestSubstring(String token, final AtomicBoolean interrupted) {
-//    token = normalizer.transliterate(token);
-//    if (token.length() == 0) {
-//      return new SearchResult(sortedIndexEntries.get(0), sortedIndexEntries.get(0), "", true);
-//    }
-//    IndexEntry insertionPoint = null;
-//    IndexEntry result = null;
-//    boolean unmodified = true;
-//    while (!interrupted.get() && token.length() > 0) {
-//      result = findInsertionPoint(token, interrupted);
-//      if (result == null) {
-//        return null;
-//      }
-//      if (unmodified) {
-//        insertionPoint = result;
-//      }
-//      if (result.normalizedToken(normalizer).startsWith(token)) {
-//        return new SearchResult(insertionPoint, result, token, unmodified);
-//      }
-//      unmodified = false;
-//      token = token.substring(0, token.length() - 1);      
-//    }
-//    return new SearchResult(insertionPoint, sortedIndexEntries.get(0), "", false);
-//  }
-  
   private final int windBackCase(final String token, int result, final AtomicBoolean interrupted) {
     while (result > 0 && sortedIndexEntries.get(result - 1).normalizedToken().equals(token)) {
       --result;
@@ -261,19 +216,4 @@ public final class Index implements RAFSerializable<Index> {
     return result;
   }
 
-  /*
-  public int tokenRowBinarySearch(final int rowIndex) {
-    int start = 0;
-    int end = sortedIndexEntries.size();
-    while (start < end) {
-      final int mid = (start + end) / 2;
-      final int midRowIndex = sortedIndexEntries.get(mid).startRow;
-      if (midRowIndex == rowIndex) {
-        return mid;
-      }
-      if ()
-    }
-  }
-  */
-
 }
\ No newline at end of file
index 84a625a569dbf7766b4f0da98332755ac10d7fe9..fcf74f1e97bc1564cd660936bd01674c596b78b9 100644 (file)
@@ -17,89 +17,92 @@ package com.hughes.android.dictionary.engine;
 import java.util.LinkedHashMap;\r
 import java.util.Locale;\r
 import java.util.Map;\r
+import java.util.regex.Pattern;\r
 \r
+import com.hughes.android.dictionary.R;\r
 import com.ibm.icu.text.Collator;\r
 \r
 public class Language {\r
 \r
-  public static final Map<String,String> isoCodeToWikiName = new LinkedHashMap<String,String>();\r
+  public static final Map<String,Integer> isoCodeToResourceId = new LinkedHashMap<String,Integer>();\r
   static {\r
-    isoCodeToWikiName.put("AF", "Afrikaans");\r
-    isoCodeToWikiName.put("SQ", "Albanian");\r
-    isoCodeToWikiName.put("AR", "Arabic");\r
-    isoCodeToWikiName.put("HY", "Armenian");\r
-    isoCodeToWikiName.put("BE", "Belarusian");\r
-    isoCodeToWikiName.put("BN", "Bengali");\r
-    isoCodeToWikiName.put("BS", "Bosnian");\r
-    isoCodeToWikiName.put("BG", "Bulgarian");\r
-    isoCodeToWikiName.put("CA", "Catalan");\r
-    isoCodeToWikiName.put("HR", "Croatian");\r
-    isoCodeToWikiName.put("CS", "Czech");\r
-    isoCodeToWikiName.put("ZH", "Chinese|Mandarin|Cantonese");\r
-    isoCodeToWikiName.put("DA", "Danish");\r
-    isoCodeToWikiName.put("NL", "Dutch");\r
-    isoCodeToWikiName.put("EN", "English");\r
-    isoCodeToWikiName.put("EO", "Esperanto");\r
-    isoCodeToWikiName.put("ET", "Estonian");\r
-    isoCodeToWikiName.put("FI", "Finnish");\r
-    isoCodeToWikiName.put("FR", "French");\r
-    isoCodeToWikiName.put("DE", "German");\r
-    isoCodeToWikiName.put("EL", "Greek");\r
-    isoCodeToWikiName.put("haw", "Hawaiian");\r
-    isoCodeToWikiName.put("HE", "Hebrew");\r
-    isoCodeToWikiName.put("HI", "Hindi");\r
-    isoCodeToWikiName.put("HU", "Hungarian");\r
-    isoCodeToWikiName.put("IS", "Icelandic");\r
-    isoCodeToWikiName.put("ID", "Indonesian");\r
-    isoCodeToWikiName.put("GA", "Irish");\r
-    isoCodeToWikiName.put("IT", "Italian");\r
-    isoCodeToWikiName.put("LA", "Latin");\r
-    isoCodeToWikiName.put("LV", "Latvian");\r
-    isoCodeToWikiName.put("LT", "Lithuanian");\r
-    isoCodeToWikiName.put("JA", "Japanese");\r
-    isoCodeToWikiName.put("KO", "Korean");\r
-    isoCodeToWikiName.put("KU", "Kurdish");\r
-    isoCodeToWikiName.put("MS", "Malay");\r
-    isoCodeToWikiName.put("MI", "Maori");\r
-    isoCodeToWikiName.put("MN", "Mongolian");\r
-    isoCodeToWikiName.put("NE", "Nepali");\r
-    isoCodeToWikiName.put("NO", "Norwegian");\r
-    isoCodeToWikiName.put("FA", "Persian");\r
-    isoCodeToWikiName.put("PL", "Polish");\r
-    isoCodeToWikiName.put("PT", "Portuguese");\r
-    isoCodeToWikiName.put("PA", "Punjabi");\r
-    isoCodeToWikiName.put("RO", "Romanian");\r
-    isoCodeToWikiName.put("RU", "Russian");\r
-    isoCodeToWikiName.put("SA", "Sanskrit");\r
-    isoCodeToWikiName.put("SR", "Serbian");\r
-    isoCodeToWikiName.put("SK", "Slovak");\r
-    isoCodeToWikiName.put("SO", "Somali");\r
-    isoCodeToWikiName.put("ES", "Spanish");\r
-    isoCodeToWikiName.put("SW", "Swahili");\r
-    isoCodeToWikiName.put("SV", "Swedish");\r
-    isoCodeToWikiName.put("TG", "Tajik");\r
-    isoCodeToWikiName.put("TH", "Thai");\r
-    isoCodeToWikiName.put("BO", "Tibetan");\r
-    isoCodeToWikiName.put("TR", "Turkish");\r
-    isoCodeToWikiName.put("UK", "Ukrainian");\r
-    isoCodeToWikiName.put("VI", "Vietnamese");\r
-    isoCodeToWikiName.put("CI", "Welsh");\r
-    isoCodeToWikiName.put("YI", "Yiddish");\r
-    isoCodeToWikiName.put("ZU", "Zulu");\r
+    isoCodeToResourceId.put("AF", R.string.AF);\r
+    isoCodeToResourceId.put("SQ", R.string.SQ);\r
+    isoCodeToResourceId.put("AR", R.string.AR);\r
+    isoCodeToResourceId.put("HY", R.string.HY);\r
+    isoCodeToResourceId.put("BE", R.string.BE);\r
+    isoCodeToResourceId.put("BN", R.string.BN);\r
+    isoCodeToResourceId.put("BS", R.string.BS);\r
+    isoCodeToResourceId.put("BG", R.string.BG);\r
+    isoCodeToResourceId.put("CA", R.string.CA);\r
+    isoCodeToResourceId.put("HR", R.string.HR);\r
+    isoCodeToResourceId.put("CS", R.string.CS);\r
+    isoCodeToResourceId.put("ZH", R.string.ZH);\r
+    isoCodeToResourceId.put("DA", R.string.DA);\r
+    isoCodeToResourceId.put("NL", R.string.NL);\r
+    isoCodeToResourceId.put("EN", R.string.EN);\r
+    isoCodeToResourceId.put("EO", R.string.EO);\r
+    isoCodeToResourceId.put("ET", R.string.ET);\r
+    isoCodeToResourceId.put("FI", R.string.FI);\r
+    isoCodeToResourceId.put("FR", R.string.FR);\r
+    isoCodeToResourceId.put("DE", R.string.DE);\r
+    isoCodeToResourceId.put("EL", R.string.EL);\r
+    isoCodeToResourceId.put("haw", R.string.haw);\r
+    isoCodeToResourceId.put("HE", R.string.HE);\r
+    isoCodeToResourceId.put("HI", R.string.HI);\r
+    isoCodeToResourceId.put("HU", R.string.HU);\r
+    isoCodeToResourceId.put("IS", R.string.IS);\r
+    isoCodeToResourceId.put("ID", R.string.ID);\r
+    isoCodeToResourceId.put("GA", R.string.GA);\r
+    isoCodeToResourceId.put("IT", R.string.IT);\r
+    isoCodeToResourceId.put("LA", R.string.LA);\r
+    isoCodeToResourceId.put("LV", R.string.LV);\r
+    isoCodeToResourceId.put("LT", R.string.LT);\r
+    isoCodeToResourceId.put("JA", R.string.JA);\r
+    isoCodeToResourceId.put("KO", R.string.KO);\r
+    isoCodeToResourceId.put("KU", R.string.KU);\r
+    isoCodeToResourceId.put("MS", R.string.MS);\r
+    isoCodeToResourceId.put("MI", R.string.MI);\r
+    isoCodeToResourceId.put("MN", R.string.MN);\r
+    isoCodeToResourceId.put("NE", R.string.NE);\r
+    isoCodeToResourceId.put("NO", R.string.NO);\r
+    isoCodeToResourceId.put("FA", R.string.FA);\r
+    isoCodeToResourceId.put("PL", R.string.PL);\r
+    isoCodeToResourceId.put("PT", R.string.PT);\r
+    isoCodeToResourceId.put("PA", R.string.PA);\r
+    isoCodeToResourceId.put("RO", R.string.RO);\r
+    isoCodeToResourceId.put("RU", R.string.RU);\r
+    isoCodeToResourceId.put("SA", R.string.SA);\r
+    isoCodeToResourceId.put("SR", R.string.SR);\r
+    isoCodeToResourceId.put("SK", R.string.SK);\r
+    isoCodeToResourceId.put("SO", R.string.SO);\r
+    isoCodeToResourceId.put("ES", R.string.ES);\r
+    isoCodeToResourceId.put("SW", R.string.SW);\r
+    isoCodeToResourceId.put("SV", R.string.SV);\r
+    isoCodeToResourceId.put("TG", R.string.TG);\r
+    isoCodeToResourceId.put("TH", R.string.TH);\r
+    isoCodeToResourceId.put("BO", R.string.BO);\r
+    isoCodeToResourceId.put("TR", R.string.TR);\r
+    isoCodeToResourceId.put("UK", R.string.UK);\r
+    isoCodeToResourceId.put("VI", R.string.VI);\r
+    isoCodeToResourceId.put("CI", R.string.CI);\r
+    isoCodeToResourceId.put("YI", R.string.YI);\r
+    isoCodeToResourceId.put("ZU", R.string.ZU);\r
   }\r
 \r
-  static final Map<String, Language> symbolToLangauge = new LinkedHashMap<String, Language>();\r
 \r
-  final String symbol;\r
+  private static final Map<String, Language> registry = new LinkedHashMap<String, Language>();\r
+\r
+  final String isoCode;\r
   final Locale locale;\r
   \r
   private Collator collator;\r
 \r
-  public Language(final Locale locale) {\r
-    this.symbol = locale.getLanguage();\r
+  private Language(final Locale locale, final String isoCode) {\r
     this.locale = locale;\r
+    this.isoCode = isoCode;\r
 \r
-    symbolToLangauge.put(symbol.toLowerCase(), this);\r
+    registry.put(isoCode.toLowerCase(), this);\r
   }\r
 \r
   @Override\r
@@ -107,8 +110,8 @@ public class Language {
     return locale.toString();\r
   }\r
   \r
-  public String getSymbol() {\r
-    return symbol;\r
+  public String getIsoCode() {\r
+    return isoCode;\r
   }\r
   \r
   public synchronized Collator getCollator() {\r
@@ -122,13 +125,27 @@ public class Language {
   public String getDefaultNormalizerRules() {\r
     return ":: Any-Latin; ' ' > ; :: Lower; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC ;";\r
   }\r
+  \r
+  /**\r
+   * A practical pattern to identify strong RTL characters. This pattern is not\r
+   * completely correct according to the Unicode standard. It is simplified for\r
+   * performance and small code size.\r
+   */\r
+  private static final String rtlChars =\r
+      "\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC";\r
+  private static final Pattern RTL_TOKEN = Pattern.compile("[" + rtlChars + "]+");\r
+  \r
+  public static String fixBidiText(final String text) {\r
+    return RTL_TOKEN.matcher(text).replaceAll("\u200e $0 \u200e");\r
+  }\r
+  \r
   // ----------------------------------------------------------------\r
 \r
-  public static final Language en = new Language(Locale.ENGLISH);\r
-  public static final Language fr = new Language(Locale.FRENCH);\r
-  public static final Language it = new Language(Locale.ITALIAN);\r
+  public static final Language en = new Language(Locale.ENGLISH, "EN");\r
+  public static final Language fr = new Language(Locale.FRENCH, "FR");\r
+  public static final Language it = new Language(Locale.ITALIAN, "IT");\r
 \r
-  public static final Language de = new Language(Locale.GERMAN) {\r
+  public static final Language de = new Language(Locale.GERMAN, "DE") {\r
     @Override\r
     public String getDefaultNormalizerRules() {\r
       return ":: Lower; 'ae' > 'ä'; 'oe' > 'ö'; 'ue' > 'ü'; 'ß' > 'ss'; ";\r
@@ -137,10 +154,10 @@ public class Language {
   \r
   // ----------------------------------------------------------------\r
 \r
-  public static synchronized Language lookup(final String symbol) {\r
-    Language lang = symbolToLangauge.get(symbol.toLowerCase());\r
+  public static synchronized Language lookup(final String isoCode) {\r
+    Language lang = registry.get(isoCode.toLowerCase());\r
     if (lang == null) {\r
-      lang = new Language(new Locale(symbol));\r
+      lang = new Language(new Locale(isoCode), isoCode);\r
     }\r
     return lang;\r
   }\r
index 09141746c29cc254c547e7c742a2175cfb4800af..569fc000a0094007bfdd6a4500d17abcfb82fdca 100644 (file)
@@ -113,8 +113,8 @@ public abstract class RowBase extends IndexedObject {
       final byte rowType = raf.readByte();
       if (rowType == 0) {
         return new PairEntry.Row(raf, listIndex, index);
-      } else if (rowType == 1) {
-        return new TokenRow(raf, listIndex, index);
+      } else if (rowType == 1 || rowType == 3) {
+        return new TokenRow(raf, listIndex, index, rowType == 1);
       } else if (rowType == 2) {
         return new TextEntry.Row(raf, listIndex, index);
       }
@@ -126,7 +126,8 @@ public abstract class RowBase extends IndexedObject {
       if (t instanceof PairEntry.Row) {
         raf.writeByte(0);
       } else if (t instanceof TokenRow) {
-        raf.writeByte(1);
+        final TokenRow tokenRow = (TokenRow) t;
+        raf.writeByte(tokenRow.hasMainEntry ? 1 : 3);
       } else if (t instanceof TextEntry.Row) {
         raf.writeByte(2);
       }
index 247436b781108b632283fda7b2a5a98e80f5f736..8579761722aa6a4c6240e856234c0a1485b7d639 100644 (file)
@@ -20,12 +20,16 @@ import java.io.RandomAccessFile;
 
 public class TokenRow extends RowBase {
   
-  TokenRow(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException {
+  final boolean hasMainEntry;
+  
+  TokenRow(final RandomAccessFile raf, final int thisRowIndex, final Index index, final boolean hasMainEntry) throws IOException {
     super(raf, thisRowIndex, index);
+    this.hasMainEntry = hasMainEntry;
   }
 
-  TokenRow(final int referenceIndex, final int thisRowIndex, final Index index) {
+  TokenRow(final int referenceIndex, final int thisRowIndex, final Index index, final boolean hasMainEntry) {
     super(referenceIndex, thisRowIndex, index);
+    this.hasMainEntry = hasMainEntry;
   }
   
   public String toString() {