+package fr.orsay.lri.varna.models;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+
+import fr.orsay.lri.varna.models.rna.ModeleBase;
+
+public class BaseList {
+ private HashSet<ModeleBase> _bases = new HashSet<ModeleBase>();
+ private String _caption;
+
+ public BaseList( BaseList b)
+ {
+ _caption = b._caption;
+ _bases = new HashSet<ModeleBase>(b._bases);
+ }
+
+
+ public BaseList( String caption)
+ {
+ _caption = caption;
+ }
+
+
+ public BaseList( String caption, ModeleBase mb)
+ {
+ this(caption);
+ addBase(mb);
+ }
+
+ public boolean contains(ModeleBase mb)
+ {
+ return _bases.contains(mb);
+ }
+
+
+ public String getCaption()
+ {
+ return _caption;
+ }
+
+ public void addBase(ModeleBase b)
+ {
+ _bases.add(b);
+ }
+
+ public void removeBase(ModeleBase b)
+ {
+ _bases.remove(b);
+ }
+
+
+ public void addBases(Collection<? extends ModeleBase> mbs)
+ {
+ _bases.addAll(mbs);
+ }
+
+ public ArrayList<ModeleBase> getBases()
+ {
+ return new ArrayList<ModeleBase>(_bases);
+ }
+
+ public void clear()
+ {
+ _bases.clear();
+ }
+
+ public static Color getAverageColor(ArrayList<Color> cols)
+ {
+ int r=0,g=0,b=0;
+ for (Color c : cols)
+ {
+ r += c.getRed();
+ g += c.getGreen();
+ b += c.getBlue();
+ }
+ if (cols.size()>0)
+ {
+ r /= cols.size();
+ g /= cols.size();
+ b /= cols.size();
+ }
+ return new Color(r,g,b);
+ }
+
+ public Color getAverageOutlineColor()
+ {
+ ArrayList<Color> cols = new ArrayList<Color>();
+ for (ModeleBase mb : _bases)
+ { cols.add(mb.getStyleBase().getBaseOutlineColor()); }
+ return getAverageColor(cols);
+ }
+
+ public Color getAverageNameColor()
+ {
+ ArrayList<Color> cols = new ArrayList<Color>();
+ for (ModeleBase mb : _bases)
+ { cols.add(mb.getStyleBase().getBaseNameColor()); }
+ return getAverageColor(cols);
+ }
+
+ public Color getAverageNumberColor()
+ {
+ ArrayList<Color> cols = new ArrayList<Color>();
+ for (ModeleBase mb : _bases)
+ { cols.add(mb.getStyleBase().getBaseNumberColor()); }
+ return getAverageColor(cols);
+ }
+
+ public Color getAverageInnerColor()
+ {
+ ArrayList<Color> cols = new ArrayList<Color>();
+ for (ModeleBase mb : _bases)
+ { cols.add(mb.getStyleBase().getBaseInnerColor()); }
+ return getAverageColor(cols);
+ }
+
+ public String getNumbers()
+ {
+ String result = "";
+ boolean first = true;
+ for (ModeleBase mb:_bases)
+ {
+ if (!first)
+ { result += ","; }
+ else
+ { first = false; }
+ result += "" + mb.getBaseNumber();
+ }
+ result += "";
+ return result;
+ }
+
+ public String getContents()
+ {
+ String result = "";
+ boolean first = true;
+ for (ModeleBase mb:_bases)
+ {
+ if (!first)
+ { result += ","; }
+ else
+ { first = false; }
+ result += "" + mb.getContent();
+ }
+ result += "";
+ return result;
+ }
+
+ public ArrayList<Integer> getIndices()
+ {
+ ArrayList<Integer> indices = new ArrayList<Integer>();
+ for (ModeleBase mb : _bases)
+ {
+ indices.add(mb.getIndex());
+ }
+ return indices;
+ }
+
+ /**
+ * Returns, in a new BaseList, the intersection of the current BaseList and of the argument.
+ * @param mb The base list to be used for the intersection
+ * @return The intersection of the current base list and the argument.
+ */
+
+ public BaseList retainAll(BaseList mb)
+ {
+ HashSet<ModeleBase> cp = new HashSet<ModeleBase>();
+ cp.addAll(_bases);
+ cp.retainAll(mb._bases);
+ BaseList result = new BaseList("TmpIntersection");
+ result.addBases(cp);
+ return result;
+ }
+
+ /**
+ * Returns, in a new BaseList, the list consisting of the current BaseList minus the list passed as argument.
+ * @param mb The base list to be subtracted from the current one
+ * @return The current base list minus the list passed as argument.
+ */
+
+ public BaseList removeAll(BaseList mb)
+ {
+ HashSet<ModeleBase> cp = new HashSet<ModeleBase>();
+ cp.addAll(_bases);
+ cp.removeAll(mb._bases);
+ BaseList result = new BaseList("TmpMinus");
+ result.addBases(cp);
+ return result;
+ }
+
+ public int size()
+ {
+ return _bases.size();
+ }
+
+
+}