package com.github.czyzby.autumn.mvc.component.i18n.processor; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.reflect.Field; import com.badlogic.gdx.utils.reflect.ReflectionException; import com.github.czyzby.autumn.annotation.Inject; 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.i18n.LocaleService; import com.github.czyzby.autumn.mvc.component.i18n.dto.LocaleChangingAction; import com.github.czyzby.autumn.mvc.component.ui.InterfaceService; import com.github.czyzby.autumn.mvc.stereotype.preference.AvailableLocales; import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor; import com.github.czyzby.kiwi.util.gdx.reflection.Reflection; import com.github.czyzby.lml.parser.LmlParser; /** Used to scan for preferences of available game translations. * * @author MJ */ public class AvailableLocalesAnnotationProcessor extends AbstractAnnotationProcessor<AvailableLocales> { @Inject private InterfaceService interfaceService; @Inject private LocaleService localeService; @Override public Class<AvailableLocales> getSupportedAnnotationType() { return AvailableLocales.class; } @Override public boolean isSupportingFields() { return true; } @Override public void processField(final Field field, final AvailableLocales annotation, final Object component, final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) { try { final Object locales = Reflection.getFieldValue(field, component); if (locales instanceof String[]) { final String[] availableLocales = (String[]) locales; final LmlParser parser = interfaceService.getParser(); parser.getData().addArgument(annotation.viewArgumentName(), availableLocales); for (final String locale : availableLocales) { parser.getData().addActorConsumer(annotation.localeChangeMethodPrefix() + locale, new LocaleChangingAction(localeService, LocaleService.toLocale(locale))); } return; } throw new GdxRuntimeException("Invalid field annotated with @AvailableLocales in component " + component + ". Expected String[], received: " + locales + "."); } catch (final ReflectionException exception) { throw new GdxRuntimeException( "Unable to read available locales from field: " + field + " of component: " + component + ".", exception); } } }