X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FMetaInfo.java;h=746fd4d939a71f346c3529b63fd65b13af5f9be9;hb=8517b60cb3dfc64f7cec0c4da8d5003837e82bb2;hp=3a6e71ae1571469a421c216761ae7208b98ff675;hpb=9e834013f84e8797acf26f5418ae3448044ad097;p=fanfix.git diff --git a/src/be/nikiroo/utils/resources/MetaInfo.java b/src/be/nikiroo/utils/resources/MetaInfo.java index 3a6e71a..746fd4d 100644 --- a/src/be/nikiroo/utils/resources/MetaInfo.java +++ b/src/be/nikiroo/utils/resources/MetaInfo.java @@ -2,6 +2,9 @@ package be.nikiroo.utils.resources; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import be.nikiroo.utils.resources.Meta.Format; @@ -21,7 +24,8 @@ public class MetaInfo> { private Meta meta; private String value; - private List reloadListeners = new ArrayList(); + private List reloadedListeners = new ArrayList(); + private List saveListeners = new ArrayList(); private String name; private String description; @@ -50,7 +54,7 @@ public class MetaInfo> { if (description == null) { description = meta.description(); if (meta.info() != null && !meta.info().isEmpty()) { - description += "\n" + meta.info(); + description += " (" + meta.info() + ")"; } } @@ -178,7 +182,7 @@ public class MetaInfo> { */ public void reload() { value = bundle.getString(id); - for (Runnable listener : reloadListeners) { + for (Runnable listener : reloadedListeners) { try { listener.run(); } catch (Exception e) { @@ -188,17 +192,31 @@ public class MetaInfo> { } } - public void addReloadListener(Runnable listener) { - reloadListeners.add(listener); + // listeners will be called AFTER reload + public void addReloadedListener(Runnable listener) { + reloadedListeners.add(listener); } /** * Save the current value to the {@link Bundle}. */ public void save() { + for (Runnable listener : saveListeners) { + try { + listener.run(); + } catch (Exception e) { + // TODO: error management? + e.printStackTrace(); + } + } bundle.setString(id, value); } + // listeners will be called BEFORE save + public void addSaveListener(Runnable listener) { + saveListeners.add(listener); + } + /** * Create a list of {@link MetaInfo}, one for each of the item in the given * {@link Bundle}. @@ -222,5 +240,52 @@ public class MetaInfo> { return list; } - // TODO: by groups, a-là Authors/Sources + // TODO: multiple levels? + static public > Map, List>> getGroupedItems( + Class type, Bundle bundle) { + Map, List>> map = new TreeMap, List>>(); + Map, List>> map1 = new TreeMap, List>>(); + + List> ungrouped = new ArrayList>(); + for (MetaInfo info : getItems(type, bundle)) { + if (info.meta.group()) { + List> list = new ArrayList>(); + map.put(info, list); + map1.put(info, list); + } else { + ungrouped.add(info); + } + } + + for (int i = 0; i < ungrouped.size(); i++) { + MetaInfo info = ungrouped.get(i); + MetaInfo 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 > MetaInfo findParent(MetaInfo info, + Set> candidates) { + MetaInfo group = null; + for (MetaInfo 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; + } }