package net.sf.nmedit.patchmodifier.mutator;
import java.util.HashMap;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.nmedit.jpatch.PParameter;
public class VariationState extends JComponent {
private static final long serialVersionUID = 1664626117829085748L;
private Vector<Integer> values = new Vector<Integer>();
private boolean valuesDirty = false;
// values of each parameter
private HashMap<PParameter, Integer> parametersValues =
new HashMap<PParameter, Integer>();
private Vector<PParameter> paraVector = new Vector<PParameter>();
private boolean isSelected = false;
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
fireStateChanged();
}
public VariationState() {
super();
}
public Vector<Integer> getValues() {
if (valuesDirty) {
values.clear();
for (PParameter p: paraVector) {
values.add(parametersValues.get(p));
}
valuesDirty = false;
return values;
}
return values;
}
public void updateValues(Vector<Integer> values) {
for (int i = 0; i < values.size(); i ++) {
PParameter param = paraVector.get(i);
this.parametersValues.put(param, values.get(i));
}
valuesDirty = true;
fireStateChanged();
}
void setParameters(Vector<PParameter> p) {
paraVector = p;
}
Vector<PParameter> getParameters() {
return paraVector;
}
public HashMap<PParameter, Integer> getParametersValues() {
return parametersValues;
}
void setParameterValue(PParameter p, int value) {
parametersValues.put(p,value);
valuesDirty = true;
fireStateChanged();
}
public void addParameter(PParameter p) {
paraVector.add(p);
parametersValues.put(p, p.getValue());
valuesDirty = true;
fireStateChanged();
}
public void removeParameter(PParameter p) {
paraVector.remove(p);
parametersValues.remove(p);
valuesDirty = true;
fireStateChanged();
}
public void addChangeListener(ChangeListener l) {
listenerList.add(ChangeListener.class, l);
}
public void removeChangeListener(ChangeListener l)
{
listenerList.remove(ChangeListener.class, l);
}
protected transient ChangeEvent changeEvent; // this is source
void fireStateChanged() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==ChangeListener.class) {
// Lazily create the event:
if (changeEvent == null)
changeEvent = new ChangeEvent(this);
((ChangeListener)listeners[i+1]).stateChanged(changeEvent);
}
}
}
public void mutate(VariationState refVar,double range,double probability )
{
for (PParameter param: paraVector)
{
if (Math.random() < probability)
{
double amplitude = 127*2*range;
int offset = (int)(Math.random()* amplitude
-amplitude/2);
int val = refVar.getParametersValues().get(param) + offset;
parametersValues.put(param, val < 0 ? 0: val > 128 ? 127:val);
}
}
valuesDirty = true;
fireStateChanged();
}
public void randomize()
{
for (int i = 0 ; i < values.size() ; i++)
{
for (PParameter p: paraVector){
parametersValues.put(p, (int)(Math.random()*127));
}
}
valuesDirty = true;
fireStateChanged();
}
public void setValuesDirty() {
valuesDirty = true;
}
}