package com.github.czyzby.lml.vis.parser.impl.tag;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.github.czyzby.kiwi.util.common.Strings;
import com.github.czyzby.lml.parser.LmlParser;
import com.github.czyzby.lml.parser.impl.tag.actor.ButtonLmlTag;
import com.github.czyzby.lml.parser.impl.tag.builder.TextLmlActorBuilder;
import com.github.czyzby.lml.parser.tag.LmlActorBuilder;
import com.github.czyzby.lml.parser.tag.LmlTag;
import com.github.czyzby.lml.vis.parser.impl.tag.builder.MenuItemLmlActorBuilder;
import com.kotcrab.vis.ui.widget.MenuItem;
import com.kotcrab.vis.ui.widget.MenuItem.MenuItemStyle;
/** Handles {@link MenuItem} actors. Similarly to image text button tags, menu items can handle both image and label
* attributes, which are used to modify its internal widgets. Appends plain text between tags to its label. Can have
* only {@link MenuPopupLmlTag} children. Should generally have a change listener attached. Mapped to "menuItem",
* "item".
*
* @author MJ */
public class MenuItemLmlTag extends ButtonLmlTag {
public MenuItemLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) {
super(parser, parentTag, rawTagData);
}
@Override
protected TextLmlActorBuilder getNewInstanceOfBuilder() {
return new MenuItemLmlActorBuilder();
}
@Override
protected final Actor getNewInstanceOfActor(final LmlActorBuilder builder) {
final MenuItemLmlActorBuilder menuItemBuilder = (MenuItemLmlActorBuilder) builder;
final Skin skin = getSkin(builder);
final MenuItemStyle style = skin.get(builder.getStyleName(), MenuItemStyle.class);
if (menuItemBuilder.getImage() == null) {
// No icon specified: passing null image:
return new MenuItem(menuItemBuilder.getText(), (Image) null, style);
}
// Icon specified: passing chosen drawable:
return new MenuItem(menuItemBuilder.getText(), skin.getDrawable(menuItemBuilder.getImage()), style);
}
@Override
protected void handleValidChild(final LmlTag childTag) {
getParser().throwErrorIfStrict("Menu items cannot handle children tags other than sub-menus. Found child: "
+ childTag.getTagName() + " with actor: " + childTag.getActor());
// Non-strict parser will append any child:
super.handleValidChild(childTag);
}
@Override
protected void handlePlainTextLine(final String plainTextLine) {
final MenuItem item = getMenuItem();
final String textToAppend = getParser().parseString(plainTextLine, getActor());
if (Strings.isEmpty(item.getText())) {
item.setText(textToAppend);
} else {
item.setText(item.getText().toString() + textToAppend);
}
}
/** @return casted actor. */
protected MenuItem getMenuItem() {
return (MenuItem) getActor();
}
@Override
protected boolean hasComponentActors() {
return true;
}
@Override
protected Actor[] getComponentActors(final Actor actor) {
final MenuItem item = (MenuItem) actor;
if (item.getImage() != null) {
return new Actor[] { item.getLabel(), item.getImage() };
}
// Label is never null:
return new Actor[] { item.getLabel() };
}
}