package org.itsnat.droid.impl.xmlinflater.drawable; import android.graphics.drawable.Drawable; import org.itsnat.droid.AttrResourceInflaterListener; import org.itsnat.droid.ItsNatDroidException; import org.itsnat.droid.impl.dom.DOMElement; import org.itsnat.droid.impl.dom.drawable.DOMElemDrawable; import org.itsnat.droid.impl.dom.drawable.XMLDOMDrawable; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChild; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildBase; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildRoot; import org.itsnat.droid.impl.xmlinflated.drawable.InflatedXMLDrawable; import org.itsnat.droid.impl.xmlinflater.XMLInflaterResource; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawableBased; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawableChildBased; import org.itsnat.droid.impl.xmlinflater.drawable.classtree.ClassDescElementDrawableChildDrawableBridge; import java.util.List; /** * Created by jmarranz on 4/11/14. */ public class XMLInflaterDrawable extends XMLInflaterResource<Drawable> { protected XMLInflaterDrawable(InflatedXMLDrawable inflatedXML, int bitmapDensityReference, AttrResourceInflaterListener attrResourceInflaterListener) { super(inflatedXML,bitmapDensityReference,attrResourceInflaterListener); } public static XMLInflaterDrawable createXMLInflaterDrawable(InflatedXMLDrawable inflatedDrawable, int bitmapDensityReference, AttrResourceInflaterListener attrResourceInflaterListener) { return new XMLInflaterDrawable(inflatedDrawable,bitmapDensityReference,attrResourceInflaterListener); } public InflatedXMLDrawable getInflatedXMLDrawable() { return (InflatedXMLDrawable)inflatedXML; } public Drawable inflateDrawable() { AttrDrawableContext attrCtx = new AttrDrawableContext(this); return inflateElementDrawableChildRoot(getInflatedXMLDrawable().getXMLDOMDrawable(),attrCtx).getDrawable(); } private ElementDrawableChildRoot inflateElementDrawableChildRoot(XMLDOMDrawable xmlDOMDrawable, AttrDrawableContext attrCtx) { DOMElemDrawable rootDOMElem = (DOMElemDrawable)xmlDOMDrawable.getRootDOMElement(); return createElementDrawableChildRootAndFillAttributes(rootDOMElem,attrCtx); } private ElementDrawableChildRoot createElementDrawableChildRootAndFillAttributes(DOMElemDrawable rootDOMElem, AttrDrawableContext attrCtx) { InflatedXMLDrawable inflatedDrawable = getInflatedXMLDrawable(); String name = rootDOMElem.getTagName(); ClassDescDrawableMgr classDescDrawableMgr = inflatedDrawable.getXMLInflaterRegistry().getClassDescDrawableMgr(); ClassDescElementDrawableBased classDesc = (ClassDescElementDrawableBased)classDescDrawableMgr.get(name); if (classDesc == null) throw new ItsNatDroidException("Drawable type is not supported: " + name); ElementDrawableChildRoot drawableElem = createElementDrawableChildRoot(classDesc, rootDOMElem,attrCtx); Drawable drawable = drawableElem.getDrawable(); inflatedDrawable.setDrawable(drawable); fillAttributes(classDesc, drawable, rootDOMElem,attrCtx); return drawableElem; } private ElementDrawableChildRoot createElementDrawableChildRoot(ClassDescElementDrawableBased classDesc, DOMElemDrawable rootDOMElem, AttrDrawableContext attrCtx) { return classDesc.createElementDrawableChildRoot(rootDOMElem,attrCtx); } @SuppressWarnings("unchecked") private void fillAttributes(ClassDescElementDrawableBased classDesc, Drawable drawable, DOMElemDrawable domElement, AttrDrawableContext attrCtx) { classDesc.fillResourceAttributes(drawable, domElement, attrCtx); } /* @SuppressWarnings("unchecked") private void fillAttributes(ClassDescResourceBased classDesc, DrawableOrElementDrawableWrapper drawable, DOMElemDrawable domElement, AttrDrawableContext attrCtx) { classDesc.fillResourceAttributes(drawable, domElement, attrCtx); } */ protected ElementDrawableChildBase inflateNextElement(DOMElemDrawable domElement, DOMElemDrawable domElementParent, ElementDrawableChildBase parentChildDrawable, AttrDrawableContext attrCtx) { ElementDrawableChild childDrawable = createElementDrawableChildAndFillAttributes(domElement, domElementParent, parentChildDrawable,attrCtx); processChildElements(domElement,childDrawable,attrCtx); return childDrawable; } private void getFullName(DOMElemDrawable domElement,StringBuilder name) { if (domElement.getParentDOMElement() != null) { getFullName((DOMElemDrawable)domElement.getParentDOMElement(),name); name.append(':'); } name.append(domElement.getTagName()); } private String getFullName(DOMElemDrawable domElement) { StringBuilder name = new StringBuilder(); getFullName(domElement,name); return name.toString(); } private ElementDrawableChild createElementDrawableChildAndFillAttributes(DOMElemDrawable domElement, DOMElemDrawable domElementParent, ElementDrawableChildBase parentChildDrawable, AttrDrawableContext attrCtx) { String parentName = getFullName(domElementParent); String name = parentName + ":" + domElement.getTagName(); ClassDescDrawableMgr classDescDrawableMgr = getInflatedXMLDrawable().getXMLInflaterRegistry().getClassDescDrawableMgr(); ClassDescElementDrawableChildBased classDesc = (ClassDescElementDrawableChildBased)classDescDrawableMgr.get(name); if (classDesc == null) { name = ClassDescElementDrawableChildDrawableBridge.NAME; // "*"; classDesc = (ClassDescElementDrawableChildDrawableBridge)classDescDrawableMgr.get(name); if (classDesc == null) throw new ItsNatDroidException("Unexpected error"); // ClassDescElementDrawableChildDrawableBridge debe estar registrado previamente } ElementDrawableChild drawableChild = createElementDrawableChild(classDesc, domElement, domElementParent, parentChildDrawable,attrCtx); fillAttributes(classDesc,drawableChild , domElement, attrCtx); // ElementDrawableChildContainer.create(drawableChild) return drawableChild; } private ElementDrawableChild createElementDrawableChild(ClassDescElementDrawableChildBased classDesc, DOMElemDrawable domElement, DOMElemDrawable domElementParent, ElementDrawableChildBase parentChildDrawable, AttrDrawableContext attrCtx) { return classDesc.createElementDrawableChild(domElement, domElementParent, parentChildDrawable,attrCtx); } @SuppressWarnings("unchecked") private void fillAttributes(ClassDescElementDrawableChildBased classDesc, ElementDrawableChild drawableChild, DOMElemDrawable domElement, AttrDrawableContext attrCtx) { classDesc.fillResourceAttributes(drawableChild, domElement, attrCtx); } public void processChildElements(DOMElemDrawable domElemParent, ElementDrawableChildBase parentChildDrawable, AttrDrawableContext attrCtx) { List<DOMElement> childDOMElemList = domElemParent.getChildDOMElementList(); if (childDOMElemList == null) return; parentChildDrawable.initElementDrawableChildList(childDOMElemList.size()); for (DOMElement childDOMElem : childDOMElemList) { ElementDrawableChildBase childDrawable = inflateNextElement((DOMElemDrawable)childDOMElem,domElemParent,parentChildDrawable,attrCtx); parentChildDrawable.addElementDrawableChild(childDrawable); } } }