/*******************************************************************************
* Copyright (c) 2011-2014 Fernando Petrola
*
* This file is part of Dragome SDK.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
******************************************************************************/
package com.dragome.web.enhancers.jsdelegate;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import com.dragome.commons.javascript.ScriptHelper;
import com.dragome.helpers.DragomeEntityManager;
public class JsCast
{
@SuppressWarnings("unchecked")
public static <T> T castTo(Object instance, Class<T> type, Object callerInstance)
{
try
{
if (instance == null)
return null;
ScriptHelper.put("instance", instance, callerInstance);
if (type.equals(Float.class))
return (T) new Float(ScriptHelper.evalFloat("instance", callerInstance));
else if (type.equals(Integer.class))
return (T) new Integer(ScriptHelper.evalInt("instance", callerInstance));
else if (type.equals(Double.class))
return (T) new Double(ScriptHelper.evalDouble("instance", callerInstance));
else if (type.equals(Long.class))
return (T) new Long(ScriptHelper.evalLong("instance", callerInstance));
else if (type.equals(Boolean.class))
return (T) new Boolean(ScriptHelper.evalBoolean("instance", callerInstance));
else if (type.equals(Short.class))
return (T) new Short((short) ScriptHelper.evalInt("instance", callerInstance));
else if (type.equals(String.class))
return (T) ScriptHelper.eval("instance", callerInstance);
else
{
String delegateClassName= JsCast.createDelegateClassName(type.getName());
Class<?> class2= Class.forName(delegateClassName);
Object newInstance= class2.newInstance();
ScriptHelper.put("delegate", newInstance, callerInstance);
if (ScriptHelper.eval("instance.node", callerInstance) == null)
ScriptHelper.eval("delegate.node= instance", callerInstance);
else
ScriptHelper.eval("delegate.node= instance.node", callerInstance);
return (T) newInstance;
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public static void addEventListener(EventTarget eventTarget, String type, EventListener eventListener, boolean b)
{
Class<? extends EventListener> eventListenerClass= eventListener.getClass();
ScriptHelper.putMethodReference("handleEventMethod", eventListenerClass, null).handleEvent(null);
ScriptHelper.put("eventListener", eventListener, null);
Object listener= ScriptHelper.eval("(function(){handleEventMethod.apply(eventListener, arguments)})", null);
ScriptHelper.put("listener", listener, null);
ScriptHelper.put("javaRefId", DragomeEntityManager.add(eventListener), null);
ScriptHelper.eval("eventListener.javaRefId= javaRefId", null);
ScriptHelper.put("eventTarget", eventTarget, null);
ScriptHelper.put("type", type, null);
ScriptHelper.eval("eventTarget.node.addEventListener(type, listener)", null);
}
public static void addOnEventListener(EventTarget eventTarget, EventListener eventListener, String methodName)
{
Class<? extends EventListener> eventListenerClass= eventListener.getClass();
ScriptHelper.putMethodReference("handleEventMethod", eventListenerClass, null).handleEvent(null);
ScriptHelper.put("eventListener", eventListener, null);
Object listener= ScriptHelper.eval("(function(){handleEventMethod.apply(eventListener, arguments)})", null);
ScriptHelper.put("listener", listener, null);
ScriptHelper.put("javaRefId", DragomeEntityManager.add(eventListener), null);
ScriptHelper.eval("eventListener.javaRefId= javaRefId", null);
ScriptHelper.put("eventTarget", eventTarget, null);
String script= "eventTarget.node." + methodName + "= listener";
ScriptHelper.eval(script, null);
}
public static void addEventListener(EventTarget eventTarget, String type, EventListener eventListener)
{
addEventListener(eventTarget, type, eventListener, false);
}
public static <T> T castTo(Object instance, Class<T> type)
{
return castTo(instance, type, null);
}
public static <T> T createInstanceOf(Class<T> type)
{
String script= "new " + type.getSimpleName() + "()";
return ScriptHelper.evalCasting(script, type, null);
}
public static String createDelegateClassName(String type)
{
int lastIndexOf= type.lastIndexOf(".");
String classname= type.substring(0, lastIndexOf + 1) + "Delegate" + type.substring(lastIndexOf + 1);
return classname;
}
}