package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.arithmetic.ExpressionNodeConstants.StringType;
import org.geogebra.common.kernel.arithmetic.NumberValue;
import org.geogebra.common.kernel.geos.GeoAngle;
import org.geogebra.common.kernel.geos.GeoAngle.AngleStyle;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.main.App;
import org.geogebra.common.main.error.ErrorHelper;
public class AnimationStepModel extends OptionsModel {
private ITextFieldListener listener;
private boolean partOfSlider;
public final static int TEXT_FIELD_FRACTION_DIGITS = 8;
public AnimationStepModel(ITextFieldListener listener, App app) {
super(app);
this.listener = listener;
}
@Override
public void updateProperties() {
// check if properties have same values
GeoElement temp, geo0 = getGeoAt(0);
boolean equalStep = true;
boolean onlyAngles = true;
for (int i = 0; i < getGeosLength(); i++) {
temp = getGeoAt(i);
// same object visible value
if (!Kernel.isEqual(geo0.getAnimationStep(),
temp.getAnimationStep())) {
equalStep = false;
}
if (!(temp.isGeoAngle())) {
onlyAngles = false;
}
}
// int oldDigits = kernel.getMaximumFractionDigits();
// kernel.setMaximumFractionDigits(PropertiesDialog.TEXT_FIELD_FRACTION_DIGITS);
StringTemplate highPrecision = StringTemplate.printDecimals(
StringType.GEOGEBRA, TEXT_FIELD_FRACTION_DIGITS, false);
if (equalStep) {
NumberValue step = geo0.getAnimationStepObject();
GeoElement stepGeo = GeoElement.as(step);
if (onlyAngles && (stepGeo == null
|| (!stepGeo.isLabelSet() && stepGeo.isIndependent()))) {
listener.setText(app.getKernel()
.formatAngle(geo0.getAnimationStep(), highPrecision,
((GeoAngle) geo0)
.getAngleStyle() == AngleStyle.UNBOUNDED)
.toString());
} else {
boolean autostep = false;
if (geo0.isGeoNumeric()) {
autostep = ((GeoNumeric) geo0).isAutoStep();
}
listener.setText(autostep ? "" : step.getLabel(highPrecision));
}
} else {
listener.setText("");
}
}
@Override
public boolean isValidAt(int index) {
GeoElement geo = getGeoAt(index);
if (!geo.isPointerChangeable() || geo.isGeoText() || geo.isGeoImage()
|| geo.isGeoList() || geo.isGeoBoolean() || geo.isGeoButton()
|| (!isPartOfSlider() && geo.isGeoNumeric()
&& geo.isIndependent()) // slider
) {
return false;
}
return true;
}
public void applyChanges(String text) {
NumberValue value = text.length() == 0 ? null
: app.getKernel().getAlgebraProcessor().evaluateToNumeric(text,
ErrorHelper.silent());
boolean isNaN = value == null || Double.isNaN(value.getDouble());
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
if (geo.isGeoNumeric()) {
((GeoNumeric) geo).setAutoStep(isNaN);
if (!isNaN) {
geo.setAnimationStep(value);
}
} else if (value != null) {
geo.setAnimationStep(value);
}
geo.updateRepaint();
}
storeUndoInfo();
}
public boolean isPartOfSlider() {
return partOfSlider;
}
public void setPartOfSlider(boolean partOfSlider) {
this.partOfSlider = partOfSlider;
}
@Override
public PropertyListener getListener() {
return listener;
}
}