package com.github.czyzby.autumn.mvc.component.ui.processor;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.reflect.Field;
import com.badlogic.gdx.utils.reflect.ReflectionException;
import com.github.czyzby.autumn.context.Context;
import com.github.czyzby.autumn.context.ContextDestroyer;
import com.github.czyzby.autumn.context.ContextInitializer;
import com.github.czyzby.autumn.mvc.component.ui.dto.SkinData;
import com.github.czyzby.autumn.mvc.stereotype.preference.Skin;
import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor;
import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps;
import com.github.czyzby.kiwi.util.gdx.reflection.Reflection;
/** Used to process annotated skin data.
*
* @author MJ */
public class SkinAnnotationProcessor extends AbstractAnnotationProcessor<Skin> {
private final ObjectMap<String, SkinData> skinsData = GdxMaps.newObjectMap();
@Override
public Class<Skin> getSupportedAnnotationType() {
return Skin.class;
}
@Override
public boolean isSupportingFields() {
return true;
}
@Override
public void processField(final Field field, final Skin annotation, final Object component, final Context context,
final ContextInitializer initializer, final ContextDestroyer contextDestroyer) {
validateFontsData(annotation);
try {
skinsData.put(annotation.value(), new SkinData(Reflection.getFieldValue(field, component).toString(),
annotation.fonts(), annotation.fontNames()));
} catch (final ReflectionException exception) {
throw new GdxRuntimeException("Unable to read skin data.", exception);
}
}
private static void validateFontsData(final Skin annotationData) {
if (annotationData.fonts().length != annotationData.fontNames().length) {
throw new GdxRuntimeException("Fonts amount specified with @Skin should match font names amount.");
}
}
/** @return all currently registered skins. */
public ObjectMap<String, SkinData> getSkinsData() {
return skinsData;
}
}