package net.sf.openrocket.gui.components;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.logging.Markers;
/**
* A color chooser button. The currently selected color can be queried or set using the
* {@link #getSelectedColor()} and {@link #setSelectedColor(Color)}, and changes listened
* to by listening to property events with property name {@link #COLOR_KEY}.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class ColorChooserButton extends JButton {
private static final Logger log = LoggerFactory.getLogger(ColorChooserButton.class);
public static final String COLOR_KEY = "selectedColor";
public ColorChooserButton(Color initial) {
setSelectedColor(initial);
// Add action listener that opens color chooser dialog
this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
log.info(Markers.USER_MARKER, "Activating color chooser");
final JColorChooser chooser = new JColorChooser(getSelectedColor());
chooser.setPreviewPanel(new JPanel());
final JDialog dialog = JColorChooser.createDialog(ColorChooserButton.this, "Select color", true,
chooser, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e2) {
Color c = chooser.getColor();
log.info(Markers.USER_MARKER, "User selected color " + c);
setSelectedColor(chooser.getColor());
}
}, null);
log.info("Closing color chooser");
dialog.setVisible(true);
}
});
}
public void addColorPropertyChangeListener(PropertyChangeListener listener) {
this.addPropertyChangeListener(COLOR_KEY, listener);
}
public void setSelectedColor(Color c) {
log.debug("Selecting color " + c);
this.setIcon(new ColorIcon(c));
this.putClientProperty(COLOR_KEY, c);
}
public Color getSelectedColor() {
return (Color) this.getClientProperty(COLOR_KEY);
}
}