1 package com.hughes.android.dictionary;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.ArrayList;
9 import java.util.concurrent.Executor;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.atomic.AtomicBoolean;
13 import com.hughes.android.dictionary.Dictionary.Row;
15 import android.app.ListActivity;
16 import android.os.Bundle;
17 import android.os.Handler;
18 import android.text.Editable;
19 import android.text.TextWatcher;
20 import android.util.Log;
21 import android.view.ContextMenu;
22 import android.view.MenuItem;
23 import android.view.View;
24 import android.view.ViewGroup;
25 import android.view.ContextMenu.ContextMenuInfo;
26 import android.view.MenuItem.OnMenuItemClickListener;
27 import android.widget.AdapterView;
28 import android.widget.BaseAdapter;
29 import android.widget.EditText;
30 import android.widget.ListView;
31 import android.widget.TextView;
32 import android.widget.AdapterView.OnItemLongClickListener;
34 public class DictionaryActivity extends ListActivity {
36 private Dictionary dictionary = null;
38 private File wordList = new File("/sdcard/wordList.txt");
40 final Handler uiHandler = new Handler();
42 private final Object mutex = new Object();
43 private Executor searchExecutor = Executors.newSingleThreadExecutor();
44 private SearchOperation searchOperation = null;
45 // private List<Entry> entries = Collections.emptyList();
46 private DictionaryListAdapter dictionaryListAdapter = new DictionaryListAdapter();
47 private int selectedItem = -1;
49 /** Called when the activity is first created. */
51 public void onCreate(Bundle savedInstanceState) {
52 Log.d("THAD", "onCreate");
53 super.onCreate(savedInstanceState);
56 dictionary = new Dictionary("/sdcard/dict-de-en.txt", Entry.LANG1);
57 } catch (Exception e) {
58 throw new RuntimeException(e);
61 setContentView(R.layout.main);
63 EditText searchText = (EditText) findViewById(R.id.SearchText);
64 searchText.addTextChangedListener(new DictionaryTextWatcher());
66 setListAdapter(dictionaryListAdapter);
68 onSearchTextChange("");
70 registerForContextMenu(getListView());
71 getListView().setOnItemLongClickListener((new OnItemLongClickListener() {
72 public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
81 public void onCreateContextMenu(ContextMenu menu, View v,
82 ContextMenuInfo menuInfo) {
83 if (selectedItem == -1) {
86 final MenuItem addToWordlist = menu.add("Add to wordlist.");
87 addToWordlist.setOnMenuItemClickListener(new OnMenuItemClickListener() {
88 public boolean onMenuItemClick(MenuItem item) {
89 final String rawText = "";//entries.get(selectedItem).getRawText();
90 Log.d("THAD", "Writing : "
93 final OutputStream out = new FileOutputStream(wordList, true);
94 out.write((rawText + "\n").getBytes());
96 } catch (IOException e) {
97 throw new RuntimeException(e);
105 protected void onListItemClick(ListView l, View v, int position, long id) {
107 Log.d("THAD", "Clicked: " + dictionary.getRow(position));
108 } catch (IOException e) {
109 throw new RuntimeException(e);
111 selectedItem = position;
112 openContextMenu(getListView());
115 void onSearchTextChange(final String searchText) {
116 Log.d("THAD", "onSearchTextChange: " + searchText);
118 synchronized (mutex) {
119 if (searchOperation != null) {
120 searchOperation.interrupted.set(true);
122 searchOperation = new SearchOperation(searchText);
124 searchExecutor.execute(searchOperation);
127 private final class SearchOperation implements Runnable {
128 final String searchText;
129 final int count = 100;
130 final AtomicBoolean interrupted = new AtomicBoolean(false);
132 public SearchOperation(final String searchText) {
133 this.searchText = searchText.toLowerCase(); // TODO: better
137 Log.d("THAD", "SearchOperation: " + searchText);
139 uiHandler.post(new Runnable() {
141 synchronized (mutex) {
142 dictionaryListAdapter.notifyDataSetChanged();
149 private class DictionaryListAdapter extends BaseAdapter {
151 public int getCount() {
152 return dictionary.numRows();
155 public Dictionary.Row getItem(int position) {
156 assert position < dictionary.numRows();
158 return dictionary.getRow(position);
159 } catch (IOException e) {
160 throw new RuntimeException(e);
164 public long getItemId(int position) {
168 public View getView(final int position, final View convertView,
169 final ViewGroup parent) {
170 TextView result = null;
171 if (convertView instanceof TextView) {
172 result = (TextView) convertView;
174 result = new TextView(parent.getContext());
176 final Row row = getItem(position);
177 result.setText(row.text);
178 result.setBackgroundColor(row.isWord ? );
183 private class DictionaryTextWatcher implements TextWatcher {
184 public void afterTextChanged(Editable searchText) {
185 onSearchTextChange(searchText.toString());
188 public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
192 public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {