package com.xenoage.zong.musicxml.types; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.annotations.MaybeNull; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; import com.xenoage.zong.musicxml.types.choice.MxlDirectionTypeContent; import com.xenoage.zong.musicxml.util.IncompleteMusicXML; /** * MusicXML direction-type. * * Only one content element is used. * * @author Andreas Wenger */ @IncompleteMusicXML(missing = "rehearsal,dashes,bracket," + "octave-shift,harp-pedals,damp,damp-all,eyeglasses,scordatura,accordion-registration," + "other-direction") @AllArgsConstructor @Getter @Setter public final class MxlDirectionType { public static final String elemName = "direction-type"; @NonNull private MxlDirectionTypeContent content; /** * Returns null, if content is unsupported. */ @MaybeNull public static MxlDirectionType read(XmlReader reader) { MxlDirectionTypeContent content = null; if (reader.openNextChildElement()) { String n = reader.getElementName(); switch (n.charAt(0)) { //switch for performance case 'c': if (n.equals(MxlCoda.elemName)) content = MxlCoda.read(reader); break; case 'd': if (n.equals(MxlDynamics.elemName)) content = MxlDynamics.read(reader); break; case 'i': if (n.equals("image")) content = MxlImage.read(reader); break; case 'p': if (n.equals(MxlPedal.elemName)) content = MxlPedal.read(reader); break; case 'm': if (n.equals(MxlMetronome.elemName)) content = MxlMetronome.read(reader); break; case 's': if (n.equals(MxlSegno.elemName)) content = MxlSegno.read(reader); break; case 'w': if (n.equals(MxlWedge.elemName)) content = MxlWedge.read(reader); else if (n.equals(MxlWords.elemName)) content = MxlWords.read(reader); break; } reader.closeElement(); } if (content != null) return new MxlDirectionType(content); else return null; } public void write(XmlWriter writer) { writer.writeElementStart(elemName); content.write(writer); writer.writeElementEnd(); } }