]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/DictionaryActivity.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / DictionaryActivity.java
1 package com.hughes.android.dictionary;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.ArrayList;
8 import java.util.List;
9 import java.util.concurrent.Executor;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.atomic.AtomicBoolean;
12
13 import com.hughes.android.dictionary.Dictionary.Row;
14
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;
33
34 public class DictionaryActivity extends ListActivity {
35
36   private Dictionary dictionary = null;
37   
38   private File wordList = new File("/sdcard/wordList.txt");
39
40   final Handler uiHandler = new Handler();
41
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;
48
49   /** Called when the activity is first created. */
50   @Override
51   public void onCreate(Bundle savedInstanceState) {
52     Log.d("THAD", "onCreate");
53     super.onCreate(savedInstanceState);
54     
55     try {
56       dictionary = new Dictionary("/sdcard/dict-de-en.txt", Entry.LANG1);
57     } catch (Exception e) {
58       throw new RuntimeException(e);
59     }
60     
61     setContentView(R.layout.main);
62
63     EditText searchText = (EditText) findViewById(R.id.SearchText);
64     searchText.addTextChangedListener(new DictionaryTextWatcher());
65
66     setListAdapter(dictionaryListAdapter);
67
68     onSearchTextChange("");
69
70     registerForContextMenu(getListView());
71     getListView().setOnItemLongClickListener((new OnItemLongClickListener() {
72       public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
73           long arg3) {
74         selectedItem = arg2;
75         return false;
76       }
77     }));
78   }
79
80   @Override
81   public void onCreateContextMenu(ContextMenu menu, View v,
82       ContextMenuInfo menuInfo) {
83     if (selectedItem == -1) {
84       return;
85     }
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 : "
91                 + rawText);
92         try {
93           final OutputStream out = new FileOutputStream(wordList, true);
94           out.write((rawText + "\n").getBytes());
95           out.close();
96         } catch (IOException e) {
97           throw new RuntimeException(e);
98         }
99         return false;
100       }
101     });
102   }
103
104   @Override
105   protected void onListItemClick(ListView l, View v, int position, long id) {
106     try {
107       Log.d("THAD", "Clicked: " + dictionary.getRow(position));
108     } catch (IOException e) {
109       throw new RuntimeException(e);
110     }
111     selectedItem = position;
112     openContextMenu(getListView());
113   }
114
115   void onSearchTextChange(final String searchText) {
116     Log.d("THAD", "onSearchTextChange: " + searchText);
117     if (1==1) return;
118     synchronized (mutex) {
119       if (searchOperation != null) {
120         searchOperation.interrupted.set(true);
121       }
122       searchOperation = new SearchOperation(searchText);
123     }
124     searchExecutor.execute(searchOperation);
125   }
126
127   private final class SearchOperation implements Runnable {
128     final String searchText;
129     final int count = 100;
130     final AtomicBoolean interrupted = new AtomicBoolean(false);
131
132     public SearchOperation(final String searchText) {
133       this.searchText = searchText.toLowerCase(); // TODO: better
134     }
135
136     public void run() {
137       Log.d("THAD", "SearchOperation: " + searchText);
138  
139       uiHandler.post(new Runnable() {
140         public void run() {
141           synchronized (mutex) {
142             dictionaryListAdapter.notifyDataSetChanged();
143           }
144         }
145       });
146     }
147   }
148
149   private class DictionaryListAdapter extends BaseAdapter {
150
151     public int getCount() {
152       return dictionary.numRows();
153     }
154
155     public Dictionary.Row getItem(int position) {
156       assert position < dictionary.numRows();
157       try {
158         return dictionary.getRow(position);
159       } catch (IOException e) {
160         throw new RuntimeException(e);
161       }
162     }
163
164     public long getItemId(int position) {
165       return position;
166     }
167
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;
173       } else {
174         result = new TextView(parent.getContext());
175       }
176       final Row row = getItem(position);
177       result.setText(row.text);
178       result.setBackgroundColor(row.isWord ? );
179       return result;
180     }
181   }
182
183   private class DictionaryTextWatcher implements TextWatcher {
184     public void afterTextChanged(Editable searchText) {
185       onSearchTextChange(searchText.toString());
186     }
187
188     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
189         int arg3) {
190     }
191
192     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
193     }
194   }
195
196 }