package org.geogebra.common.gui.dialog.options.model; import java.util.Arrays; import java.util.List; import org.geogebra.common.kernel.ConstructionDefaults; 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.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.geos.GeoNumeric; import org.geogebra.common.main.App; import org.geogebra.common.main.Localization; public class AnimationSpeedModel extends MultipleOptionsModel { public interface IAnimationSpeedListener extends IComboListener, ITextFieldListener { } private boolean showSliders = false; private Kernel kernel; @Override public IAnimationSpeedListener getListener() { return (IAnimationSpeedListener) super.getListener(); } public AnimationSpeedModel(App app) { super(app); kernel = app.getKernel(); } @Override public boolean isValidAt(int index) { GeoElement geo = getGeoAt(index); if (geo.isPointOnPath() || geo .getDefaultGeoType() == ConstructionDefaults.DEFAULT_POINT_ON_PATH) { if (!geo.isPointerChangeable()) { return false; } } else if (geo.isGeoNumeric() && geo.isIndependent()) { if (!isShowSliders() || !geo.isPointerChangeable()) { return false; } } else { return false; } return true; } @Override public void updateProperties() { // check if properties have same values GeoElement temp, geo0 = getGeoAt(0); boolean equalSpeed = true; boolean equalAnimationType = true; for (int i = 0; i < getGeosLength(); i++) { temp = getGeoAt(i); // same object visible value if (geo0.getAnimationSpeedObject() != temp .getAnimationSpeedObject()) { equalSpeed = false; } if (geo0.getAnimationType() != temp.getAnimationType()) { equalAnimationType = false; } } getListener().setSelectedIndex( equalAnimationType ? geo0.getAnimationType() : -1); StringTemplate highPrecision = StringTemplate.printDecimals( StringType.GEOGEBRA, AnimationStepModel.TEXT_FIELD_FRACTION_DIGITS, false); if (equalSpeed) { GeoElement speedObj = geo0.getAnimationSpeedObject(); GeoNumeric num = kernel.getAlgoDispatcher() .getDefaultNumber(geo0.isAngle()); getListener().setText(speedObj == null ? num.getAnimationSpeedObject().getLabel(highPrecision) : speedObj.getLabel(highPrecision)); } else { getListener().setText(""); } } @Override public List<String> getChoiches(Localization loc) { return Arrays.asList("\u21d4 " + loc.getPlain("Oscillating"), // index 0 "\u21d2 " + loc.getPlain("Increasing"), // index 1 "\u21d0 " + loc.getPlain("Decreasing"), // index 2 "\u21d2 " + loc.getPlain("IncreasingOnce")); // index 3); } public void applyTypeChanges(int value) { applyChanges(value); storeUndoInfo(); } public void applySpeedChanges(GeoNumberValue value) { for (int i = 0; i < getGeosLength(); i++) { GeoElement geo = getGeoAt(i); geo.setAnimationSpeedObject(value); geo.updateCascade(); } kernel.udpateNeedToShowAnimationButton(); kernel.notifyRepaint(); storeUndoInfo(); } @Override protected void apply(int index, int value) { GeoElement geo = getGeoAt(index); geo.setAnimationType(value); geo.updateRepaint(); } @Override public int getValueAt(int index) { // not used return -1; } public boolean isShowSliders() { return showSliders; } public void setShowSliders(boolean showSliders) { this.showSliders = showSliders; } }