package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.kernel.CircularDefinitionException;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoBoolean;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.main.App;
import org.geogebra.common.main.error.ErrorHandler;
import org.geogebra.common.main.error.ErrorHelper;
import org.geogebra.common.util.StringUtil;
public class ShowConditionModel extends OptionsModel {
public interface IShowConditionListener extends PropertyListener {
void setText(String text);
void updateSelection(Object[] geos);
}
private IShowConditionListener listener;
public ShowConditionModel(App app, IShowConditionListener listener) {
super(app);
this.listener = listener;
}
@Override
public void updateProperties() {
// take condition of first geo
String strCond = "";
GeoElement geo0 = getGeoAt(0);
GeoBoolean cond = geo0.getShowObjectCondition();
if (cond != null) {
strCond = cond.getLabel(StringTemplate.editTemplate);
}
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
cond = geo.getShowObjectCondition();
if (cond != null) {
String strCondGeo = cond.getLabel(StringTemplate.editTemplate);
if (!strCond.equals(strCondGeo)) {
strCond = "";
}
}
}
listener.setText(strCond);
}
@Override
public boolean isValidAt(int index) {
return getGeoAt(index).isEuclidianShowable();
}
/**
* @param strCond
* string value of the condition
* @param handler
* takes care of errors
*/
public void applyChanges(String strCond, ErrorHandler handler) {
// processed = true;
GeoBoolean cond;
if (StringUtil.emptyTrim(strCond)) {
cond = null;
} else {
cond = app.getKernel().getAlgebraProcessor()
.evaluateToBoolean(strCond, handler);
}
if (cond != null || StringUtil.emptyTrim(strCond)) {
// set condition
try {
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
geo.setShowObjectCondition(cond);
// make sure object shown when condition removed
if (cond == null) {
geo.updateRepaint();
}
}
} catch (CircularDefinitionException e) {
listener.setText("");
ErrorHelper.handleException(e, app, handler);
}
if (cond != null) {
cond.updateRepaint();
}
// to update "showObject" as well
listener.updateSelection(getGeos());
} else {
// put back faulty condition (for editing)
listener.setText(strCond);
}
storeUndoInfo();
}
@Override
public PropertyListener getListener() {
return listener;
}
}