package org.geogebra.common.kernel.scripting;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.commands.CmdScripting;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.MyError;
/**
* Execute[<list of commands>]
*/
public class CmdExecute extends CmdScripting {
/**
* Create new command processor
*
* @param kernel
* kernel
*/
public CmdExecute(Kernel kernel) {
super(kernel);
}
@Override
final public GeoElement[] perform(Command c) throws MyError {
int n = c.getArgumentNumber();
GeoElement[] arg;
arg = resArgs(c);
if (n > 10) {
throw argNumErr(app, c, n);
}
if (arg[0].isGeoList() && ((GeoList) arg[0]).size() == 0
|| !arg[0].isDefined()) {
return new GeoElement[] {};
}
if ((!arg[0].isGeoList()) || (!((GeoList) arg[0])
.getGeoElementForPropertiesDialog().isGeoText())) {
throw argErr(app, c, arg[0]);
}
GeoList list = (GeoList) arg[0];
// this is new in GeoGebra 4.2 and it will stop some files working
// but causes problems if the files are opened and edited
// and in the web project
boolean oldVal = kernelA.isUsingInternalCommandNames();
kernelA.setUseInternalCommandNames(true);
for (int i = 0; i < list.size(); i++) {
try {
String cmdText = ((GeoText) list.get(i)).getTextString();
for (int k = 1; k < n; k++) {
cmdText = cmdText.replace("%" + k,
arg[k].getLabel(StringTemplate.maxDecimals));
}
kernelA.getAlgebraProcessor()
.processAlgebraCommandNoExceptionHandling(cmdText,
false, app.getErrorHandler(), false, null);
} catch (MyError e) {
app.showError(e);
break;
} catch (Exception e) {
app.showError(e.getLocalizedMessage());
e.printStackTrace();
break;
}
}
kernelA.setUseInternalCommandNames(oldVal);
app.storeUndoInfo();
return arg;
}
}