package com.github.czyzby.autumn.mvc.component.ui.processor;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.reflect.Field;
import com.badlogic.gdx.utils.reflect.ReflectionException;
import com.badlogic.gdx.utils.viewport.Viewport;
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.ui.InterfaceService;
import com.github.czyzby.autumn.mvc.stereotype.preference.StageViewport;
import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor;
import com.github.czyzby.kiwi.util.gdx.asset.lazy.provider.ObjectProvider;
import com.github.czyzby.kiwi.util.gdx.reflection.Reflection;
/** Used to scan for viewport provider.
*
* @author MJ */
public class StageViewportAnnotationProcessor extends AbstractAnnotationProcessor<StageViewport> {
@Inject private InterfaceService interfaceService;
@Override
public Class<StageViewport> getSupportedAnnotationType() {
return StageViewport.class;
}
@Override
public boolean isSupportingFields() {
return true;
}
@Override
public void processField(final Field field, final StageViewport annotation, final Object component,
final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) {
try {
final Object provider = Reflection.getFieldValue(field, component);
setViewportProvider(provider);
} catch (final ReflectionException exception) {
throw new GdxRuntimeException("Unable to extract viewport provider.", exception);
}
}
@SuppressWarnings("unchecked")
private void setViewportProvider(final Object provider) {
if (provider instanceof ObjectProvider<?>) {
interfaceService.setViewportProvider((ObjectProvider<Viewport>) provider);
return;
}
throw new GdxRuntimeException(
"Invalid viewport provider: has to implement ObjectProvider<Viewport>: " + provider);
}
@Override
public boolean isSupportingTypes() {
return true;
}
@Override
public void processType(final Class<?> type, final StageViewport annotation, final Object component,
final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) {
setViewportProvider(component);
}
}