/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ package org.geogebra.desktop.gui.color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import javax.swing.ImageIcon; import org.geogebra.common.awt.GColor; import org.geogebra.common.gui.util.SelectionTable; import org.geogebra.common.main.GeoGebraColorConstants; import org.geogebra.desktop.awt.GColorD; import org.geogebra.desktop.gui.util.GeoGebraIconD; import org.geogebra.desktop.gui.util.PopupMenuButtonD; import org.geogebra.desktop.main.AppD; public class ColorPopupMenuButton extends PopupMenuButtonD implements ActionListener { private static final long serialVersionUID = 1L; private AppD app; public static final int COLORSET_DEFAULT = 0; public static final int COLORSET_BGCOLOR = 1; private int colorSetType; private GColor[] colorSet; private GColor defaultColor; private HashMap<GColor, Integer> lookupMap; private boolean hasSlider; private Dimension iconSize; public ColorPopupMenuButton(AppD app, Dimension iconSize, int colorSetType, boolean hasSlider) { super(app, createDummyIcons(iconSize), -1, 9, iconSize, SelectionTable.MODE_ICON); this.app = app; this.iconSize = iconSize; this.colorSetType = colorSetType; this.hasSlider = hasSlider; colorSet = getColorArray(colorSetType); defaultColor = colorSet[0]; lookupMap = new HashMap<GColor, Integer>(); for (int i = 0; i < colorSet.length; i++) { lookupMap.put((colorSet[i]), i); } setToolTipArray(getToolTipArray()); getMyTable().setUseColorSwatchBorder(true); getMySlider().setMinimum(0); getMySlider().setMaximum(100); getMySlider().setMajorTickSpacing(25); getMySlider().setMinorTickSpacing(5); setSliderValue(100); getMySlider().setVisible(hasSlider); updateColorTable(); addActionListener(this); } public void updateColorTable() { getMyTable().populateModel(getColorSwatchIcons(colorSet, getSliderValue() / 100f, iconSize, colorSetType)); } @Override public void actionPerformed(ActionEvent e) { if (this.hasSlider) { Integer si = getSelectedIndex(); defaultColor = getSelectedColor(); updateColorTable(); setSelectedIndex(si); } } @Override public ImageIcon getButtonIcon() { ImageIcon icon = super.getButtonIcon(); if (icon == null && this.hasSlider) { icon = GeoGebraIconD.createColorSwatchIcon(getSliderValue() / 100f, iconSize, GColorD.getAwtColor(defaultColor), null); } return icon; } public int getColorIndex(GColor color) { int index = -1; if (color == null && colorSetType == COLORSET_BGCOLOR) { index = colorSet.length - 1; return index; } if (lookupMap.containsKey(color)) { index = lookupMap.get(color); } return index; } public GColor getSelectedColor() { int index = getSelectedIndex(); if (index <= -1) { return defaultColor; } else if (colorSetType == COLORSET_BGCOLOR && index > colorSet.length - 1) { return null; } else { return colorSet[index]; } } private static GColor[] getColorArray(int colorSetType) { return GeoGebraColorConstants.getPopupArray(colorSetType); } public void setDefaultColor(double alpha, GColor gc) { defaultColor = gc; if (gc != null) { this.setIcon(GeoGebraIconD.createColorSwatchIcon(alpha, iconSize, GColorD.getAwtColor(gc), null)); } else { this.setIcon(GeoGebraIconD.createNullSymbolIcon(iconSize.width, iconSize.height)); } } private String[] getToolTipArray() { String[] toolTipArray = new String[colorSet.length]; for (int i = 0; i < toolTipArray.length; i++) { if (colorSet[i] == null) { toolTipArray[i] = app.getLocalization().getMenu("Transparent"); } else { toolTipArray[i] = GeoGebraColorConstants .getGeogebraColorName(app, colorSet[i]); } } return toolTipArray; } private static ImageIcon[] getColorSwatchIcons(GColor[] colorArray, float alpha, Dimension iconSize, int colorSetType) { ImageIcon[] a = new ImageIcon[colorArray.length]; for (int i = 0; i < colorArray.length; i++) { if (colorArray[i] != null) { a[i] = GeoGebraIconD.createColorSwatchIcon(alpha, iconSize, GColorD.getAwtColor(colorArray[i]), null); } else { a[i] = GeoGebraIconD.createNullSymbolIcon(iconSize.width, iconSize.height); } } return a; } private static ImageIcon[] createDummyIcons(Dimension iconSize) { ImageIcon[] a = new ImageIcon[27]; for (int i = 0; i < 27; i++) { a[i] = GeoGebraIconD.createEmptyIcon(iconSize.width, iconSize.height); } return a; } }