package uk.ac.lkl.migen.mockup.shapebuilder.ui;
import java.awt.Color;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import org.apache.log4j.Logger;
import uk.ac.lkl.common.util.event.UpdateEvent;
import uk.ac.lkl.common.util.event.UpdateListener;
import uk.ac.lkl.migen.mockup.shapebuilder.model.shape.*;
public class Palette extends JPanel {
private Logger logger = Logger.getLogger(Palette.class);
private ButtonGroup buttonGroup;
private HashMap<ButtonModel, Color> colorMap;
private HashMap<Color, ButtonModel> modelMap;
private ShapePlotter shapePlotter;
public Palette(ShapePlotter shapePlotter) {
this.shapePlotter = shapePlotter;
buttonGroup = new ButtonGroup();
colorMap = new HashMap<ButtonModel, Color>();
modelMap = new HashMap<Color, ButtonModel>();
// All canonical Java colors. Left here as a quick reference
// addRadioButton("Blue", Color.BLUE);
// addRadioButton("Red", Color.RED);
// addRadioButton("Green", Color.GREEN);
// addRadioButton("Blue", Color.BLUE);
// addRadioButton("Yellow", Color.YELLOW);
// addRadioButton("Magenta", Color.MAGENTA);
// addRadioButton("Cyan", Color.CYAN);
// addRadioButton("White", Color.WHITE);
// addRadioButton("Grey", Color.DARK_GRAY);
// addRadioButton("Black", Color.BLACK);
// addRadioButton("Orange", Color.ORANGE); // (255, 200, 0)
// addRadioButton("Pink", Color.PINK); // (255, 175, 175)
// Colors for the 18-kids experiment
addRadioButton("Blue", Color.BLUE);
addRadioButton("Red", Color.RED);
addRadioButton("Yellow", Color.YELLOW);
addRadioButton("Pink", Color.PINK); // (255, 175, 175)
addRadioButton("Orange", new Color((float) 0.9, (float) 0.6,
(float) 0.0));
addRadioButton("Grey", Color.DARK_GRAY);
addChangeListener();
}
private void addChangeListener() {
shapePlotter.addUpdateListener(new UpdateListener<ShapePlotter>() {
public void objectUpdated(UpdateEvent<ShapePlotter> e) {
ExpressedShape selectedShape = shapePlotter.getSelectedShape();
if (selectedShape == null)
return;
Color color = selectedShape.getFillColor();
ButtonModel model = modelMap.get(color);
if (model != null)
model.setSelected(true);
}
});
}
private void addRadioButton(String label, Color color) {
JRadioButton button = new JRadioButton(label);
button.getModel().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ExpressedShape shape = shapePlotter.getSelectedShape();
if (shape == null)
return;
ButtonModel model = buttonGroup.getSelection();
// only allow setting of a color if the shape's current colour
// is known to the palette. This allows special colours for
// shapes.
Color currentColor = shape.getFillColor();
if (!modelMap.containsKey(currentColor))
return;
Color color = colorMap.get(model);
shape.setFillColor(color);
logger.info("Shape ID:" + shape.getId() + " color is now "
+ color + ".");
}
});
add(button);
buttonGroup.add(button);
colorMap.put(button.getModel(), color);
modelMap.put(color, button.getModel());
button.getModel().setSelected(true);
}
public Color getSelectedColor() {
ButtonModel model = buttonGroup.getSelection();
Color color = colorMap.get(model);
return color;
}
}
|