package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.validator; import java.io.File; import com.badlogic.gdx.scenes.scene2d.Actor; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.tag.LmlAttribute; import com.github.czyzby.lml.parser.tag.LmlTag; import com.kotcrab.vis.ui.util.form.FormValidator.FileExistsValidator; import com.kotcrab.vis.ui.widget.VisTextField; /** See {@link FileExistsValidator#setRelativeToFile(File)} and * {@link FileExistsValidator#setRelativeToTextField(VisTextField)}. Can handle both text field references and file * paths. Expects an ID of a {@link VisTextField} parsed BEFORE validator tag appears (as in: text field's tag was * already closed when validator's tag was opened). If text field is not found, it is assumed that the passed attribute * data is a path to a file. A new {@link File} is created with {@link File#File(String)} constructor and passed to the * validator with {@link FileExistsValidator#setRelativeToFile(File)}. Mapped to "relativeTo". * * @author MJ */ public class RelativeToFileLmlAttribute implements LmlAttribute<FileExistsValidator> { @Override public Class<FileExistsValidator> getHandledType() { return FileExistsValidator.class; } @Override public void process(final LmlParser parser, final LmlTag tag, final FileExistsValidator actor, final String rawAttributeData) { final String fileId = parser.parseString(rawAttributeData, actor); if (parser.getActorsMappedByIds().containsKey(fileId)) { final Actor relative = parser.getActorsMappedByIds().get(fileId); if (relative instanceof VisTextField) { actor.setRelativeToTextField((VisTextField) relative); } else { parser.throwErrorIfStrict("Relative file attribute found ID: " + fileId + " referencing another actor: " + relative + ", but he does not extend VisTextField."); } } actor.setRelativeToFile(new File(fileId)); } }