package com.xenoage.zong.commands.core.music;
import static com.xenoage.utils.kernel.Range.range;
import com.xenoage.utils.annotations.Untested;
import com.xenoage.utils.document.command.Command;
import com.xenoage.utils.document.command.Undoability;
import com.xenoage.utils.document.exceptions.UselessException;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.music.Staff;
/**
* Adds empty measures at the end of a score.
*
* @author Andreas Wenger
*/
@Untested public class MeasureAdd
implements Command {
//data
private Score score;
private int measuresCount;
/**
* Creates a {@link MeasureAdd} command.
* @param score the affected score
* @param measuresCount the number of measures to add
*/
public MeasureAdd(Score score, int measuresCount) {
this.score = score;
this.measuresCount = measuresCount;
}
@Override public void execute() {
if (measuresCount < 1)
throw new UselessException();
//column headers
score.getHeader().addEmptyMeasures(measuresCount);
//staves
for (Staff staff : score.getStavesList().getStaves()) {
staff.addEmptyMeasures(measuresCount);
}
}
@Override public Undoability getUndoability() {
return Undoability.Undoable;
}
@Override public void undo() {
//remove the added measures.
//this is trivial, since they still have no content in this state.
int oldSize = score.getMeasuresCount();
for (int i : range(measuresCount)) {
int measureIndex = oldSize - i - 1;
//column header
score.getHeader().getColumnHeaders().remove(measureIndex);
//staves
for (Staff staff : score.getStavesList().getStaves()) {
staff.getMeasures().remove(measureIndex);
}
}
}
}