package games.strategy.engine.data.properties;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
/**
* User editable property representing a color.
*
* <p>
* Presents a clickable label with the currently selected color, through which a color swatch panel is accessable to
* change the color.
* </p>
*/
public class ColorProperty extends AEditableProperty {
private static final long serialVersionUID = 6826763550643504789L;
private static final int MAX_COLOR = 0xFFFFFF;
private static final int MIN_COLOR = 0x000000;
private Color color;
public ColorProperty(final String name, final String description, final int def) {
super(name, description);
if (def > MAX_COLOR || def < MIN_COLOR) {
throw new IllegalArgumentException("Default value out of range");
}
color = new Color(def);
}
public ColorProperty(final String name, final String description, final Color def) {
super(name, description);
if (def == null) {
color = Color.black;
} else {
color = def;
}
}
@Override
public Object getValue() {
return color;
}
@Override
public void setValue(final Object value) throws ClassCastException {
if (value == null) {
color = Color.black;
} else {
color = (Color) value;
}
}
@Override
public JComponent getEditorComponent() {
final JLabel label = new JLabel(" ") {
private static final long serialVersionUID = 3833935337866905836L;
@Override
public void paintComponent(final Graphics g) {
final Graphics2D g2 = (Graphics2D) g;
g2.setColor(color);
g2.fill(g2.getClip());
}
};
label.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(final MouseEvent e) {
try {
final Color colorSelected =
JColorChooser.showDialog(label, "Choose color",
(ColorProperty.this.color == null ? Color.black : ColorProperty.this.color));
if (colorSelected != null) {
color = colorSelected;
// Ask Swing to repaint this label when it's convenient
SwingUtilities.invokeLater(() -> label.repaint());
}
} catch (final Exception exception) {
System.err.println(exception.getMessage());
}
}
@Override
public void mouseEntered(final MouseEvent e) {}
@Override
public void mouseExited(final MouseEvent e) {}
@Override
public void mousePressed(final MouseEvent e) {}
@Override
public void mouseReleased(final MouseEvent e) {}
});
return label;
}
@Override
public boolean validate(final Object value) {
return (value == null) || (value instanceof Color);
}
}