package com.xenoage.zong.musicxml.types;
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;
import com.xenoage.zong.musicxml.types.attributes.MxlRepeat;
import com.xenoage.zong.musicxml.types.choice.MxlMusicDataContent;
import com.xenoage.zong.musicxml.types.enums.MxlRightLeftMiddle;
import com.xenoage.zong.musicxml.util.IncompleteMusicXML;
/**
* MusicXML barline.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(missing = "editorial,wavy-line,segno,coda,fermata,"
+ "segno,coda,divisions")
@AllArgsConstructor @Getter @Setter
public final class MxlBarline
implements MxlMusicDataContent {
public static final String elemName = "barline";
@MaybeNull private MxlBarStyleColor barStyle;
@MaybeNull private MxlEnding ending;
@MaybeNull private MxlRepeat repeat;
@NonNull private MxlRightLeftMiddle location;
private static final MxlRightLeftMiddle defaultLocation = MxlRightLeftMiddle.Right;
@Override public MxlMusicDataContentType getMusicDataContentType() {
return MxlMusicDataContentType.Barline;
}
public static MxlBarline read(XmlReader reader) {
//attributes
MxlRightLeftMiddle location = MxlRightLeftMiddle.readOr(reader, defaultLocation);
//elements
MxlBarStyleColor barStyle = null;
MxlEnding ending = null;
MxlRepeat repeat = null;
while (reader.openNextChildElement()) {
String n = reader.getElementName();
switch (n) {
case MxlBarStyleColor.elemName:
barStyle = MxlBarStyleColor.read(reader);
break;
case MxlEnding.elemName:
ending = MxlEnding.read(reader);
break;
case MxlRepeat.elemName:
repeat = MxlRepeat.read(reader);
break;
}
reader.closeElement();
}
return new MxlBarline(barStyle, ending, repeat, location);
}
@Override public void write(XmlWriter writer) {
writer.writeElementStart(elemName);
location.write(writer);
if (barStyle != null)
barStyle.write(writer);
if (ending != null)
ending.write(writer);
if (repeat != null)
repeat.write(writer);
writer.writeElementEnd();
}
}