package com.xenoage.zong.musicxml.types;
import com.xenoage.utils.annotations.MaybeNull;
import com.xenoage.utils.annotations.NonNull;
import com.xenoage.utils.xml.XmlReader;
import com.xenoage.utils.xml.XmlWriter;
import com.xenoage.zong.musicxml.types.enums.MxlClefSign;
import com.xenoage.zong.musicxml.util.IncompleteMusicXML;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import static com.xenoage.utils.NullUtils.notNull;
import static com.xenoage.utils.Parser.parseIntegerNull;
/**
* MusicXML clef.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(missing = "additional,size,print-style,print-object")
@AllArgsConstructor @Getter @Setter
public final class MxlClef {
public static final String elemName = "clef";
@NonNull private MxlClefSign sign;
@MaybeNull private Integer line;
private int clefOctaveChange;
private int number;
private static final int defaultClefOctaveChange = 0;
private static final int defaultNumber = 1;
public static MxlClef read(XmlReader reader) {
Integer number = notNull(reader.getAttributeInt("number"), defaultNumber);
MxlClefSign sign = null;
Integer line = null;
int clefOctaveChange = defaultClefOctaveChange;
while (reader.openNextChildElement()) {
String n = reader.getElementName();
switch (n) {
case MxlClefSign.elemName:
sign = MxlClefSign.read(reader);
break;
case "line":
line = parseIntegerNull(reader.getText());
break;
case "clef-octave-change":
clefOctaveChange = parseIntegerNull(reader.getText());
break;
}
reader.closeElement();
}
if (sign == null)
throw reader.dataException(MxlClefSign.elemName + " missing");
return new MxlClef(sign, line, clefOctaveChange, number);
}
public void write(XmlWriter writer) {
writer.writeElementStart(elemName);
if (number != defaultNumber)
writer.writeAttribute("number", number);
sign.write(writer);
if (line != null)
writer.writeElementText("line", line);
if (clefOctaveChange != defaultClefOctaveChange)
writer.writeElementText("clef-octave-change", clefOctaveChange);
writer.writeElementEnd();
}
}