package org.robobinding; import org.robobinding.function.Function; import org.robobinding.presentationmodel.PresentationModelAdapter; import org.robobinding.property.DataSetValueModel; import org.robobinding.property.ValueModel; import android.content.Context; import android.view.View; import android.view.ViewGroup; /** * * @since 1.0 * @version $Revision: 1.0 $ * @author Cheng Wei */ public class BindingContext { private final BinderProvider binderProvider; private final Context context; private final PresentationModelAdapter presentationModelAdapter; private final PreInitializingViews preInitializeViews; public BindingContext(BinderProvider binderProvider, Context context, PresentationModelAdapter presentationModelAdapter, PreInitializingViews preInitializeViews) { this.binderProvider = binderProvider; this.context = context; this.presentationModelAdapter = presentationModelAdapter; this.preInitializeViews = preInitializeViews; } public Class<?> getPropertyType(String propertyName) { return presentationModelAdapter.getPropertyType(propertyName); } public <T> ValueModel<T> getReadOnlyPropertyValueModel(String propertyName) { return presentationModelAdapter.getReadOnlyPropertyValueModel(propertyName); } public <T> ValueModel<T> getPropertyValueModel(String propertyName) { return presentationModelAdapter.getPropertyValueModel(propertyName); } public Function findFunction(String functionName, Class<?>... parameterTypes) { return presentationModelAdapter.findFunction(functionName, parameterTypes); } public String getPresentationModelClassName() { return presentationModelAdapter.getPresentationModelClassName(); } public boolean shouldPreInitializeViews() { return preInitializeViews.value; } public Context getContext() { return context; } public View inflateWithoutAttachingToRoot(int layoutId, ViewGroup parent) { SubViewBinderFactory factory = createSubViewBinderFactory(); SubViewBinder viewBinder = factory.createSubViewBinder(); return viewBinder.inflateWithoutAttachingToRoot(layoutId, parent); } private SubViewBinderFactory createSubViewBinderFactory() { return new SubViewBinderFactory(binderProvider, createBindingContextFactory(preInitializeViews.withValue(preInitializeViews.defaultValue))); } private BindingContextFactory createBindingContextFactory(PreInitializingViews preInitializingViews) { return new BindingContextFactoryImpl(binderProvider, context, preInitializingViews); } public SubBindingContext navigateToSubContext(String propertyName) { Object subPresentationModel = presentationModelAdapter.getSubPresentationModelProperty(propertyName); return new SubBindingContext(createSubViewBinderFactory(), subPresentationModel); } public ItemBindingContext navigateToItemContext(String propertyName) { DataSetValueModel valueModel = presentationModelAdapter.getDataSetPropertyValueModel(propertyName); boolean itemPreInitializeViews = valueModel.preInitializingViewsWithDefault(preInitializeViews.defaultValue); return new ItemBindingContext( new ItemBinderFactory(binderProvider, createBindingContextFactory(preInitializeViews.withValue(itemPreInitializeViews))), valueModel, itemPreInitializeViews); } static class ItemBinderFactory { private final BinderProvider binderProvider; private final BindingContextFactory factory; public ItemBinderFactory(BinderProvider binderProvider, BindingContextFactory factory) { this.binderProvider = binderProvider; this.factory = factory; } public ItemBinder createItemBinder() { return binderProvider.createItemBinder(factory); } } static class SubViewBinderFactory { private final BinderProvider binderProvider; private final BindingContextFactory factory; public SubViewBinderFactory(BinderProvider binderProvider, BindingContextFactory factory) { this.binderProvider = binderProvider; this.factory = factory; } public SubViewBinder createSubViewBinder() { return binderProvider.createSubViewBinder(factory); } } }