package org.geogebra.web.web.gui.color; import java.util.HashMap; import org.geogebra.common.awt.GColor; import org.geogebra.common.gui.util.SelectionTable; import org.geogebra.common.main.Feature; import org.geogebra.common.main.GeoGebraColorConstants; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.util.GeoGebraIconW; import org.geogebra.web.web.gui.util.ImageOrText; import org.geogebra.web.web.gui.util.PopupMenuButtonW; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; /** * Color popup for stylebar * */ public class ColorPopupMenuButton extends PopupMenuButtonW implements ClickHandler { /** foreground */ public static final int COLORSET_DEFAULT = 0; /** background */ public static final int COLORSET_BGCOLOR = 1; private int colorSetType; private GColor[] colorSet; private GColor defaultColor; private HashMap<String, Integer> lookupMap; private boolean enableTable; private boolean hasSlider; /** * @param app * {@link AppW} * @param colorSetType * {@code int} * @param hasSlider * {@code boolean} */ public ColorPopupMenuButton(AppW app, int colorSetType, boolean hasSlider) { super(app, createDummyIcons(10), -1, 5, SelectionTable.MODE_ICON); this.app = app; this.colorSetType = colorSetType; this.hasSlider = hasSlider; setColors(); defaultColor = colorSet[0]; lookupMap = new HashMap<String, Integer>(); for (int i = 0; i < colorSet.length; i++) { if (colorSet[i] != null) { lookupMap.put(GColor.getColorString(colorSet[i]), i); } } getMySlider().setMinimum(0); getMySlider().setMaximum(100); getMySlider().setMajorTickSpacing(25); getMySlider().setMinorTickSpacing(5); setSliderValue(100); setSliderVisible(hasSlider); updateColorTable(); setKeepVisible(false); getMyTable().removeDefaultStyle(); } /** * Sets the colors to choose from. */ protected void setColors() { colorSet = GeoGebraColorConstants.getSimplePopupArray(colorSetType); } /** * @param visible * {@code boolean} */ protected void setSliderVisible(boolean visible) { hasSlider = visible; showSlider(hasSlider); if (!app.has(Feature.COLORPOPUP_IMPROVEMENTS)) { if (!hasSlider && app.isWhiteboardActive()) { getMyPopup().setHeight("38px"); } } } /** * Update the table */ protected void updateColorTable() { getMyTable().populateModel(getColorSwatchIcons(colorSet, getSliderValue() / 100f)); } @Override public ImageOrText getButtonIcon() { ImageOrText icon = super.getButtonIcon(); if (icon == null) { icon = GeoGebraIconW.createColorSwatchIcon(getSliderValue() / 100f, defaultColor, null); } return icon; } /** * @param color * {@link GColor} * @return {@code int} the index of the given color */ protected int getColorIndex(GColor color) { int index = -1; if (color == null && colorSetType == COLORSET_BGCOLOR) { index = colorSet.length - 1; return index; } if (lookupMap.containsKey(GColor.getColorString(color))) { index = lookupMap.get(GColor.getColorString(color)); } return index; } /** * @return the selected {@link GColor color} */ public GColor getSelectedColor() { if (!enableTable) { return null; } int index = getSelectedIndex(); if (index <= -1) { return defaultColor; } else if (colorSetType == COLORSET_BGCOLOR && index > colorSet.length - 1) { return null; } else { return colorSet[index]; } } /** * @param alpha * opacity * @param gc * base color */ protected void setDefaultColor(double alpha, GColor gc) { defaultColor = gc; if (gc != null) { this.setIcon(GeoGebraIconW.createColorSwatchIcon(alpha, gc, null)); this.getElement().getStyle().setBorderColor(gc.toString()); } else { this.setIcon(GeoGebraIconW.createNullSymbolIcon()); this.getElement().getStyle() .setBorderColor(GColor.BLACK.toString()); } } private static ImageOrText[] getColorSwatchIcons(GColor[] colorArray, double alpha) { ImageOrText[] a = new ImageOrText[colorArray.length]; for (int i = 0; i < colorArray.length; i++) { if (colorArray[i] != null) { a[i] = GeoGebraIconW.createColorSwatchIcon(alpha, colorArray[i], null); } else { a[i] = new ImageOrText("+"); // a[i] = new ImageOrText(AppResources.INSTANCE.more()); } } return a; } private static ImageOrText[] createDummyIcons(int count) { ImageOrText[] a = new ImageOrText[count]; for (int i = 0; i < count; i++) { a[i] = new ImageOrText(); } return a; } @Override public void onClick(ClickEvent event) { if (this.hasSlider) { Integer si = getSelectedIndex(); defaultColor = getSelectedColor(); updateColorTable(); setSelectedIndex(si); } } @Override protected void fireActionPerformed() { if (this.hasSlider) { Integer si = getSelectedIndex(); defaultColor = getSelectedColor(); updateColorTable(); setSelectedIndex(si); } } /** * @return whether table is enabled (otherwise just slider) */ public boolean isEnableTable() { return enableTable; } /** * @param enableTable * whether table is enabled (otherwise just slider) */ public void setEnableTable(boolean enableTable) { this.enableTable = enableTable; getMyTable().setVisible(enableTable); } public GColor[] getColorSet() { return colorSet; } public void setColorSet(GColor[] colorSet) { this.colorSet = colorSet; } }