package org.geogebra.desktop.plugin;
import java.util.HashMap;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.main.App;
import org.geogebra.common.plugin.ScriptManager;
import org.geogebra.common.util.debug.Log;
import org.geogebra.desktop.main.AppD;
import org.mozilla.javascript.Scriptable;
//import org.concord.framework.data.stream.DataListener;
//import org.concord.framework.data.stream.DataStreamEvent;
//import org.concord.sensor.SensorDataProducer;
//import org.mozilla.javascript.Context;
//import org.mozilla.javascript.Scriptable;
public class ScriptManagerD extends ScriptManager {
// library of functions that is available to all JavaScript calls
// init() is called when GeoGebra starts up (eg to start listeners)
/*
* private String libraryScriptxxx ="function ggbOnInit() {}"; private
* String libraryScriptxx ="function ggbOnInit() {"+
* "ggbApplet.evalCommand('A=(1,2)');" +
* //"ggbApplet.registerAddListener('listener');" +
* "ggbApplet.registerObjectUpdateListener('A','listener');" + "}" +
* "function listener() {//java.lang.System.out.println('add listener called');\n"
* + "var x = ggbApplet.getXcoord('A');" +
* "var y = ggbApplet.getYcoord('A');" + "var len = Math.sqrt(x*x + y*y);" +
* "if (len > 5) { x=x*5/len; y=y*5/len; }" + "" +
* "ggbApplet.unregisterObjectUpdateListener('A');" +
* "ggbApplet.setCoords('A',x,y);" +
* "ggbApplet.registerObjectUpdateListener('A','listener');" + "}";
*/
protected HashMap<Construction, Scriptable> globalScopeMap;
public ScriptManagerD(App app) {
super(app);
globalScopeMap = new HashMap<Construction, Scriptable>();
// evalScript("ggbOnInit();");
}
@Override
public void ggbOnInit() {
try {
// call only if libraryJavaScript is not the default (ie do nothing)
if (!((AppD) app).getKernel().getLibraryJavaScript()
.equals(Kernel.defaultLibraryJavaScript)) {
evalJavaScript(app, "ggbOnInit();", null);
}
} catch (Exception e) {
Log.debug("Error calling ggbOnInit(): " + e.getMessage());
}
}
@Override
public synchronized void initJavaScript() {
if (app.isApplet()) {
((AppD) app).getApplet().initJavaScript();
}
}
@Override
public void callJavaScript(String jsFunction, Object[] args) {
if (app.isApplet() && app.useBrowserForJavaScript()) {
((AppD) app).getApplet().callJavaScript(jsFunction, args);
} else {
StringBuilder sb = new StringBuilder();
sb.append(jsFunction);
sb.append("(");
for (int i = 0; i < args.length; i++) {
sb.append('"');
sb.append(args[i].toString());
sb.append('"');
if (i < args.length - 1) {
sb.append(",");
}
}
sb.append(");");
try {
evalJavaScript(app, sb.toString(), null);
} catch (Exception e) {
Log.debug("error calling script " + e.getMessage());
}
}
}
public HashMap<Construction, Scriptable> getGlobalScopeMap() {
return globalScopeMap;
}
@Override
public void setGlobalScript() {
Scriptable globalScope = CallJavaScript.evalGlobalScript(app);
globalScopeMap.put(app.getKernel().getConstruction(), globalScope);
}
public void evalJavaScript(App app, String script, String arg)
throws Exception {
if (globalScopeMap.get(app.getKernel().getConstruction()) == null) {
setGlobalScript();
}
CallJavaScript.evalScript(app, script, arg);
}
}