package org.itsnat.droid.impl.xmlinflated.values;
import android.animation.Animator;
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.dom.DOMAttr;
import org.itsnat.droid.impl.xmlinflater.Dimension;
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.XMLInflaterLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_ANIM;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_ANIMATOR;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_BOOL;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_COLOR;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_DIMEN;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_DRAWABLE;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_FLOAT;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_ID;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_INTEGER;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_LAYOUT;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_STRING;
import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_STRING_ARRAY;
/**
* Es la clase asociada al tag root "resources"
* Created by jmarranz on 27/11/14.
*/
public class ElementValuesResources extends ElementValues
{
private Map<String,ElementValuesChild> elemValuesElemMap = new HashMap<String,ElementValuesChild>();
public ElementValuesResources()
{
super("resources");
}
@Override
public ElementValuesResources getRootElementResources()
{
return this;
}
@Override
public void addChildElementValues(ElementValues child)
{
super.addChildElementValues(child);
// Es posible repetir en dos items el name, incluso style puede tener el name de un <dimen>, lo importante es que NO coincida exactamente el mismo tipo y nombre
ElementValuesChild old;
if (child instanceof ElementValuesItemNormal)
{
ElementValuesItemNormal childItemNormal = (ElementValuesItemNormal)child;
String key = genKey(childItemNormal.getType(), childItemNormal.getName());
old = elemValuesElemMap.put(key,childItemNormal);
if (old != null) throw new ItsNatDroidException("Already exists an element with type " + childItemNormal.getType() + " and name " + childItemNormal.getName());
}
else if (child instanceof ElementValuesStyle)
{
ElementValuesStyle childStyle = (ElementValuesStyle)child;
String key = genKey("style",childStyle.getName());
old = elemValuesElemMap.put(key,childStyle);
if (old != null) throw new ItsNatDroidException("Already exists an element with type style and name " + childStyle.getName());
}
else if (child instanceof ElementValuesArrayBase) // <string-array>,<integer-array>,<array>
{
ElementValuesArrayBase childArrayBase = (ElementValuesArrayBase)child;
String key = genKey(childArrayBase.getTagName(), childArrayBase.getName());
old = elemValuesElemMap.put(key,childArrayBase);
if (old != null) throw new ItsNatDroidException("Already exists an element " + childArrayBase.getTagName() + " with name " + childArrayBase.getName());
}
else throw new ItsNatDroidException("Not supported in values folder the element : " + child.getTagName());
}
public DOMAttr findElementValuesChildNoChildElemValue(String type,String name)
{
String key = genKey(type,name);
ElementValuesChildNoChildElem child = (ElementValuesChildNoChildElem)elemValuesElemMap.get(key);
if (child == null)
return null;
return child.getValueAsDOMAttr();
}
public DOMAttr getElementValuesChildNoChildElemValue(String type,String name)
{
DOMAttr attr = findElementValuesChildNoChildElemValue(type,name);
if (attr == null)
throw new ItsNatDroidException("Not found item of type: " + type + " and name: " + name);
return attr;
}
public List<DOMAttr> getElementValuesChildWithChildElemValue(String type,String name)
{
String key = genKey(type,name);
ElementValuesChildWithChildElem child = (ElementValuesChildWithChildElem)elemValuesElemMap.get(key);
if (child == null)
throw new ItsNatDroidException("Not found item of type: " + type + " and name: " + name);
return child.getChildDOMAttrValueList();
}
private static String genKey(String type,String name)
{
return type + "#" + name;
}
public int getIdentifier(String name, String type, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_ID,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getIdentifier(valueAsDOMAttr.getResourceDesc(), type, xmlInflaterContext);
}
public LayoutAnimationController getLayoutAnimation(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_ANIM,name); // android.view.animation.LayoutAnimationController se referencia como anim/
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getLayoutAnimation(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public Interpolator getInterpolator(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_ANIM,name); // android.view.animation.Interpolator se referencia como anim/
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getInterpolator(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public Animation getAnimation(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_ANIM,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getAnimation(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public Animator getAnimator(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_ANIMATOR,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getAnimator(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public boolean getBoolean(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_BOOL,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getBoolean(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public int getColor(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_COLOR,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getColor(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public Dimension getDimensionObject(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_DIMEN,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getDimensionObject(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public PercFloatImpl getDimensionPercFloat(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = findElementValuesChildNoChildElemValue(TYPE_STRING,name);
if (valueAsDOMAttr == null) valueAsDOMAttr = findElementValuesChildNoChildElemValue(TYPE_DIMEN,name);
if (valueAsDOMAttr == null) throw new ItsNatDroidException("Expected a <string> or <item type=\"dimen\"> for resource name: " + name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getDimensionPercFloat(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public PercFloatImpl getPercFloat(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_STRING,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getPercFloat(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public String getDimensionOrString(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = findElementValuesChildNoChildElemValue(TYPE_STRING,name);
if (valueAsDOMAttr == null) valueAsDOMAttr = findElementValuesChildNoChildElemValue(TYPE_DIMEN,name);
if (valueAsDOMAttr == null) throw new ItsNatDroidException("Expected a <string> or <item type=\"dimen\"> for resource name: " + name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getString(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public Drawable getDrawable(String name, XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_DRAWABLE,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getDrawable(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public LayoutValue getLayoutValue(String name, XMLInflaterContext xmlInflaterContext, XMLInflaterLayout xmlInflater, ViewGroup viewParent, int indexChild, ArrayList<DOMAttr> includeAttribs)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_LAYOUT,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getLayoutValue(valueAsDOMAttr.getResourceDesc(),xmlInflaterContext, xmlInflater, viewParent, indexChild, includeAttribs);
}
public float getFloat(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_FLOAT,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getFloat(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public int getInteger(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_INTEGER,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getInteger(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public String getString(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_STRING,name);
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getString(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public CharSequence getText(String name,XMLInflaterContext xmlInflaterContext)
{
DOMAttr valueAsDOMAttr = getElementValuesChildNoChildElemValue(TYPE_STRING,name); // NO HAY tipo "text" tal y como <text name="somename">some <b>text</b></text>
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
return xmlInflaterRegistry.getText(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
}
public CharSequence[] getTextArray(String name,XMLInflaterContext xmlInflaterContext)
{
List<DOMAttr> valueAsDOMAttrList = getElementValuesChildWithChildElemValue(TYPE_STRING_ARRAY, name); // NO HAY tipo "text-array" nos basamos en "string-array" los items pueden ser HTML y resolverse con getText
XMLInflaterRegistry xmlInflaterRegistry = xmlInflaterContext.getXMLInflaterRegistry();
CharSequence[] res = new CharSequence[valueAsDOMAttrList.size()];
int i = 0;
for(DOMAttr valueAsDOMAttr : valueAsDOMAttrList)
{
res[i] = xmlInflaterRegistry.getText(valueAsDOMAttr.getResourceDesc(), xmlInflaterContext);
i++;
}
return res;
}
public ElementValuesStyle getViewStyle(String name)
{
String key = genKey("style",name);
ElementValuesStyle child = (ElementValuesStyle)elemValuesElemMap.get(key);
if (child == null)
throw new ItsNatDroidException("Not found style item with name: " + name);
return child;
}
}