package org.robobinding.viewattribute.grouped;
import org.robobinding.attribute.PropertyAttributeParser;
import org.robobinding.attribute.ValueModelAttribute;
import org.robobinding.viewattribute.event.EventViewAttributeBinder;
import org.robobinding.viewattribute.event.EventViewAttributeBinderFactory;
import org.robobinding.viewattribute.event.EventViewAttributeFactory;
import org.robobinding.viewattribute.property.MultiTypePropertyViewAttributeBinder;
import org.robobinding.viewattribute.property.MultiTypePropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.OneWayMultiTypePropertyViewAttribute;
import org.robobinding.viewattribute.property.OneWayMultiTypePropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.OneWayMultiTypePropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.OneWayPropertyViewAttribute;
import org.robobinding.viewattribute.property.OneWayPropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.OneWayPropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.PropertyViewAttributeBinder;
import org.robobinding.viewattribute.property.PropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttribute;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttribute;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttributeBinderFactory;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttributeFactory;
import org.robobinding.widgetaddon.ViewAddOnInjector;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Cheng Wei
*/
public class ViewAttributeBinderFactory {
private final Object view;
private final PropertyAttributeParser propertyAttributeParser;
private final GroupAttributesResolver groupAttributesResolver;
private final ViewAddOnInjector viewAddOnInjector;
public ViewAttributeBinderFactory(Object view, PropertyAttributeParser propertyAttributeParser,
GroupAttributesResolver groupAttributesResolver, ViewAddOnInjector viewAddOnInjector) {
this.view = view;
this.propertyAttributeParser = propertyAttributeParser;
this.groupAttributesResolver = groupAttributesResolver;
this.viewAddOnInjector = viewAddOnInjector;
}
public PropertyViewAttributeBinderFactory binderFactoryFor(OneWayPropertyViewAttributeFactory<?> factory) {
return new PropertyViewAttributeBinderFactory(new OneWayPropertyViewAttributeBinderFactory(factory, viewAddOnInjector),
propertyAttributeParser);
}
public PropertyViewAttributeBinderFactory binderFactoryFor(TwoWayPropertyViewAttributeFactory<?> factory) {
return new PropertyViewAttributeBinderFactory(new TwoWayPropertyViewAttributeBinderFactory(factory, viewAddOnInjector),
propertyAttributeParser);
}
public MultiTypePropertyViewAttributeBinderFactory binderFactoryFor(OneWayMultiTypePropertyViewAttributeFactory<?> factory) {
return new MultiTypePropertyViewAttributeBinderFactory(
new OneWayMultiTypePropertyViewAttributeBinderFactory(factory, viewAddOnInjector),
propertyAttributeParser);
}
public MultiTypePropertyViewAttributeBinderFactory binderFactoryFor(TwoWayMultiTypePropertyViewAttributeFactory<?> factory) {
return new MultiTypePropertyViewAttributeBinderFactory(
new TwoWayMultiTypePropertyViewAttributeBinderFactory(factory, viewAddOnInjector),
propertyAttributeParser);
}
public EventViewAttributeBinderFactory binderFactoryFor(EventViewAttributeFactory<?> factory) {
return new EventViewAttributeBinderFactory(viewAddOnInjector, factory);
}
public GroupedViewAttributeBinderFactory binderFactoryFor(GroupedViewAttributeFactory<?> factory) {
return new GroupedViewAttributeBinderFactory(factory, groupAttributesResolver, this);
}
public PropertyViewAttributeBinder binderFor(final OneWayPropertyViewAttribute<?, ?> viewAttribute,
ValueModelAttribute attribute) {
return binderFor(new OneWayPropertyViewAttributeFactory<Object>() {
@SuppressWarnings("unchecked")
@Override
public OneWayPropertyViewAttribute<Object, ?> create() {
return (OneWayPropertyViewAttribute<Object, ?>)viewAttribute;
}
}, attribute);
}
public PropertyViewAttributeBinder binderFor(OneWayPropertyViewAttributeFactory<?> factory,
ValueModelAttribute attribute) {
PropertyViewAttributeBinderFactory binderFactory = binderFactoryFor(factory);
return binderFactory.create(view, attribute);
}
public PropertyViewAttributeBinder binderFor(final TwoWayPropertyViewAttribute<?, ?, ?> viewAttribute,
ValueModelAttribute attribute) {
return binderFor(new TwoWayPropertyViewAttributeFactory<Object>() {
@SuppressWarnings("unchecked")
@Override
public TwoWayPropertyViewAttribute<Object, ?, ?> create() {
return (TwoWayPropertyViewAttribute<Object, ?, ?>)viewAttribute;
}
}, attribute);
}
public PropertyViewAttributeBinder binderFor(TwoWayPropertyViewAttributeFactory<?> factory,
ValueModelAttribute attribute) {
PropertyViewAttributeBinderFactory binderFactory = binderFactoryFor(factory);
return binderFactory.create(view, attribute);
}
public MultiTypePropertyViewAttributeBinder binderFor(final OneWayMultiTypePropertyViewAttribute<?> viewAttribute,
ValueModelAttribute attribute) {
return binderFor(new OneWayMultiTypePropertyViewAttributeFactory<Object>() {
@SuppressWarnings("unchecked")
@Override
public OneWayMultiTypePropertyViewAttribute<Object> create() {
return (OneWayMultiTypePropertyViewAttribute<Object>)viewAttribute;
}
}, attribute);
}
public MultiTypePropertyViewAttributeBinder binderFor(
OneWayMultiTypePropertyViewAttributeFactory<?> factory, ValueModelAttribute attribute) {
MultiTypePropertyViewAttributeBinderFactory binderFactory = binderFactoryFor(factory);
return binderFactory.create(view, attribute);
}
public MultiTypePropertyViewAttributeBinder binderFor(final TwoWayMultiTypePropertyViewAttribute<?> viewAttribute,
ValueModelAttribute attribute) {
return binderFor(new TwoWayMultiTypePropertyViewAttributeFactory<Object>() {
@SuppressWarnings("unchecked")
@Override
public TwoWayMultiTypePropertyViewAttribute<Object> create() {
return (TwoWayMultiTypePropertyViewAttribute<Object>)viewAttribute;
}
}, attribute);
}
public MultiTypePropertyViewAttributeBinder binderFor(
TwoWayMultiTypePropertyViewAttributeFactory<?> factory, ValueModelAttribute attribute) {
MultiTypePropertyViewAttributeBinderFactory binderFactory = binderFactoryFor(factory);
return binderFactory.create(view, attribute);
}
public EventViewAttributeBinder binderFor(EventViewAttributeFactory<?> factory, String attributeName,
String attributeValue) {
EventViewAttributeBinderFactory binderFactory = binderFactoryFor(factory);
return binderFactory.create(view, attributeName, attributeValue);
}
}