summaryrefslogtreecommitdiffstats
path: root/src/org/madore/android/unicodeMap/UnicodeMapActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/madore/android/unicodeMap/UnicodeMapActivity.java')
-rw-r--r--src/org/madore/android/unicodeMap/UnicodeMapActivity.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java
index 8e93e36..01f5fdb 100644
--- a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java
+++ b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java
@@ -75,6 +75,14 @@ public final class UnicodeMapActivity extends ListActivity {
public int getLimit() { return this.limit; }
public int getSizeHint() { return this.sizeHint; }
}
+ protected static class DecodeDisplay extends Display {
+ protected String coded;
+ public DecodeDisplay(String title, String coded) {
+ super(title);
+ this.coded = coded;
+ }
+ public String getCoded() { return this.coded; }
+ }
protected static class DisplayAndPosition {
protected Display disp;
@@ -227,6 +235,42 @@ public final class UnicodeMapActivity extends ListActivity {
String.format(str, limit),
Toast.LENGTH_SHORT).show();
}
+ } else if ( disp instanceof DecodeDisplay ) {
+ String coded = ((DecodeDisplay)disp).getCoded();
+ list = new ArrayList<UnicodeDisplayable>(coded.length());
+ for ( int i=0 ; i<coded.length() ; i++ ) {
+ int codePoint = coded.codePointAt(i);
+ if ( codePoint >= 0x10000 )
+ i++;
+ UnicodeCharacter ch = db.getSingle(codePoint);
+ if ( ch == null ) {
+ String name; UnicodeCharacter.Category category;
+ if ( codePoint < 0x0020 || ( codePoint >= 0x007f
+ && codePoint < 0x00a0 ) ) {
+ name = String.format("<control-%04X>", codePoint);
+ category = UnicodeCharacter.Category.CONTROL;
+ } else if ( UnicodeCharacter.Range.HIGH_SURROGATES.belongs(codePoint)
+ || UnicodeCharacter.Range.HIGH_PRIVATE_USE_SURROGATES.belongs(codePoint)
+ || UnicodeCharacter.Range.LOW_SURROGATES.belongs(codePoint) ) {
+ name = String.format("<surrogate-%04X>", codePoint);
+ category = UnicodeCharacter.Category.SURROGATE;
+ } else if ( UnicodeCharacter.Range.PRIVATE_USE_AREA.belongs(codePoint)
+ || UnicodeCharacter.Range.SUPPLEMENTARY_PRIVATE_USE_AREA_A.belongs(codePoint)
+ || UnicodeCharacter.Range.SUPPLEMENTARY_PRIVATE_USE_AREA_B.belongs(codePoint) ) {
+ name = String.format("<private-use-%04X>", codePoint);
+ category = UnicodeCharacter.Category.PRIVATE_USE;
+ } else {
+ name = String.format("<noncharacter-%04X>", codePoint);
+ category = UnicodeCharacter.Category.UNASSIGNED;
+ }
+ ch = new UnicodeCharacter(codePoint, name, category,
+ false);
+ }
+ list.add(ch);
+ }
+ disp.setListCache(list);
+ adapter = new UnicodeArrayAdapter(this, list);
+ setListAdapter(adapter);
} else
throw new AssertionError("unknown UnicodeMapActivity.Display");
String title = disp.getTitle();
@@ -499,6 +543,49 @@ public final class UnicodeMapActivity extends ListActivity {
dialog.show();
}
+ protected void doDecode(String s) {
+ Display newDisp = new DecodeDisplay(s, s);
+ saveDisplay();
+ doDisplay(newDisp, true);
+ }
+
+ protected void queryDecode() {
+ final Dialog dialog = new Dialog(UnicodeMapActivity.this);
+ // dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialog.setTitle(R.string.decode_title);
+ dialog.setOwnerActivity(this);
+ dialog.setContentView(R.layout.decode_dialog);
+ dialog.setCancelable(true);
+ dialog.getWindow().setLayout(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ final EditText textForm
+ = (EditText) dialog.findViewById(R.id.decodeString);
+ textForm.setOnKeyListener(new View.OnKeyListener() {
+ public boolean onKey(View view, int keyCode, KeyEvent event) {
+ if ( ( event.getAction() == KeyEvent.ACTION_DOWN )
+ && ( keyCode == KeyEvent.KEYCODE_ENTER ) ) {
+ String s = textForm.getText().toString();
+ if ( ! Pattern.matches("^\\s*$", s) ) {
+ doDecode(s);
+ dialog.dismiss();
+ }
+ return true;
+ }
+ return false;
+ }
+ });
+ final Button btn = (Button) dialog.findViewById(R.id.decodeButton);
+ btn.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View view) {
+ String s = textForm.getText().toString();
+ if ( ! Pattern.matches("^\\s*$", s) )
+ doDecode(s);
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ }
+
protected void displayAbout() {
final Dialog dialog = new Dialog(UnicodeMapActivity.this);
dialog.setTitle(R.string.about_title);
@@ -548,6 +635,9 @@ public final class UnicodeMapActivity extends ListActivity {
case R.id.menuSearch:
querySearch();
return true;
+ case R.id.menuDecode:
+ queryDecode();
+ return true;
case R.id.menuAbout:
displayAbout();
return true;