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.choice.MxlMusicDataContent;
import com.xenoage.zong.musicxml.util.IncompleteMusicXML;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
import static com.xenoage.utils.Parser.parseIntegerNull;
/**
* MusicXML attributes.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(missing = "editorial,part-symbol,instruments,staff-details,"
+ "directive,measure-style", partly = "time,clef", children = "key,time,clef")
@AllArgsConstructor @Getter @Setter
public final class MxlAttributes
implements MxlMusicDataContent {
public static final String elemName = "attributes";
@MaybeNull private Integer divisions;
@MaybeNull private MxlKey key;
@MaybeNull private MxlTime time;
@MaybeNull private Integer staves;
@MaybeNull private List<MxlClef> clefs;
@MaybeNull private MxlTranspose transpose;
@Override public MxlMusicDataContentType getMusicDataContentType() {
return MxlMusicDataContentType.Attributes;
}
@NonNull public static MxlAttributes read(XmlReader reader) {
Integer divisions = null;
MxlKey key = null;
MxlTime time = null;
Integer staves = null;
List<MxlClef> clefs = null;
MxlTranspose transpose = null;
while (reader.openNextChildElement()) {
String n = reader.getElementName();
switch (n.charAt(0)) { //switch for performance
case 'c':
if (MxlClef.elemName.equals(n)) {
if (clefs == null)
clefs = new ArrayList<>();
clefs.add(MxlClef.read(reader));
}
break;
case 'd':
if ("divisions".equals(n))
divisions = parseIntegerNull(reader.getText());
break;
case 'k':
if (MxlKey.elemName.equals(n))
key = MxlKey.read(reader);
break;
case 's':
if ("staves".equals(n))
staves = parseIntegerNull(reader.getText());
break;
case 't':
if (MxlTime.elemName.equals(n))
time = MxlTime.read(reader);
else if (MxlTranspose.elemName.equals(n))
transpose = MxlTranspose.read(reader);
break;
}
reader.closeElement();
}
return new MxlAttributes(divisions, key, time, staves, clefs, transpose);
}
@Override public void write(XmlWriter writer) {
writer.writeElementStart(elemName);
writer.writeElementText("divisions", divisions);
if (key != null)
key.write(writer);
if (time != null)
time.write(writer);
writer.writeElementText("staves", staves);
if (clefs != null) {
for (MxlClef clef : clefs)
clef.write(writer);
}
if (transpose != null)
transpose.write(writer);
writer.writeElementEnd();
}
}