Merge branch 'subtree'
[fanfix.git] / src / be / nikiroo / utils / resources / MetaInfo.java
index e7a8b7c5fe09b5f0a72e36a1161cfde4f2ecfe6f..70c6c43181bbff8f8885c1eca15a792eef03eac1 100644 (file)
@@ -4,7 +4,6 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.utils.resources.Meta.Format;
 
 /**
@@ -28,6 +27,7 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
        private List<Runnable> saveListeners = new ArrayList<Runnable>();
 
        private String name;
+       private boolean hidden;
        private String description;
 
        private boolean dirty;
@@ -91,6 +91,7 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
                }
 
                this.name = name;
+               this.hidden = meta.hidden();
                this.description = description;
 
                reload();
@@ -111,6 +112,16 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
        public String getName() {
                return name;
        }
+       
+       /**
+        * This item should be hidden from the user (she will still be able to
+        * modify it if she opens the file manually).
+        * 
+        * @return TRUE if it should stay hidden
+        */
+       public boolean isHidden() {
+               return hidden;
+       }
 
        /**
         * A description for this item: what it is or does, how to explain that item
@@ -142,7 +153,7 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
        /**
         * The allowed list of values that a {@link Format#FIXED_LIST} item is
         * allowed to be, or a list of suggestions for {@link Format#COMBO_LIST}
-        * items.
+        * items. Also works for {@link Format#LOCALE}.
         * <p>
         * Will always allow an empty string in addition to the rest.
         * 
@@ -160,6 +171,22 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
                return withEmpty;
        }
 
+       /**
+        * Return all the languages known by the program for this bundle.
+        * <p>
+        * This only works for {@link TransBundle}, and will return an empty list if
+        * this is not a {@link TransBundle}.
+        * 
+        * @return the known language codes
+        */
+       public List<String> getKnownLanguages() {
+               if (bundle instanceof TransBundle) {
+                       return ((TransBundle<E>) bundle).getKnownLanguages();
+               }
+
+               return new ArrayList<String>();
+       }
+
        /**
         * This item is a comma-separated list of values instead of a single value.
         * <p>
@@ -175,8 +202,8 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
        }
 
        /**
-        * A manual flag to specify if the {@link MetaData} has been changed or not,
-        * which can be used by {@link MetaInfo#save(boolean)}.
+        * A manual flag to specify if the data has been changed or not, which can
+        * be used by {@link MetaInfo#save(boolean)}.
         * 
         * @return TRUE if it is dirty (if it has changed)
         */
@@ -185,8 +212,8 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
        }
 
        /**
-        * A manual flag to specify that the {@link MetaData} has been changed,
-        * which can be used by {@link MetaInfo#save(boolean)}.
+        * A manual flag to specify that the data has been changed, which can be
+        * used by {@link MetaInfo#save(boolean)}.
         */
        public void setDirty() {
                this.dirty = true;
@@ -462,12 +489,7 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
         */
        public void setString(String value, int item) {
                if (isArray() && item >= 0) {
-                       List<String> values = BundleHelper.parseList(this.value, -1);
-                       for (int i = values.size(); i <= item; i++) {
-                               values.add(null);
-                       }
-                       values.set(item, value);
-                       this.value = BundleHelper.fromList(values);
+                       this.value = BundleHelper.fromList(this.value, value, item);
                } else {
                        this.value = value;
                }
@@ -519,7 +541,7 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
         * The value stored by this item, as a colour (represented here as an
         * {@link Integer}) if it represents a colour, or NULL if it doesn't.
         * <p>
-        * The returned colour value is an ARGB value.
+        * The colour value is an ARGB value.
         * 
         * @param value
         *            the value
@@ -560,7 +582,8 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
                        value = null;
                }
 
-               for (Runnable listener : reloadedListeners) {
+               // Copy the list so we can create new listener in a listener
+               for (Runnable listener : new ArrayList<Runnable>(reloadedListeners)) {
                        try {
                                listener.run();
                        } catch (Exception e) {
@@ -592,7 +615,8 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
         *            dirty flag)
         */
        public void save(boolean onlyIfDirty) {
-               for (Runnable listener : saveListeners) {
+               // Copy the list so we can create new listener in a listener
+               for (Runnable listener : new ArrayList<Runnable>(saveListeners)) {
                        try {
                                listener.run();
                        } catch (Exception e) {
@@ -637,6 +661,15 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
                return children;
        }
 
+       /**
+        * The number of sub-items, if any.
+        * 
+        * @return the number or 0
+        */
+       public int size() {
+               return children.size();
+       }
+
        @Override
        public Iterator<MetaInfo<E>> iterator() {
                return children.iterator();
@@ -661,8 +694,10 @@ public class MetaInfo<E extends Enum<E>> implements Iterable<MetaInfo<E>> {
                List<MetaInfo<E>> shadow = new ArrayList<MetaInfo<E>>();
                for (E id : type.getEnumConstants()) {
                        MetaInfo<E> info = new MetaInfo<E>(type, bundle, id);
-                       list.add(info);
-                       shadow.add(info);
+                       if (!info.hidden) {
+                               list.add(info);
+                               shadow.add(info);
+                       }
                }
 
                for (int i = 0; i < list.size(); i++) {