package com.github.czyzby.lml.parser.impl.tag.actor;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays;
import com.github.czyzby.lml.parser.LmlParser;
import com.github.czyzby.lml.parser.impl.tag.AbstractActorLmlTag;
import com.github.czyzby.lml.parser.tag.LmlActorBuilder;
import com.github.czyzby.lml.parser.tag.LmlTag;
/** Handles {@link SelectBox} actor. Like the List widget it wraps, select box can handle only string data. Converts
* label and text button children to items by extracting their text; does not accept any other child tags. Appends plain
* text lines between tags as its items. Mapped to "selectBox".
*
* @author MJ */
public class SelectBoxLmlTag extends AbstractActorLmlTag {
public SelectBoxLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) {
super(parser, parentTag, rawTagData);
}
@Override
protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) {
return new SelectBox<String>(getSkin(builder), builder.getStyleName());
}
@Override
protected void handlePlainTextLine(final String plainTextLine) {
addChild(getParser().parseString(plainTextLine, getActor()));
}
/** @param child will be appended to the select box. */
protected void addChild(final String child) {
getSelectBox().getItems().add(child);
}
@SuppressWarnings("unchecked")
private SelectBox<String> getSelectBox() {
return (SelectBox<String>) getActor();
}
@Override
protected void handleValidChild(final LmlTag childTag) {
if (childTag.getActor() instanceof Label) {
addChild(((Label) childTag.getActor()).getText().toString());
} else if (childTag.getActor() instanceof TextButton) {
addChild(((TextButton) childTag.getActor()).getText().toString());
} else {
getParser().throwErrorIfStrict(
"Select boxes can handle only text based children: Label and TextButton. Received child: "
+ childTag.getTagName() + " with actor: " + childTag.getActor());
}
}
@Override
protected void doOnTagClose() {
// Forcing items update:
getSelectBox().setItems(GdxArrays.newArray(getSelectBox().getItems()));
}
@Override
protected boolean hasComponentActors() {
return true;
}
@Override
protected Actor[] getComponentActors(final Actor actor) {
@SuppressWarnings("unchecked") final SelectBox<String> selectBox = (SelectBox<String>) actor;
return new Actor[] { selectBox.getList(), selectBox.getScrollPane() };
}
}