+ // TODO: multiple levels?
+ static public <E extends Enum<E>> Map<MetaInfo<E>, List<MetaInfo<E>>> getGroupedItems(
+ Class<E> type, Bundle<E> bundle) {
+ Map<MetaInfo<E>, List<MetaInfo<E>>> map = new TreeMap<MetaInfo<E>, List<MetaInfo<E>>>();
+ Map<MetaInfo<E>, List<MetaInfo<E>>> map1 = new TreeMap<MetaInfo<E>, List<MetaInfo<E>>>();
+
+ List<MetaInfo<E>> ungrouped = new ArrayList<MetaInfo<E>>();
+ for (MetaInfo<E> info : getItems(type, bundle)) {
+ if (info.meta.group()) {
+ List<MetaInfo<E>> list = new ArrayList<MetaInfo<E>>();
+ map.put(info, list);
+ map1.put(info, list);
+ } else {
+ ungrouped.add(info);
+ }
+ }
+
+ for (int i = 0; i < ungrouped.size(); i++) {
+ MetaInfo<E> info = ungrouped.get(i);
+ MetaInfo<E> group = findParent(info, map.keySet());
+ if (group != null) {
+ map.get(group).add(info);
+ ungrouped.remove(i--);
+ }
+ }
+
+ if (ungrouped.size() > 0) {
+ map.put(null, ungrouped);
+ }
+
+ return map;
+ }
+
+ static private <E extends Enum<E>> MetaInfo<E> findParent(MetaInfo<E> info,
+ Set<MetaInfo<E>> candidates) {
+ MetaInfo<E> group = null;
+ for (MetaInfo<E> pcandidate : candidates) {
+ if (info.id.toString().startsWith(pcandidate.id.toString())) {
+ if (group == null
+ || group.id.toString().length() < pcandidate.id
+ .toString().length()) {
+ group = pcandidate;
+ }
+ }
+ }
+
+ return group;
+ }