package org.robobinding.viewattribute.property;
import org.robobinding.attribute.ValueModelAttribute;
import org.robobinding.viewattribute.property.MultiTypePropertyViewAttributeBinderFactory.Implementor;
import org.robobinding.widgetaddon.ViewAddOns;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Cheng Wei
*/
public class TwoWayMultiTypePropertyViewAttributeBinderFactory implements Implementor {
private final TwoWayMultiTypePropertyViewAttributeFactory<Object> factory;
private final ViewAddOns viewAddOns;
@SuppressWarnings("unchecked")
public TwoWayMultiTypePropertyViewAttributeBinderFactory(
TwoWayMultiTypePropertyViewAttributeFactory<?> multiTypeViewAttribute,
ViewAddOns viewAddOns) {
this.factory = (TwoWayMultiTypePropertyViewAttributeFactory<Object>)multiTypeViewAttribute;
this.viewAddOns = viewAddOns;
}
@Override
public MultiTypePropertyViewAttributeBinder create(Object view, ValueModelAttribute attribute) {
PropertyViewAttributeBinderProvider binderProvider = new TwoWayPropertyViewAttributeBinderProvider(
view, factory.create(), attribute, viewAddOns);
return new MultiTypePropertyViewAttributeBinder(binderProvider, attribute);
}
private static class TwoWayPropertyViewAttributeBinderProvider extends AbstractTwoWayPropertyViewAttributeBinderFactory
implements PropertyViewAttributeBinderProvider {
private final Object view;
private final TwoWayMultiTypePropertyViewAttribute<Object> multiTypeViewAttribute;
private final ValueModelAttribute attribute;
public TwoWayPropertyViewAttributeBinderProvider(Object view,
TwoWayMultiTypePropertyViewAttribute<Object> multiTypeViewAttribute,
ValueModelAttribute attribute,
ViewAddOns viewAddOns) {
super(viewAddOns);
this.view = view;
this.multiTypeViewAttribute = multiTypeViewAttribute;
this.attribute = attribute;
}
@Override
public PropertyViewAttributeBinder create(Class<?> propertyType) {
TwoWayPropertyViewAttribute<Object, ?, ?> viewAttribute = multiTypeViewAttribute.create(view, propertyType);
if(viewAttribute == null) {
return null;
}
return create(view, viewAttribute, attribute);
}
}
}