package com.github.czyzby.lml.parser.impl.attribute.listener; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.utils.IntSet; import com.github.czyzby.kiwi.util.common.Strings; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.impl.tag.AbstractListenerLmlTag; import com.github.czyzby.lml.parser.impl.tag.listener.InputListenerLmlTag; import com.github.czyzby.lml.scene2d.ui.reflected.ActorStorage; /** See {@link InputListenerLmlTag#addKey(int)}. Expends an array of key names matching values returned by * {@link Keys#toString(int)} or actual, exact int values of key codes. Mapped to "keys". * * @author MJ */ public class ListenerKeysLmlAttribute extends AbstractListenerLmlAttribute { @Override protected void process(final LmlParser parser, final AbstractListenerLmlTag tag, final ActorStorage actor, final String rawAttributeData) { if (!(tag instanceof InputListenerLmlTag)) { parser.throwErrorIfStrict("'keys' attribute can be used only for input listeners."); return; } final IntSet keys = ((InputListenerLmlTag) tag).getKeys(); processKeysAttribute(parser, actor, rawAttributeData, keys); } /** Utility. * * @param parser parses template. * @param actor contains the listener. * @param rawAttributeData unparsed attribute data. * @param keys handled keys set. */ public static void processKeysAttribute(final LmlParser parser, final Actor actor, final String rawAttributeData, final IntSet keys) { final String[] keyNames = parser.parseArray(rawAttributeData, actor); for (final String keyName : keyNames) { final int key = Keys.valueOf(keyName); if (key <= Keys.UNKNOWN) { if (Strings.isInt(keyName)) { keys.add(Integer.parseInt(keyName)); } else { parser.throwErrorIfStrict("Unable to determine key for name: " + keyName + ". Note that key name should match the EXACT name from Keys class (see Keys#valueOf(String)) or be the desired int value of key code."); } } else { keys.add(key); } } } }