package org.geogebra.common.plugin.script; import java.util.HashMap; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.main.App; import org.geogebra.common.plugin.Event; import org.geogebra.common.plugin.EventType; import org.geogebra.common.plugin.ScriptError; import org.geogebra.common.plugin.ScriptType; /** * @author arno Class for JavaScript scripts */ public class JsScript extends Script { /** * @param app * the script's application * @param text * the script's source code */ public JsScript(App app, String text) { super(app, text); } @Override public boolean run(Event evt) throws ScriptError { String label = evt.target.getLabel(StringTemplate.defaultTemplate); boolean update = evt.type == EventType.UPDATE; Object[] args; try { if (app.isApplet() && app.useBrowserForJavaScript() && !update) { if (evt.argument == null) { args = new Object[] {}; } else { args = new Object[] { evt.argument }; } app.callAppletJavaScript("ggb" + label, args); } else if (app.isHTML5Applet() && app.useBrowserForJavaScript()) { String functionPrefix = update ? "ggbUpdate" : "ggb"; if (evt.argument == null) { args = new Object[] {}; } else { args = new Object[] { evt.argument }; } app.callAppletJavaScript(functionPrefix + label, args); } else { app.evalJavaScript(app, text, evt.argument); } return true; } catch (Exception e) { e.printStackTrace(); throw new ScriptError(app.getLocalization() .getMenu(update ? "OnUpdate" : "OnClick") + " " + label + ":\n" + app.getLocalization().getMenu("ErrorInJavaScript") + "\n" + e.getLocalizedMessage()); } } @Override public ScriptType getType() { return ScriptType.JAVASCRIPT; } @Override public Script copy() { return new JsScript(app, text); } /** * The text of this script is modified by changing every whole word oldLabel * to newLabel. * * @return whether any renaming happened */ @Override public boolean renameGeo(String oldLabel, String newLabel) { // TODO: this method is hard to write, // as JavaScript might contain many kinds of strings // which may clash with oldLabel... return false; } static HashMap<String, JsScript> nameToScript = new HashMap<String, JsScript>(); public static JsScript fromName(App app, String string) { if (nameToScript == null) { nameToScript = new HashMap<String, JsScript>(); } else if (nameToScript.containsKey(string)) { return nameToScript.get(string); } JsScript script = new JsScript(app, string); nameToScript.put(string, script); return script; } }