]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/colour/ColourChooser.java
Version 16.3, July 2014
[GpsPrune.git] / tim / prune / gui / colour / ColourChooser.java
1 package tim.prune.gui.colour;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Dimension;
6 import java.awt.FlowLayout;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9
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;
18
19 import tim.prune.I18nManager;
20
21 /**
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).
26  */
27 public class ColourChooser
28 {
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;
35         /** colour patch */
36         private ColourPatch _patch = null;
37         /** chosen colour */
38         private Color _chosenColour = null;
39
40
41         /**
42          * Constructor
43          * @param inParent parent dialog
44          */
45         public ColourChooser(JDialog inParent)
46         {
47                 _dialog = new JDialog(inParent, I18nManager.getText("dialog.colourchooser.title"), true);
48                 _dialog.setLocationRelativeTo(inParent);
49                 _dialog.getContentPane().add(makeContents());
50                 _dialog.pack();
51         }
52
53         /**
54          * Make the dialog contents
55          * @return JPanel containing dialog elements
56          */
57         private JPanel makeContents()
58         {
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);
67
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++)
72                 {
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) {
78                                         updatePatch();
79                                 }
80                         });
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);
89                 }
90                 centrePanel.add(sliderPanel, BorderLayout.SOUTH);
91                 mainPanel.add(centrePanel, BorderLayout.CENTER);
92
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);
101                         }
102                 });
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);
109                         }
110                 });
111                 buttonPanel.add(cancelButton);
112                 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
113                 return mainPanel;
114         }
115
116         /**
117          * Show the dialog to choose a colour
118          * @param inStartColour current colour
119          */
120         public void showDialog(Color inStartColour)
121         {
122                 // Initialise sliders
123                 _rgbSliders[0].setValue(inStartColour.getRed());
124                 _rgbSliders[1].setValue(inStartColour.getGreen());
125                 _rgbSliders[2].setValue(inStartColour.getBlue());
126                 updatePatch();
127                 _dialog.setLocationRelativeTo(_dialog.getParent());
128                 _dialog.setVisible(true);
129         }
130
131         /**
132          * Update the patch colour from the slider values
133          */
134         private void updatePatch()
135         {
136                 for (int i=0; i<3; i++) {
137                         _rgbLabels[i].setText("" + _rgbSliders[i].getValue());
138                 }
139                 final Color colour = new Color(_rgbSliders[0].getValue(),
140                         _rgbSliders[1].getValue(),_rgbSliders[2].getValue());
141                 _patch.setColour(colour);
142         }
143
144         /**
145          * @return the selected colour, or null if cancel pressed
146          */
147         public Color getChosenColour()
148         {
149                 return _chosenColour;
150         }
151 }