package org.itsnat.droid.impl.xmlinflater.values;
import org.itsnat.droid.AttrResourceInflaterListener;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.dom.DOMElement;
import org.itsnat.droid.impl.dom.values.DOMElemValues;
import org.itsnat.droid.impl.dom.values.DOMElemValuesArrayBase;
import org.itsnat.droid.impl.dom.values.DOMElemValuesItemNormal;
import org.itsnat.droid.impl.dom.values.DOMElemValuesStyle;
import org.itsnat.droid.impl.dom.values.XMLDOMValues;
import org.itsnat.droid.impl.xmlinflated.values.ElementValues;
import org.itsnat.droid.impl.xmlinflated.values.ElementValuesArrayBase;
import org.itsnat.droid.impl.xmlinflated.values.ElementValuesItemNormal;
import org.itsnat.droid.impl.xmlinflated.values.ElementValuesResources;
import org.itsnat.droid.impl.xmlinflated.values.ElementValuesStyle;
import org.itsnat.droid.impl.xmlinflated.values.InflatedXMLValues;
import org.itsnat.droid.impl.xmlinflater.XMLInflater;
import org.itsnat.droid.impl.xmlinflater.values.classtree.ClassDescValuesArrayBase;
import org.itsnat.droid.impl.xmlinflater.values.classtree.ClassDescValuesItemNormal;
import org.itsnat.droid.impl.xmlinflater.values.classtree.ClassDescValuesStyle;
import java.util.List;
/**
* Created by jmarranz on 4/11/14.
*/
public class XMLInflaterValues extends XMLInflater
{
protected XMLInflaterValues(InflatedXMLValues inflatedXML, int bitmapDensityReference, AttrResourceInflaterListener attrResourceInflaterListener)
{
super(inflatedXML, bitmapDensityReference,attrResourceInflaterListener);
}
public static XMLInflaterValues createXMLInflaterValues(InflatedXMLValues inflatedValues, int bitmapDensityReference, AttrResourceInflaterListener attrResourceInflaterListener)
{
return new XMLInflaterValues(inflatedValues,bitmapDensityReference,attrResourceInflaterListener);
}
public InflatedXMLValues getInflatedXMLValues()
{
return (InflatedXMLValues)inflatedXML;
}
public ElementValuesResources inflateValues()
{
return inflateRoot(getInflatedXMLValues().getXMLDOMValues());
}
private ElementValuesResources inflateRoot(XMLDOMValues xmlDOMValues)
{
DOMElemValues rootDOMElem = (DOMElemValues)xmlDOMValues.getRootDOMElement();
ElementValuesResources elementResources = new ElementValuesResources();
getInflatedXMLValues().setRootElementResources(elementResources);
processChildNoChildElemElements(rootDOMElem, elementResources);
return elementResources;
}
private void processChildNoChildElemElements(DOMElemValues domElemParent, ElementValuesResources parentChildValues)
{
List<DOMElement> childDOMElemList = domElemParent.getChildDOMElementList();
if (childDOMElemList == null) return;
parentChildValues.initChildElementValuesList(childDOMElemList.size());
for (DOMElement childDOMElem : childDOMElemList)
{
ElementValues childElemValues = inflateNextElement((DOMElemValues)childDOMElem,domElemParent,parentChildValues);
parentChildValues.addChildElementValues(childElemValues);
}
}
protected ElementValues inflateNextElement(DOMElemValues domElement,DOMElemValues domElementParent,ElementValuesResources parentChildValues)
{
ElementValues childElem;
String tagName = domElement.getTagName();
if ("style".equals(tagName))
{
childElem = createElementValuesStyle((DOMElemValuesStyle) domElement, parentChildValues);
}
else if ("string-array".equals(tagName) || "integer-array".equals(tagName) || "array".equals(tagName))
{
childElem = createElementValuesArrayBase((DOMElemValuesArrayBase) domElement, parentChildValues);
}
else if ("declare-styleable".equals(tagName) )
{
throw new ItsNatDroidException("Not supported yet: " + tagName);
}
else
{
childElem = createElementValuesItemNormal((DOMElemValuesItemNormal) domElement, parentChildValues);
}
// No procesamos los child elements porque cada ElementValues sabe como gestionar sus hijos si es que los tiene
return childElem;
}
private ElementValuesStyle createElementValuesStyle(DOMElemValuesStyle domElement, ElementValuesResources parentChildValues)
{
ClassDescValuesMgr classDescValuesMgr = getInflatedXMLValues().getXMLInflaterRegistry().getClassDescValuesMgr();
ClassDescValuesStyle classDesc = (ClassDescValuesStyle)classDescValuesMgr.get("style");
ElementValuesStyle childValuesChild = classDesc.createElementValuesStyle(domElement, parentChildValues);
return childValuesChild;
}
private ElementValuesArrayBase createElementValuesArrayBase(DOMElemValuesArrayBase domElement, ElementValuesResources parentChildValues)
{
ClassDescValuesMgr classDescValuesMgr = getInflatedXMLValues().getXMLInflaterRegistry().getClassDescValuesMgr();
ClassDescValuesArrayBase classDesc = (ClassDescValuesArrayBase)classDescValuesMgr.get(domElement.getTagName());
ElementValuesArrayBase childValuesChild = classDesc.createElementValuesArrayBase(domElement, parentChildValues);
return childValuesChild;
}
private ElementValuesItemNormal createElementValuesItemNormal(DOMElemValuesItemNormal domElement, ElementValuesResources parentChildValues)
{
String resourceType = ClassDescValuesItemNormal.getResourceTypeItemNormal(domElement);
ClassDescValuesMgr classDescValuesMgr = getInflatedXMLValues().getXMLInflaterRegistry().getClassDescValuesMgr();
ClassDescValuesItemNormal classDesc = (ClassDescValuesItemNormal)classDescValuesMgr.get(resourceType);
if (classDesc == null)
throw new ItsNatDroidException("Not found processor for resource type: " + resourceType);
ElementValuesItemNormal childValuesChild = classDesc.createElementValuesItemNormal(domElement, parentChildValues);
return childValuesChild;
}
}