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 to the score until the score has the given * number of measures. * * @author Andreas Wenger */ @Untested public class MeasureAddUpTo implements Command { //data private Score score; private int measuresCount; //backup private int measuresToAdd = 0; /** * Creates a {@link MeasureAddUpTo} command. * @param score the affected score * @param measuresCount the total number of measures for the score */ public MeasureAddUpTo(Score score, int measuresCount) { this.score = score; this.measuresCount = measuresCount; } @Override public void execute() { measuresToAdd = measuresCount - score.getMeasuresCount(); if (measuresToAdd <= 0) throw new UselessException(); //column headers score.getHeader().addEmptyMeasures(measuresToAdd); //staves for (Staff staff : score.getStavesList().getStaves()) { staff.addEmptyMeasures(measuresToAdd); } } @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(measuresToAdd)) { int measureIndex = oldSize - i - 1; //column header score.getHeader().getColumnHeaders().remove(measureIndex); //staves for (Staff staff : score.getStavesList().getStaves()) { staff.getMeasures().remove(measureIndex); } } } }