package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.gui.dialog.handler.RedefineInputHandler;
import org.geogebra.common.gui.dialog.handler.RenameInputHandler;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.arithmetic.TextValue;
import org.geogebra.common.kernel.geos.GProperty;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.main.App;
import org.geogebra.common.main.error.ErrorHandler;
import org.geogebra.common.util.AsyncOperation;
public class ObjectNameModel extends OptionsModel {
public interface IObjectNameListener extends PropertyListener {
void setNameText(final String text);
void setDefinitionText(final String text);
void setCaptionText(final String text);
void updateGUI(boolean showDefinition, boolean showCaption);
void updateDefLabel();
void updateCaption();
void updateName(final String text);
}
private IObjectNameListener listener;
private RenameInputHandler nameInputHandler;
private RedefineInputHandler defInputHandler;
private GeoElementND currentGeo;
private boolean redefinitionFailed;
private boolean busy;
public ObjectNameModel(App app, IObjectNameListener listener) {
super(app);
this.listener = listener;
busy = false;
redefinitionFailed = false;
setNameInputHandler(new RenameInputHandler(app, null, false));
// DEFINITON PANEL
setDefInputHandler(new RedefineInputHandler(app, null, null));
}
@Override
public void updateProperties() {
/*
* DON'T WORK : MAKE IT A TRY FOR 5.0 ? //apply textfields modification
* on previous geo before switching to new geo //skip this if label is
* not set (we re in the middle of redefinition) //skip this if action
* is performing if (currentGeo!=null && currentGeo.isLabelSet() &&
* !actionPerforming && (geos.length!=1 || geos[0]!=currentGeo)){
*
* //App.printStacktrace("\n"+tfName.getText()+"\n"+currentGeo.getLabel(
* StringTemplate.defaultTemplate));
*
* String strName = tfName.getText(); if (strName !=
* currentGeo.getLabel(StringTemplate.defaultTemplate))
* nameInputHandler.processInput(tfName.getText());
*
*
* String strDefinition = tfDefinition.getText(); if
* (strDefinition.length()>0 &&
* !strDefinition.equals(getDefText(currentGeo)))
* defInputHandler.processInput(strDefinition);
*
* String strCaption = tfCaption.getText(); if
* (!strCaption.equals(currentGeo.getCaptionSimple())){
* currentGeo.setCaption(tfCaption.getText());
* currentGeo.updateVisualStyleRepaint(); } }
*/
// take name of first geo
GeoElement geo0 = getGeoAt(0);
listener.updateName(geo0.getLabel(StringTemplate.editTemplate));
// if a focus lost is called in between, we keep the current definition
// text
// redefinitionForFocusLost = tfDefinition.getText();
setCurrentGeo(geo0);
nameInputHandler.setGeoElement(geo0);
defInputHandler.setGeoElement(geo0);
// DEFINITION
// boolean showDefinition = !(currentGeo.isGeoText() ||
// currentGeo.isGeoImage());
boolean showDefinition = true;
if(getCurrentGeo().isGeoText()){
showDefinition = ((GeoText) getCurrentGeo()).isTextCommand();
}else{
showDefinition = getCurrentGeo().isAlgebraViewEditable();
}
if (showDefinition) {
listener.updateDefLabel();
}
// CAPTION
boolean showCaption = !(getCurrentGeo() instanceof TextValue); // borcherds
// was
// currentGeo.isGeoBoolean();
if (showCaption) {
listener.updateCaption();
}
// captionLabel.setVisible(showCaption);
// inputPanelCap.setVisible(showCaption);
listener.updateGUI(showDefinition, showCaption);
}
@Override
public boolean checkGeos() {
return (getGeosLength() == 1);
}
public void applyNameChange(final String name, ErrorHandler handler) {
nameInputHandler.setGeoElement(currentGeo);
nameInputHandler.processInput(name, handler,
new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean obj) {
// TODO Auto-generated method stub
}
});
// reset label if not successful
final String strName = currentGeo
.getLabel(StringTemplate.defaultTemplate);
if (!strName.equals(name)) {
listener.setNameText(strName);
}
currentGeo.updateRepaint();
storeUndoInfo();
}
public void applyDefinitionChange(final String definition,
ErrorHandler handler) {
if (!definition.equals(getDefText(currentGeo))) {
defInputHandler.processInput(definition, handler,
new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean ok) {
if (ok) {
// if succeeded, switch current geo
currentGeo = defInputHandler.getGeoElement();
app.getSelectionManager()
.clearSelectedGeos(false, false);
app.getSelectionManager()
.addSelectedGeo(currentGeo);
} else {
setRedefinitionFailed(true);
}
storeUndoInfo();
}
});
}
}
public static String getDefText(GeoElementND geo) {
/*
* return geo.isIndependent() ? geo.toOutputValueString() :
* geo.getCommandDescription();
*/
return geo.getRedefineString(false, true);
}
public void applyCaptionChange(final String caption) {
currentGeo.setCaption(caption);
final String strCaption = currentGeo.getRawCaption();
if (!strCaption.equals(caption.trim())) {
listener.setCaptionText(strCaption);
}
currentGeo.updateVisualStyleRepaint(GProperty.CAPTION);
storeUndoInfo();
}
public void redefineCurrentGeo(GeoElementND geo, final String text,
final String redefinitionText, ErrorHandler handler) {
setBusy(true);
if (isRedefinitionFailed()) {
setRedefinitionFailed(false);
return;
}
if (currentGeo == geo) {
if (!text.equals(getDefText(currentGeo))) {
listener.setDefinitionText(text);
defInputHandler.setGeoElement(geo);
defInputHandler.processInput(text, handler,
new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean ok) {
if (ok) {
setCurrentGeo(
defInputHandler.getGeoElement());
storeUndoInfo();
}
}
});
}
} else {
String strDefinition = redefinitionText;
if (!strDefinition.equals(getDefText(geo))) {
defInputHandler.setGeoElement(geo);
defInputHandler.processInput(strDefinition, handler,
new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean obj) {
// TODO Auto-generated method stub
}
});
defInputHandler.setGeoElement(currentGeo);
}
}
}
public GeoElementND getCurrentGeo() {
return currentGeo;
}
public void setCurrentGeo(GeoElementND currentGeo) {
this.currentGeo = currentGeo;
}
public RenameInputHandler getNameInputHandler() {
return nameInputHandler;
}
public void setNameInputHandler(RenameInputHandler nameInputHandler) {
this.nameInputHandler = nameInputHandler;
}
public RedefineInputHandler getDefInputHandler() {
return defInputHandler;
}
public void setDefInputHandler(RedefineInputHandler defInputHandler) {
this.defInputHandler = defInputHandler;
}
public boolean isBusy() {
return busy;
}
public void setBusy(boolean busy) {
this.busy = busy;
}
protected boolean isRedefinitionFailed() {
return redefinitionFailed;
}
protected void setRedefinitionFailed(boolean redefinitionFailed) {
this.redefinitionFailed = redefinitionFailed;
}
@Override
protected boolean isValidAt(int index) {
// TODO Auto-generated method stub
return true;
}
@Override
public PropertyListener getListener() {
return listener;
}
}