package org.robobinding.widget.adapterview; import static org.robobinding.attribute.ChildAttributeResolvers.staticResourceAttributeResolver; import static org.robobinding.attribute.ChildAttributeResolvers.valueModelAttributeResolver; import org.robobinding.BindingContext; import org.robobinding.attribute.ChildAttributeResolverMappings; import org.robobinding.attribute.ResolvedGroupAttributes; import org.robobinding.viewattribute.grouped.ChildViewAttribute; import org.robobinding.viewattribute.grouped.ChildViewAttributeFactory; import org.robobinding.viewattribute.grouped.ChildViewAttributesBuilder; import org.robobinding.viewattribute.grouped.GroupedViewAttribute; import org.robobinding.widget.view.AbstractVisibility; import org.robobinding.widget.view.VisibilityAttributeFactory; import org.robobinding.widget.view.VisibilityFactory; import android.view.View; import android.widget.AdapterView; /** * * @since 1.0 * @version $Revision: 1.0 $ * @author Cheng Wei */ public class SubViewAttributes<T extends AdapterView<?>> implements GroupedViewAttribute<T>, SubViewHolder { private View subView; private SubViewAttributesStrategy<T> subViewAttributesStrategy; public SubViewAttributes(SubViewAttributesStrategy<T> subViewAttributesStrategy) { this.subViewAttributesStrategy = subViewAttributesStrategy; } @Override public String[] getCompulsoryAttributes() { return new String[] { layoutAttribute() }; } @Override public void mapChildAttributeResolvers(ChildAttributeResolverMappings resolverMappings) { resolverMappings.map(staticResourceAttributeResolver(), layoutAttribute()); resolverMappings.map(valueModelAttributeResolver(), subViewPresentationModel()); resolverMappings.map(valueModelAttributeResolver(), visibilityAttribute()); } @Override public void validateResolvedChildAttributes(ResolvedGroupAttributes groupAttributes) { } @Override public void setupChildViewAttributes(T view, ChildViewAttributesBuilder<T> childViewAttributesBuilder) { childViewAttributesBuilder.failOnFirstBindingError(); SubViewLayoutAttribute subViewLayoutAttribute = new SubViewLayoutAttribute(); childViewAttributesBuilder.add(layoutAttribute(), subViewLayoutAttribute); boolean hasSubViewPresentationModel = childViewAttributesBuilder.hasAttribute(subViewPresentationModel()); childViewAttributesBuilder.addDependent(subViewPresentationModel(), new SubViewAttributeFactory(view, subViewLayoutAttribute, hasSubViewPresentationModel)); if (childViewAttributesBuilder.hasAttribute(visibilityAttribute())) { childViewAttributesBuilder.add(visibilityAttribute(), new VisibilityAttributeFactory<T>(new SubViewVisibilityFactory())); } } @Override public void postBind(T view, BindingContext bindingContext) { subViewAttributesStrategy.addSubView(view, subView, bindingContext.getContext()); } private String visibilityAttribute() { return subViewAttributesStrategy.visibilityAttribute(); } private String subViewPresentationModel() { return subViewAttributesStrategy.subViewPresentationModelAttribute(); } private String layoutAttribute() { return subViewAttributesStrategy.layoutAttribute(); } @Override public void setSubView(View subView) { this.subView = subView; } private class SubViewAttributeFactory implements ChildViewAttributeFactory { private final T view; private final SubViewLayoutAttribute subViewLayoutAttribute; private final boolean hasSubViewPresentationModel; public SubViewAttributeFactory(T view, SubViewLayoutAttribute subViewLayoutAttribute, boolean hasSubViewPresentationModel) { this.view = view; this.subViewLayoutAttribute = subViewLayoutAttribute; this.hasSubViewPresentationModel = hasSubViewPresentationModel; } @Override public ChildViewAttribute create() { int layoutId = subViewLayoutAttribute.getLayoutId(); return hasSubViewPresentationModel ? new SubViewPresentationModelAttribute(view, layoutId, SubViewAttributes.this) : new SubViewWithoutPresentationModelAttribute(view, layoutId, SubViewAttributes.this); } } private class SubViewVisibilityFactory implements VisibilityFactory<T> { public AbstractVisibility create(T view) { return subViewAttributesStrategy.createVisibility(view, subView); } } }