package com.github.czyzby.autumn.mvc.component.ui.processor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.reflect.Field;
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.component.ui.controller.impl.AbstractAnnotatedController;
import com.github.czyzby.autumn.mvc.stereotype.ViewStage;
import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor;
/** Used to process fields that should have {@link com.badlogic.gdx.scenes.scene2d.Stage} injected.
*
* @author MJ */
public class ViewStageAnnotationProcessor extends AbstractAnnotationProcessor<ViewStage> {
@Inject private InterfaceService interfaceService;
@Override
public Class<ViewStage> getSupportedAnnotationType() {
return ViewStage.class;
}
@Override
public boolean isSupportingFields() {
return true;
}
@Override
public void processField(final Field field, final ViewStage annotation, final Object component,
final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) {
if (!Stage.class.equals(field.getType())) {
throw new GdxRuntimeException("Only Scene2D stages can be annotated with @ViewStage. Found type:"
+ field.getType() + " in field: " + field + " of component: " + component + ".");
}
final Class<?> controllerClass = field.getDeclaringClass();
if (!registerField(field, interfaceService.getController(controllerClass))) {
// If view controller not found, trying out dialog controllers:
if (!registerField(field, interfaceService.getDialogController(controllerClass))) {
throw new GdxRuntimeException(
"Unable to assign stage in field: " + field + " of component: " + component + ".");
}
}
}
private static boolean registerField(final Field field, final Object controller) {
if (controller instanceof AbstractAnnotatedController) {
((AbstractAnnotatedController) controller).registerStageField(field);
return true;
}
return false;
}
}