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().get_base_outline_color()); }
return getAverageColor(cols);
}
public Color getAverageNameColor()
{
ArrayList<Color> cols = new ArrayList<Color>();
for (ModeleBase mb : _bases)
{ cols.add(mb.getStyleBase().get_base_name_color()); }
return getAverageColor(cols);
}
public Color getAverageNumberColor()
{
ArrayList<Color> cols = new ArrayList<Color>();
for (ModeleBase mb : _bases)
{ cols.add(mb.getStyleBase().get_base_number_color()); }
return getAverageColor(cols);
}
public Color getAverageInnerColor()
{
ArrayList<Color> cols = new ArrayList<Color>();
for (ModeleBase mb : _bases)
{ cols.add(mb.getStyleBase().get_base_inner_color()); }
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();
}
}