From 9df4bb4fa30a0c05ccd484d6b59521bfca665854 Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Tue, 27 Apr 2010 19:53:14 +0200 Subject: Dynamically generate subranges on large character zones. --- .../android/unicodeMap/UnicodeMapActivity.java | 57 ++++++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) (limited to 'src/org/madore/android/unicodeMap/UnicodeMapActivity.java') diff --git a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java index e633006..b48c771 100644 --- a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java +++ b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java @@ -48,17 +48,18 @@ public final class UnicodeMapActivity extends ListActivity { public RootDisplay() { super(null); } } protected static class RangeDisplay extends Display { - protected int from; protected int to; - public RangeDisplay(String title, int from, int to) { + protected int from; protected int to; protected int limit; + public RangeDisplay(String title, int from, int to, int limit) { super(title); - this.from = from; this.to = to; + this.from = from; this.to = to; this.limit = limit; } - public RangeDisplay(UnicodeCharacter.Range rng) { + public RangeDisplay(UnicodeRangeable rng, int limit) { super(rng.getDescr()); - this.from = rng.getFrom(); this.to = rng.getTo(); + this.from = rng.getFrom(); this.to = rng.getTo(); this.limit = limit; } public int getFrom() { return this.from; } public int getTo() { return this.to; } + public int getLimit() { return this.limit; } } protected static class SearchDisplay extends Display { protected String like; protected int limit; @@ -165,9 +166,26 @@ public final class UnicodeMapActivity extends ListActivity { } else if ( disp instanceof RangeDisplay ) { int from = ((RangeDisplay)disp).getFrom(); int to = ((RangeDisplay)disp).getTo(); - list = new ArrayList(db.countRange(from,to)); - for ( UnicodeCharacter ch : db.getRange(from,to) ) - list.add(ch); + int count = db.countRange(from,to); + if ( count > 1024 ) { + list = new ArrayList(count/128 + 1); + int from0 = from&(~127); + int to0 = ((to-1)|127)+1; + for ( int base=from0 ; baseto?to:base+128; + final String str = String.format("%04X\u2013%04X", from1, to1-1); + list.add(new UnicodeRangeable() { + public int getFrom() { return from1; } + public int getTo() { return to1; } + public String getDescr() { return str; } + }); + } + } else { + list = new ArrayList(count); + for ( UnicodeCharacter ch : db.getRange(from,to) ) + list.add(ch); + } disp.setListCache(list); adapter = new UnicodeArrayAdapter(this, list); setListAdapter(adapter); @@ -201,6 +219,8 @@ public final class UnicodeMapActivity extends ListActivity { setTitle(getResources().getString(R.string.app_name)); } + final static int rangeLimit = 1024; + protected class MapItemClickListener implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { @@ -210,8 +230,8 @@ public final class UnicodeMapActivity extends ListActivity { = (UnicodeDisplayable)parent.getItemAtPosition(position); if ( it instanceof UnicodeCharacter ) textForm.append(((UnicodeCharacter)it).getChar()); - else if ( it instanceof UnicodeCharacter.Range ) { - Display newDisp = new RangeDisplay((UnicodeCharacter.Range)it); + else if ( it instanceof UnicodeRangeable ) { + Display newDisp = new RangeDisplay((UnicodeRangeable)it, rangeLimit); saveDisplay(view, position); doDisplay(newDisp, true); } else @@ -246,8 +266,8 @@ public final class UnicodeMapActivity extends ListActivity { text.setText(new String(s)); dialog.show(); return true; - } else if ( it instanceof UnicodeCharacter.Range ) { - UnicodeCharacter.Range itr = (UnicodeCharacter.Range)it; + } else if ( it instanceof UnicodeRangeable ) { + UnicodeRangeable itr = (UnicodeRangeable)it; Dialog dialog = new Dialog(UnicodeMapActivity.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setOwnerActivity(UnicodeMapActivity.this); @@ -259,10 +279,15 @@ public final class UnicodeMapActivity extends ListActivity { text = (TextView) dialog.findViewById(R.id.rangeRangeLabel); StringBuilder s = new StringBuilder(); Formatter fmt = new Formatter(s); - fmt.format("%04X\u2013%04X (%d slots, %d chars)", - itr.getFrom(), itr.getTo()-1, - itr.getTo()-itr.getFrom(), - db.countRange(itr.getFrom(), itr.getTo())); + if ( itr instanceof UnicodeCharacter.Range ) + fmt.format("%04X\u2013%04X (%d slots, %d chars)", + itr.getFrom(), itr.getTo()-1, + itr.getTo()-itr.getFrom(), + db.countRange(itr.getFrom(), itr.getTo())); + else + fmt.format("(%d slots, %d chars)", + itr.getTo()-itr.getFrom(), + db.countRange(itr.getFrom(), itr.getTo())); text.setText(new String(s)); dialog.show(); return true; -- cgit v1.2.3