package org.itsnat.droid.impl.xmlinflater.drawable.classtree;
import android.content.Context;
import android.graphics.drawable.Drawable;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.drawable.DOMElemDrawable;
import org.itsnat.droid.impl.util.NamespaceUtil;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildBase;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildDrawableBridge;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildRoot;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildWithDrawable;
import org.itsnat.droid.impl.xmlinflater.XMLInflaterContext;
import org.itsnat.droid.impl.xmlinflater.XMLInflaterRegistry;
import org.itsnat.droid.impl.xmlinflater.drawable.AttrDrawableContext;
import org.itsnat.droid.impl.xmlinflater.drawable.ClassDescDrawableMgr;
import org.itsnat.droid.impl.xmlinflater.shared.classtree.ClassDescResourceBased;
import java.util.ArrayList;
/**
* Created by Jose on 15/10/2015.
*/
public abstract class ClassDescElementDrawableBased<Tdrawable extends Drawable> extends ClassDescResourceBased<Tdrawable,AttrDrawableContext>
{
public ClassDescElementDrawableBased(ClassDescDrawableMgr classMgr, String tagName, ClassDescElementDrawableBased<? super Tdrawable> parentClass)
{
super(classMgr, tagName, parentClass);
}
public abstract ElementDrawableChildRoot createElementDrawableChildRoot(DOMElemDrawable rootElem, AttrDrawableContext attrCtx);
@Override
protected Tdrawable createResourceNative(Context ctx)
{
return null; // No se usa
}
public Class<Tdrawable> getDeclaredClass()
{
return getDrawableOrElementDrawableClass();
}
public abstract Class<Tdrawable> getDrawableOrElementDrawableClass();
public ClassDescDrawableMgr getClassDescDrawableMgr()
{
return (ClassDescDrawableMgr) classMgr;
}
public ClassDescElementDrawableBased getParentClassDescDrawable()
{
return (ClassDescElementDrawableBased) getParentClassDesc();
}
public String getElementName()
{
return getClassOrDOMElemName();
}
public Drawable getDrawableChild(String drawableAttrName, DOMElemDrawable domElement, XMLInflaterContext xmlInflaterContext, ArrayList<ElementDrawableChildBase> childList)
{
XMLInflaterRegistry xmlInflaterRegistry = classMgr.getXMLInflaterRegistry();
// Si el drawable está definido como elemento hijo gana éste por delante del atributo drawable
DOMAttr attrDrawable = domElement.getDOMAttribute(NamespaceUtil.XMLNS_ANDROID, drawableAttrName); // Puede ser nulo, en dicho caso el drawable debe estar definido inline como elemento hijo
Drawable drawable = attrDrawable != null ? xmlInflaterRegistry.getDrawable(attrDrawable.getResourceDesc(), xmlInflaterContext) : null;
if (childList != null)
{
if (childList.size() == 1) {
// Si existe un drawable hijo gana el hijo sobre el drawable definido como atributo
ElementDrawableChildDrawableBridge childDrawable = (ElementDrawableChildDrawableBridge) childList.get(0);
drawable = childDrawable.getDrawable();
}
else if (childList.size() > 1)
throw new ItsNatDroidException("Expected just a single child element or none, processing " + getElementName());
}
if (drawable == null)
throw new ItsNatDroidException("Drawable is not defined in drawable attribute or as a child element, processing " + getElementName());
return drawable; // Puede ser null
}
public static Drawable[] getLayerChildDrawables(ArrayList<ElementDrawableChildBase> itemList)
{
Drawable[] drawableLayers = new Drawable[itemList.size()];
for (int i = 0; i < itemList.size(); i++)
{
ElementDrawableChildWithDrawable item = (ElementDrawableChildWithDrawable) itemList.get(i);
drawableLayers[i] = item.getDrawable();
}
return drawableLayers;
}
public void setCallback(Drawable childDrawable, Drawable.Callback parentDrawable)
{
childDrawable.setCallback(parentDrawable);
}
}