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;
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;
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;
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;
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;
List<RowBase> 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) {
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
@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
@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);
uiHandler.post(new Runnable() {
@Override
public void run() {
- onSearchTextChange(searchText.getText().toString());
+ onSearchTextChange(searchView.getQuery().toString());
}
});
}
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;
}
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) {
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
}
@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)) {
// 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) {
}
}
- 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) {
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);
};
};
button.setOnClickListener(intentLauncher);
- // button.setLayoutParams(layoutParams);
listView.addHeaderView(button);
- // listView.setHeaderDividersEnabled(true);
listView.setAdapter(new BaseAdapter() {
@Override
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();
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;
// --------------------------------------------------------------------------
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());
{
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();
source.getNumEntries())).append("\n");
}
}
- // } else {
- // builder.append(getString(R.string.invalidDictionary));
- // }
textView.setText(builder.toString());
dialog.show();
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());
}
});
- 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;
}
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;
}
}
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<String, String>());
return false;
}
}
- 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);
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
}
}
+ @SuppressLint("SimpleDateFormat")
void onAppendToWordList(final RowBase row) {
defocusSearchText();
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();
@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) {
}
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);
+// }
}
// --------------------------------------------------------------------------
}
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+");
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.");
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.
// --------------------------------------------------------------------------
}
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;
}