package org.esa.snap.ui.color; import com.jidesoft.popup.JidePopup; import javax.swing.JComponent; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * A combo box for color values. * * @author Norman Fomferra * @since SNAP 2.0 */ public class ColorComboBox extends JComponent { public static final String SELECTED_COLOR_PROPERTY = "selectedColor"; public static final Color TRANSPARENCY = new Color(0, 0, 0, 0); private JidePopup popupWindow; private ColorLabel colorLabel; private Color selectedColor; private ColorChooserPanelFactory colorChooserPanelFactory; public ColorComboBox() { this(Color.WHITE); } public ColorComboBox(Color color) { selectedColor = color; colorLabel = new ColorLabel(selectedColor); colorLabel.setPreferredSize(new Dimension(16, 16)); colorLabel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { requestFocusInWindow(); showPopupWindow(); } }); setPreferredSize(new Dimension(60, 20)); setLayout(new BorderLayout()); add(colorLabel, BorderLayout.CENTER); setFocusable(true); } public ColorChooserPanelFactory getColorChooserPanelFactory() { return colorChooserPanelFactory; } public void setColorChooserPanelFactory(ColorChooserPanelFactory colorChooserPanelFactory) { this.colorChooserPanelFactory = colorChooserPanelFactory; } public Color getSelectedColor() { return selectedColor; } public void setSelectedColor(Color selectedColor) { Color oldValue = this.selectedColor; this.selectedColor = selectedColor; colorLabel.setColor(selectedColor); firePropertyChange(SELECTED_COLOR_PROPERTY, oldValue, this.selectedColor); } private ColorChooserPanel createColorChooserPanel() { if (colorChooserPanelFactory != null) { return colorChooserPanelFactory.create(getSelectedColor()); } return new ColorChooserPanel(getSelectedColor()); } private void showPopupWindow() { if (popupWindow != null && popupWindow.isShowing()) { closePopupWindow(); return; } Point location = getLocationOnScreen(); location.y += getHeight(); ColorChooserPanel colorChooserPanel = createColorChooserPanel(); colorChooserPanel.addPropertyChangeListener(ColorChooserPanel.SELECTED_COLOR_PROPERTY, evt -> { setSelectedColor(colorChooserPanel.getSelectedColor()); closePopupWindow(); }); popupWindow = new JidePopup(); popupWindow.setOwner(this); popupWindow.getContentPane().add(colorChooserPanel); popupWindow.setDefaultFocusComponent(colorChooserPanel); popupWindow.setMovable(false); popupWindow.setAttachable(false); popupWindow.showPopup(location.x, location.y); } protected void closePopupWindow() { if (popupWindow != null) { popupWindow.hidePopupImmediately(); popupWindow = null; } } }