package com.github.czyzby.lml.vis.parser.impl.attribute.spinner; import java.math.BigDecimal; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.action.ActorConsumer; import com.github.czyzby.lml.parser.tag.LmlAttribute; import com.github.czyzby.lml.parser.tag.LmlTag; import com.github.czyzby.lml.util.LmlUtilities; import com.kotcrab.vis.ui.widget.spinner.ArraySpinnerModel; import com.kotcrab.vis.ui.widget.spinner.FloatSpinnerModel; import com.kotcrab.vis.ui.widget.spinner.IntSpinnerModel; import com.kotcrab.vis.ui.widget.spinner.SimpleFloatSpinnerModel; import com.kotcrab.vis.ui.widget.spinner.Spinner; import com.kotcrab.vis.ui.widget.spinner.SpinnerModel; /** In case of numeric spinners, this attribute allows to set the initial value. In case of array spinners, this marks * the index of the value that should be selected first. In case of numeric spinners, "value" attribute is preferred, as * it will use model's constructor: use this attribute only if you need to invoke a method that consumes spinner * instance. Mapped to "selected". * * @author MJ */ public class SpinnerSelectedLmlAttribute implements LmlAttribute<Spinner> { @Override public Class<Spinner> getHandledType() { return Spinner.class; } @Override public void process(final LmlParser parser, final LmlTag tag, final Spinner actor, final String rawAttributeData) { LmlUtilities.getLmlUserObject(actor).addOnCloseAction(new ActorConsumer<Void, Object>() { @Override public Void consume(final Object spinner) { final SpinnerModel model = actor.getModel(); if (model instanceof IntSpinnerModel) { ((IntSpinnerModel) model).setValue(parser.parseInt(rawAttributeData, actor), false); } else if (model instanceof FloatSpinnerModel) { try { ((FloatSpinnerModel) model) .setValue(new BigDecimal(parser.parseString(rawAttributeData, actor)), false); } catch (final NumberFormatException exception) { parser.throwErrorIfStrict("Invalid numeric value: " + rawAttributeData, exception); } } else if (model instanceof SimpleFloatSpinnerModel) { ((SimpleFloatSpinnerModel) model).setValue(parser.parseFloat(rawAttributeData, actor), false); } else if (model instanceof ArraySpinnerModel<?>) { ((ArraySpinnerModel<?>) model).setCurrent(parser.parseInt(rawAttributeData, actor), false); } else { parser.throwErrorIfStrict("Unknown model: " + model + ". Unable to select value."); } actor.notifyValueChanged(false); return null; } }); } }