package org.itsnat.droid.impl.xmlinflater.shared.attr;
import android.animation.Animator;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import android.view.animation.LayoutAnimationController;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.browser.PageImpl;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.DOMAttrRemote;
import org.itsnat.droid.impl.dom.ResourceDesc;
import org.itsnat.droid.impl.util.MapSmart;
import org.itsnat.droid.impl.util.MiscUtil;
import org.itsnat.droid.impl.util.NamespaceUtil;
import org.itsnat.droid.impl.xmlinflater.AttrContext;
import org.itsnat.droid.impl.xmlinflater.PercFloatImpl;
import org.itsnat.droid.impl.xmlinflater.XMLInflaterContext;
import org.itsnat.droid.impl.xmlinflater.XMLInflaterRegistry;
import org.itsnat.droid.impl.xmlinflater.layout.LayoutValue;
import org.itsnat.droid.impl.xmlinflater.layout.ViewStyleAttribs;
import org.itsnat.droid.impl.xmlinflater.layout.XMLInflaterLayout;
import org.itsnat.droid.impl.xmlinflater.shared.classtree.ClassDesc;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jmarranz on 4/11/14.
*/
public abstract class AttrDesc<TclassDesc extends ClassDesc,TattrTarget,TattrContext extends AttrContext>
{
private static Class class_R_styleable;
protected String name;
protected TclassDesc classDesc;
public AttrDesc(TclassDesc classDesc, String name)
{
this.classDesc = classDesc;
this.name = name;
}
protected static Class getClass_R_styleable()
{
if (class_R_styleable == null)
class_R_styleable = MiscUtil.resolveClass("com.android.internal.R$styleable");
return class_R_styleable;
}
public TclassDesc getClassDesc()
{
return classDesc;
}
public String getName()
{
return name;
}
protected XMLInflaterRegistry getXMLInflaterRegistry()
{
return classDesc.getXMLInflaterRegistry();
}
public static void processDownloadTask(DOMAttrRemote attr, Runnable task, XMLInflaterContext xmlInflaterContext)
{
PageImpl page = xmlInflaterContext.getPageImpl(); // NO puede ser nulo
page.getItsNatDocImpl().downloadResources(attr.getResourceDescRemote(), task);
}
public boolean getBoolean(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getBoolean(resourceDesc, xmlInflaterContext);
}
public int getColor(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getColor(resourceDesc, xmlInflaterContext);
}
public int getIdentifier(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getIdentifier(resourceDesc, xmlInflaterContext);
}
public ViewStyleAttribs getViewStyle(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getViewStyle(resourceDesc, xmlInflaterContext);
}
public int getViewStyle(ViewStyleAttribs style,List<DOMAttr> styleItemsDynamicAttribs,Context ctx)
{
return getXMLInflaterRegistry().getViewStyle(style, styleItemsDynamicAttribs, ctx);
}
public int getInteger(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getInteger(resourceDesc, xmlInflaterContext);
}
public float getFloat(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getFloat(resourceDesc, xmlInflaterContext);
}
public String getString(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getString(resourceDesc, xmlInflaterContext);
}
public CharSequence getText(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getText(resourceDesc, xmlInflaterContext);
}
public CharSequence[] getTextArray(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getTextArray(resourceDesc, xmlInflaterContext);
}
public int getDimensionIntFloor(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionIntFloor(resourceDesc, xmlInflaterContext);
}
public int getDimensionIntRound(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionIntRound(resourceDesc, xmlInflaterContext);
}
public float getDimensionFloat(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionFloat(resourceDesc, xmlInflaterContext);
}
public float getDimensionFloatFloor(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionFloatFloor(resourceDesc, xmlInflaterContext);
}
public float getDimensionFloatRound(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionFloatRound(resourceDesc, xmlInflaterContext);
}
public int getDimensionWithNameIntRound(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionWithNameIntRound(resourceDesc, xmlInflaterContext);
}
public String getDimensionOrString(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionOrString(resourceDesc, xmlInflaterContext);
}
public PercFloatImpl getDimensionPercFloat(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDimensionPercFloat(resourceDesc, xmlInflaterContext);
}
public PercFloatImpl getPercFloat(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getPercFloat(resourceDesc, xmlInflaterContext);
}
public Animation getAnimation(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getAnimation(resourceDesc, xmlInflaterContext);
}
public Animator getAnimator(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getAnimator(resourceDesc, xmlInflaterContext);
}
public Drawable getDrawable(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getDrawable(resourceDesc,xmlInflaterContext);
}
public Interpolator getInterpolator(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getInterpolator(resourceDesc, xmlInflaterContext);
}
public View getLayout(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext,XMLInflaterLayout xmlInflaterParent, ViewGroup viewParent, int indexChild,ArrayList<DOMAttr> includeAttribs)
{
return getXMLInflaterRegistry().getLayout(resourceDesc, xmlInflaterContext, xmlInflaterParent, viewParent, indexChild,includeAttribs);
}
public LayoutValue getLayoutValue(ResourceDesc resourceDesc,XMLInflaterContext xmlInflaterContext,XMLInflaterLayout xmlInflaterParent, ViewGroup viewParent, int indexChild,ArrayList<DOMAttr> includeAttribs)
{
return getXMLInflaterRegistry().getLayoutValue(resourceDesc, xmlInflaterContext, xmlInflaterParent, viewParent, indexChild,includeAttribs);
}
public LayoutAnimationController getLayoutAnimation(ResourceDesc resourceDesc, XMLInflaterContext xmlInflaterContext)
{
return getXMLInflaterRegistry().getLayoutAnimation(resourceDesc, xmlInflaterContext);
}
public static <T> T parseSingleName(String value, MapSmart<String, T> nameValueMap)
{
// Se llama directamente sin Context porque es para atributos que no pueden ser un recurso
T valueRes = nameValueMap.get(value);
if (valueRes == null)
throw new ItsNatDroidException("Unrecognized value name " + value + " for attribute");
return valueRes;
}
public static int parseMultipleName(String value, MapSmart<String, Integer> nameValueMap)
{
// Se llama directamente sin Context porque es para atributos que no pueden ser un recurso
String[] names = value.split("\\|");
int res = 0;
for(int i = 0; i < names.length; i++)
{
// No hace falta hacer trim, los espacios dan error
String name = names[i];
Integer valueInt = nameValueMap.get(name);
if (valueInt == null)
throw new ItsNatDroidException("Unrecognized value name " + name + " for attribute");
res |= valueInt;
}
return res;
}
protected void setAttributeToRemove(TattrTarget target, String value, TattrContext attrCtx)
{
// Este método es llamado desde removeAttributeFromRemote, cuyo valor será o @null o un recurso de Android, no esperamos
// nada dinámico (Remote o Asset), por eso hacemos cast sin complejos a DOMAttrCompiled
DOMAttr attr = DOMAttr.createDOMAttr(NamespaceUtil.XMLNS_ANDROID, getName(), value);
setAttribute(target, attr,attrCtx);
}
public abstract void setAttribute(TattrTarget target,DOMAttr attr,TattrContext attrCtx);
public abstract void removeAttribute(TattrTarget target, TattrContext attrCtx);
}