package org.itsnat.droid.impl.browser;
import android.view.View;
import org.itsnat.droid.ClientErrorMode;
import org.itsnat.droid.ItsNatDroidScriptException;
import org.itsnat.droid.OnScriptErrorListener;
import org.itsnat.droid.impl.browser.serveritsnat.DroidEventDispatcherItsNat;
import org.itsnat.droid.impl.browser.serveritsnat.ItsNatDocItsNatImpl;
import org.itsnat.droid.impl.browser.serveritsnat.eventfake.DroidEventFakeImpl;
import org.itsnat.droid.impl.browser.servernotitsnat.DroidEventDispatcherNotItsNat;
import org.itsnat.droid.impl.browser.servernotitsnat.ItsNatDocNotItsNatImpl;
import bsh.EvalError;
import bsh.Interpreter;
/**
* Created by jmarranz on 22/08/14.
*/
public abstract class DroidEventDispatcher
{
protected ItsNatDocImpl itsNatDoc;
public DroidEventDispatcher(ItsNatDocImpl itsNatDoc)
{
this.itsNatDoc = itsNatDoc;
}
public static DroidEventDispatcher createDroidEventDispatcher(ItsNatDocImpl itsNatDoc)
{
if (itsNatDoc instanceof ItsNatDocItsNatImpl)
return new DroidEventDispatcherItsNat((ItsNatDocItsNatImpl)itsNatDoc);
else if (itsNatDoc instanceof ItsNatDocNotItsNatImpl)
return new DroidEventDispatcherNotItsNat((ItsNatDocNotItsNatImpl)itsNatDoc);
return null; // Never happens
}
public void dispatch(ItsNatViewImpl viewDataCurrentTarget,String type,Object nativeEvt)
{
String inlineCode = viewDataCurrentTarget.getOnTypeInlineCode("on" + type);
if (inlineCode != null)
{
executeInlineEventHandler(viewDataCurrentTarget, inlineCode, type, nativeEvt);
}
}
private void executeInlineEventHandler(ItsNatViewImpl viewData,String inlineCode, String type, Object nativeEvt)
{
View view = viewData.getView();
/*
int eventGroupCode = DroidEventGroupInfo.getEventGroupCode(type);
DroidEventListener listenerFake = new DroidEventListener(itsNatDoc, view, type, null, null, false, -1, -1, eventGroupCode);
DroidEventImpl event = (DroidEventImpl)listenerFake.createNormalEvent(nativeEvt);
event.setEventPhase(DroidEventImpl.AT_TARGET);
event.setTarget(event.getCurrentTarget()); // El inline handler no participa en capture en web
*/
DroidEventFakeImpl event = new DroidEventFakeImpl(type,view);
PageImpl page = itsNatDoc.getPageImpl();
Interpreter interp = page.getInterpreter();
try
{
interp.set("event", event);
try
{
interp.eval(inlineCode);
}
finally
{
interp.set("event", null); // Para evitar un memory leak
}
}
catch (EvalError ex)
{
OnScriptErrorListener errorListener = itsNatDoc.getPageImpl().getOnScriptErrorListener();
if (errorListener != null)
{
errorListener.onError(page, inlineCode, ex, event);
}
else
{
int errorMode = itsNatDoc.getClientErrorMode();
if (errorMode != ClientErrorMode.NOT_CATCH_ERRORS)
{
itsNatDoc.showErrorMessage(false, ex.getMessage());
}
else throw new ItsNatDroidScriptException(ex, inlineCode);
}
}
catch (Exception ex)
{
OnScriptErrorListener errorListener = itsNatDoc.getPageImpl().getOnScriptErrorListener();
if (errorListener != null)
{
errorListener.onError(page, inlineCode, ex, event);
}
else
{
int errorMode = itsNatDoc.getClientErrorMode();
if (errorMode != ClientErrorMode.NOT_CATCH_ERRORS)
{
itsNatDoc.showErrorMessage(false, ex.getMessage());
}
else throw new ItsNatDroidScriptException(ex, inlineCode);
}
}
}
}