package com.xenoage.zong.musicxml.types;
import com.xenoage.utils.Parser;
import com.xenoage.utils.annotations.MaybeNull;
import com.xenoage.utils.annotations.NonNull;
import com.xenoage.utils.math.geom.Size2f;
import com.xenoage.utils.xml.XmlReader;
import com.xenoage.utils.xml.XmlWriter;
import com.xenoage.zong.musicxml.util.IncompleteMusicXML;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import static com.xenoage.utils.collections.CollectionUtils.alist;
/**
* MusicXML page-layout.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(partly = "")
@AllArgsConstructor @Getter @Setter
public final class MxlPageLayout {
public static final String elemName = "page-layout";
@MaybeNull private Size2f pageSize;
/** Size is between 0 and 2. */
@MaybeNull private List<MxlPageMargins> pageMargins;
@NonNull public static MxlPageLayout read(XmlReader reader) {
Float pageWidth = null;
Float pageHeight = null;
List<MxlPageMargins> pageMargins = alist();
while (reader.openNextChildElement()) {
String n = reader.getElementName();
switch (n) {
case "page-width":
pageWidth = Parser.parseFloatNull(reader.getText());
break;
case "page-height":
pageHeight = Parser.parseFloatNull(reader.getText());
break;
case "page-margins":
pageMargins.add(MxlPageMargins.read(reader));
break;
}
reader.closeElement();
}
Size2f pageSize = (pageWidth == null && pageHeight == null ? null : new Size2f(pageWidth, pageHeight));
return new MxlPageLayout(pageSize, pageMargins);
}
public void write(XmlWriter writer) {
writer.writeElementStart(elemName);
if (pageSize != null) {
writer.writeElementText("page-width", pageSize.width);
writer.writeElementText("page-height", pageSize.height);
}
for (MxlPageMargins item : pageMargins)
item.write(writer);
writer.writeElementEnd();
}
}