package org.geogebra.common.gui.dialog.options.model; import java.util.ArrayList; import org.geogebra.common.gui.inputfield.DynamicTextElement; import org.geogebra.common.gui.inputfield.DynamicTextProcessor; import org.geogebra.common.gui.menubar.OptionsMenu; import org.geogebra.common.kernel.geos.GProperty; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.kernel.geos.GeoText; import org.geogebra.common.kernel.geos.TextProperties; import org.geogebra.common.kernel.kernelND.GeoElementND; import org.geogebra.common.main.App; import org.geogebra.common.main.Localization; import org.geogebra.common.main.error.ErrorHandler; import org.geogebra.common.plugin.EventType; import org.geogebra.common.util.AsyncOperation; import org.geogebra.common.util.StringUtil; import org.geogebra.common.util.debug.Log; public class TextOptionsModel extends OptionsModel { public interface ITextOptionsListener extends PropertyListener { void setWidgetsVisible(boolean showFontDetails, boolean isButton); void setFontSizeVisibleOnly(); void selectSize(int index); void selectFont(int index); void selectDecimalPlaces(int index); void setSecondLineVisible(boolean noDecimals); void selectFontStyle(int style); void setEditorText(ArrayList<DynamicTextElement> list); void setEditorText(String text); void updatePreview(); void reinitEditor(); } private ITextOptionsListener listener; private boolean justDisplayFontSize; private Localization loc; private DynamicTextProcessor dTProcessor; private GeoText editGeo; public TextOptionsModel(App app) { super(app); loc = app.getLocalization(); dTProcessor = new DynamicTextProcessor(app); editGeo = null; } @Override public boolean checkGeos() { if (!hasGeos()) { return false; } boolean geosOK = true; justDisplayFontSize = true; for (int i = 0; i < getGeosLength(); i++) { GeoElement geo = getGeoAt(i); if ((geo instanceof TextProperties && !((TextProperties) geo).justFontSize()) || geo.isGeoButton()) { justDisplayFontSize = false; } if (!(geo.getGeoElementForPropertiesDialog().isGeoText())) { if (!geo.isGeoButton()) { geosOK = false; break; } } } return geosOK; } public TextProperties getTextPropertiesAt(int index) { return (TextProperties) getObjectAt(index); } public GeoText getGeoTextAt(int index) { Object ret = getObjectAt(index); if (ret instanceof GeoText) { return (GeoText) ret; } return null; } @Override public void updateProperties() { GeoElement geo = getGeoAt(0); if (geo.isGeoInputBox()) { listener.setFontSizeVisibleOnly(); } else { listener.setWidgetsVisible(!justDisplayFontSize, geo.isGeoButton()); } TextProperties geo0 = getTextPropertiesAt(0); setEditGeo(getGeoTextAt(0)); listener.selectSize( GeoText.getFontSizeIndex(geo0.getFontSizeMultiplier())); // font // size // ranges // from // -6 // to // 6, // transform // this // to // 0,1,..,6 listener.selectFont(geo0.isSerifFont() ? 1 : 0); int selItem = -1; int decimals = geo0.getPrintDecimals(); if (decimals > 0 && decimals < OptionsMenu.decimalsLookupLength() && !geo0.useSignificantFigures()) { selItem = OptionsMenu.decimalsLookup(decimals); } int figures = geo0.getPrintFigures(); if (figures > 0 && figures < OptionsMenu.figuresLookupLength() && geo0.useSignificantFigures()) { selItem = OptionsMenu.figuresLookup(figures); } listener.selectDecimalPlaces(selItem); listener.setSecondLineVisible( (getGeoAt(0).isIndependent() || (geo0 instanceof GeoList))); Log.debug("UpdateText Properties Text"); GeoText text0 = getGeoTextAt(0); if (text0 != null) { /* * Gives null for eg. table text */ ArrayList<DynamicTextElement> a = dTProcessor .buildDynamicTextList(text0); if (a != null) { listener.setEditorText(a); } } listener.selectFontStyle(geo0.getFontStyle()); } public void applyFontSizeFromString(String percentStr0) { double multiplier; if (percentStr0 == null) { // Cancel return; } String percentStr = percentStr0.replaceAll("%", ""); try { multiplier = StringUtil.parseDouble(percentStr) / 100; if (multiplier < 0.01) { multiplier = 0.01; } else if (multiplier > 100) { multiplier = 100; } } catch (NumberFormatException e2) { app.showError("InvalidInput"); return; } applyFontSize(multiplier); } public void applyFontSizeFromIndex(int index) { applyFontSize(GeoText.getRelativeFontSize(index)); } public void applyFontSize(double value) { for (int i = 0; i < getGeosLength(); i++) { TextProperties text = getTextPropertiesAt(i); text.setFontSizeMultiplier(value); getGeoAt(i).updateVisualStyleRepaint(GProperty.FONT); } if (editGeo == null) { return; } ((TextProperties) editGeo).setFontSizeMultiplier(value); listener.updatePreview(); } public String[] getFonts() { String[] ret = { loc.getMenu("SansSerif"), loc.getMenu("Serif") }; return ret; } public String[] getFontSizes() { return loc.getFontSizeStrings(); } public void applyFont(boolean isSerif) { for (int i = 0; i < getGeosLength(); i++) { TextProperties text = getTextPropertiesAt(i); text.setSerifFont(isSerif); text.updateVisualStyleRepaint(GProperty.FONT); } if (editGeo != null) { ((TextProperties) editGeo).setSerifFont(isSerif); } listener.updatePreview(); } public void applyDecimalPlaces(int decimals) { for (int i = 0; i < getGeosLength(); i++) { TextProperties text = getTextPropertiesAt(i); if (decimals < 8) // decimal places { // Application.debug("decimals"+roundingMenuLookup[decimals]+""); text.setPrintDecimals(OptionsMenu.roundingMenuLookup(decimals), true); } else // significant figures { // Application.debug("figures"+roundingMenuLookup[decimals]+""); text.setPrintFigures(OptionsMenu.roundingMenuLookup(decimals), true); } ((GeoElement) text).updateRepaint(); } listener.updatePreview(); } public static int getFontStyle(boolean isBold, boolean isItalic) { int style = 0; if (isBold) { style += 1; } if (isItalic) { style += 2; } return style; } public void applyFontStyle(boolean isBold, boolean isItalic) { int style = getFontStyle(isBold, isItalic); for (int i = 0; i < getGeosLength(); i++) { TextProperties text = getTextPropertiesAt(i); text.setFontStyle(style); text.updateVisualStyleRepaint(GProperty.FONT); } listener.updatePreview(); } public String getGeoGebraString(ArrayList<DynamicTextElement> list, boolean isLatex) { return dTProcessor.buildGeoGebraString(list, isLatex); } public GeoText getEditGeo() { return editGeo; } public void setEditGeo(GeoText editGeo) { this.editGeo = editGeo; } public void setEditGeoText(String text) { if (editGeo == null) { return; } editGeo.setTextString(text); } public void applyEditedGeo(ArrayList<DynamicTextElement> text, final boolean isLatex, final boolean isSerif, ErrorHandler handler) { GeoText geo0 = getGeoTextAt(0); app.getKernel().getAlgebraProcessor().changeGeoElement(geo0, dTProcessor.buildGeoGebraString(text, isLatex), true, true, handler, new AsyncOperation<GeoElementND>() { @Override public void callback(GeoElementND geo1) { ((GeoText) geo1).setSerifFont(isSerif); ((GeoText) geo1).setLaTeX(isLatex, true); ((GeoText) geo1).updateRepaint(); app.getSelectionManager().addSelectedGeo(geo1); editGeo = null; } }); storeUndoInfo(); } public void cancelEditGeo() { if (editGeo == null) { return; } editGeo = null; listener.updatePreview(); } public void setLaTeX(boolean isLatex, boolean updateAlgo) { if (editGeo == null) { return; } editGeo.setLaTeX(isLatex, updateAlgo); listener.updatePreview(); storeUndoInfo(); } @Override protected boolean isValidAt(int index) { // TODO Auto-generated method stub return false; } public boolean isTextEditable() { return getGeosLength() == 1 && getObjectAt(0) instanceof GeoText && !getGeoTextAt(0).isTextCommand() && !getGeoTextAt(0).isProtected(EventType.UPDATE); } @Override public PropertyListener getListener() { return listener; } public void setListener(ITextOptionsListener listener) { this.listener = listener; } public void reinitEditor() { if (listener != null) { listener.reinitEditor(); } } }