package org.itsnat.droid.impl.xmlinflater.layout.page;
import android.view.View;
import android.view.ViewGroup;
import org.itsnat.droid.AttrResourceInflaterListener;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.browser.ItsNatDocImpl;
import org.itsnat.droid.impl.browser.ItsNatViewImpl;
import org.itsnat.droid.impl.browser.ItsNatViewNotNullImpl;
import org.itsnat.droid.impl.browser.PageImpl;
import org.itsnat.droid.impl.browser.serveritsnat.DroidEventGroupInfo;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.layout.DOMScript;
import org.itsnat.droid.impl.dom.layout.XMLDOMLayoutPage;
import org.itsnat.droid.impl.util.StringUtil;
import org.itsnat.droid.impl.xmlinflated.layout.InflatedXMLLayoutPageImpl;
import org.itsnat.droid.impl.xmlinflater.layout.XMLInflaterLayout;
import java.util.List;
/**
* Created by jmarranz on 4/11/14.
*/
public class XMLInflaterLayoutPage extends XMLInflaterLayout
{
public XMLInflaterLayoutPage(InflatedXMLLayoutPageImpl inflatedXML, int bitmapDensityReference, AttrResourceInflaterListener attrResourceInflaterListener)
{
super(inflatedXML,bitmapDensityReference,attrResourceInflaterListener);
}
public PageImpl getPageImpl()
{
return getInflatedXMLLayoutPageImpl().getPageImpl(); // No puede ser nulo
}
public InflatedXMLLayoutPageImpl getInflatedXMLLayoutPageImpl()
{
return (InflatedXMLLayoutPageImpl) inflatedXML;
}
private ItsNatViewImpl getItsNatViewOfInlineHandler(String type,View view)
{
if (type.equals("load") || type.equals("unload"))
{
// El handler inline de load o unload sólo se puede poner una vez por layout por lo que obligamos
// a que sea el View root de forma similar al <body> en HTML
if (view != getInflatedXMLLayoutPageImpl().getRootView())
throw new ItsNatDroidException("onload/onunload handlers only can be defined in the view root of the layout");
}
ItsNatDocImpl itsNatDoc = getPageImpl().getItsNatDocImpl();
return itsNatDoc.getItsNatViewImpl(view);
}
private static String getTypeInlineEventHandler(String name)
{
if (!name.startsWith("on")) return null;
String type = name.substring(2);
DroidEventGroupInfo eventGroup = DroidEventGroupInfo.getEventGroupInfo(type);
if (eventGroup.getEventGroupCode() == DroidEventGroupInfo.UNKNOWN_EVENT)
return null;
return type;
}
@Override
public boolean setAttributeInlineEventHandler(View view, DOMAttr attr)
{
String namespaceURI = attr.getNamespaceURI();
String name = attr.getName(); // El nombre devuelto no contiene el namespace
if (StringUtil.isEmpty(namespaceURI))
{
String type = getTypeInlineEventHandler(name);
if (type != null)
{
String value = attr.getValue();
ItsNatViewImpl viewData = getItsNatViewOfInlineHandler(type,view);
viewData.setOnTypeInlineCode(name, value);
if (viewData instanceof ItsNatViewNotNullImpl)
((ItsNatViewNotNullImpl) viewData).registerEventListenerViewAdapter(type);
return true;
}
}
return false;
}
@Override
public boolean removeAttributeInlineEventHandler(View view, String namespaceURI, String name)
{
if (StringUtil.isEmpty(namespaceURI))
{
String type = getTypeInlineEventHandler(name);
if (type != null)
{
ItsNatViewImpl viewData = getItsNatViewOfInlineHandler(type, view);
viewData.removeOnTypeInlineCode(name);
return true;
}
}
return false;
}
@Override
public View inflateLayout(ViewGroup viewParent,int indexChild)
{
InflatedXMLLayoutPageImpl inflatedLayoutPage = getInflatedXMLLayoutPageImpl();
XMLDOMLayoutPage xmldomLayoutPage = inflatedLayoutPage.getXMLDOMLayoutPage();
// No hace falta definir el loadInitScript en InflatedLayoutPageItsNatImpl pues se obtiene del XMLDOMLayoutPageItsNat y no cambia
List<DOMScript> scriptListFromTree = xmldomLayoutPage.getDOMScriptList();
if (scriptListFromTree != null)
{
for (DOMScript script : scriptListFromTree)
inflatedLayoutPage.addScript(script.getCode()); // Podríamos usar los DOMScript directamente pero así es más limpio
}
return super.inflateLayout(viewParent,indexChild);
}
}