/**
*
*/
package cz.cuni.mff.peckam.java.origamist.model;
import javax.xml.bind.annotation.XmlTransient;
import cz.cuni.mff.peckam.java.origamist.utils.ChangeNotification;
import cz.cuni.mff.peckam.java.origamist.utils.ObservableList;
import cz.cuni.mff.peckam.java.origamist.utils.ObservableList.ChangeTypes;
import cz.cuni.mff.peckam.java.origamist.utils.Observer;
/**
* The steps the model consists of.
*
* Provides property: model
*
* @author Martin Pecka
*/
@XmlTransient
public class Steps extends cz.cuni.mff.peckam.java.origamist.model.jaxb.Steps
{
public Steps()
{
// this observer handles the next/previous properties of Steps added to this list to reflect the steps'
// positions in the list
((ObservableList<Step>) getStep()).addObserver(new Observer<Step>() {
@Override
public void changePerformed(ChangeNotification<? extends Step> change)
{
if (change.getChangeType() != ChangeTypes.ADD) {
if (change.getOldItem().getPrevious() != null) {
change.getOldItem().getPrevious().setNext(change.getOldItem().getNext());
}
if (change.getOldItem().getNext() != null) {
change.getOldItem().getNext().setPrevious(change.getOldItem().getPrevious());
}
change.getOldItem().setNext(null);
change.getOldItem().setPrevious(null);
}
if (change.getChangeType() != ChangeTypes.REMOVE) {
int index = step.indexOf(change.getItem());
if (index > 0) {
Step prev = step.get(index - 1);
change.getItem().setPrevious(prev);
prev.setNext(change.getItem());
}
if (index + 1 < step.size()) {
Step next = step.get(index + 1);
change.getItem().setNext(next);
next.setPrevious(change.getItem());
}
}
}
});
}
/**
* Invalidate all steps contained in this list.
*/
public void invalidateSteps()
{
if (step.size() > 0)
step.get(0).invalidateModelState();
}
}