package org.geogebra.common.gui.dialog.options.model; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.arithmetic.NumberValue; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.main.App; import org.geogebra.common.util.StringUtil; public class ColorFunctionModel extends OptionsModel { public interface IColorFunctionListener extends PropertyListener { void setRedText(final String text); void setGreenText(final String text); void setBlueText(final String text); void setAlphaText(final String text); void showAlpha(boolean value); void setDefaultValues(GeoElement geo0); void updateSelection(Object[] geos); } private IColorFunctionListener listener; private Kernel kernel; public ColorFunctionModel(App app, IColorFunctionListener listener) { super(app); this.kernel = app.getKernel(); this.listener = listener; } @Override public void updateProperties() { // check for fillable geos in the current selection boolean someFillable = false; for (int i = 0; i < getGeosLength(); i++) { if (getGeoAt(i).isFillable()) { someFillable = true; continue; } } // if we have any fillables then show the opacity field listener.showAlpha(someFillable); GeoElement geo0 = getGeoAt(0); listener.setDefaultValues(geo0); // take condition of first geo String strRed = ""; String strGreen = ""; String strBlue = ""; String strAlpha = ""; GeoList colorList = geo0.getColorFunction(); if (colorList != null) { strRed = colorList.get(0).getLabel(StringTemplate.editTemplate); strGreen = colorList.get(1).getLabel(StringTemplate.editTemplate); strBlue = colorList.get(2).getLabel(StringTemplate.editTemplate); if (colorList.size() == 4) { strAlpha = colorList.get(3) .getLabel(StringTemplate.editTemplate); } } // compare first geo with other selected geos // if difference exists in a color then null it out for (int i = 0; i < getGeosLength(); i++) { GeoElement geo = getGeoAt(i); GeoList colorListTemp = geo.getColorFunction(); if (colorListTemp != null) { String strRedTemp = colorListTemp.get(0) .getLabel(StringTemplate.editTemplate); String strGreenTemp = colorListTemp.get(1) .getLabel(StringTemplate.editTemplate); String strBlueTemp = colorListTemp.get(2) .getLabel(StringTemplate.editTemplate); String strAlphaTemp = ""; if (colorListTemp.size() == 4) { strAlphaTemp = colorListTemp.get(3) .getLabel(StringTemplate.editTemplate); } if (!strRed.equals(strRedTemp)) { strRed = ""; } if (!strGreen.equals(strGreenTemp)) { strGreen = ""; } if (!strBlue.equals(strBlueTemp)) { strBlue = ""; } if (!strAlpha.equals(strAlphaTemp)) { strAlpha = ""; } } } // set the color fields setListenerRGBA(strRed, strGreen, strBlue, strAlpha); } private void setListenerRGBA(final String strRed, final String strGreen, final String strBlue, final String strAlpha) { listener.setRedText(strRed); listener.setGreenText(strGreen); listener.setBlueText(strBlue); listener.setAlphaText(strAlpha); } public void applyChanges(String strRed0, String strGreen0, String strBlue0, String strAlpha0, int colorSpace, final String defaultRed, final String defaultGreen, final String defaultBlue, final String defaultAlpha) { GeoList list = null; GeoList listAlpha = null; String strRed = strRed0; String strGreen = strGreen0; String strBlue = strBlue0; String strAlpha = strAlpha0; int defaults = 0; if (StringUtil.emptyTrim(strRed)) { strRed = defaultRed; defaults++; } if (StringUtil.emptyTrim(strGreen)) { strGreen = defaultGreen; defaults++; } if (StringUtil.emptyTrim(strBlue)) { strBlue = defaultBlue; defaults++; } if (StringUtil.emptyTrim(strAlpha)) { strAlpha = defaultAlpha; defaults++; } if (defaults < 4) { list = kernel.getAlgebraProcessor().evaluateToList( "{" + strRed + "," + strGreen + "," + strBlue + "}"); listAlpha = kernel.getAlgebraProcessor().evaluateToList("{" + strRed + "," + strGreen + "," + strBlue + "," + strAlpha + "}"); } // set condition // try { if (list != null) { // if (((list.get(0) instanceof NumberValue)) && // bugfix, enter "x" // for a color ((list.get(1) instanceof NumberValue)) && // ((list.get(2) instanceof NumberValue)) && // ((list.size() == 3 || list.get(3) instanceof NumberValue))) { for (int i = 0; i < getGeosLength(); i++) { GeoElement geo = getGeoAt(i); if (geo.isFillable() && listAlpha != null) { geo.setColorFunction(listAlpha); list = listAlpha; // to have correct update } else { geo.setColorFunction(list); } geo.setColorSpace(colorSpace); } } list.updateRepaint(); // to update "showObject" as well listener.updateSelection(getGeos()); } else { // put back faulty text (for editing) setListenerRGBA(strRed, strGreen, strBlue, strAlpha); } storeUndoInfo(); } @Override public boolean checkGeos() { // Applicable for all geos return true; } public void removeAll() { for (int i = 0; i < getGeosLength(); i++) { GeoElement geo = getGeoAt(i); geo.removeColorFunction(); geo.setObjColor(geo.getObjectColor()); geo.updateRepaint(); } listener.setRedText(""); listener.setGreenText(""); listener.setBlueText(""); listener.setAlphaText(""); } @Override public boolean isValidAt(int index) { // TODO Auto-generated method stub return false; } @Override public PropertyListener getListener() { return listener; } }