package org.madore.android.unicodeMap; import java.util.Arrays; import java.util.List; import java.util.ArrayList; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.KeyEvent; import android.widget.*; import android.text.ClipboardManager; import android.app.ListActivity; import android.app.ProgressDialog; public final class UnicodeMapActivity extends ListActivity { protected UnicodeDatabase db; protected final List rootList = new ArrayList(200); protected final List stack = new ArrayList(10); protected final List positionStack = new ArrayList(10); protected final List positionYStack = new ArrayList(10); protected void launchPopulation() { final ProgressDialog progress = new ProgressDialog(this); progress.setOwnerActivity(this); progress.setTitle(R.string.loading_database_title); progress.setMessage(getResources().getText(R.string.loading_database_msg)); progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progress.setCancelable(false); progress.show(); final Handler handler = new Handler() { public void handleMessage(Message msg) { int done = msg.getData().getInt("done"); int total = msg.getData().getInt("total"); progress.setMax(total); progress.setProgress(done); if ( done >= total ) progress.dismiss(); } }; final Thread thr = new Thread() { public void run() { final UnicodeDatabase writeDb = new UnicodeDatabase(UnicodeMapActivity.this); writeDb.populate(handler); } }; thr.start(); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); db = new UnicodeDatabase(this); final boolean needPopulate = db.needPopulate(); if ( needPopulate ) launchPopulation(); for ( UnicodeCharacter.Range rng : UnicodeCharacter.Range.values() ) rootList.add(rng); UnicodeArrayAdapter rootAdapter = new UnicodeArrayAdapter(this, rootList); stack.add(rootAdapter); setListAdapter(rootAdapter); final ClipboardManager cmgr = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); final Button btn = (Button) findViewById(R.id.button); final EditText txt = (EditText) findViewById(R.id.edit); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { cmgr.setText(txt.getText()); Toast.makeText(getApplicationContext(), R.string.copied_toast, Toast.LENGTH_SHORT).show(); } }); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { UnicodeDisplayable it = (UnicodeDisplayable)parent.getItemAtPosition(position); if ( it instanceof UnicodeCharacter ) txt.append(((UnicodeCharacter)it).getChar()); else if ( it instanceof UnicodeCharacter.Range ) { int from = ((UnicodeCharacter.Range)it).getFrom(); int to = ((UnicodeCharacter.Range)it).getTo(); List list = new ArrayList(db.countRange(from,to)); for ( UnicodeCharacter ch : db.getRange(from,to) ) list.add(ch); UnicodeArrayAdapter adapter = new UnicodeArrayAdapter(UnicodeMapActivity.this, list); stack.add(adapter); positionStack.add(position); positionYStack.add(view.getTop()); setListAdapter(adapter); } else throw new AssertionError("unknown UnicodeDisplayable"); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( ( keyCode == KeyEvent.KEYCODE_BACK) && stack.size() > 1 ) { final ListView lv = getListView(); stack.remove(stack.size()-1); setListAdapter(stack.get(stack.size()-1)); lv.setSelectionFromTop(positionStack.remove(positionStack.size()-1), positionYStack.remove(positionYStack.size()-1)); return true; } return super.onKeyDown(keyCode, event); } }