package org.geogebra.common.kernel.scripting; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.arithmetic.BooleanValue; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.arithmetic.MyDouble; import org.geogebra.common.kernel.commands.CommandProcessor; import org.geogebra.common.kernel.geos.GeoAngle; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.geos.GeoNumeric; import org.geogebra.common.main.MyError; /** * * Slider[<Min>,<Max>,<Increment>,<Speed>,<Width>,<Angle>,<Horizontal>,< * Animating>,<Random>] * */ public class CmdSlider extends CommandProcessor { /** * Create new command processor * * @param kernel * kernel */ public CmdSlider(Kernel kernel) { super(kernel); } @Override final public GeoElement[] process(Command c) throws MyError { int n = c.getArgumentNumber(); GeoElement[] arg; arg = resArgs(c); if (n < 2 || n > 9) { throw argNumErr(app, c, n); } for (int i = 0; i < Math.min(n, 5); i++) { if (!(arg[i] instanceof GeoNumberValue)) { throw argErr(app, c, arg[i]); } } for (int i = 5; i < n; i++) { if (!(arg[i] instanceof BooleanValue)) { throw argErr(app, c, arg[i]); } } GeoNumeric slider = null; // check if a slider already exists with this name and use it if // possible GeoElement geo = cons.lookupLabel(c.getLabel()); if (geo != null && geo.isGeoNumeric()) { slider = (GeoNumeric) geo; } // Slider[0,360deg] should be angle if ((n > 5 && ((BooleanValue) arg[5]).getBoolean()) || arg[0] instanceof GeoAngle || arg[1] instanceof GeoAngle) { if (slider == null || !slider.isAngle()) { slider = new GeoAngle(kernelA.getConstruction()); } } else { if (slider == null || slider.isAngle()) { slider = new GeoNumeric(kernelA.getConstruction()); } } slider.setIntervalMin((GeoNumberValue) arg[0]); slider.setIntervalMax((GeoNumberValue) arg[1]); if (n > 2) { slider.setAnimationStep((GeoNumberValue) arg[2]); slider.setAutoStep(!MyDouble.isFinite(arg[2].evaluateDouble())); } if (n > 3) { slider.setAnimationSpeedObject((GeoNumberValue) arg[3]); } if (n > 4) { slider.setSliderWidth(((GeoNumberValue) arg[4]).getDouble()); } if (n > 6) { slider.setSliderHorizontal(((BooleanValue) arg[6]).getBoolean()); } if (n > 7) { slider.setAnimating(((BooleanValue) arg[7]).getBoolean()); } if (n > 8) { slider.setRandom(((BooleanValue) arg[8]).getBoolean()); } slider.setLabelMode(GeoElement.LABEL_NAME_VALUE); slider.setLabelVisible(true); slider.setEuclidianVisible(true); slider.setLineThickness(GeoNumeric.DEFAULT_SLIDER_THICKNESS); slider.setLabel(c.getLabel()); return new GeoElement[] { slider }; } }