package org.geogebra.common.kernel.algos;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.arithmetic.ExpressionNode;
import org.geogebra.common.kernel.arithmetic.Function;
import org.geogebra.common.kernel.arithmetic.FunctionVariable;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoFunction;
import org.geogebra.common.kernel.geos.GeoFunctionable;
import org.geogebra.common.plugin.GeoClass;
import org.geogebra.common.plugin.Operation;
/**
* Sum command helper for functions
*
*/
public class FunctionFold implements FoldComputer {
private GeoFunction resultFun;
/*
* (non-Javadoc)
*
* @see
* org.geogebra.common.kernel.algos.FoldComputer#getTemplate(org.geogebra.
* common.kernel.Construction)
*/
@Override
public GeoElement getTemplate(Construction cons, GeoClass listElement) {
return this.resultFun = new GeoFunction(cons);
}
/*
* (non-Javadoc)
*
* @see
* org.geogebra.common.kernel.algos.FoldComputer#add(org.geogebra.common.
* kernel.geos.GeoElement, org.geogebra.common.plugin.Operation)
*/
@Override
public void add(GeoElement geoElement, Operation op) {
resultFun = GeoFunction.add(resultFun, resultFun,
((GeoFunctionable) geoElement).getGeoFunction(), op);
}
/*
* (non-Javadoc)
*
* @see
* org.geogebra.common.kernel.algos.FoldComputer#setFrom(org.geogebra.common
* .kernel.geos.GeoElement, org.geogebra.common.kernel.Kernel)
*/
@Override
public void setFrom(GeoElement geoElement, Kernel kernel) {
if (!geoElement.isGeoFunctionable()) {
resultFun.setUndefined();
return;
}
GeoFunction fun1 = ((GeoFunctionable) geoElement).getGeoFunction();
FunctionVariable x1 = fun1.getFunction().getFunctionVariable();
FunctionVariable x = new FunctionVariable(kernel);
ExpressionNode left = fun1.getFunctionExpression()
.getCopy(fun1.getKernel());
Function f = new Function(left.replace(x1, x).wrap(), x);
resultFun.setFunction(f);
resultFun.setDefined(true);
}
/*
* (non-Javadoc)
*
* @see
* org.geogebra.common.kernel.algos.FoldComputer#check(org.geogebra.common.
* kernel.geos.GeoElement)
*/
@Override
public boolean check(GeoElement geoElement) {
return geoElement.isGeoFunctionable();
}
@Override
public void finish() {
// nothing to do
}
}