package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array;
import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays;
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.kotcrab.vis.ui.widget.file.FileChooser;
import com.kotcrab.vis.ui.widget.file.FileChooserAdapter;
import com.kotcrab.vis.ui.widget.file.FileChooserListener;
/** See {@link FileChooser#setListener(FileChooserListener)}. Attribute expects a reference to a method that consumes a
* single {@link FileHandle} or an {@link Array} of files. If the file chooser is cancelled, file handle-consuming
* method will receive null; array-consuming method will receive empty array. Mapped to "listener",
* "fileChooserListener".
*
* @author MJ */
public class FileChooserListenerLmlAttribute implements LmlAttribute<FileChooser> {
@Override
public Class<FileChooser> getHandledType() {
return FileChooser.class;
}
@Override
public void process(final LmlParser parser, final LmlTag tag, final FileChooser actor,
final String rawAttributeData) {
addFileChooserListener(parser, rawAttributeData, actor);
}
/** @param parser parses the attribute.
* @param rawAttributeData attribute value.
* @param fileChooser will have a listener set. */
protected static void addFileChooserListener(final LmlParser parser, final String rawAttributeData,
final FileChooser fileChooser) {
final ActorConsumer<?, FileHandle> action = parser.parseAction(rawAttributeData, MockUpFileHandle.INSTANCE);
if (action != null) {
// Handling single file:
fileChooser.setMultiSelectionEnabled(false);
fileChooser.setListener(new FileChooserAdapter() {
@Override
public void selected(final Array<FileHandle> file) {
if (GdxArrays.isNotEmpty(file)) {
action.consume(file.first());
}
}
@Override
public void canceled() {
action.consume(null);
}
});
} else {
// Handling multiple files:
final ActorConsumer<?, Array<FileHandle>> directoryAction = parser.parseAction(rawAttributeData,
MockUpFileHandle.EMPTY_ARRAY);
if (directoryAction == null) {
parser.throwError(
"File chooser attribute needs a reference to an action consuming a FileHandle or Array<FileHandle>. Action not found for: "
+ rawAttributeData);
}
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setListener(new FileChooserListener() {
@Override
public void selected(final Array<FileHandle> files) {
directoryAction.consume(files);
}
@Override
public void canceled() {
directoryAction.consume(GdxArrays.newArray(FileHandle.class));
}
});
}
}
}