package org.geogebra.common.gui.dialog.handler; import org.geogebra.common.gui.InputHandler; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.arithmetic.FunctionalNVar; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.kernelND.GeoElementND; import org.geogebra.common.main.App; import org.geogebra.common.main.MyError; import org.geogebra.common.main.error.ErrorHandler; import org.geogebra.common.util.AsyncOperation; public class RedefineInputHandler implements InputHandler { private GeoElementND geo; App app; String oldString; public RedefineInputHandler(App app, GeoElement geo, String oldString) { this.geo = geo; this.app = app; this.oldString = oldString; } /** * @param geo */ public void setGeoElement(GeoElementND geo) { this.geo = geo; oldString = geo.getRedefineString(false, true); } /** * * @return current geo */ public GeoElementND getGeoElement() { return geo; } @Override public void processInput(String rawInput, ErrorHandler handler, final AsyncOperation<Boolean> callback) { if (rawInput == null) { callback.callback(false); return; } if (rawInput.equals(this.oldString)) { callback.callback(true); return; } try { String inputValue = rawInput; if (geo instanceof FunctionalNVar) { // string like f(x,y)=x^2 // or f(\theta) = \theta inputValue = geo.getLabel(StringTemplate.defaultTemplate) + "(" + ((FunctionalNVar) geo) .getVarString(StringTemplate.defaultTemplate) + ")=" + inputValue; } final String input = inputValue; app.getKernel().getAlgebraProcessor().changeGeoElement(geo, inputValue, true, true, handler, new AsyncOperation<GeoElementND>() { @Override public void callback(GeoElementND newGeo) { app.getKernel().clearJustCreatedGeosInViews(); if (newGeo != null) { app.doAfterRedefine(newGeo); // update after redefine // http://code.google.com/p/geogebra/issues/detail?id=147 setGeoElement(newGeo); oldString = input; // ----------------------------------------------------------- } // needed for Apply button if (callback != null) { callback.callback(newGeo != null); } } }); return; } catch (Exception e) { app.showError("ReplaceFailed"); } catch (MyError err) { app.showError(err); } callback.callback(false); } }