diff options
Diffstat (limited to 'src/org/madore/android/unicodeMap/UnicodeMapActivity.java')
-rw-r--r-- | src/org/madore/android/unicodeMap/UnicodeMapActivity.java | 57 |
1 files changed, 41 insertions, 16 deletions
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<UnicodeDisplayable>(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<UnicodeDisplayable>(count/128 + 1); + int from0 = from&(~127); + int to0 = ((to-1)|127)+1; + for ( int base=from0 ; base<to0 ; base+=128 ) { + final int from1 = base<from?from:base; + final int to1 = base+128>to?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<UnicodeDisplayable>(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; |