package org.robobinding.viewattribute.property; import org.robobinding.attribute.ValueModelAttribute; import org.robobinding.widgetaddon.ViewAddOn; import org.robobinding.widgetaddon.ViewAddOns; /** * @since 1.0 * @author Cheng Wei * */ public abstract class AbstractTwoWayPropertyViewAttributeBinderFactory { private final ViewAddOns viewAddOns; public AbstractTwoWayPropertyViewAttributeBinderFactory(ViewAddOns viewAddOns) { this.viewAddOns = viewAddOns; } protected PropertyViewAttributeBinder create(Object view, TwoWayPropertyViewAttribute<?, ?, ?> viewAttribute, ValueModelAttribute attribute) { AbstractBindingProperty bindingProperty; ViewAddOn viewAddOn = viewAddOns.getMostSuitable(view); if (attribute.isTwoWayBinding()) { bindingProperty = new TwoWayBindingProperty( view, viewAddOn, viewAttribute, attribute); } else { bindingProperty = new OneWayBindingProperty(view, new OneWayPropertyViewAttributeAdapter(viewAttribute, viewAddOn), attribute); } return new PropertyViewAttributeBinder(bindingProperty, attribute.getName()); } private static class OneWayPropertyViewAttributeAdapter implements OneWayPropertyViewAttribute<Object, Object> { private final TwoWayPropertyViewAttribute<Object, ViewAddOn, Object> viewAttribute; private final ViewAddOn viewAddOn; @SuppressWarnings("unchecked") public OneWayPropertyViewAttributeAdapter(TwoWayPropertyViewAttribute<?, ?, ?> viewAttribute, ViewAddOn viewAddOn) { this.viewAttribute = (TwoWayPropertyViewAttribute<Object, ViewAddOn, Object>)viewAttribute; this.viewAddOn = viewAddOn; } @Override public void updateView(Object view, Object newValue) { viewAttribute.updateView(view, newValue, viewAddOn); } } }