package com.github.czyzby.lml.parser.impl.tag.actor; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Tooltip; import com.badlogic.gdx.scenes.scene2d.ui.TooltipManager; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlParserListener; import com.github.czyzby.lml.parser.impl.tag.builder.TooltipLmlActorBuilder; import com.github.czyzby.lml.parser.tag.LmlActorBuilder; import com.github.czyzby.lml.parser.tag.LmlTag; import com.github.czyzby.lml.scene2d.ui.reflected.TooltipTable; import com.github.czyzby.lml.util.LmlParsingException; /** Handles {@link Tooltip} listener represented by a {@link TooltipTable} actor. Handles and appends children like a * table - its tag can contain any table attributes, and its children's tag can have cell attributes and will be * properly handled. Attached to its parent tag above it. Mapped to "tooltip". * * @author MJ */ public class TooltipLmlTag extends TableLmlTag implements LmlParserListener { private Tooltip<TooltipTable> tooltip; public TooltipLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { super(parser, parentTag, rawTagData); } @Override protected TooltipLmlActorBuilder getNewInstanceOfBuilder() { return new TooltipLmlActorBuilder(); } @Override protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) { final TooltipManager manager = getTooltipManager((TooltipLmlActorBuilder) builder); final TooltipTable table = TooltipTable.create(getSkin(builder), manager); tooltip = table.getTooltip(); return table; } /** @return {@link Tooltip} instance wrapped with the {@link TooltipTable}. */ @Override public Object getManagedObject() { return tooltip; } /** @param builder contains tooltip building data. * @return an instance of tooltip manager with the ID selected by the builder or default tooltip manager. * @throws LmlParsingException if parser is strict and the ID is invalid. */ protected TooltipManager getTooltipManager(final TooltipLmlActorBuilder builder) { TooltipManager manager = getParser().getData().getTooltipManager(builder.getTooltipManager()); if (manager == null) { getParser().throwErrorIfStrict("Could not find tooltip manager for name: " + builder.getTooltipManager()); manager = TooltipManager.getInstance(); } return manager; } @Override public boolean isAttachable() { return true; } @Override public void attachTo(final LmlTag tag) { attachTooltip(tag.getActor()); } /** @param actor will have the tooltip attached. */ protected void attachTooltip(final Actor actor) { actor.addListener(tooltip); } /** @return managed instance of tooltip. */ public Tooltip<TooltipTable> getTooltip() { return tooltip; } @Override protected void doOnTagClose() { super.doOnTagClose(); final String[] ids = tooltip.getActor().getIds(); if (ids != null && ids.length > 0) { getParser().doAfterParsing(this); } } @Override public boolean onEvent(final LmlParser parser, final Array<Actor> parsingResult) { final ObjectMap<String, Actor> actorsByIds = parser.getActorsMappedByIds(); final boolean keep = tooltip.getActor().isKept(); for (final String id : tooltip.getActor().getIds()) { final Actor actor = actorsByIds.get(id); if (actor != null) { attachTooltip(actor); } else if (!keep) { parser.throwErrorIfStrict("Unknown ID: '" + id + "'. Cannot attach tooltip."); } } return keep; } }