1 package tim.prune.gui.colour;
3 import java.awt.BorderLayout;
5 import java.awt.Dimension;
6 import java.awt.FlowLayout;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
10 import javax.swing.BoxLayout;
11 import javax.swing.JButton;
12 import javax.swing.JDialog;
13 import javax.swing.JLabel;
14 import javax.swing.JPanel;
15 import javax.swing.JSlider;
16 import javax.swing.event.ChangeEvent;
17 import javax.swing.event.ChangeListener;
19 import tim.prune.I18nManager;
22 * Class to offer a dialog to choose a colour.
23 * Normally a JColorChooser would be used, but this is too buggy
24 * in Java 1.6 and extremely prone to thread-locking, meaning
25 * that the application has to be killed (and all data lost).
27 public class ColourChooser
29 /** main dialog object */
30 private JDialog _dialog = null;
31 /** array of three slider objects for rgb */
32 private JSlider[] _rgbSliders = null;
33 /** array of labels for rgb values */
34 private JLabel[] _rgbLabels = null;
36 private ColourPatch _patch = null;
38 private Color _chosenColour = null;
43 * @param inParent parent dialog
45 public ColourChooser(JDialog inParent)
47 _dialog = new JDialog(inParent, I18nManager.getText("dialog.colourchooser.title"), true);
48 _dialog.setLocationRelativeTo(inParent);
49 _dialog.getContentPane().add(makeContents());
54 * Make the dialog contents
55 * @return JPanel containing dialog elements
57 private JPanel makeContents()
59 JPanel mainPanel = new JPanel();
60 mainPanel.setLayout(new BorderLayout());
61 _rgbSliders = new JSlider[3];
62 _rgbLabels = new JLabel[3];
63 _patch = new ColourPatch(Color.WHITE);
64 JPanel centrePanel = new JPanel();
65 centrePanel.setLayout(new BorderLayout());
66 centrePanel.add(_patch, BorderLayout.CENTER);
68 JPanel sliderPanel = new JPanel();
69 sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.Y_AXIS));
70 final String[] labelKeys = {"red", "green", "blue"};
71 for (int i=0; i<3; i++)
73 String key = I18nManager.getText("dialog.colourchooser." + labelKeys[i]);
74 sliderPanel.add(new JLabel(key));
75 _rgbSliders[i] = new JSlider(0, 255);
76 _rgbSliders[i].addChangeListener(new ChangeListener() {
77 public void stateChanged(ChangeEvent arg0) {
81 _rgbSliders[i].setToolTipText(key);
82 JPanel sliderHolder = new JPanel();
83 sliderHolder.setLayout(new BorderLayout(5, 0));
84 sliderHolder.add(_rgbSliders[i], BorderLayout.CENTER);
85 _rgbLabels[i] = new JLabel("255");
86 _rgbLabels[i].setPreferredSize(new Dimension(40, 1));
87 sliderHolder.add(_rgbLabels[i], BorderLayout.EAST);
88 sliderPanel.add(sliderHolder);
90 centrePanel.add(sliderPanel, BorderLayout.SOUTH);
91 mainPanel.add(centrePanel, BorderLayout.CENTER);
93 // Button panel for ok, cancel
94 JPanel buttonPanel = new JPanel();
95 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
96 JButton okButton = new JButton(I18nManager.getText("button.ok"));
97 okButton.addActionListener(new ActionListener() {
98 public void actionPerformed(ActionEvent e) {
99 _chosenColour = _patch.getBackground();
100 _dialog.setVisible(false);
103 buttonPanel.add(okButton);
104 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
105 cancelButton.addActionListener(new ActionListener() {
106 public void actionPerformed(ActionEvent e) {
107 _chosenColour = null;
108 _dialog.setVisible(false);
111 buttonPanel.add(cancelButton);
112 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
117 * Show the dialog to choose a colour
118 * @param inStartColour current colour
120 public void showDialog(Color inStartColour)
122 // Initialise sliders
123 _rgbSliders[0].setValue(inStartColour.getRed());
124 _rgbSliders[1].setValue(inStartColour.getGreen());
125 _rgbSliders[2].setValue(inStartColour.getBlue());
127 _dialog.setLocationRelativeTo(_dialog.getParent());
128 _dialog.setVisible(true);
132 * Update the patch colour from the slider values
134 private void updatePatch()
136 for (int i=0; i<3; i++) {
137 _rgbLabels[i].setText("" + _rgbSliders[i].getValue());
139 final Color colour = new Color(_rgbSliders[0].getValue(),
140 _rgbSliders[1].getValue(),_rgbSliders[2].getValue());
141 _patch.setColour(colour);
145 * @return the selected colour, or null if cancel pressed
147 public Color getChosenColour()
149 return _chosenColour;