package com.github.czyzby.lml.parser.impl.tag.actor;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.SplitPane;
import com.github.czyzby.lml.parser.LmlParser;
import com.github.czyzby.lml.parser.impl.tag.AbstractActorLmlTag;
import com.github.czyzby.lml.parser.impl.tag.builder.AlignedLmlActorBuilder;
import com.github.czyzby.lml.parser.tag.LmlActorBuilder;
import com.github.czyzby.lml.parser.tag.LmlTag;
/** Handles {@link SplitPane} actor. Can manage two children - they will be set as the first and second managed widgets
* in order in which they appeared in the template. Converts plain text between its tags to a label and assumes it is
* one of its actors to manage. Mapped to "splitPane".
*
* @author MJ */
public class SplitPaneLmlTag extends AbstractActorLmlTag {
private int appendedActors;
public SplitPaneLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) {
super(parser, parentTag, rawTagData);
}
@Override
protected AlignedLmlActorBuilder getNewInstanceOfBuilder() {
return new AlignedLmlActorBuilder();
}
@Override
protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) {
final AlignedLmlActorBuilder alignedBuilder = (AlignedLmlActorBuilder) builder;
return new SplitPane(null, null, alignedBuilder.isVertical(), getSkin(builder), alignedBuilder.getStyleName());
}
@Override
protected void handleValidChild(final LmlTag childTag) {
setSplitPaneChild(childTag.getActor());
}
/** @param child will be set as the first or the second widget, according to how many widgets were added before. */
protected void setSplitPaneChild(final Actor child) {
if (appendedActors == 0) {
getSplitPane().setFirstWidget(child);
} else if (appendedActors == 1) {
getSplitPane().setSecondWidget(child);
} else {
getParser().throwErrorIfStrict("Split pane can have only 2 children.");
appendedActors = 0; // If not strict and for some reason we got here, let's pretend nothing happened.
setSplitPaneChild(child);
}
appendedActors++;
if (!getParser().isStrict()) {
// If parser is not strict, more than 2 children can be appended. They will just override previous children.
appendedActors %= 2;
}
}
/** @return casted widget. */
protected SplitPane getSplitPane() {
return (SplitPane) getActor();
}
@Override
protected void handlePlainTextLine(final String plainTextLine) {
setSplitPaneChild(toLabel(plainTextLine));
}
}