package com.xenoage.zong.commands.core.music;
import com.xenoage.utils.annotations.MaybeNull;
import com.xenoage.utils.document.command.Command;
import com.xenoage.utils.document.command.Undoability;
import com.xenoage.utils.math.Fraction;
import com.xenoage.zong.core.header.ColumnHeader;
import com.xenoage.zong.core.music.ColumnElement;
import com.xenoage.zong.core.music.MeasureSide;
/**
* Writes the given {@link ColumnElement} at the given beat and measure side in the given
* {@link ColumnHeader}.
*
* The beat and side is not needed for some {@link ColumnElement}s.
* See {@link ColumnHeader#setColumnElement(ColumnElement, Fraction, MeasureSide)}.
*
* @author Andreas Wenger
*/
public class ColumnElementWrite
implements Command {
//data
private ColumnElement element;
private ColumnHeader column;
@MaybeNull private Fraction beat;
@MaybeNull private MeasureSide side; //TODO: get rid of the side. place it in the barline class itself
//backup data
private ColumnElement replacedElement = null;
public ColumnElementWrite(ColumnElement element, ColumnHeader column,
@MaybeNull Fraction beat, @MaybeNull MeasureSide side) {
this.column = column;
this.element = element;
this.beat = beat;
this.side = side;
}
@Override public void execute() {
replacedElement = column.setColumnElement(element, beat, side);
}
@Override public Undoability getUndoability() {
return Undoability.Undoable;
}
@Override public void undo() {
column.removeColumnElement(element);
if (replacedElement != null)
column.setColumnElement(replacedElement, beat, side);
}
}