]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/gui/colour/ColourChooser.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / gui / colour / ColourChooser.java
diff --git a/src/tim/prune/gui/colour/ColourChooser.java b/src/tim/prune/gui/colour/ColourChooser.java
new file mode 100644 (file)
index 0000000..3c40b4a
--- /dev/null
@@ -0,0 +1,151 @@
+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;
+       }
+}