package org.geogebra.common.gui.dialog.options.model; import java.util.List; import org.geogebra.common.kernel.geos.GeoConic; import org.geogebra.common.kernel.kernelND.GeoConicND; import org.geogebra.common.main.App; import org.geogebra.common.main.Localization; public class ConicEqnModel extends MultipleOptionsModel { private Localization loc; int implicitIndex, explicitIndex, specificIndex, parametricIndex, userIndex, vertexformIndex, conicformIndex; public ConicEqnModel(App app) { super(app); this.loc = app.getLocalization(); } @Override public boolean isValidAt(int index) { if (!app.getSettings().getCasSettings().isEnabled()) { return false; } return (getObjectAt(index) instanceof GeoConic); } private GeoConicND getConicAt(int index) { return (GeoConicND) getObjectAt(index); } @Override public void updateProperties() { // check if all conics have same type and mode // and if specific, explicit is possible GeoConicND temp, geo0 = getConicAt(0); boolean equalType = true; boolean equalMode = true; boolean specificPossible = geo0.isSpecificPossible(); boolean explicitPossible = geo0.isExplicitPossible(); boolean userPossible = geo0.getDefinition() != null; boolean vertexformPossible = geo0.isVertexformPossible(); boolean conicformPossible = geo0.isConicformPossible(); for (int i = 1; i < getGeosLength(); i++) { temp = getConicAt(i); // same type? if (geo0.getType() != temp.getType()) { equalType = false; } // same mode? if (geo0.getToStringMode() != temp.getToStringMode()) { equalMode = false; } // specific equation possible? if (!temp.isSpecificPossible()) { specificPossible = false; } // explicit equation possible? if (!temp.isExplicitPossible()) { explicitPossible = false; } if (temp.getDefinition() == null) { userPossible = false; } if (!temp.isVertexformPossible()) { vertexformPossible = false; } if (!temp.isConicformPossible()) { conicformPossible = false; } } // specific can't be shown because there are different types if (!equalType) { specificPossible = false; } specificIndex = -1; explicitIndex = -1; implicitIndex = -1; userIndex = -1; parametricIndex = -1; vertexformIndex = -1; conicformIndex = -1; int counter = -1; getListener().clearItems(); if (specificPossible) { getListener().addItem(geo0.getSpecificEquation()); specificIndex = ++counter; } if (explicitPossible) { getListener().addItem(loc.getPlain("ExplicitConicEquation")); explicitIndex = ++counter; } if (userPossible) { getListener().addItem(loc.getPlain("InputForm")); userIndex = ++counter; } implicitIndex = ++counter; getListener().addItem(loc.getPlain("ImplicitConicEquation")); if (vertexformPossible) { getListener().addItem(loc.getPlain("ParabolaVertexForm")); vertexformIndex = ++counter; } if (conicformPossible) { getListener().addItem(loc.getPlain("ParabolaConicForm")); conicformIndex = ++counter; } int mode; if (equalMode) { mode = geo0.getToStringMode(); } else { mode = -1; } switch (mode) { case GeoConicND.EQUATION_SPECIFIC: if (specificIndex > -1) { getListener().setSelectedIndex(specificIndex); } break; case GeoConicND.EQUATION_EXPLICIT: if (explicitIndex > -1) { getListener().setSelectedIndex(explicitIndex); } break; case GeoConicND.EQUATION_IMPLICIT: getListener().setSelectedIndex(implicitIndex); break; case GeoConicND.EQUATION_PARAMETRIC: getListener().setSelectedIndex(parametricIndex); break; case GeoConicND.EQUATION_USER: getListener().setSelectedIndex(userIndex); break; case GeoConicND.EQUATION_VERTEX: if (vertexformIndex > -1) { getListener().setSelectedIndex(vertexformIndex); } break; case GeoConicND.EQUATION_CONICFORM: if (conicformIndex > -1) { getListener().setSelectedIndex(conicformIndex); } break; default: getListener().setSelectedIndex(-1); } } @Override public List<String> getChoiches(Localization loc) { // Not used return null; } @Override protected void apply(int index, int value) { GeoConicND geo = getConicAt(index); if (value == specificIndex) { geo.setToSpecific(); } else if (value == explicitIndex) { geo.setToExplicit(); } else if (value == implicitIndex) { geo.setToImplicit(); } else if (value == userIndex) { geo.setToUser(); } else if (value == parametricIndex) { geo.setToParametric(); } else if (value == vertexformIndex) { geo.setToVertexform(); } else if (value == conicformIndex) { geo.setToConicform(); } geo.updateRepaint(); } @Override public int getValueAt(int index) { // Not used return 0; } }