X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryActivity.java;h=6e4bb9106cf6b4ae014a55c109edc83af6cfd1b8;hb=c625416a33f9da39bb8ec6a2c9a67a7d47e477d8;hp=991e87b9a88e9d0f06e89fa3c93bec70014e2f45;hpb=25ea6e908f9d0d78bf6ad789aa2ecc66700e2087;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 991e87b..6e4bb91 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -14,34 +14,10 @@ package com.hughes.android.dictionary; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.RandomAccessFile; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Locale; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import android.app.AlertDialog; +import android.annotation.SuppressLint; import android.app.Dialog; -import android.app.ListActivity; import android.app.SearchManager; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; @@ -53,10 +29,7 @@ import android.preference.PreferenceManager; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.text.ClipboardManager; -import android.text.Editable; -import android.text.Selection; import android.text.Spannable; -import android.text.TextWatcher; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.StyleSpan; @@ -65,22 +38,18 @@ import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.BaseAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageButton; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; @@ -91,12 +60,21 @@ import android.widget.TextView; import android.widget.TextView.BufferType; import android.widget.Toast; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.SherlockListActivity; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener; +import com.actionbarsherlock.widget.SearchView; +import com.actionbarsherlock.widget.SearchView.OnQueryTextListener; import com.hughes.android.dictionary.DictionaryInfo.IndexInfo; import com.hughes.android.dictionary.engine.Dictionary; import com.hughes.android.dictionary.engine.EntrySource; import com.hughes.android.dictionary.engine.HtmlEntry; import com.hughes.android.dictionary.engine.Index; import com.hughes.android.dictionary.engine.Index.IndexEntry; +import com.hughes.android.dictionary.engine.Language; +import com.hughes.android.dictionary.engine.Language.LanguageResources; import com.hughes.android.dictionary.engine.PairEntry; import com.hughes.android.dictionary.engine.PairEntry.Pair; import com.hughes.android.dictionary.engine.RowBase; @@ -106,14 +84,35 @@ import com.hughes.android.util.IntentLauncher; import com.hughes.android.util.NonLinkClickableSpan; import com.hughes.util.StringUtil; -public class DictionaryActivity extends ListActivity { +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.RandomAccessFile; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DictionaryActivity extends SherlockListActivity { static final String LOG = "QuickDic"; DictionaryApplication application; File dictFile = null; - RandomAccessFile dictRaf = null; Dictionary dictionary = null; @@ -124,15 +123,8 @@ public class DictionaryActivity extends ListActivity { List rowsToShow = null; // if not null, just show these rows. - // package for test. final Handler uiHandler = new Handler(); - - TextToSpeech textToSpeech; - volatile boolean ttsReady; - - int textColorFg = Color.BLACK; - private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { @@ -142,28 +134,29 @@ public class DictionaryActivity extends ListActivity { private SearchOperation currentSearchOperation = null; - C.Theme theme = C.Theme.LIGHT; - Typeface typeface; + TextToSpeech textToSpeech; + volatile boolean ttsReady; + Typeface typeface; + C.Theme theme = C.Theme.LIGHT; + int textColorFg = Color.BLACK; int fontSizeSp; - EditText searchText; + SearchView searchView; + ImageView searchHintIcon; + SearchView.OnQueryTextListener onQueryTextListener; - Button langButton; + MenuItem nextWordMenuItem, previousWordMenuItem; // Never null. private File wordList = null; - private boolean saveOnlyFirstSubentry = false; - private boolean clickOpensContextMenu = false; // Visible for testing. ListAdapter indexAdapter = null; - final SearchTextWatcher searchTextWatcher = new SearchTextWatcher(); - /** * For some languages, loading the transliterators used in this search takes * a long time, so we fire it up on a different thread, and don't invoke it @@ -187,10 +180,10 @@ public class DictionaryActivity extends ListActivity { @Override protected void onSaveInstanceState(final Bundle outState) { - super.onSaveInstanceState(outState); - Log.d(LOG, "onSaveInstanceState: " + searchText.getText().toString()); + super.onSaveInstanceState(outState); + Log.d(LOG, "onSaveInstanceState: " + searchView.getQuery().toString()); outState.putInt(C.INDEX_INDEX, indexIndex); - outState.putString(C.SEARCH_TOKEN, searchText.getText().toString()); + outState.putString(C.SEARCH_TOKEN, searchView.getQuery().toString()); } @Override @@ -202,15 +195,16 @@ public class DictionaryActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { + Log.d(LOG, "onCreate:" + this); + super.onCreate(savedInstanceState); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - prefs.edit().remove(C.INDEX_INDEX).commit(); // Don't auto-launch if - // this fails. + + // Don't auto-launch if this fails. + prefs.edit().remove(C.INDEX_INDEX).commit(); setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId); - Log.d(LOG, "onCreate:" + this); - super.onCreate(savedInstanceState); - application = (DictionaryApplication) getApplication(); theme = application.getSelectedTheme(); textColorFg = getResources().getColor(theme.tokenRowFgColor); @@ -354,7 +348,7 @@ public class DictionaryActivity extends ListActivity { uiHandler.post(new Runnable() { @Override public void run() { - onSearchTextChange(searchText.getText().toString()); + onSearchTextChange(searchView.getQuery().toString()); } }); } @@ -388,10 +382,6 @@ public class DictionaryActivity extends ListActivity { Toast.LENGTH_LONG).show(); } } - // if (!"SYSTEM".equals(fontName)) { - // throw new RuntimeException("Test force using system font: " + - // fontName); - // } if (typeface == null) { Log.w(LOG, "Unable to create typeface, using default."); typeface = Typeface.DEFAULT; @@ -404,16 +394,21 @@ public class DictionaryActivity extends ListActivity { } setContentView(R.layout.dictionary_activity); - searchText = (EditText) findViewById(R.id.SearchText); - searchText.requestFocus(); - searchText.addTextChangedListener(searchTextWatcher); - searchText.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - Log.d(LOG, "searchText onFocusChange hasFocus=" + hasFocus); - } - }); + // ContextMenu. + registerForContextMenu(getListView()); + + // Cache some prefs. + wordList = new File(prefs.getString(getString(R.string.wordListFileKey), + getString(R.string.wordListFileDefault))); + saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey), + false); + clickOpensContextMenu = prefs.getBoolean(getString(R.string.clickOpensContextMenuKey), + false); + Log.d(LOG, "wordList=" + wordList + ", saveOnlyFirstSubentry=" + saveOnlyFirstSubentry); + + onCreateSetupActionBarAndSearchView(); + // Set the search text from the intent, then the saved state. String text = getIntent().getStringExtra(C.SEARCH_TOKEN); if (savedInstanceState != null) { @@ -425,89 +420,66 @@ public class DictionaryActivity extends ListActivity { setSearchText(text, true); Log.d(LOG, "Trying to restore searchText=" + text); - final View clearSearchTextButton = findViewById(R.id.ClearSearchTextButton); - clearSearchTextButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onClearSearchTextButton(); - } - }); - clearSearchTextButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.showClearSearchTextButtonKey), true) ? View.VISIBLE - : View.GONE); - - langButton = (Button) findViewById(R.id.LangButton); - langButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onLanguageButton(); + setDictionaryPrefs(this, dictFile, indexIndex, searchView.getQuery().toString()); + + updateLangButton(); + } + + private void onCreateSetupActionBarAndSearchView() { + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(false); + + searchView = new SearchView(getSupportActionBar().getThemedContext()); + searchView.setIconifiedByDefault(false); + // searchView.setIconified(false); // puts the magifying glass in the + // wrong place. + searchView.setQueryHint(getString(R.string.searchText)); + searchView.setSubmitButtonEnabled(false); + final int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, + getResources().getDisplayMetrics()); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width, + FrameLayout.LayoutParams.WRAP_CONTENT); + searchView.setLayoutParams(lp); + searchView.setImeOptions( + EditorInfo.IME_ACTION_SEARCH | + EditorInfo.IME_FLAG_NO_EXTRACT_UI | + EditorInfo.IME_FLAG_NO_ENTER_ACTION | + // EditorInfo.IME_FLAG_NO_FULLSCREEN | // Requires API + // 11 + EditorInfo.IME_MASK_ACTION | + EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + onQueryTextListener = new OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + Log.d(LOG, "OnQueryTextListener: onQueryTextSubmit: " + searchView.getQuery()); + return true; } - }); - langButton.setOnLongClickListener(new OnLongClickListener() { + @Override - public boolean onLongClick(View v) { - onLanguageButtonLongClick(v.getContext()); + public boolean onQueryTextChange(String newText) { + Log.d(LOG, "OnQueryTextListener: onQueryTextChange: " + searchView.getQuery()); + onSearchTextChange(searchView.getQuery().toString()); return true; } - }); - updateLangButton(); + }; + searchView.setOnQueryTextListener(onQueryTextListener); - final View upButton = findViewById(R.id.UpButton); - upButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onUpDownButton(true); + searchHintIcon = (ImageView) searchView.findViewById(R.id.abs__search_mag_icon); + searchHintIcon.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + onLanguageButtonClick(); } }); - final View downButton = findViewById(R.id.DownButton); - downButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onUpDownButton(false); + searchHintIcon.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + onLanguageButtonLongClick(v.getContext()); + return true; } }); - upButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.showPrevNextButtonsKey), true) ? View.VISIBLE - : View.GONE); - downButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.showPrevNextButtonsKey), true) ? View.VISIBLE - : View.GONE); - -// getListView().setOnItemSelectedListener(new ListView.OnItemSelectedListener() { -// @Override -// public void onItemSelected(AdapterView adapterView, View arg1, final int position, -// long id) { -// if (!searchText.isFocused()) { -// if (!isFiltered()) { -// final RowBase row = (RowBase) getListAdapter().getItem(position); -// Log.d(LOG, "onItemSelected: " + row.index()); -// final TokenRow tokenRow = row.getTokenRow(true); -// searchText.setText(tokenRow.getToken()); -// } -// } -// } -// -// @Override -// public void onNothingSelected(AdapterView arg0) { -// } -// }); -// - // ContextMenu. - registerForContextMenu(getListView()); - - // Prefs. - wordList = new File(prefs.getString(getString(R.string.wordListFileKey), - getString(R.string.wordListFileDefault))); - saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey), - false); - clickOpensContextMenu = prefs.getBoolean(getString(R.string.clickOpensContextMenuKey), - false); - // if (prefs.getBoolean(getString(R.string.vibrateOnFailedSearchKey), - // true)) { - // vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); - // } - Log.d(LOG, "wordList=" + wordList + ", saveOnlyFirstSubentry=" + saveOnlyFirstSubentry); - - setDictionaryPrefs(this, dictFile, indexIndex, searchText.getText().toString()); - - - + actionBar.setCustomView(searchView); + actionBar.setDisplayShowCustomEnabled(true); } @Override @@ -528,6 +500,10 @@ public class DictionaryActivity extends ListActivity { } @Override + /** + * Invoked when MyWebView returns, since the user might have clicked some + * hypertext in the MyWebView. + */ protected void onActivityResult(int requestCode, int resultCode, Intent result) { super.onActivityResult(requestCode, resultCode, result); if (result != null && result.hasExtra(C.SEARCH_TOKEN)) { @@ -576,38 +552,35 @@ public class DictionaryActivity extends ListActivity { // Buttons // -------------------------------------------------------------------------- - private void onClearSearchTextButton() { - setSearchText("", true); - showKeyboard(); - } - private void showKeyboard() { - searchText.postDelayed(new Runnable() { - @Override - public void run() { - Log.d(LOG, "Trying to show soft keyboard."); - final boolean searchTextHadFocus = searchText.hasFocus(); - searchText.requestFocus(); - final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - manager.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT); - if (!searchTextHadFocus) { - defocusSearchText(); - } - }}, 100); +// searchText.postDelayed(new Runnable() { +// @Override +// public void run() { +// Log.d(LOG, "Trying to show soft keyboard."); +// final boolean searchTextHadFocus = searchText.hasFocus(); +// searchText.requestFocus(); +// final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); +// manager.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT); +// if (!searchTextHadFocus) { +// defocusSearchText(); +// } +// }}, 100); } void updateLangButton() { - // final LanguageResources languageResources = - // Language.isoCodeToResources.get(index.shortName); - // if (languageResources != null && languageResources.flagId != 0) { - // langButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, - // languageResources.flagId, 0); - // } else { - // langButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - langButton.setText(index.shortName); - // } + final LanguageResources languageResources = + Language.isoCodeToResources.get(index.shortName); + if (languageResources != null && languageResources.flagId != 0) { + searchHintIcon.setImageResource(languageResources.flagId); + } else { + if (indexIndex % 2 == 0) { + searchHintIcon.setImageResource(android.R.drawable.ic_media_next); + } else { + searchHintIcon.setImageResource(android.R.drawable.ic_media_previous); + } + } updateTTSLanguage(); - } + } private void updateTTSLanguage() { if (!ttsReady || index == null || textToSpeech == null) { @@ -623,12 +596,12 @@ public class DictionaryActivity extends ListActivity { } } - void onLanguageButton() { + void onLanguageButtonClick() { if (currentSearchOperation != null) { currentSearchOperation.interrupted.set(true); currentSearchOperation = null; } - changeIndexAndResearch((indexIndex + 1) % dictionary.indices.size()); + setIndexAndSearchText((indexIndex + 1) % dictionary.indices.size(), searchView.getQuery().toString()); } void onLanguageButtonLongClick(final Context context) { @@ -641,12 +614,6 @@ public class DictionaryActivity extends ListActivity { ListView listView = (ListView) dialog.findViewById(android.R.id.list); - // final LinearLayout.LayoutParams layoutParams = new - // LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, - // ViewGroup.LayoutParams.WRAP_CONTENT); - // layoutParams.width = 0; - // layoutParams.weight = 1.0f; - final Button button = new Button(listView.getContext()); final String name = getString(R.string.dictionaryManager); button.setText(name); @@ -659,9 +626,7 @@ public class DictionaryActivity extends ListActivity { }; }; button.setOnClickListener(intentLauncher); - // button.setLayoutParams(layoutParams); listView.addHeaderView(button); - // listView.setHeaderDividersEnabled(true); listView.setAdapter(new BaseAdapter() { @Override @@ -683,7 +648,7 @@ public class DictionaryActivity extends ListActivity { final IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(), getLaunchIntent( application.getPath(dictionaryInfo.uncompressedFilename), - i, searchText.getText().toString())) { + i, searchView.getQuery().toString())) { @Override protected void onGo() { dialog.dismiss(); @@ -728,22 +693,6 @@ public class DictionaryActivity extends ListActivity { dialog.show(); } - private void changeIndexAndResearch(int newIndex) { - Log.d(LOG, "Changing index to: " + newIndex); - if (newIndex == -1) { - Log.e(LOG, "Invalid index."); - newIndex = 0; - } - indexIndex = newIndex; - index = dictionary.indices.get(indexIndex); - indexAdapter = new IndexAdapter(index); - Log.d(LOG, "changingIndex, newLang=" + index.longName); - setDictionaryPrefs(this, dictFile, indexIndex, searchText.getText().toString()); - setListAdapter(indexAdapter); - updateLangButton(); - setSearchText(searchText.getText().toString(), true); - } - void onUpDownButton(final boolean up) { if (isFiltered()) { return; @@ -774,25 +723,42 @@ public class DictionaryActivity extends ListActivity { // -------------------------------------------------------------------------- final Random random = new Random(); - + @Override public boolean onCreateOptionsMenu(final Menu menu) { - application.onCreateGlobalOptionsMenu(this, menu); + + if (PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean(getString(R.string.showPrevNextButtonsKey), true)) { + // Next word. + nextWordMenuItem = menu.add(getString(R.string.nextWord)) + .setIcon(R.drawable.arrow_down_float); + nextWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + nextWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + onUpDownButton(false); + return true; + } + }); + + // Previous word. + previousWordMenuItem = menu.add(getString(R.string.previousWord)) + .setIcon(R.drawable.arrow_up_float); + previousWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + previousWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + onUpDownButton(true); + return true; + } + }); + } -// { -// final MenuItem randomWord = menu.add(getString(R.string.randomWord)); -// randomWord.setOnMenuItemClickListener(new OnMenuItemClickListener() { -// public boolean onMenuItemClick(final MenuItem menuItem) { -// final String word = index.sortedIndexEntries.get(random -// .nextInt(index.sortedIndexEntries.size())).token; -// setSearchText(word, true); -// return false; -// } -// }); -// } + application.onCreateGlobalOptionsMenu(this, menu); { final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryManager)); + dictionaryList.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(final MenuItem menuItem) { startActivity(DictionaryManagerActivity.getLaunchIntent()); @@ -804,6 +770,7 @@ public class DictionaryActivity extends ListActivity { { final MenuItem aboutDictionary = menu.add(getString(R.string.aboutDictionary)); + aboutDictionary.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); aboutDictionary.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(final MenuItem menuItem) { final Context context = getListView().getContext(); @@ -843,9 +810,6 @@ public class DictionaryActivity extends ListActivity { source.getNumEntries())).append("\n"); } } - // } else { - // builder.append(getString(R.string.invalidDictionary)); - // } textView.setText(builder.toString()); dialog.show(); @@ -870,18 +834,18 @@ public class DictionaryActivity extends ListActivity { AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo) menuInfo; final RowBase row = (RowBase) getListAdapter().getItem(adapterContextMenuInfo.position); - final MenuItem addToWordlist = menu.add(getString(R.string.addToWordList, + final android.view.MenuItem addToWordlist = menu.add(getString(R.string.addToWordList, wordList.getName())); - addToWordlist.setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { + addToWordlist.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { + public boolean onMenuItemClick(android.view.MenuItem item) { onAppendToWordList(row); return false; } }); - final MenuItem share = menu.add("Share"); - share.setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { + final android.view.MenuItem share = menu.add("Share"); + share.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { + public boolean onMenuItemClick(android.view.MenuItem item) { Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, row.getTokenRow(true).getToken()); @@ -891,9 +855,9 @@ public class DictionaryActivity extends ListActivity { } }); - final MenuItem copy = menu.add(android.R.string.copy); - copy.setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { + final android.view.MenuItem copy = menu.add(android.R.string.copy); + copy.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { + public boolean onMenuItemClick(android.view.MenuItem item) { onCopy(row); return false; } @@ -901,10 +865,10 @@ public class DictionaryActivity extends ListActivity { if (selectedSpannableText != null) { final String selectedText = selectedSpannableText; - final MenuItem searchForSelection = menu.add(getString(R.string.searchForSelection, + final android.view.MenuItem searchForSelection = menu.add(getString(R.string.searchForSelection, selectedSpannableText)); - searchForSelection.setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { + searchForSelection.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { + public boolean onMenuItemClick(android.view.MenuItem item) { jumpToTextFromHyperLink(selectedText, selectedSpannableIndex); return false; } @@ -912,10 +876,10 @@ public class DictionaryActivity extends ListActivity { } if (row instanceof TokenRow && ttsReady) { - final MenuItem speak = menu.add(R.string.speak); - speak.setOnMenuItemClickListener(new OnMenuItemClickListener() { + final android.view.MenuItem speak = menu.add(R.string.speak); + speak.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { @Override - public boolean onMenuItemClick(MenuItem item) { + public boolean onMenuItemClick(android.view.MenuItem item) { textToSpeech.speak(((TokenRow) row).getToken(), TextToSpeech.QUEUE_FLUSH, new HashMap()); return false; @@ -924,7 +888,8 @@ public class DictionaryActivity extends ListActivity { } } - private void jumpToTextFromHyperLink(final String selectedText, final int defaultIndexToUse) { + private void jumpToTextFromHyperLink( + final String selectedText, final int defaultIndexToUse) { int indexToUse = -1; for (int i = 0; i < dictionary.indices.size(); ++i) { final Index index = dictionary.indices.get(i); @@ -946,13 +911,22 @@ public class DictionaryActivity extends ListActivity { if (indexToUse == -1) { indexToUse = defaultIndexToUse; } - final boolean changeIndex = indexIndex != indexToUse; - if (changeIndex) { - setSearchText(selectedText, false); - changeIndexAndResearch(indexToUse); - } else { - setSearchText(selectedText, true); - } + setIndexAndSearchText(indexToUse, selectedText); + } + + /** + * Called when user clicks outside of search text, so that they can start + * typing again immediately. + */ + void defocusSearchText() { + // Log.d(LOG, "defocusSearchText"); + // Request focus so that if we start typing again, it clears the text + // input. + getListView().requestFocus(); + + // Visual indication that a new keystroke will clear the search text. + // Doesn't seem to work unless earchText has focus. +// searchView.selectAll(); } @Override @@ -963,6 +937,7 @@ public class DictionaryActivity extends ListActivity { } } + @SuppressLint("SimpleDateFormat") void onAppendToWordList(final RowBase row) { defocusSearchText(); @@ -987,21 +962,6 @@ public class DictionaryActivity extends ListActivity { return; } - /** - * Called when user clicks outside of search text, so that they can start - * typing again immediately. - */ - void defocusSearchText() { - // Log.d(LOG, "defocusSearchText"); - // Request focus so that if we start typing again, it clears the text - // input. - getListView().requestFocus(); - - // Visual indication that a new keystroke will clear the search text. - // Doesn't seem to work unless earchText has focus. - // searchText.selectAll(); - } - @SuppressWarnings("deprecation") void onCopy(final RowBase row) { defocusSearchText(); @@ -1017,9 +977,10 @@ public class DictionaryActivity extends ListActivity { @Override public boolean onKeyDown(final int keyCode, final KeyEvent event) { if (event.getUnicodeChar() != 0) { - if (!searchText.hasFocus()) { + if (!searchView.hasFocus()) { setSearchText("" + (char) event.getUnicodeChar(), true); } + searchView.requestFocus(); return true; } if (keyCode == KeyEvent.KEYCODE_BACK) { @@ -1037,35 +998,53 @@ public class DictionaryActivity extends ListActivity { } return super.onKeyDown(keyCode, event); } + + private void setIndexAndSearchText(int newIndex, String newSearchText) { + Log.d(LOG, "Changing index to: " + newIndex); + if (newIndex == -1) { + Log.e(LOG, "Invalid index."); + newIndex = 0; + } + if (newIndex != indexIndex) { + indexIndex = newIndex; + index = dictionary.indices.get(indexIndex); + indexAdapter = new IndexAdapter(index); + setListAdapter(indexAdapter); + Log.d(LOG, "changingIndex, newLang=" + index.longName); + setDictionaryPrefs(this, dictFile, indexIndex, searchView.getQuery().toString()); + updateLangButton(); + } + setSearchText(newSearchText, true); + } private void setSearchText(final String text, final boolean triggerSearch) { if (!triggerSearch) { - getListView().requestFocus(); + searchView.setOnQueryTextListener(null); } - searchText.setText(text); - searchText.requestFocus(); + searchView.setQuery(text, false); moveCursorToRight(); - if (triggerSearch) { - onSearchTextChange(text); + if (!triggerSearch) { + searchView.setOnQueryTextListener(onQueryTextListener); + } else { + onQueryTextListener.onQueryTextChange(text); } } - private long cursorDelayMillis = 100; - +// private long cursorDelayMillis = 100; private void moveCursorToRight() { - if (searchText.getLayout() != null) { - cursorDelayMillis = 100; - // Surprising, but this can crash when you rotate... - Selection.moveToRightEdge(searchText.getText(), searchText.getLayout()); - } else { - uiHandler.postDelayed(new Runnable() { - @Override - public void run() { - moveCursorToRight(); - } - }, cursorDelayMillis); - cursorDelayMillis = Math.min(10 * 1000, 2 * cursorDelayMillis); - } +// if (searchText.getLayout() != null) { +// cursorDelayMillis = 100; +// // Surprising, but this can crash when you rotate... +// Selection.moveToRightEdge(searchView.getQuery(), searchText.getLayout()); +// } else { +// uiHandler.postDelayed(new Runnable() { +// @Override +// public void run() { +// moveCursorToRight(); +// } +// }, cursorDelayMillis); +// cursorDelayMillis = Math.min(10 * 1000, 2 * cursorDelayMillis); +// } } // -------------------------------------------------------------------------- @@ -1109,15 +1088,10 @@ public class DictionaryActivity extends ListActivity { } private final void jumpToRow(final int row) { - final boolean refocusSearchText = searchText.hasFocus(); - Log.d(LOG, "jumpToRow: " + row + ", refocusSearchText=" + refocusSearchText); - getListView().requestFocusFromTouch(); + Log.d(LOG, "jumpToRow: " + row + ", refocusSearchText=" + false); +// getListView().requestFocusFromTouch(); getListView().setSelectionFromTop(row, 0); getListView().setSelected(true); - if (refocusSearchText) { - searchText.requestFocus(); - } - //Log.d(LOG, "getSelectedItemPosition():" + getSelectedItemPosition()); } static final Pattern WHITESPACE = Pattern.compile("\\s+"); @@ -1519,10 +1493,10 @@ public class DictionaryActivity extends ListActivity { Log.d(LOG, "searchText changed during shutdown, doing nothing."); return; } - if (!searchText.isFocused()) { - Log.d(LOG, "searchText changed without focus, doing nothing."); - return; - } +// if (!searchView.hasFocus()) { +// Log.d(LOG, "searchText changed without focus, doing nothing."); +// return; +// } Log.d(LOG, "onSearchTextChange: " + text); if (currentSearchOperation != null) { Log.d(LOG, "Interrupting currentSearchOperation."); @@ -1532,22 +1506,6 @@ public class DictionaryActivity extends ListActivity { searchExecutor.execute(currentSearchOperation); } - private class SearchTextWatcher implements TextWatcher { - public void afterTextChanged(final Editable searchTextEditable) { - if (searchText.hasFocus()) { - Log.d(LOG, "SearchTextWatcher: Search text changed with focus: " + searchText.getText()); - // If they were typing to cause the change, update the UI. - onSearchTextChange(searchText.getText().toString()); - } - } - - public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { - } - - public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { - } - } - // -------------------------------------------------------------------------- // Filtered results. // -------------------------------------------------------------------------- @@ -1557,15 +1515,19 @@ public class DictionaryActivity extends ListActivity { } void setFiltered(final SearchOperation searchOperation) { - ((ImageButton) findViewById(R.id.UpButton)).setEnabled(false); - ((ImageButton) findViewById(R.id.DownButton)).setEnabled(false); + if (nextWordMenuItem != null) { + nextWordMenuItem.setEnabled(false); + previousWordMenuItem.setEnabled(false); + } rowsToShow = searchOperation.multiWordSearchResult; setListAdapter(new IndexAdapter(index, rowsToShow, searchOperation.searchTokens)); } void clearFiltered() { - ((ImageButton) findViewById(R.id.UpButton)).setEnabled(true); - ((ImageButton) findViewById(R.id.DownButton)).setEnabled(true); + if (nextWordMenuItem != null) { + nextWordMenuItem.setEnabled(true); + previousWordMenuItem.setEnabled(true); + } setListAdapter(new IndexAdapter(index)); rowsToShow = null; }