--- /dev/null
+package tim.prune.gui.colour;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import tim.prune.I18nManager;
+
+/**
+ * Class to offer a dialog to choose a colour.
+ * Normally a JColorChooser would be used, but this is too buggy
+ * in Java 1.6 and extremely prone to thread-locking, meaning
+ * that the application has to be killed (and all data lost).
+ */
+public class ColourChooser
+{
+ /** main dialog object */
+ private JDialog _dialog = null;
+ /** array of three slider objects for rgb */
+ private JSlider[] _rgbSliders = null;
+ /** array of labels for rgb values */
+ private JLabel[] _rgbLabels = null;
+ /** colour patch */
+ private ColourPatch _patch = null;
+ /** chosen colour */
+ private Color _chosenColour = null;
+
+
+ /**
+ * Constructor
+ * @param inParent parent dialog
+ */
+ public ColourChooser(JDialog inParent)
+ {
+ _dialog = new JDialog(inParent, I18nManager.getText("dialog.colourchooser.title"), true);
+ _dialog.setLocationRelativeTo(inParent);
+ _dialog.getContentPane().add(makeContents());
+ _dialog.pack();
+ }
+
+ /**
+ * Make the dialog contents
+ * @return JPanel containing dialog elements
+ */
+ private JPanel makeContents()
+ {
+ JPanel mainPanel = new JPanel();
+ mainPanel.setLayout(new BorderLayout());
+ _rgbSliders = new JSlider[3];
+ _rgbLabels = new JLabel[3];
+ _patch = new ColourPatch(Color.WHITE);
+ JPanel centrePanel = new JPanel();
+ centrePanel.setLayout(new BorderLayout());
+ centrePanel.add(_patch, BorderLayout.CENTER);
+
+ JPanel sliderPanel = new JPanel();
+ sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.Y_AXIS));
+ final String[] labelKeys = {"red", "green", "blue"};
+ for (int i=0; i<3; i++)
+ {
+ String key = I18nManager.getText("dialog.colourchooser." + labelKeys[i]);
+ sliderPanel.add(new JLabel(key));
+ _rgbSliders[i] = new JSlider(0, 255);
+ _rgbSliders[i].addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent arg0) {
+ updatePatch();
+ }
+ });
+ _rgbSliders[i].setToolTipText(key);
+ JPanel sliderHolder = new JPanel();
+ sliderHolder.setLayout(new BorderLayout(5, 0));
+ sliderHolder.add(_rgbSliders[i], BorderLayout.CENTER);
+ _rgbLabels[i] = new JLabel("255");
+ _rgbLabels[i].setPreferredSize(new Dimension(40, 1));
+ sliderHolder.add(_rgbLabels[i], BorderLayout.EAST);
+ sliderPanel.add(sliderHolder);
+ }
+ centrePanel.add(sliderPanel, BorderLayout.SOUTH);
+ mainPanel.add(centrePanel, BorderLayout.CENTER);
+
+ // Button panel for ok, cancel
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ JButton okButton = new JButton(I18nManager.getText("button.ok"));
+ okButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ _chosenColour = _patch.getBackground();
+ _dialog.setVisible(false);
+ }
+ });
+ buttonPanel.add(okButton);
+ JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ _chosenColour = null;
+ _dialog.setVisible(false);
+ }
+ });
+ buttonPanel.add(cancelButton);
+ mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+ return mainPanel;
+ }
+
+ /**
+ * Show the dialog to choose a colour
+ * @param inStartColour current colour
+ */
+ public void showDialog(Color inStartColour)
+ {
+ // Initialise sliders
+ _rgbSliders[0].setValue(inStartColour.getRed());
+ _rgbSliders[1].setValue(inStartColour.getGreen());
+ _rgbSliders[2].setValue(inStartColour.getBlue());
+ updatePatch();
+ _dialog.setLocationRelativeTo(_dialog.getParent());
+ _dialog.setVisible(true);
+ }
+
+ /**
+ * Update the patch colour from the slider values
+ */
+ private void updatePatch()
+ {
+ for (int i=0; i<3; i++) {
+ _rgbLabels[i].setText("" + _rgbSliders[i].getValue());
+ }
+ final Color colour = new Color(_rgbSliders[0].getValue(),
+ _rgbSliders[1].getValue(),_rgbSliders[2].getValue());
+ _patch.setColour(colour);
+ }
+
+ /**
+ * @return the selected colour, or null if cancel pressed
+ */
+ public Color getChosenColour()
+ {
+ return _chosenColour;
+ }
+}