package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.gui.InputHandler;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoButton;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.main.App;
import org.geogebra.common.main.error.ErrorHandler;
import org.geogebra.common.plugin.EventType;
import org.geogebra.common.plugin.ScriptType;
import org.geogebra.common.plugin.script.Script;
import org.geogebra.common.util.AsyncOperation;
public class ScriptInputModel extends OptionsModel {
public interface IScriptInputListener extends PropertyListener {
void setInputText(String text);
String getInputText();
void setLanguageIndex(int index, String name);
}
private GeoElement geo;
private boolean global = false;
// private boolean javaScript = false;
private ScriptType scriptType = ScriptType.GGBSCRIPT;
private boolean updateScript = false;
private TextInputHandler inputHandler;
private IScriptInputListener listener;
/**
* used for update to avoid several updates
*/
private boolean handlingDocumentEventOff = false;
/**
* false on init, become true when an edit occurs
*/
private boolean editOccurred = false;
public ScriptInputModel(App app, IScriptInputListener listener,
boolean updateScript) {
super(app);
this.listener = listener;
this.updateScript = updateScript;
inputHandler = new TextInputHandler();
}
public void setGeo(GeoElement geo) {
handlingDocumentEventOff = true;
if (global) {
setGlobal();
handlingDocumentEventOff = false;
return;
}
this.geo = geo;
if (geo != null) {
Script script = geo.getScript(
updateScript ? EventType.UPDATE : EventType.CLICK);
// Default to an empty Ggb script
if (script == null) {
script = app.createScript(ScriptType.GGBSCRIPT, "", false);
}
// Log.debug(script.getText());
listener.setInputText(script.getText());
setScriptType(script.getType());
}
handlingDocumentEventOff = false;
}
/**
* edit global javascript
*/
public void setGlobal() {
boolean currentHandlingDocumentEventOff = handlingDocumentEventOff;
handlingDocumentEventOff = true;
geo = null;
global = true;
listener.setInputText(app.getKernel().getLibraryJavaScript());
handlingDocumentEventOff = currentHandlingDocumentEventOff;
}
public void processInput(String inputText,
AsyncOperation<Boolean> callback) {
inputHandler.processInput(inputText, app.getErrorHandler(), callback);
}
// private void setJSMode(boolean flag){
// javaScript = flag;
// ((GeoGebraEditorPane) inputPanel.getTextComponent()).setEditorKit(flag ?
// "javascript":"geogebra");
// }
public void setScriptType(ScriptType scriptType) {
this.scriptType = scriptType;
String scriptStr;
int index = scriptType.ordinal();
switch (scriptType) {
default:
case GGBSCRIPT:
scriptStr = "geogebra";
break;
case JAVASCRIPT:
scriptStr = "javascript";
break;
}
listener.setLanguageIndex(index, scriptStr);
}
/**
* @return the geo
*/
public GeoElement getGeo() {
return geo;
}
private class TextInputHandler implements InputHandler {
private Kernel kernel;
public TextInputHandler() {
kernel = app.getKernel();
}
@Override
public void processInput(String inputValue, ErrorHandler handler,
AsyncOperation<Boolean> callback) {
if (inputValue == null) {
callback.callback(false);
return;
}
if (global) {
app.getKernel().setLibraryJavaScript(inputValue);
callback.callback(true);
return;
}
if (getGeo() == null) {
setGeo(GeoButton.getNewButton(kernel.getConstruction()));
}
// change existing script
Script script = app.createScript(scriptType, inputValue, true);
if (updateScript) {
getGeo().setUpdateScript(script);
// let's suppose fixing this script removed the reason why
// scripts were blocked
app.setBlockUpdateScripts(false);
} else {
getGeo().setClickScript(script);
}
storeUndoInfo();
callback.callback(true);
}
}
public void handleDocumentEvent() {
if (handlingDocumentEventOff) {
return;
}
setEditOccurred(true);
}
@Override
protected boolean isValidAt(int index) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean checkGeos() {
return getGeosLength() == 1;
}
@Override
public void updateProperties() {
// TODO Auto-generated method stub
}
public boolean isEditOccurred() {
return editOccurred;
}
public void setEditOccurred(boolean editOccurred) {
this.editOccurred = editOccurred;
}
@Override
public PropertyListener getListener() {
return listener;
}
}