X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryActivity.java;h=76915dfa9c48f90affb7eb896877e74d28166834;hb=83d497f704ad1f8ba85190255d46a3fbe0e3c353;hp=43c9003a123e4eb3387a68eacc7f793c9d2f4c23;hpb=f5da479c90cbcfc62279da4df6c17fb5c847f202;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 43c9003..76915df 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -39,6 +39,7 @@ import android.support.v7.widget.Toolbar; import android.text.ClipboardManager; import android.text.InputType; import android.text.Spannable; +import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.StyleSpan; @@ -229,6 +230,8 @@ public class DictionaryActivity extends ActionBarActivity { private void dictionaryOpenFail(Exception e) { Log.e(LOG, "Unable to load dictionary.", e); if (dictRaf != null) { + indexAdapter = null; + setListAdapter(null); try { dictRaf.close(); } catch (IOException e1) { @@ -709,6 +712,9 @@ public class DictionaryActivity extends ActionBarActivity { textToSpeech.shutdown(); textToSpeech = null; + indexAdapter = null; + setListAdapter(null); + try { Log.d(LOG, "Closing RAF."); dictRaf.close(); @@ -778,7 +784,8 @@ public class DictionaryActivity extends ActionBarActivity { Log.e(LOG, "TTS not available in this language: ttsResult=" + ttsResult); } } catch (Exception e) { - Toast.makeText(this, getString(R.string.TTSbroken), Toast.LENGTH_LONG).show(); + if (!isFinishing()) + Toast.makeText(this, getString(R.string.TTSbroken), Toast.LENGTH_LONG).show(); } } @@ -813,7 +820,7 @@ public class DictionaryActivity extends ActionBarActivity { final List installedDicts = application.getDictionariesOnDevice(null); - ListView listView = (ListView) dialog.findViewById(android.R.id.list); + ListView listView = dialog.findViewById(android.R.id.list); final Button button = new Button(listView.getContext()); final String name = getString(R.string.dictionaryManager); button.setText(name); @@ -968,8 +975,6 @@ public class DictionaryActivity extends ActionBarActivity { } }); - application.onCreateGlobalOptionsMenu(this, menu); - { final MenuItem dictionaryManager = menu.add(getString(R.string.dictionaryManager)); MenuItemCompat.setShowAsAction(dictionaryManager, MenuItem.SHOW_AS_ACTION_NEVER); @@ -990,7 +995,7 @@ public class DictionaryActivity extends ActionBarActivity { final Context context = getListView().getContext(); final Dialog dialog = new Dialog(context); dialog.setContentView(R.layout.about_dictionary_dialog); - final TextView textView = (TextView) dialog.findViewById(R.id.text); + final TextView textView = dialog.findViewById(R.id.text); dialog.setTitle(dictFileTitleName); @@ -1040,6 +1045,8 @@ public class DictionaryActivity extends ActionBarActivity { }); } + DictionaryApplication.onCreateGlobalOptionsMenu(this, menu); + return true; } @@ -1055,7 +1062,7 @@ public class DictionaryActivity extends ActionBarActivity { if (clickOpensContextMenu && (row instanceof HtmlEntry.Row || (row instanceof TokenRow && ((TokenRow)row).getIndexEntry().htmlEntries.size() > 0))) { final List html = row instanceof TokenRow ? ((TokenRow)row).getIndexEntry().htmlEntries : Collections.singletonList(((HtmlEntry.Row)row).getEntry()); - final String highlight = row instanceof HtmlEntry.Row ? ((HtmlEntry.Row)row).getTokenRow(true).getToken() : null; + final String highlight = row instanceof HtmlEntry.Row ? row.getTokenRow(true).getToken() : null; final MenuItem open = menu.add("Open"); open.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { @@ -1576,22 +1583,40 @@ public class DictionaryActivity extends ActionBarActivity { } } + private void addBoldSpans(String token, String col1Text, Spannable col1Spannable) { + int startPos = 0; + while ((startPos = col1Text.indexOf(token, startPos)) != -1) { + col1Spannable.setSpan(new StyleSpan(Typeface.BOLD), startPos, startPos + + token.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + startPos += token.length(); + } + } + private TableLayout getView(final int position, PairEntry.Row row, ViewGroup parent, TableLayout result) { final Context context = parent.getContext(); + final PairEntry entry = row.getEntry(); + final int rowCount = entry.pairs.size(); if (result == null) { result = new TableLayout(context); - } else { - result.removeAllViews(); + result.setStretchAllColumns(true); + // Because we have a Button inside a ListView row: + // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1 + result.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + result.setClickable(true); + result.setFocusable(false); + result.setLongClickable(true); +// result.setBackgroundResource(android.R.drawable.menuitem_background); + + result.setBackgroundResource(theme.normalRowBg); + } else if (result.getChildCount() > rowCount) { + result.removeViews(rowCount, result.getChildCount() - rowCount); } - final PairEntry entry = row.getEntry(); - final int rowCount = entry.pairs.size(); - final TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(); - layoutParams.weight = 0.5f; - layoutParams.leftMargin = mPaddingLarge; + for (int r = result.getChildCount(); r < rowCount; ++r) { + final TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT); + layoutParams.leftMargin = mPaddingLarge; - for (int r = 0; r < rowCount; ++r) { final TableRow tableRow = new TableRow(result.getContext()); final TextView col1 = new TextView(tableRow.getContext()); @@ -1600,6 +1625,8 @@ public class DictionaryActivity extends ActionBarActivity { col1.setTextIsSelectable(true); col2.setTextIsSelectable(true); } + col1.setTextColor(textColorFg); + col2.setTextColor(textColorFg); // Set the columns in the table. if (r > 0) { @@ -1617,31 +1644,6 @@ public class DictionaryActivity extends ActionBarActivity { col1.setWidth(1); col2.setWidth(1); - // Set what's in the columns. - - final Pair pair = entry.pairs.get(r); - final String col1Text = index.swapPairEntries ? pair.lang2 : pair.lang1; - final String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2; - - col1.setText(col1Text, TextView.BufferType.SPANNABLE); - col2.setText(col2Text, TextView.BufferType.SPANNABLE); - - // Bold the token instances in col1. - final Set toBold = toHighlight != null ? this.toHighlight : Collections - .singleton(row.getTokenRow(true).getToken()); - final Spannable col1Spannable = (Spannable) col1.getText(); - for (final String token : toBold) { - int startPos = 0; - while ((startPos = col1Text.indexOf(token, startPos)) != -1) { - col1Spannable.setSpan(new StyleSpan(Typeface.BOLD), startPos, startPos - + token.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - startPos += token.length(); - } - } - - createTokenLinkSpans(col1, col1Spannable, col1Text); - createTokenLinkSpans(col2, (Spannable) col2.getText(), col2Text); - col1.setTypeface(typeface); col2.setTypeface(typeface); col1.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp); @@ -1659,15 +1661,32 @@ public class DictionaryActivity extends ActionBarActivity { result.addView(tableRow); } - // Because we have a Button inside a ListView row: - // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1 - result.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); - result.setClickable(true); - result.setFocusable(false); - result.setLongClickable(true); -// result.setBackgroundResource(android.R.drawable.menuitem_background); + for (int r = 0; r < rowCount; ++r) { + final TableRow tableRow = (TableRow)result.getChildAt(r); + final TextView col1 = (TextView)tableRow.getChildAt(r == 0 ? 0 : 1); + final TextView col2 = (TextView)tableRow.getChildAt(r == 0 ? 1 : 3); + + // Set what's in the columns. + final Pair pair = entry.pairs.get(r); + final String col1Text = index.swapPairEntries ? pair.lang2 : pair.lang1; + final String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2; + final Spannable col1Spannable = new SpannableString(col1Text); + final Spannable col2Spannable = new SpannableString(col2Text); + + // Bold the token instances in col1. + if (toHighlight != null) { + for (final String token : toHighlight) { + addBoldSpans(token, col1Text, col1Spannable); + } + } else + addBoldSpans(row.getTokenRow(true).getToken(), col1Text, col1Spannable); + + createTokenLinkSpans(col1, col1Spannable, col1Text); + createTokenLinkSpans(col2, col2Spannable, col2Text); - result.setBackgroundResource(theme.normalRowBg); + col1.setText(col1Spannable); + col2.setText(col2Spannable); + } result.setOnClickListener(new TextView.OnClickListener() { @Override @@ -1694,8 +1713,6 @@ public class DictionaryActivity extends ActionBarActivity { textView.setOnLongClickListener(indexIndex > 0 ? textViewLongClickListenerIndex1 : textViewLongClickListenerIndex0); textView.setLongClickable(true); - // Doesn't work: - // textView.setTextColor(android.R.color.secondary_text_light); textView.setTypeface(typeface); if (isTokenRow) { textView.setTextAppearance(context, theme.tokenRowFg); @@ -1703,6 +1720,7 @@ public class DictionaryActivity extends ActionBarActivity { } else { textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp); } + textView.setTextColor(textColorFg); if (!htmlEntries.isEmpty()) { textView.setClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance()); @@ -1713,8 +1731,8 @@ public class DictionaryActivity extends ActionBarActivity { : theme.tokenRowOtherBg); // Make it so we can long-click on these token rows, too: - textView.setText(text, BufferType.SPANNABLE); - createTokenLinkSpans(textView, (Spannable) textView.getText(), text); + final Spannable textSpannable = new SpannableString(text); + createTokenLinkSpans(textView, textSpannable, text); if (!htmlEntries.isEmpty()) { final ClickableSpan clickableSpan = new ClickableSpan() { @@ -1722,7 +1740,7 @@ public class DictionaryActivity extends ActionBarActivity { public void onClick(View widget) { } }; - ((Spannable) textView.getText()).setSpan(clickableSpan, 0, text.length(), + textSpannable.setSpan(clickableSpan, 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); textView.setOnClickListener(new OnClickListener() { @Override @@ -1731,6 +1749,7 @@ public class DictionaryActivity extends ActionBarActivity { } }); } + textView.setText(textSpannable); return textView; } @@ -1760,7 +1779,7 @@ public class DictionaryActivity extends ActionBarActivity { textView.setMovementMethod(LinkMovementMethod.getInstance()); final Matcher matcher = CHAR_DASH.matcher(text); while (matcher.find()) { - spannable.setSpan(new NonLinkClickableSpan(textColorFg), matcher.start(), + spannable.setSpan(new NonLinkClickableSpan(), matcher.start(), matcher.end(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } @@ -1812,7 +1831,7 @@ public class DictionaryActivity extends ActionBarActivity { final Dialog dialog = new Dialog(getListView().getContext()); dialog.setContentView(R.layout.thadolina_dialog); dialog.setTitle("Ti amo, amore mio!"); - final ImageView imageView = (ImageView) dialog.findViewById(R.id.thadolina_image); + final ImageView imageView = dialog.findViewById(R.id.thadolina_image); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {