package com.xenoage.zong.musicxml.types; import static com.xenoage.utils.Parser.parseFloatNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import com.xenoage.utils.annotations.MaybeNull; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; /** * MusicXML staff-layout. * * @author Andreas Wenger */ @AllArgsConstructor @Getter @Setter public final class MxlStaffLayout { public static final String elemName = "staff-layout"; @MaybeNull private Float staffDistance; /** May be null. If within in the defaults element, this means * "for all staves". Otherwise, use {@link #getNumberNotNull()}. */ @MaybeNull private Integer number; private static final int defaultNumber = 1; @NonNull public int getNumberNotNull() { return (number != null ? number : defaultNumber); } @NonNull public static MxlStaffLayout read(XmlReader reader) { Float staffDistance = null; Integer number = reader.getAttributeInt("number"); if (reader.openNextChildElement("staff-distance")) { staffDistance = parseFloatNull(reader.getText()); reader.closeElement(); } return new MxlStaffLayout(staffDistance, number); } public void write(XmlWriter writer) { writer.writeElementStart(elemName); writer.writeAttribute("number", number); writer.writeElementText("staff-distance", staffDistance); writer.writeElementEnd(); } }