package gueei.binding.kernel; import android.app.Application; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import gueei.binding.AttributeBinder; import gueei.binding.AttributeCollection; import gueei.binding.Binder.InflateResult; import gueei.binding.BindingLog; import gueei.binding.BindingMap; import gueei.binding.IBindableView; import gueei.binding.IKernel; import gueei.binding.ISyntaxResolver; import gueei.binding.ViewAttribute; import gueei.binding.ViewFactory; import gueei.binding.ViewTag; import gueei.binding.bindingProviders.AbsSpinnerViewProvider; import gueei.binding.bindingProviders.AdapterViewProvider; import gueei.binding.bindingProviders.CompoundButtonProvider; import gueei.binding.bindingProviders.ExpandableListViewProvider; import gueei.binding.bindingProviders.ImageViewProvider; import gueei.binding.bindingProviders.ListViewProvider; import gueei.binding.bindingProviders.ProgressBarProvider; import gueei.binding.bindingProviders.RatingBarProvider; import gueei.binding.bindingProviders.SeekBarProvider; import gueei.binding.bindingProviders.TabHostProvider; import gueei.binding.bindingProviders.TextViewProvider; import gueei.binding.bindingProviders.ViewAnimatorProvider; import gueei.binding.bindingProviders.ViewProvider; import gueei.binding.exception.AttributeNotDefinedException; import gueei.binding.listeners.MulticastListenerCollection; import gueei.binding.listeners.ViewMulticastListener; public abstract class KernelBase implements IKernel { public KernelBase() { super(); } @Override public ViewAttribute<?, ?> getAttributeForView(View view, String attributeId) throws AttributeNotDefinedException { ViewAttribute<?, ?> viewAttribute = null; AttributeCollection collection = getAttributeCollectionOfView(view); if (collection.containsAttribute(attributeId)) return collection.getAttribute(attributeId); // Check if it is custom view, if so, try to look for the attribute in custom view first if (view instanceof IBindableView){ viewAttribute = ((IBindableView<?>)view).createViewAttribute(attributeId); } if (viewAttribute==null) viewAttribute = AttributeBinder.getInstance().createAttributeForView(view, attributeId); if (viewAttribute == null) throw new AttributeNotDefinedException (String.format("The view of type '%s' does not have attribute '%s' defined. ", view.getClass().getSimpleName(), attributeId)); collection.putAttribute(attributeId, viewAttribute); return viewAttribute; } @Override public ViewTag getViewTag(View view) { Object tag = view.getTag(); if (tag instanceof ViewTag){ return (ViewTag)tag; } ViewTag vtag = new ViewTag(); view.setTag(vtag); return vtag; } @Override public AttributeCollection getAttributeCollectionOfView(View view) { ViewTag vt = getViewTag(view); AttributeCollection collection = vt.get(AttributeCollection.class); if (collection!=null) return collection; collection = new AttributeCollection(); vt.put(AttributeCollection.class, collection); return collection; } @Override public void putBindingMapToView(View view, BindingMap map) { getViewTag(view).put(BindingMap.class, map); } @Override public BindingMap getBindingMapForView(View view) { if (!getViewTag(view).containsKey(BindingMap.class)){ putBindingMapToView(view, new BindingMap()); } return getViewTag(view).get(BindingMap.class); } @Override public InflateResult inflateView(Context context, int layoutId, ViewGroup parent, boolean attachToRoot) { LayoutInflater inflater = LayoutInflater.from(context).cloneInContext(context); ViewFactory factory = new ViewFactory(inflater); inflater.setFactory(factory); InflateResult result = new InflateResult(); result.rootView = inflater.inflate(layoutId, parent, attachToRoot); result.processedViews = factory.getProcessedViews(); return result; } @Override public View bindView(Context context, InflateResult inflatedView, Object model) { for(View v: inflatedView.processedViews){ AttributeBinder.getInstance().bindView(context, v, model); } return inflatedView.rootView; } @Override public <T extends ViewMulticastListener<?>> T getMulticastListenerForView( View view, Class<T> listenerType) { MulticastListenerCollection collection = getViewTag(view).get(MulticastListenerCollection.class); if (collection==null){ collection = new MulticastListenerCollection(); getViewTag(view).put(MulticastListenerCollection.class, collection); } if (collection.containsKey(listenerType)){ return collection.get(listenerType); } try { T listener = listenerType.getConstructor().newInstance(); listener.registerToView(view); collection.put(listenerType, listener); return listener; } catch (Exception e){ BindingLog.exception("BinderV30", e); return null; } } @Override public void init(Application application) { syntaxResolver = createSyntaxResolver(application); attributeBinder = createAttributeBinder(application); registerProviders(attributeBinder); } protected abstract AttributeBinder createAttributeBinder(Application application); protected abstract void registerProviders(AttributeBinder attrBinder); protected abstract ISyntaxResolver createSyntaxResolver(Application application); @Override public AttributeBinder getAttributeBinder() { return attributeBinder; } protected AttributeBinder attributeBinder; protected ISyntaxResolver syntaxResolver; @Override public ISyntaxResolver getSyntaxResolver() { return syntaxResolver; } }