package com.ftinc.scoop;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.element.Modifier;
import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.PUBLIC;
/**
* Created by r0adkll on 6/26/16.
*/
final class BindingClass {
/***********************************************************************************************
*
* Constants
*
*/
private static final ClassName TOPPING_BINDER = ClassName.get("com.ftinc.scoop.internal", "ToppingBinder");
private static final ClassName IBINDING = ClassName.get("com.ftinc.scoop.binding", "IBinding");
private static final ClassName LIST = ClassName.get("java.util", "List");
private static final ClassName ARRAY_LIST = ClassName.get("java.util", "ArrayList");
private static final ParameterizedTypeName listOfIBinding = ParameterizedTypeName.get(LIST, IBINDING);
/***********************************************************************************************
*
* Variables
*
*/
private ClassStatusBarBinding statusBarBinding;
private List<FieldViewBinding> fieldBindings;
private ClassName binderClassName;
private TypeName targetTypeName;
public BindingClass(TypeName targetTypeName, ClassName binderClassName){
this.binderClassName = binderClassName;
this.targetTypeName = targetTypeName;
fieldBindings = new ArrayList<>();
}
public void setStatusBarBinding(ClassStatusBarBinding binding){
statusBarBinding = binding;
}
public void addViewBinding(FieldViewBinding binding){
fieldBindings.add(binding);
}
public JavaFile brewJava(){
TypeSpec.Builder result = TypeSpec.classBuilder(binderClassName)
.addModifiers(PUBLIC, FINAL)
.addSuperinterface(ParameterizedTypeName.get(TOPPING_BINDER, targetTypeName));
result.addMethod(createBindMethod(targetTypeName));
return JavaFile.builder(binderClassName.packageName(), result.build())
.addFileComment("Generated code from Scoops. Do not modify!")
.build();
}
private MethodSpec createBindMethod(TypeName targetType) {
MethodSpec.Builder result = MethodSpec.methodBuilder("bind")
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.returns(listOfIBinding)
.addParameter(targetType, "target");
// Add list variable to store all generated bindings in
result.addStatement("$T bindings = new $T<>()", listOfIBinding, ARRAY_LIST);
result.addCode("\n");
// if status bar binding exists, generate statement
if(statusBarBinding != null){
statusBarBinding.brewStatement(result);
}
result.addCode("\n");
// Generate all the view bindings
for (FieldViewBinding fieldBinding : fieldBindings) {
fieldBinding.brewStatement(result);
}
result.addCode("\n")
.addStatement("return bindings");
return result.build();
}
}