package org.itsnat.droid.impl.xmlinflater.drawable.classtree; import android.graphics.drawable.ClipDrawable; import android.graphics.drawable.Drawable; import android.view.Gravity; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.dom.drawable.DOMElemDrawable; import org.itsnat.droid.impl.util.MapSmart; import org.itsnat.droid.impl.util.NamespaceUtil; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildBase; import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildRoot; import org.itsnat.droid.impl.xmlinflater.XMLInflaterContext; import org.itsnat.droid.impl.xmlinflater.drawable.AttrDrawableContext; import org.itsnat.droid.impl.xmlinflater.drawable.ClassDescDrawableMgr; import org.itsnat.droid.impl.xmlinflater.drawable.XMLInflaterDrawable; import org.itsnat.droid.impl.xmlinflater.shared.GravityUtil; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDesc; import java.util.ArrayList; /** * Created by jmarranz on 10/11/14. */ public class ClassDescClipDrawable extends ClassDescElementDrawableBased<ClipDrawable> implements ClassDescCallback { // Para el atributo clipOrientation // No podemos usar OrientationUtil porque los valores numéricos SON DIFERENTES (1 y 2 en vez de 0 y 1), hay que joderse con la falta de homogeneidad private static final MapSmart<String,Integer> nameValueMap = MapSmart.<String,Integer>create(2); static { nameValueMap.put("horizontal", ClipDrawable.HORIZONTAL /* 1 */); nameValueMap.put("vertical", ClipDrawable.VERTICAL /* 2 */); } public ClassDescClipDrawable(ClassDescDrawableMgr classMgr,ClassDescElementDrawableBased<? super ClipDrawable> parent) { super(classMgr,"clip",parent); } @Override public ElementDrawableChildRoot createElementDrawableChildRoot(DOMElemDrawable rootElem, AttrDrawableContext attrCtx) { ElementDrawableChildRoot elementDrawableRoot = new ElementDrawableChildRoot(); XMLInflaterContext xmlInflaterContext = attrCtx.getXMLInflaterContext(); XMLInflaterDrawable xmlInflaterDrawable = attrCtx.getXMLInflaterDrawable(); xmlInflaterDrawable.processChildElements(rootElem, elementDrawableRoot,attrCtx); ArrayList<ElementDrawableChildBase> childList = elementDrawableRoot.getElementDrawableChildList(); Drawable childDrawable = getDrawableChild("drawable", rootElem, xmlInflaterContext,childList); DOMAttr attrGravity = rootElem.getDOMAttribute(NamespaceUtil.XMLNS_ANDROID, "gravity"); int gravity = attrGravity != null ? AttrDesc.parseMultipleName(attrGravity.getValue(), GravityUtil.nameValueMap) : Gravity.LEFT; // Valor concreto no puede ser un recurso DOMAttr attrClipOrientation = rootElem.getDOMAttribute(NamespaceUtil.XMLNS_ANDROID, "clipOrientation"); int orientation = attrClipOrientation != null ? AttrDesc.<Integer>parseSingleName(attrClipOrientation.getValue(), nameValueMap) : ClipDrawable.HORIZONTAL; // Valor concreto no puede ser un recurso ClipDrawable drawable = new ClipDrawable(childDrawable,gravity,orientation); setCallback(childDrawable,drawable); elementDrawableRoot.setDrawable(drawable); return elementDrawableRoot; } @Override public boolean isAttributeIgnored(ClipDrawable resource, String namespaceURI, String name) { if (super.isAttributeIgnored(resource,namespaceURI,name)) return true; if (NamespaceUtil.XMLNS_ANDROID.equals(namespaceURI)) { // Se usan en tiempo de construcción return ("clipOrientation".equals(name) || "drawable".equals(name) || "gravity".equals(name)); } return false; } @Override public Class<ClipDrawable> getDrawableOrElementDrawableClass() { return ClipDrawable.class; } protected void init() { super.init(); } }