package com.xenoage.zong.commands.core.music;
import static com.xenoage.zong.core.music.Voice.voice;
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.music.Measure;
import com.xenoage.zong.core.music.Voice;
/**
* Creates a {@link Voice} in a {@link Measure}.
*
* For each voice x in a measure, there is also a voice x-1 (for x>0).
* So maybe more than one voice is created.
* If already existing, a {@link UselessException} is thrown.
*
* @author Andreas Wenger
*/
public class VoiceAdd
implements Command {
//data
private Measure measure;
private int voiceIndex;
//backup
private int lastExistingVoiceIndex;
public VoiceAdd(Measure measure, int voiceIndex) {
this.measure = measure;
this.voiceIndex = voiceIndex;
}
@Override public void execute() {
if (measure.getVoices().size() > voiceIndex)
throw new UselessException();
lastExistingVoiceIndex = measure.getVoices().size() - 1;
for (int i = lastExistingVoiceIndex + 1; i <= voiceIndex; i++) {
Voice voice = voice();
voice.setParent(measure);
measure.getVoices().add(voice);
}
}
@Override public Undoability getUndoability() {
return Undoability.Undoable;
}
@Override public void undo() {
for (int i = voiceIndex; i > lastExistingVoiceIndex; i++)
measure.getVoices().remove(i);
}
}